diff --git a/README.md b/README.md
index 48ccd70..d9ae788 100644
--- a/README.md
+++ b/README.md
@@ -239,3 +239,53 @@ changes:
```bash
bun run snapshot:update
```
+
+The full TPS63802 datasheet waveform checks use the unmodified TI switching
+model at a 10 ns step and can take minutes to tens of minutes per figure. Run
+one figure explicitly:
+
+```bash
+RUN_TPS63802_DATASHEET_SIMULATIONS=1 \
+ bun test tests/TPS63802-datasheet-waveform-snapshots.test.tsx \
+ -t "Figure 10-21"
+```
+
+Add `UPDATE_TPS63802_DATASHEET_SNAPSHOTS=1` to update that figure's committed
+simulation SVG. Each completed run also stores its Circuit JSON and SPICE
+netlist in `/tmp`, so rendering changes can be checked without rerunning the
+vendor model.
+
+The waveform examples use the effective 5 µF input and 8.2 µF output
+capacitances from Section 8.3. Tables 10-3, 10-4, and 10-6 list the
+corresponding nominal 10 µF and 22 µF parts and their 10 mΩ ESR.
+For conflicting conditions, the annotation printed with the graph is used:
+Figures 10-23 and 10-26 use 5 V even though Table 10-7 says 4.2 V.
+
+The committed SVGs contain simulator output, not digitized datasheet traces.
+TI's figures are bench measurements, so the model can differ quantitatively.
+The wide line steps in Figures 10-27 and 10-28 show the largest difference
+around the automatic boost/buck mode transition.
+
+```bash
+RUN_TPS63802_DATASHEET_SIMULATIONS=1 \
+UPDATE_TPS63802_DATASHEET_SNAPSHOTS=1 \
+ bun test tests/TPS63802-datasheet-waveform-snapshots.test.tsx \
+ -t "Figure 10-21"
+```
+
+The ordinary TPS63802 tests use deterministic engines to verify circuit
+generation, Cartesian sweep coordinates, measurements, graph grouping, and
+figure labels without replacing the vendor-model checks.
+
+TI's TPS63802 model states that it does not model quiescent current or
+temperature effects. As a result, low-current efficiency curves can be
+simulated structurally but cannot be expected to match TI's bench data
+quantitatively. Figures 10-30 and 10-31 also contain conflicting conditions:
+Table 10-7 specifies a 2.2 V input and 10 mA load, while the figure annotations
+specify 4.2 V and a physically impossible 100 mΩ load. The example circuits
+use the figure's 4.2 V input and the table's physically coherent 10 mA load.
+
+Figure 10-2 records the settled regulation surface across input voltage and
+load current. The datasheet does not define the pass/fail criterion used to
+turn that surface into a single "maximum output current" boundary, so the
+example does not hard-code an arbitrary threshold.
diff --git a/lib/simulations/TPS63802-Figure-10-10-efficiency-vs-input-voltage-pwm-only.circuit.tsx b/lib/simulations/TPS63802-Figure-10-10-efficiency-vs-input-voltage-pwm-only.circuit.tsx
new file mode 100644
index 0000000..c8d79ea
--- /dev/null
+++ b/lib/simulations/TPS63802-Figure-10-10-efficiency-vs-input-voltage-pwm-only.circuit.tsx
@@ -0,0 +1,50 @@
+import type { SubcircuitProps } from "@tscircuit/props";
+import { createTPS63802EfficiencyVsInputVoltageFigureCircuit } from "./create-TPS63802-efficiency-vs-input-voltage-figure-circuit";
+
+const inputVoltages = [
+ "1.8V",
+ "2.3V",
+ "2.8V",
+ "3.3V",
+ "3.8V",
+ "4.3V",
+ "4.8V",
+ "5.3V",
+];
+
+export const TPS63802Figure1010EfficiencyVsInputVoltagePwmOnlyCircuit = ({
+ name,
+ ...props
+}: SubcircuitProps) => (
+
+ {createTPS63802EfficiencyVsInputVoltageFigureCircuit({
+ ...props,
+ name: `${name}_vo_1v8`,
+ figureName: "Figure 10-10. Efficiency versus Input Voltage (PWM Only)",
+ inputVoltages,
+ mode: "pwm",
+ outputVoltage: 1.8,
+ seriesName: "VO = 1.8 V",
+ })}
+ {createTPS63802EfficiencyVsInputVoltageFigureCircuit({
+ ...props,
+ name: `${name}_vo_3v3`,
+ figureName: "Figure 10-10. Efficiency versus Input Voltage (PWM Only)",
+ inputVoltages,
+ mode: "pwm",
+ outputVoltage: 3.3,
+ seriesName: "VO = 3.3 V",
+ })}
+ {createTPS63802EfficiencyVsInputVoltageFigureCircuit({
+ ...props,
+ name: `${name}_vo_5v2`,
+ figureName: "Figure 10-10. Efficiency versus Input Voltage (PWM Only)",
+ inputVoltages,
+ mode: "pwm",
+ outputVoltage: 5.2,
+ seriesName: "VO = 5.2 V",
+ })}
+
+);
+
+export default TPS63802Figure1010EfficiencyVsInputVoltagePwmOnlyCircuit;
diff --git a/lib/simulations/TPS63802-Figure-10-11-load-regulation-pwm-only.circuit.tsx b/lib/simulations/TPS63802-Figure-10-11-load-regulation-pwm-only.circuit.tsx
new file mode 100644
index 0000000..c154e17
--- /dev/null
+++ b/lib/simulations/TPS63802-Figure-10-11-load-regulation-pwm-only.circuit.tsx
@@ -0,0 +1,13 @@
+import type { SubcircuitProps } from "@tscircuit/props";
+import { createTPS63802LoadRegulationFigureCircuit } from "./create-TPS63802-load-regulation-figure-circuit";
+
+export const TPS63802Figure1011LoadRegulationPwmOnlyCircuit = (
+ props: SubcircuitProps,
+) =>
+ createTPS63802LoadRegulationFigureCircuit({
+ ...props,
+ figureName: "Figure 10-11. Load Regulation (PWM Only)",
+ mode: "pwm",
+ });
+
+export default TPS63802Figure1011LoadRegulationPwmOnlyCircuit;
diff --git a/lib/simulations/TPS63802-Figure-10-12-load-regulation-pfm-pwm.circuit.tsx b/lib/simulations/TPS63802-Figure-10-12-load-regulation-pfm-pwm.circuit.tsx
new file mode 100644
index 0000000..33093dc
--- /dev/null
+++ b/lib/simulations/TPS63802-Figure-10-12-load-regulation-pfm-pwm.circuit.tsx
@@ -0,0 +1,13 @@
+import type { SubcircuitProps } from "@tscircuit/props";
+import { createTPS63802LoadRegulationFigureCircuit } from "./create-TPS63802-load-regulation-figure-circuit";
+
+export const TPS63802Figure1012LoadRegulationPfmPwmCircuit = (
+ props: SubcircuitProps,
+) =>
+ createTPS63802LoadRegulationFigureCircuit({
+ ...props,
+ figureName: "Figure 10-12. Load Regulation (PFM/PWM)",
+ mode: "pfm",
+ });
+
+export default TPS63802Figure1012LoadRegulationPfmPwmCircuit;
diff --git a/lib/simulations/TPS63802-Figure-10-13-line-regulation-pwm-only.circuit.tsx b/lib/simulations/TPS63802-Figure-10-13-line-regulation-pwm-only.circuit.tsx
new file mode 100644
index 0000000..e2b29da
--- /dev/null
+++ b/lib/simulations/TPS63802-Figure-10-13-line-regulation-pwm-only.circuit.tsx
@@ -0,0 +1,33 @@
+import type { SubcircuitProps } from "@tscircuit/props";
+import { createTPS63802LineRegulationFigureCircuit } from "./create-TPS63802-line-regulation-figure-circuit";
+
+export const TPS63802Figure1013LineRegulationPwmOnlyCircuit = ({
+ name,
+ ...props
+}: SubcircuitProps) => (
+
+ {createTPS63802LineRegulationFigureCircuit({
+ ...props,
+ name: `${name}_vo_1v8`,
+ figureName: "Figure 10-13. Line Regulation (PWM Only)",
+ mode: "pwm",
+ outputVoltage: 1.8,
+ })}
+ {createTPS63802LineRegulationFigureCircuit({
+ ...props,
+ name: `${name}_vo_3v3`,
+ figureName: "Figure 10-13. Line Regulation (PWM Only)",
+ mode: "pwm",
+ outputVoltage: 3.3,
+ })}
+ {createTPS63802LineRegulationFigureCircuit({
+ ...props,
+ name: `${name}_vo_5v2`,
+ figureName: "Figure 10-13. Line Regulation (PWM Only)",
+ mode: "pwm",
+ outputVoltage: 5.2,
+ })}
+
+);
+
+export default TPS63802Figure1013LineRegulationPwmOnlyCircuit;
diff --git a/lib/simulations/TPS63802-Figure-10-14-line-regulation-pfm-pwm.circuit.tsx b/lib/simulations/TPS63802-Figure-10-14-line-regulation-pfm-pwm.circuit.tsx
new file mode 100644
index 0000000..d96b98d
--- /dev/null
+++ b/lib/simulations/TPS63802-Figure-10-14-line-regulation-pfm-pwm.circuit.tsx
@@ -0,0 +1,33 @@
+import type { SubcircuitProps } from "@tscircuit/props";
+import { createTPS63802LineRegulationFigureCircuit } from "./create-TPS63802-line-regulation-figure-circuit";
+
+export const TPS63802Figure1014LineRegulationPfmPwmCircuit = ({
+ name,
+ ...props
+}: SubcircuitProps) => (
+
+ {createTPS63802LineRegulationFigureCircuit({
+ ...props,
+ name: `${name}_vo_1v8`,
+ figureName: "Figure 10-14. Line Regulation (PFM/PWM)",
+ mode: "pfm",
+ outputVoltage: 1.8,
+ })}
+ {createTPS63802LineRegulationFigureCircuit({
+ ...props,
+ name: `${name}_vo_3v3`,
+ figureName: "Figure 10-14. Line Regulation (PFM/PWM)",
+ mode: "pfm",
+ outputVoltage: 3.3,
+ })}
+ {createTPS63802LineRegulationFigureCircuit({
+ ...props,
+ name: `${name}_vo_5v2`,
+ figureName: "Figure 10-14. Line Regulation (PFM/PWM)",
+ mode: "pfm",
+ outputVoltage: 5.2,
+ })}
+
+);
+
+export default TPS63802Figure1014LineRegulationPfmPwmCircuit;
diff --git a/lib/simulations/TPS63802-Figure-10-15-switching-waveforms-pfm-boost-operation.circuit.tsx b/lib/simulations/TPS63802-Figure-10-15-switching-waveforms-pfm-boost-operation.circuit.tsx
new file mode 100644
index 0000000..6d8b561
--- /dev/null
+++ b/lib/simulations/TPS63802-Figure-10-15-switching-waveforms-pfm-boost-operation.circuit.tsx
@@ -0,0 +1,15 @@
+import type { SubcircuitProps } from "@tscircuit/props";
+import { createTPS63802SwitchingWaveformsFigureCircuit } from "./create-TPS63802-switching-waveforms-figure-circuit";
+
+export const TPS63802Figure1015SwitchingWaveformsPfmBoostOperationCircuit = (
+ props: SubcircuitProps,
+) =>
+ createTPS63802SwitchingWaveformsFigureCircuit({
+ ...props,
+ duration: "704us",
+ figureName: "Figure 10-15. Switching Waveforms, PFM Boost Operation",
+ inputVoltage: "2.3V",
+ startTime: "686us",
+ });
+
+export default TPS63802Figure1015SwitchingWaveformsPfmBoostOperationCircuit;
diff --git a/lib/simulations/TPS63802-Figure-10-16-switching-waveforms-pfm-buck-boost-operation.circuit.tsx b/lib/simulations/TPS63802-Figure-10-16-switching-waveforms-pfm-buck-boost-operation.circuit.tsx
new file mode 100644
index 0000000..9c5bcd6
--- /dev/null
+++ b/lib/simulations/TPS63802-Figure-10-16-switching-waveforms-pfm-buck-boost-operation.circuit.tsx
@@ -0,0 +1,14 @@
+import type { SubcircuitProps } from "@tscircuit/props";
+import { createTPS63802SwitchingWaveformsFigureCircuit } from "./create-TPS63802-switching-waveforms-figure-circuit";
+
+export const TPS63802Figure1016SwitchingWaveformsPfmBuckBoostOperationCircuit =
+ (props: SubcircuitProps) =>
+ createTPS63802SwitchingWaveformsFigureCircuit({
+ ...props,
+ duration: "700us",
+ figureName: "Figure 10-16. Switching Waveforms, PFM Buck-Boost Operation",
+ inputVoltage: "3.3V",
+ startTime: "682us",
+ });
+
+export default TPS63802Figure1016SwitchingWaveformsPfmBuckBoostOperationCircuit;
diff --git a/lib/simulations/TPS63802-Figure-10-17-switching-waveforms-pfm-buck-operation.circuit.tsx b/lib/simulations/TPS63802-Figure-10-17-switching-waveforms-pfm-buck-operation.circuit.tsx
new file mode 100644
index 0000000..75b778a
--- /dev/null
+++ b/lib/simulations/TPS63802-Figure-10-17-switching-waveforms-pfm-buck-operation.circuit.tsx
@@ -0,0 +1,15 @@
+import type { SubcircuitProps } from "@tscircuit/props";
+import { createTPS63802SwitchingWaveformsFigureCircuit } from "./create-TPS63802-switching-waveforms-figure-circuit";
+
+export const TPS63802Figure1017SwitchingWaveformsPfmBuckOperationCircuit = (
+ props: SubcircuitProps,
+) =>
+ createTPS63802SwitchingWaveformsFigureCircuit({
+ ...props,
+ duration: "704us",
+ figureName: "Figure 10-17. Switching Waveforms, PFM Buck Operation",
+ inputVoltage: "4.2V",
+ startTime: "686us",
+ });
+
+export default TPS63802Figure1017SwitchingWaveformsPfmBuckOperationCircuit;
diff --git a/lib/simulations/TPS63802-Figure-10-18-switching-waveforms-pwm-boost-operation.circuit.tsx b/lib/simulations/TPS63802-Figure-10-18-switching-waveforms-pwm-boost-operation.circuit.tsx
new file mode 100644
index 0000000..dd06d81
--- /dev/null
+++ b/lib/simulations/TPS63802-Figure-10-18-switching-waveforms-pwm-boost-operation.circuit.tsx
@@ -0,0 +1,20 @@
+import type { SubcircuitProps } from "@tscircuit/props";
+import { createTPS63802SwitchingWaveformsFigureCircuit } from "./create-TPS63802-switching-waveforms-figure-circuit";
+
+export const TPS63802Figure1018SwitchingWaveformsPwmBoostOperationCircuit = (
+ props: SubcircuitProps,
+) =>
+ createTPS63802SwitchingWaveformsFigureCircuit({
+ ...props,
+ duration: "704us",
+ figureName: "Figure 10-18. Switching Waveforms, PWM Boost Operation",
+ inductorCurrentCenter: 4.4,
+ inputVoltage: "2.3V",
+ l1Center: -1.02,
+ loadCurrent: "2A",
+ mode: "pwm",
+ outputVoltageCenter: 3.23,
+ startTime: "686us",
+ });
+
+export default TPS63802Figure1018SwitchingWaveformsPwmBoostOperationCircuit;
diff --git a/lib/simulations/TPS63802-Figure-10-19-switching-waveforms-pwm-buck-boost-operation.circuit.tsx b/lib/simulations/TPS63802-Figure-10-19-switching-waveforms-pwm-buck-boost-operation.circuit.tsx
new file mode 100644
index 0000000..1c7501f
--- /dev/null
+++ b/lib/simulations/TPS63802-Figure-10-19-switching-waveforms-pwm-buck-boost-operation.circuit.tsx
@@ -0,0 +1,18 @@
+import type { SubcircuitProps } from "@tscircuit/props";
+import { createTPS63802SwitchingWaveformsFigureCircuit } from "./create-TPS63802-switching-waveforms-figure-circuit";
+
+export const TPS63802Figure1019SwitchingWaveformsPwmBuckBoostOperationCircuit =
+ (props: SubcircuitProps) =>
+ createTPS63802SwitchingWaveformsFigureCircuit({
+ ...props,
+ duration: "696us",
+ figureName: "Figure 10-19. Switching Waveforms, PWM Buck-Boost Operation",
+ inductorCurrentCenter: 4.4,
+ inputVoltage: "3.3V",
+ loadCurrent: "2A",
+ mode: "pwm",
+ outputVoltageCenter: 3.24,
+ startTime: "678us",
+ });
+
+export default TPS63802Figure1019SwitchingWaveformsPwmBuckBoostOperationCircuit;
diff --git a/lib/simulations/TPS63802-Figure-10-2-output-current-capability-vs-input-voltage.circuit.tsx b/lib/simulations/TPS63802-Figure-10-2-output-current-capability-vs-input-voltage.circuit.tsx
new file mode 100644
index 0000000..8048989
--- /dev/null
+++ b/lib/simulations/TPS63802-Figure-10-2-output-current-capability-vs-input-voltage.circuit.tsx
@@ -0,0 +1,126 @@
+import type { SubcircuitProps } from "@tscircuit/props";
+import { analog } from "tscircuit";
+import { TPS63802DatasheetApplicationCircuit } from "./create-TPS63802-datasheet-application-circuit";
+import { mean } from "./TPS63802-datasheet-measurements";
+
+const inputVoltages = [
+ "1.8V",
+ "2.3V",
+ "2.8V",
+ "3.3V",
+ "3.8V",
+ "4.3V",
+ "4.8V",
+ "5.3V",
+];
+
+const ConfiguredOutputCurrentCapabilityCircuit = ({
+ measureAtMinimumInputVoltage = false,
+ outputVoltage,
+ ...props
+}: SubcircuitProps & {
+ measureAtMinimumInputVoltage?: boolean;
+ outputVoltage: number;
+}) => (
+
+
+ {!measureAtMinimumInputVoltage && (
+
+ )}
+
+
+ ((mean(getVoltage(".V_FB_PROBE").values.slice(-1_000)) - 0.5) / 0.5) *
+ 100
+ }
+ />
+
+
+);
+
+export const TPS63802Figure102OutputCurrentCapabilityVsInputVoltageCircuit = ({
+ name,
+ ...props
+}: SubcircuitProps) => (
+
+
+
+
+
+
+
+
+);
+
+export default TPS63802Figure102OutputCurrentCapabilityVsInputVoltageCircuit;
diff --git a/lib/simulations/TPS63802-Figure-10-20-switching-waveforms-pwm-buck-operation.circuit.tsx b/lib/simulations/TPS63802-Figure-10-20-switching-waveforms-pwm-buck-operation.circuit.tsx
new file mode 100644
index 0000000..37f3b9e
--- /dev/null
+++ b/lib/simulations/TPS63802-Figure-10-20-switching-waveforms-pwm-buck-operation.circuit.tsx
@@ -0,0 +1,19 @@
+import type { SubcircuitProps } from "@tscircuit/props";
+import { createTPS63802SwitchingWaveformsFigureCircuit } from "./create-TPS63802-switching-waveforms-figure-circuit";
+
+export const TPS63802Figure1020SwitchingWaveformsPwmBuckOperationCircuit = (
+ props: SubcircuitProps,
+) =>
+ createTPS63802SwitchingWaveformsFigureCircuit({
+ ...props,
+ duration: "704us",
+ figureName: "Figure 10-20. Switching Waveforms, PWM Buck Operation",
+ inductorCurrentCenter: 3.62,
+ inputVoltage: "4.2V",
+ loadCurrent: "2A",
+ mode: "pwm",
+ outputVoltageCenter: 3.24,
+ startTime: "686us",
+ });
+
+export default TPS63802Figure1020SwitchingWaveformsPwmBuckOperationCircuit;
diff --git a/lib/simulations/TPS63802-Figure-10-21-load-transient-pfm-pwm-boost-operation.circuit.tsx b/lib/simulations/TPS63802-Figure-10-21-load-transient-pfm-pwm-boost-operation.circuit.tsx
new file mode 100644
index 0000000..e037b33
--- /dev/null
+++ b/lib/simulations/TPS63802-Figure-10-21-load-transient-pfm-pwm-boost-operation.circuit.tsx
@@ -0,0 +1,14 @@
+import type { SubcircuitProps } from "@tscircuit/props";
+import { createTPS63802LoadTransientFigureCircuit } from "./create-TPS63802-load-transient-figure-circuit";
+
+export const TPS63802Figure1021LoadTransientPfmPwmBoostOperationCircuit = (
+ props: SubcircuitProps,
+) =>
+ createTPS63802LoadTransientFigureCircuit({
+ ...props,
+ figureName: "Figure 10-21. Load Transient, PFM/PWM Boost Operation",
+ inputVoltage: "2.5V",
+ mode: "pfm",
+ });
+
+export default TPS63802Figure1021LoadTransientPfmPwmBoostOperationCircuit;
diff --git a/lib/simulations/TPS63802-Figure-10-22-load-transient-pfm-pwm-buck-boost-operation.circuit.tsx b/lib/simulations/TPS63802-Figure-10-22-load-transient-pfm-pwm-buck-boost-operation.circuit.tsx
new file mode 100644
index 0000000..3e2f983
--- /dev/null
+++ b/lib/simulations/TPS63802-Figure-10-22-load-transient-pfm-pwm-buck-boost-operation.circuit.tsx
@@ -0,0 +1,14 @@
+import type { SubcircuitProps } from "@tscircuit/props";
+import { createTPS63802LoadTransientFigureCircuit } from "./create-TPS63802-load-transient-figure-circuit";
+
+export const TPS63802Figure1022LoadTransientPfmPwmBuckBoostOperationCircuit = (
+ props: SubcircuitProps,
+) =>
+ createTPS63802LoadTransientFigureCircuit({
+ ...props,
+ figureName: "Figure 10-22. Load Transient, PFM/PWM Buck-Boost Operation",
+ inputVoltage: "3.3V",
+ mode: "pfm",
+ });
+
+export default TPS63802Figure1022LoadTransientPfmPwmBuckBoostOperationCircuit;
diff --git a/lib/simulations/TPS63802-Figure-10-23-load-transient-pfm-pwm-buck-operation.circuit.tsx b/lib/simulations/TPS63802-Figure-10-23-load-transient-pfm-pwm-buck-operation.circuit.tsx
new file mode 100644
index 0000000..4a6c437
--- /dev/null
+++ b/lib/simulations/TPS63802-Figure-10-23-load-transient-pfm-pwm-buck-operation.circuit.tsx
@@ -0,0 +1,15 @@
+import type { SubcircuitProps } from "@tscircuit/props";
+import { createTPS63802LoadTransientFigureCircuit } from "./create-TPS63802-load-transient-figure-circuit";
+
+export const TPS63802Figure1023LoadTransientPfmPwmBuckOperationCircuit = (
+ props: SubcircuitProps,
+) =>
+ createTPS63802LoadTransientFigureCircuit({
+ ...props,
+ figureName: "Figure 10-23. Load Transient, PFM/PWM Buck Operation",
+ // Figure 10-23 is annotated VI = 5 V; Table 10-7 says 4.2 V.
+ inputVoltage: "5V",
+ mode: "pfm",
+ });
+
+export default TPS63802Figure1023LoadTransientPfmPwmBuckOperationCircuit;
diff --git a/lib/simulations/TPS63802-Figure-10-24-load-transient-pwm-boost-operation.circuit.tsx b/lib/simulations/TPS63802-Figure-10-24-load-transient-pwm-boost-operation.circuit.tsx
new file mode 100644
index 0000000..5e5997d
--- /dev/null
+++ b/lib/simulations/TPS63802-Figure-10-24-load-transient-pwm-boost-operation.circuit.tsx
@@ -0,0 +1,14 @@
+import type { SubcircuitProps } from "@tscircuit/props";
+import { createTPS63802LoadTransientFigureCircuit } from "./create-TPS63802-load-transient-figure-circuit";
+
+export const TPS63802Figure1024LoadTransientPwmBoostOperationCircuit = (
+ props: SubcircuitProps,
+) =>
+ createTPS63802LoadTransientFigureCircuit({
+ ...props,
+ figureName: "Figure 10-24. Load Transient, PWM Boost Operation",
+ inputVoltage: "2.5V",
+ mode: "pwm",
+ });
+
+export default TPS63802Figure1024LoadTransientPwmBoostOperationCircuit;
diff --git a/lib/simulations/TPS63802-Figure-10-25-load-transient-pwm-buck-boost-operation.circuit.tsx b/lib/simulations/TPS63802-Figure-10-25-load-transient-pwm-buck-boost-operation.circuit.tsx
new file mode 100644
index 0000000..e43909d
--- /dev/null
+++ b/lib/simulations/TPS63802-Figure-10-25-load-transient-pwm-buck-boost-operation.circuit.tsx
@@ -0,0 +1,14 @@
+import type { SubcircuitProps } from "@tscircuit/props";
+import { createTPS63802LoadTransientFigureCircuit } from "./create-TPS63802-load-transient-figure-circuit";
+
+export const TPS63802Figure1025LoadTransientPwmBuckBoostOperationCircuit = (
+ props: SubcircuitProps,
+) =>
+ createTPS63802LoadTransientFigureCircuit({
+ ...props,
+ figureName: "Figure 10-25. Load Transient, PWM Buck-Boost Operation",
+ inputVoltage: "3.3V",
+ mode: "pwm",
+ });
+
+export default TPS63802Figure1025LoadTransientPwmBuckBoostOperationCircuit;
diff --git a/lib/simulations/TPS63802-Figure-10-26-load-transient-pwm-buck-operation.circuit.tsx b/lib/simulations/TPS63802-Figure-10-26-load-transient-pwm-buck-operation.circuit.tsx
new file mode 100644
index 0000000..e3c9030
--- /dev/null
+++ b/lib/simulations/TPS63802-Figure-10-26-load-transient-pwm-buck-operation.circuit.tsx
@@ -0,0 +1,15 @@
+import type { SubcircuitProps } from "@tscircuit/props";
+import { createTPS63802LoadTransientFigureCircuit } from "./create-TPS63802-load-transient-figure-circuit";
+
+export const TPS63802Figure1026LoadTransientPwmBuckOperationCircuit = (
+ props: SubcircuitProps,
+) =>
+ createTPS63802LoadTransientFigureCircuit({
+ ...props,
+ figureName: "Figure 10-26. Load Transient, PWM Buck Operation",
+ // Figure 10-26 is annotated VI = 5 V; Table 10-7 says 4.2 V.
+ inputVoltage: "5V",
+ mode: "pwm",
+ });
+
+export default TPS63802Figure1026LoadTransientPwmBuckOperationCircuit;
diff --git a/lib/simulations/TPS63802-Figure-10-27-line-transient-pwm-operation.circuit.tsx b/lib/simulations/TPS63802-Figure-10-27-line-transient-pwm-operation.circuit.tsx
new file mode 100644
index 0000000..c0128bf
--- /dev/null
+++ b/lib/simulations/TPS63802-Figure-10-27-line-transient-pwm-operation.circuit.tsx
@@ -0,0 +1,15 @@
+import type { SubcircuitProps } from "@tscircuit/props";
+import { createTPS63802LineTransientFigureCircuit } from "./create-TPS63802-line-transient-figure-circuit";
+
+export const TPS63802Figure1027LineTransientPwmOperationCircuit = (
+ props: SubcircuitProps,
+) =>
+ createTPS63802LineTransientFigureCircuit({
+ ...props,
+ figureName: "Figure 10-27. Line Transient, PWM Operation",
+ inputVoltageHigh: "4.2V",
+ inputVoltageLow: "2.2V",
+ loadResistance: "6.6Ω",
+ });
+
+export default TPS63802Figure1027LineTransientPwmOperationCircuit;
diff --git a/lib/simulations/TPS63802-Figure-10-28-line-transient-pwm-operation.circuit.tsx b/lib/simulations/TPS63802-Figure-10-28-line-transient-pwm-operation.circuit.tsx
new file mode 100644
index 0000000..02e632c
--- /dev/null
+++ b/lib/simulations/TPS63802-Figure-10-28-line-transient-pwm-operation.circuit.tsx
@@ -0,0 +1,15 @@
+import type { SubcircuitProps } from "@tscircuit/props";
+import { createTPS63802LineTransientFigureCircuit } from "./create-TPS63802-line-transient-figure-circuit";
+
+export const TPS63802Figure1028LineTransientPwmOperationCircuit = (
+ props: SubcircuitProps,
+) =>
+ createTPS63802LineTransientFigureCircuit({
+ ...props,
+ figureName: "Figure 10-28. Line Transient, PWM Operation",
+ inputVoltageHigh: "4.2V",
+ inputVoltageLow: "2.2V",
+ loadResistance: "3.3Ω",
+ });
+
+export default TPS63802Figure1028LineTransientPwmOperationCircuit;
diff --git a/lib/simulations/TPS63802-Figure-10-29-line-transient-pwm-operation.circuit.tsx b/lib/simulations/TPS63802-Figure-10-29-line-transient-pwm-operation.circuit.tsx
new file mode 100644
index 0000000..7b248f4
--- /dev/null
+++ b/lib/simulations/TPS63802-Figure-10-29-line-transient-pwm-operation.circuit.tsx
@@ -0,0 +1,15 @@
+import type { SubcircuitProps } from "@tscircuit/props";
+import { createTPS63802LineTransientFigureCircuit } from "./create-TPS63802-line-transient-figure-circuit";
+
+export const TPS63802Figure1029LineTransientPwmOperationCircuit = (
+ props: SubcircuitProps,
+) =>
+ createTPS63802LineTransientFigureCircuit({
+ ...props,
+ figureName: "Figure 10-29. Line Transient, PWM Operation",
+ inputVoltageHigh: "3.6V",
+ inputVoltageLow: "3V",
+ loadResistance: "6.6Ω",
+ });
+
+export default TPS63802Figure1029LineTransientPwmOperationCircuit;
diff --git a/lib/simulations/TPS63802-Figure-10-3-switching-frequency-vs-input-voltage.circuit.tsx b/lib/simulations/TPS63802-Figure-10-3-switching-frequency-vs-input-voltage.circuit.tsx
new file mode 100644
index 0000000..f5b4240
--- /dev/null
+++ b/lib/simulations/TPS63802-Figure-10-3-switching-frequency-vs-input-voltage.circuit.tsx
@@ -0,0 +1,83 @@
+import type { SubcircuitProps } from "@tscircuit/props";
+import { analog } from "tscircuit";
+import { TPS63802DatasheetApplicationCircuit } from "./create-TPS63802-datasheet-application-circuit";
+import { measureSwitchingFrequencyHz } from "./TPS63802-datasheet-measurements";
+
+const inputVoltages = [
+ "2.5V",
+ "2.7V",
+ "2.9V",
+ "3.1V",
+ "3.3V",
+ "3.5V",
+ "3.7V",
+ "3.9V",
+ "4.1V",
+ "4.3V",
+];
+
+const ConfiguredSwitchingFrequencyCircuit = ({
+ outputVoltage,
+ ...props
+}: SubcircuitProps & { outputVoltage: number }) => (
+
+
+
+
+ measureSwitchingFrequencyHz(getCurrent(".I_L_PROBE")) / 1_000_000
+ }
+ />
+
+
+);
+
+export const TPS63802Figure103SwitchingFrequencyVsInputVoltageCircuit = ({
+ name,
+ ...props
+}: SubcircuitProps) => (
+
+
+
+
+
+);
+
+export default TPS63802Figure103SwitchingFrequencyVsInputVoltageCircuit;
diff --git a/lib/simulations/TPS63802-Figure-10-30-start-up-behavior-from-rising-enable-pfm-operation.circuit.tsx b/lib/simulations/TPS63802-Figure-10-30-start-up-behavior-from-rising-enable-pfm-operation.circuit.tsx
new file mode 100644
index 0000000..4d93f1c
--- /dev/null
+++ b/lib/simulations/TPS63802-Figure-10-30-start-up-behavior-from-rising-enable-pfm-operation.circuit.tsx
@@ -0,0 +1,14 @@
+import type { SubcircuitProps } from "@tscircuit/props";
+import { createTPS63802StartupFigureCircuit } from "./create-TPS63802-startup-figure-circuit";
+
+export const TPS63802Figure1030StartupFromRisingEnablePfmCircuit = (
+ props: SubcircuitProps,
+) =>
+ createTPS63802StartupFigureCircuit({
+ ...props,
+ figureName:
+ "Figure 10-30. Start-up Behavior from Rising Enable, PFM Operation",
+ mode: "pfm",
+ });
+
+export default TPS63802Figure1030StartupFromRisingEnablePfmCircuit;
diff --git a/lib/simulations/TPS63802-Figure-10-31-start-up-behavior-from-rising-enable-pwm-operation.circuit.tsx b/lib/simulations/TPS63802-Figure-10-31-start-up-behavior-from-rising-enable-pwm-operation.circuit.tsx
new file mode 100644
index 0000000..71c7999
--- /dev/null
+++ b/lib/simulations/TPS63802-Figure-10-31-start-up-behavior-from-rising-enable-pwm-operation.circuit.tsx
@@ -0,0 +1,14 @@
+import type { SubcircuitProps } from "@tscircuit/props";
+import { createTPS63802StartupFigureCircuit } from "./create-TPS63802-startup-figure-circuit";
+
+export const TPS63802Figure1031StartupFromRisingEnablePwmCircuit = (
+ props: SubcircuitProps,
+) =>
+ createTPS63802StartupFigureCircuit({
+ ...props,
+ figureName:
+ "Figure 10-31. Start-up Behavior from Rising Enable, PWM Operation",
+ mode: "pwm",
+ });
+
+export default TPS63802Figure1031StartupFromRisingEnablePwmCircuit;
diff --git a/lib/simulations/TPS63802-Figure-10-4-inductor-burst-frequency-vs-output-current.circuit.tsx b/lib/simulations/TPS63802-Figure-10-4-inductor-burst-frequency-vs-output-current.circuit.tsx
new file mode 100644
index 0000000..a0ac155
--- /dev/null
+++ b/lib/simulations/TPS63802-Figure-10-4-inductor-burst-frequency-vs-output-current.circuit.tsx
@@ -0,0 +1,52 @@
+import type { SubcircuitProps } from "@tscircuit/props";
+import { analog } from "tscircuit";
+import { TPS63802DatasheetApplicationCircuit } from "./create-TPS63802-datasheet-application-circuit";
+import { measureBurstFrequencyHz } from "./TPS63802-datasheet-measurements";
+
+export const TPS63802Figure104InductorBurstFrequencyVsOutputCurrentCircuit = (
+ props: SubcircuitProps,
+) => (
+
+
+
+
+
+ measureBurstFrequencyHz(getCurrent(".I_L_PROBE"))
+ }
+ />
+
+
+);
+
+export default TPS63802Figure104InductorBurstFrequencyVsOutputCurrentCircuit;
diff --git a/lib/simulations/TPS63802-Figure-10-5-efficiency-vs-output-current-pfm-pwm.circuit.tsx b/lib/simulations/TPS63802-Figure-10-5-efficiency-vs-output-current-pfm-pwm.circuit.tsx
new file mode 100644
index 0000000..481c509
--- /dev/null
+++ b/lib/simulations/TPS63802-Figure-10-5-efficiency-vs-output-current-pfm-pwm.circuit.tsx
@@ -0,0 +1,14 @@
+import type { SubcircuitProps } from "@tscircuit/props";
+import { createTPS63802EfficiencyVsOutputCurrentFigureCircuit } from "./create-TPS63802-efficiency-vs-output-current-figure-circuit";
+
+export const TPS63802Figure105EfficiencyVsOutputCurrentPfmPwmCircuit = (
+ props: SubcircuitProps,
+) =>
+ createTPS63802EfficiencyVsOutputCurrentFigureCircuit({
+ ...props,
+ figureName: "Figure 10-5. Efficiency vs Output Current (PFM/PWM)",
+ inputVoltages: ["2.5V", "3.6V", "4.2V"],
+ mode: "pfm",
+ });
+
+export default TPS63802Figure105EfficiencyVsOutputCurrentPfmPwmCircuit;
diff --git a/lib/simulations/TPS63802-Figure-10-6-efficiency-vs-output-current-pwm-only.circuit.tsx b/lib/simulations/TPS63802-Figure-10-6-efficiency-vs-output-current-pwm-only.circuit.tsx
new file mode 100644
index 0000000..a781dd6
--- /dev/null
+++ b/lib/simulations/TPS63802-Figure-10-6-efficiency-vs-output-current-pwm-only.circuit.tsx
@@ -0,0 +1,14 @@
+import type { SubcircuitProps } from "@tscircuit/props";
+import { createTPS63802EfficiencyVsOutputCurrentFigureCircuit } from "./create-TPS63802-efficiency-vs-output-current-figure-circuit";
+
+export const TPS63802Figure106EfficiencyVsOutputCurrentPwmOnlyCircuit = (
+ props: SubcircuitProps,
+) =>
+ createTPS63802EfficiencyVsOutputCurrentFigureCircuit({
+ ...props,
+ figureName: "Figure 10-6. Efficiency vs Output Current (PWM Only)",
+ inputVoltages: ["2.5V", "3.6V", "4.2V"],
+ mode: "pwm",
+ });
+
+export default TPS63802Figure106EfficiencyVsOutputCurrentPwmOnlyCircuit;
diff --git a/lib/simulations/TPS63802-Figure-10-7-efficiency-vs-output-current-pfm-pwm.circuit.tsx b/lib/simulations/TPS63802-Figure-10-7-efficiency-vs-output-current-pfm-pwm.circuit.tsx
new file mode 100644
index 0000000..d9fc17f
--- /dev/null
+++ b/lib/simulations/TPS63802-Figure-10-7-efficiency-vs-output-current-pfm-pwm.circuit.tsx
@@ -0,0 +1,14 @@
+import type { SubcircuitProps } from "@tscircuit/props";
+import { createTPS63802EfficiencyVsOutputCurrentFigureCircuit } from "./create-TPS63802-efficiency-vs-output-current-figure-circuit";
+
+export const TPS63802Figure107EfficiencyVsOutputCurrentPfmPwmCircuit = (
+ props: SubcircuitProps,
+) =>
+ createTPS63802EfficiencyVsOutputCurrentFigureCircuit({
+ ...props,
+ figureName: "Figure 10-7. Efficiency vs Output Current (PFM/PWM)",
+ inputVoltages: ["1.8V", "3.3V", "5V"],
+ mode: "pfm",
+ });
+
+export default TPS63802Figure107EfficiencyVsOutputCurrentPfmPwmCircuit;
diff --git a/lib/simulations/TPS63802-Figure-10-8-efficiency-vs-output-current-pwm-only.circuit.tsx b/lib/simulations/TPS63802-Figure-10-8-efficiency-vs-output-current-pwm-only.circuit.tsx
new file mode 100644
index 0000000..9816164
--- /dev/null
+++ b/lib/simulations/TPS63802-Figure-10-8-efficiency-vs-output-current-pwm-only.circuit.tsx
@@ -0,0 +1,14 @@
+import type { SubcircuitProps } from "@tscircuit/props";
+import { createTPS63802EfficiencyVsOutputCurrentFigureCircuit } from "./create-TPS63802-efficiency-vs-output-current-figure-circuit";
+
+export const TPS63802Figure108EfficiencyVsOutputCurrentPwmOnlyCircuit = (
+ props: SubcircuitProps,
+) =>
+ createTPS63802EfficiencyVsOutputCurrentFigureCircuit({
+ ...props,
+ figureName: "Figure 10-8. Efficiency vs Output Current (PWM Only)",
+ inputVoltages: ["1.8V", "3.3V", "5V"],
+ mode: "pwm",
+ });
+
+export default TPS63802Figure108EfficiencyVsOutputCurrentPwmOnlyCircuit;
diff --git a/lib/simulations/TPS63802-Figure-10-9-efficiency-vs-input-voltage-pfm-pwm.circuit.tsx b/lib/simulations/TPS63802-Figure-10-9-efficiency-vs-input-voltage-pfm-pwm.circuit.tsx
new file mode 100644
index 0000000..f4e504b
--- /dev/null
+++ b/lib/simulations/TPS63802-Figure-10-9-efficiency-vs-input-voltage-pfm-pwm.circuit.tsx
@@ -0,0 +1,26 @@
+import type { SubcircuitProps } from "@tscircuit/props";
+import { createTPS63802EfficiencyVsInputVoltageFigureCircuit } from "./create-TPS63802-efficiency-vs-input-voltage-figure-circuit";
+
+export const TPS63802Figure109EfficiencyVsInputVoltagePfmPwmCircuit = (
+ props: SubcircuitProps,
+) =>
+ createTPS63802EfficiencyVsInputVoltageFigureCircuit({
+ ...props,
+ figureName: "Figure 10-9. Efficiency versus Input Voltage (PFM/PWM)",
+ inputVoltages: [
+ "2.5V",
+ "2.7V",
+ "2.9V",
+ "3.1V",
+ "3.3V",
+ "3.5V",
+ "3.7V",
+ "3.9V",
+ "4.1V",
+ "4.2V",
+ ],
+ loadCurrentValues: ["100uA", "10mA", "100mA", "1A", "1.5A"],
+ mode: "pfm",
+ });
+
+export default TPS63802Figure109EfficiencyVsInputVoltagePfmPwmCircuit;
diff --git a/lib/simulations/TPS63802-datasheet-measurements.ts b/lib/simulations/TPS63802-datasheet-measurements.ts
new file mode 100644
index 0000000..7632d04
--- /dev/null
+++ b/lib/simulations/TPS63802-datasheet-measurements.ts
@@ -0,0 +1,135 @@
+import type {
+ AnalogTransientMeasurementContext,
+ TransientMeasurementSeries,
+} from "@tscircuit/props";
+
+export const mean = (values: readonly number[]) =>
+ values.reduce((sum, value) => sum + value, 0) / values.length;
+
+export const meanAbsolute = (values: readonly number[]) =>
+ values.reduce((sum, value) => sum + Math.abs(value), 0) / values.length;
+
+export const measureEfficiencyPercent = ({
+ getCurrent,
+ getVoltage,
+}: AnalogTransientMeasurementContext) => {
+ const inputVoltage = getVoltage("net.VIN").values.slice(-1_000);
+ const outputVoltage = getVoltage("net.VOUT").values.slice(-1_000);
+ const inputCurrent = getCurrent(".I_IN_PROBE").values.slice(-1_000);
+ const outputCurrent = getCurrent(".I_LOAD_PROBE").values.slice(-1_000);
+ const sampleCount = Math.min(
+ inputVoltage.length,
+ outputVoltage.length,
+ inputCurrent.length,
+ outputCurrent.length,
+ );
+ const inputPowers = Array.from(
+ { length: sampleCount },
+ (_, index) => inputVoltage[index]! * inputCurrent[index]!,
+ );
+ const outputPowers = Array.from(
+ { length: sampleCount },
+ (_, index) => outputVoltage[index]! * outputCurrent[index]!,
+ );
+ return (meanAbsolute(outputPowers) / meanAbsolute(inputPowers)) * 100;
+};
+
+const getRange = (values: readonly number[]) => {
+ let minimum = Number.POSITIVE_INFINITY;
+ let maximum = Number.NEGATIVE_INFINITY;
+ for (const value of values) {
+ minimum = Math.min(minimum, value);
+ maximum = Math.max(maximum, value);
+ }
+ return { minimum, maximum };
+};
+
+const getRisingCrossingTimesMs = (
+ series: TransientMeasurementSeries,
+ threshold: number,
+) => {
+ const crossingTimesMs: number[] = [];
+ for (let index = 1; index < series.values.length; index++) {
+ const previousValue = series.values[index - 1]!;
+ const value = series.values[index]!;
+ if (previousValue > threshold || value <= threshold) continue;
+
+ const previousTimeMs = series.timestampsMs[index - 1]!;
+ const timeMs = series.timestampsMs[index]!;
+ const interpolation =
+ value === previousValue
+ ? 0
+ : (threshold - previousValue) / (value - previousValue);
+ crossingTimesMs.push(
+ previousTimeMs + interpolation * (timeMs - previousTimeMs),
+ );
+ }
+ return crossingTimesMs;
+};
+
+const median = (values: readonly number[]) => {
+ const sortedValues = [...values].sort((a, b) => a - b);
+ const middleIndex = Math.floor(sortedValues.length / 2);
+ return sortedValues.length % 2 === 0
+ ? (sortedValues[middleIndex - 1]! + sortedValues[middleIndex]!) / 2
+ : sortedValues[middleIndex]!;
+};
+
+const frequencyFromCrossingTimes = (crossingTimesMs: readonly number[]) => {
+ if (crossingTimesMs.length < 2) {
+ throw new Error("At least two rising crossings are required");
+ }
+ const periodsMs = crossingTimesMs
+ .slice(1)
+ .map((timeMs, index) => timeMs - crossingTimesMs[index]!);
+ return 1_000 / median(periodsMs);
+};
+
+export const measureSwitchingFrequencyHz = (
+ series: TransientMeasurementSeries,
+) => {
+ const settledValues = series.values.slice(
+ Math.floor(series.values.length / 2),
+ );
+ const settledTimestampsMs = series.timestampsMs.slice(
+ Math.floor(series.timestampsMs.length / 2),
+ );
+ const threshold = mean(settledValues);
+ return frequencyFromCrossingTimes(
+ getRisingCrossingTimesMs(
+ { values: settledValues, timestampsMs: settledTimestampsMs },
+ threshold,
+ ),
+ );
+};
+
+export const measureBurstFrequencyHz = (series: TransientMeasurementSeries) => {
+ const settledStartIndex = Math.floor(series.values.length / 2);
+ const settledValues = series.values.slice(settledStartIndex);
+ const settledSeries = {
+ values: settledValues,
+ timestampsMs: series.timestampsMs.slice(settledStartIndex),
+ };
+ const { minimum, maximum } = getRange(settledValues);
+ const crossings = getRisingCrossingTimesMs(
+ settledSeries,
+ minimum + (maximum - minimum) * 0.5,
+ );
+ if (crossings.length < 2) {
+ throw new Error("At least two inductor-current pulses are required");
+ }
+
+ const crossingIntervalsMs = crossings
+ .slice(1)
+ .map((timeMs, index) => timeMs - crossings[index]!);
+ const switchingPeriodMs = Math.min(...crossingIntervalsMs);
+ const burstGapThresholdMs = switchingPeriodMs * 2.5;
+ const burstStarts = crossings.filter(
+ (timeMs, index) =>
+ index === 0 || timeMs - crossings[index - 1]! > burstGapThresholdMs,
+ );
+
+ return frequencyFromCrossingTimes(
+ burstStarts.length >= 2 ? burstStarts : crossings,
+ );
+};
diff --git a/lib/simulations/TPS63802-switching-waveforms-pfm-buck-operation.circuit.tsx b/lib/simulations/TPS63802-switching-waveforms-pfm-buck-operation.circuit.tsx
deleted file mode 100644
index d6e2ed0..0000000
--- a/lib/simulations/TPS63802-switching-waveforms-pfm-buck-operation.circuit.tsx
+++ /dev/null
@@ -1,240 +0,0 @@
-import type { SubcircuitProps } from "@tscircuit/props";
-import { TPS63802DLAR } from "../chips/TPS63802DLAR.circuit.tsx";
-
-export const TPS63802SwitchingWaveformsPfmBuckOperationCircuit = (
- props: SubcircuitProps,
-) => (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-);
-
-export default TPS63802SwitchingWaveformsPfmBuckOperationCircuit;
diff --git a/lib/simulations/__snapshots__/TPS63802-Figure-10-15-switching-waveforms-pfm-boost-operation.circuit-schematic-simulation.snap.svg b/lib/simulations/__snapshots__/TPS63802-Figure-10-15-switching-waveforms-pfm-boost-operation.circuit-schematic-simulation.snap.svg
new file mode 100644
index 0000000..1411131
--- /dev/null
+++ b/lib/simulations/__snapshots__/TPS63802-Figure-10-15-switching-waveforms-pfm-boost-operation.circuit-schematic-simulation.snap.svg
@@ -0,0 +1,44 @@
+
diff --git a/lib/simulations/__snapshots__/TPS63802-Figure-10-15-switching-waveforms-pfm-boost-operation.circuit-simulation.snap.svg b/lib/simulations/__snapshots__/TPS63802-Figure-10-15-switching-waveforms-pfm-boost-operation.circuit-simulation.snap.svg
new file mode 100644
index 0000000..d0ec641
--- /dev/null
+++ b/lib/simulations/__snapshots__/TPS63802-Figure-10-15-switching-waveforms-pfm-boost-operation.circuit-simulation.snap.svg
@@ -0,0 +1,19 @@
+05101518VO2.85 V2.95 V3.05 V3.15 V3.25 V3.35 VL1-21 V-15 V-9 V-3 V3 V9 VL2-15 V-9 V-3 V3 V9 V15 VIL-1 A0 A1 A2 A3 A4 ATime (µs)VO50 mV/div0 div3.15 VL13 V/div0 div-3 VL23 V/div0 div3 VIL500 mA/div0 div2 AFigure 10-15. Switching Waveforms, PFM Boost Operation
\ No newline at end of file
diff --git a/lib/simulations/__snapshots__/TPS63802-Figure-10-16-switching-waveforms-pfm-buck-boost-operation.circuit-schematic-simulation.snap.svg b/lib/simulations/__snapshots__/TPS63802-Figure-10-16-switching-waveforms-pfm-buck-boost-operation.circuit-schematic-simulation.snap.svg
new file mode 100644
index 0000000..7e18900
--- /dev/null
+++ b/lib/simulations/__snapshots__/TPS63802-Figure-10-16-switching-waveforms-pfm-buck-boost-operation.circuit-schematic-simulation.snap.svg
@@ -0,0 +1,44 @@
+U11EN2MODE3AGND4FB5PG6VOUT7L28GND9L110VINV_IN3.3VL1470nHIL_PROBER_L1_DCR7.6mΩC15uFR_CIN_ESR10mΩC28.2uFR_COUT_ESR10mΩR1511kΩR291kΩR3100kΩR_LOAD82.5ΩVINVINVINGNDGNDGNDGNDU1_FBU1_FBVOUTVOUTVIN 1.3V-5.5VVOUT = 3.3VVOUT_PROBEL1_PROBEL2_PROBE0.6730.680.6850.690.696VO2.7 V2.85 V3 V3.15 V3.3 V3.45 VL1-19.5 V-13 V-6.5 V0 V6.5 V13 VL2-11 V-5.5 V0 V5.5 V11 V16.5 VIL-800 mA0 A800 mA1.6 A2.4 A3.2 ATime (ms)VO150 mV/div3 div3.3 VL16.5 V/div2 div0 VL25.5 V/div1 div0 VIL800 mA/div0 div0 AFigure 10-16. Switching Waveforms, PFM Buck-Boost Operation
diff --git a/lib/simulations/__snapshots__/TPS63802-Figure-10-16-switching-waveforms-pfm-buck-boost-operation.circuit-simulation.snap.svg b/lib/simulations/__snapshots__/TPS63802-Figure-10-16-switching-waveforms-pfm-buck-boost-operation.circuit-simulation.snap.svg
new file mode 100644
index 0000000..3c21a35
--- /dev/null
+++ b/lib/simulations/__snapshots__/TPS63802-Figure-10-16-switching-waveforms-pfm-buck-boost-operation.circuit-simulation.snap.svg
@@ -0,0 +1,19 @@
+05101518VO2.85 V2.95 V3.05 V3.15 V3.25 V3.35 V3.45 VL1-21 V-15 V-9 V-3 V3 V9 V15 VL2-15 V-9 V-3 V3 V9 V15 V21 VIL-1 A0 A1 A2 A3 A4 A5 ATime (µs)VO50 mV/div0 div3.15 VL13 V/div0 div-3 VL23 V/div0 div3 VIL500 mA/div0 div2 AFigure 10-16. Switching Waveforms, PFM Buck-Boost Operation
\ No newline at end of file
diff --git a/lib/simulations/__snapshots__/TPS63802-switching-waveforms-pfm-buck-operation.circuit-schematic-simulation.snap.svg b/lib/simulations/__snapshots__/TPS63802-Figure-10-17-switching-waveforms-pfm-buck-operation.circuit-schematic-simulation.snap.svg
similarity index 97%
rename from lib/simulations/__snapshots__/TPS63802-switching-waveforms-pfm-buck-operation.circuit-schematic-simulation.snap.svg
rename to lib/simulations/__snapshots__/TPS63802-Figure-10-17-switching-waveforms-pfm-buck-operation.circuit-schematic-simulation.snap.svg
index 6d41373..8d0f2fb 100644
--- a/lib/simulations/__snapshots__/TPS63802-switching-waveforms-pfm-buck-operation.circuit-schematic-simulation.snap.svg
+++ b/lib/simulations/__snapshots__/TPS63802-Figure-10-17-switching-waveforms-pfm-buck-operation.circuit-schematic-simulation.snap.svg
@@ -4,47 +4,26 @@
.component { fill: none; stroke: rgb(132, 0, 0); }
.chip { fill: rgb(255, 255, 194); stroke: rgb(132, 0, 0); }
.component-pin { fill: none; stroke: rgb(132, 0, 0); }
- /* Basic per-trace hover fallback */
- .trace:hover {
- filter: invert(1);
- }
- .trace:hover .trace-crossing-outline {
- opacity: 0;
- }
- .trace:hover .trace-junction {
- filter: invert(1);
- }
- /* Net-hover highlighting: when a trace or its overlays are hovered,
- invert color for all traces (base + overlays) sharing the same
- subcircuit connectivity key. Also hide crossing outline during hover. */
- svg:has(:is(g.trace[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net1"], g.trace-overlays[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net1"]):hover) :is(g.trace[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net1"], g.trace-overlays[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net1"]) { filter: invert(1); }
-svg:has(:is(g.trace[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net1"], g.trace-overlays[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net1"]):hover) g.trace-overlays[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net1"] .trace-crossing-outline { opacity: 0; }
-svg:has(:is(g.trace[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net2"], g.trace-overlays[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net2"]):hover) :is(g.trace[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net2"], g.trace-overlays[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net2"]) { filter: invert(1); }
-svg:has(:is(g.trace[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net2"], g.trace-overlays[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net2"]):hover) g.trace-overlays[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net2"] .trace-crossing-outline { opacity: 0; }
-svg:has(:is(g.trace[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net5"], g.trace-overlays[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net5"]):hover) :is(g.trace[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net5"], g.trace-overlays[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net5"]) { filter: invert(1); }
-svg:has(:is(g.trace[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net5"], g.trace-overlays[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net5"]):hover) g.trace-overlays[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net5"] .trace-crossing-outline { opacity: 0; }
-svg:has(:is(g.trace[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net6"], g.trace-overlays[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net6"]):hover) :is(g.trace[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net6"], g.trace-overlays[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net6"]) { filter: invert(1); }
-svg:has(:is(g.trace[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net6"], g.trace-overlays[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net6"]):hover) g.trace-overlays[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net6"] .trace-crossing-outline { opacity: 0; }
-svg:has(:is(g.trace[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net7"], g.trace-overlays[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net7"]):hover) :is(g.trace[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net7"], g.trace-overlays[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net7"]) { filter: invert(1); }
-svg:has(:is(g.trace[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net7"], g.trace-overlays[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net7"]):hover) g.trace-overlays[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net7"] .trace-crossing-outline { opacity: 0; }
-svg:has(:is(g.trace[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net3"], g.trace-overlays[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net3"]):hover) :is(g.trace[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net3"], g.trace-overlays[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net3"]) { filter: invert(1); }
-svg:has(:is(g.trace[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net3"], g.trace-overlays[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net3"]):hover) g.trace-overlays[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net3"] .trace-crossing-outline { opacity: 0; }
-svg:has(:is(g.trace[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net8"], g.trace-overlays[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net8"]):hover) :is(g.trace[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net8"], g.trace-overlays[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net8"]) { filter: invert(1); }
-svg:has(:is(g.trace[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net8"], g.trace-overlays[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net8"]):hover) g.trace-overlays[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net8"] .trace-crossing-outline { opacity: 0; }
-svg:has(:is(g.trace[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net9"], g.trace-overlays[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net9"]):hover) :is(g.trace[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net9"], g.trace-overlays[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net9"]) { filter: invert(1); }
-svg:has(:is(g.trace[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net9"], g.trace-overlays[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net9"]):hover) g.trace-overlays[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net9"] .trace-crossing-outline { opacity: 0; }
-svg:has(:is(g.trace[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net10"], g.trace-overlays[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net10"]):hover) :is(g.trace[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net10"], g.trace-overlays[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net10"]) { filter: invert(1); }
-svg:has(:is(g.trace[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net10"], g.trace-overlays[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net10"]):hover) g.trace-overlays[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net10"] .trace-crossing-outline { opacity: 0; }
-svg:has(:is(g.trace[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net4"], g.trace-overlays[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net4"]):hover) :is(g.trace[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net4"], g.trace-overlays[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net4"]) { filter: invert(1); }
-svg:has(:is(g.trace[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net4"], g.trace-overlays[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net4"]):hover) g.trace-overlays[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net4"] .trace-crossing-outline { opacity: 0; }
-svg:has(:is(g.trace[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net0"], g.trace-overlays[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net0"]):hover) :is(g.trace[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net0"], g.trace-overlays[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net0"]) { filter: invert(1); }
-svg:has(:is(g.trace[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net0"], g.trace-overlays[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net0"]):hover) g.trace-overlays[data-subcircuit-connectivity-map-key="unnamedsubcircuitsubcircuit_source_group_0_connectivity_net0"] .trace-crossing-outline { opacity: 0; }
.text { font-family: sans-serif; fill: rgb(0, 150, 0); }
.pin-number { fill: rgb(169, 0, 0); }
.port-label { fill: rgb(0, 100, 100); }
.component-name { fill: rgb(0, 100, 100); }
- U11EN2MODE3AGND4FB5PG6VOUT7L28GND9L110VINV_IN4.2VL1470nHIL_PROBER_L1_DCR7.6mΩC15uFR_CIN_ESR10mΩC28.2uFR_COUT_ESR10mΩR1511kΩR291kΩR3100kΩR_LOAD82.5ΩVINVINVINGNDGNDGNDVOUTVOUTVIN 1.3V-5.5VVOUT = 3.3VVOUT_PROBEL1_PROBEL2_PROBEU11EN2MODE3AGND4FB5PG6VOUT7L28GND9L110VINV_IN4.2VL1470nHIL_PROBER_L1_DCR7.6mΩC15uFR_CIN_ESR10mΩC28.2uFR_COUT_ESR10mΩR1511kΩR291kΩR3100kΩR_LOAD82.5ΩVINVINVINGNDGNDGNDGNDU1_FBU1_FBVOUTVOUTVIN 1.3V-5.5VVOUT = 3.3VVOUT_PROBEL1_PROBEL2_PROBE0.6860.690.6950.70.704VO2.7 V2.85 V3 V3.15 V3.3 V3.45 VL1-19.5 V-13 V-6.5 V0 V6.5 V13 VL2-11 V-5.5 V0 V5.5 V11 V16.5 VIL-800 mA0 A800 mA1.6 A2.4 A3.2 ATime (ms)VO150 mV/div3 div3.3 VL16.5 V/div2 div0 VL25.5 V/div1 div0 VIL800 mA/div0 div0 ATPS63802 Switching Waveforms PFM Buck Operation
\ No newline at end of file
+0.6860.690.6950.70.704VO2.7 V2.85 V3 V3.15 V3.3 V3.45 VL1-19.5 V-13 V-6.5 V0 V6.5 V13 VL2-11 V-5.5 V0 V5.5 V11 V16.5 VIL-800 mA0 A800 mA1.6 A2.4 A3.2 ATime (ms)VO150 mV/div3 div3.3 VL16.5 V/div2 div0 VL25.5 V/div1 div0 VIL800 mA/div0 div0 AFigure 10-17. Switching Waveforms, PFM Buck Operation
\ No newline at end of file
diff --git a/lib/simulations/__snapshots__/TPS63802-Figure-10-17-switching-waveforms-pfm-buck-operation.circuit-simulation.snap.svg b/lib/simulations/__snapshots__/TPS63802-Figure-10-17-switching-waveforms-pfm-buck-operation.circuit-simulation.snap.svg
new file mode 100644
index 0000000..a3170ca
--- /dev/null
+++ b/lib/simulations/__snapshots__/TPS63802-Figure-10-17-switching-waveforms-pfm-buck-operation.circuit-simulation.snap.svg
@@ -0,0 +1,19 @@
+05101518VO2.85 V2.95 V3.05 V3.15 V3.25 V3.35 VL1-21 V-15 V-9 V-3 V3 V9 VL2-15 V-9 V-3 V3 V9 V15 VIL-1 A0 A1 A2 A3 A4 ATime (µs)VO50 mV/div0 div3.15 VL13 V/div0 div-3 VL23 V/div0 div3 VIL500 mA/div0 div2 AFigure 10-17. Switching Waveforms, PFM Buck Operation
\ No newline at end of file
diff --git a/lib/simulations/__snapshots__/TPS63802-Figure-10-18-switching-waveforms-pwm-boost-operation.circuit-simulation.snap.svg b/lib/simulations/__snapshots__/TPS63802-Figure-10-18-switching-waveforms-pwm-boost-operation.circuit-simulation.snap.svg
new file mode 100644
index 0000000..dc48270
--- /dev/null
+++ b/lib/simulations/__snapshots__/TPS63802-Figure-10-18-switching-waveforms-pwm-boost-operation.circuit-simulation.snap.svg
@@ -0,0 +1,19 @@
+05101518VO3.15 V3.19 V3.23 V3.27 V3.31 V3.35 VL1-13 V-7.02 V-1.02 V4.98 V11 V17 VL2-9 V-3 V3 V9 V15 V21 VIL2.4 A3.4 A4.4 A5.4 A6.4 A7.4 ATime (µs)VO20 mV/div0 div3.23 VL13 V/div0 div-1.02 VL23 V/div0 div3 VIL500 mA/div0 div4.4 AFigure 10-18. Switching Waveforms, PWM Boost Operation
\ No newline at end of file
diff --git a/lib/simulations/__snapshots__/TPS63802-Figure-10-19-switching-waveforms-pwm-buck-boost-operation.circuit-simulation.snap.svg b/lib/simulations/__snapshots__/TPS63802-Figure-10-19-switching-waveforms-pwm-buck-boost-operation.circuit-simulation.snap.svg
new file mode 100644
index 0000000..a4b7f95
--- /dev/null
+++ b/lib/simulations/__snapshots__/TPS63802-Figure-10-19-switching-waveforms-pwm-buck-boost-operation.circuit-simulation.snap.svg
@@ -0,0 +1,19 @@
+05101518VO3.12 V3.16 V3.2 V3.24 V3.28 V3.32 V3.36 VL1-21 V-15 V-9 V-3 V3 V9 V15 VL2-15 V-9 V-3 V3 V9 V15 V21 VIL1.4 A2.4 A3.4 A4.4 A5.4 A6.4 A7.4 ATime (µs)VO20 mV/div0 div3.24 VL13 V/div0 div-3 VL23 V/div0 div3 VIL500 mA/div0 div4.4 AFigure 10-19. Switching Waveforms, PWM Buck-Boost Operation
\ No newline at end of file
diff --git a/lib/simulations/__snapshots__/TPS63802-Figure-10-20-switching-waveforms-pwm-buck-operation.circuit-simulation.snap.svg b/lib/simulations/__snapshots__/TPS63802-Figure-10-20-switching-waveforms-pwm-buck-operation.circuit-simulation.snap.svg
new file mode 100644
index 0000000..7df67bd
--- /dev/null
+++ b/lib/simulations/__snapshots__/TPS63802-Figure-10-20-switching-waveforms-pwm-buck-operation.circuit-simulation.snap.svg
@@ -0,0 +1,19 @@
+05101518VO3.12 V3.16 V3.2 V3.24 V3.28 V3.32 VL1-21 V-15 V-9 V-3 V3 V9 VL2-15 V-9 V-3 V3 V9 V15 VIL620 mA1.62 A2.62 A3.62 A4.62 A5.62 ATime (µs)VO20 mV/div0 div3.24 VL13 V/div0 div-3 VL23 V/div0 div3 VIL500 mA/div0 div3.62 AFigure 10-20. Switching Waveforms, PWM Buck Operation
\ No newline at end of file
diff --git a/lib/simulations/__snapshots__/TPS63802-Figure-10-21-load-transient-pfm-pwm-boost-operation.circuit-simulation.snap.svg b/lib/simulations/__snapshots__/TPS63802-Figure-10-21-load-transient-pfm-pwm-boost-operation.circuit-simulation.snap.svg
new file mode 100644
index 0000000..69d68fa
--- /dev/null
+++ b/lib/simulations/__snapshots__/TPS63802-Figure-10-21-load-transient-pfm-pwm-boost-operation.circuit-simulation.snap.svg
@@ -0,0 +1,19 @@
+-2000200400600800VO2.5 V2.7 V2.9 V3.1 V3.3 V3.5 V3.7 VI Load-600 mA200 mA1 A1.8 A2.6 A3.4 A4.2 ATime (µs)VO100 mV/div0 div3.1 VI Load400 mA/div0 div1.8 AFigure 10-21. Load Transient, PFM/PWM Boost Operation
\ No newline at end of file
diff --git a/lib/simulations/__snapshots__/TPS63802-Figure-10-22-load-transient-pfm-pwm-buck-boost-operation.circuit-simulation.snap.svg b/lib/simulations/__snapshots__/TPS63802-Figure-10-22-load-transient-pfm-pwm-buck-boost-operation.circuit-simulation.snap.svg
new file mode 100644
index 0000000..4ced09d
--- /dev/null
+++ b/lib/simulations/__snapshots__/TPS63802-Figure-10-22-load-transient-pfm-pwm-buck-boost-operation.circuit-simulation.snap.svg
@@ -0,0 +1,19 @@
+-2000200400600800VO2.5 V2.7 V2.9 V3.1 V3.3 V3.5 V3.7 VI Load-600 mA200 mA1 A1.8 A2.6 A3.4 A4.2 ATime (µs)VO100 mV/div0 div3.1 VI Load400 mA/div0 div1.8 AFigure 10-22. Load Transient, PFM/PWM Buck-Boost Operation
\ No newline at end of file
diff --git a/lib/simulations/__snapshots__/TPS63802-Figure-10-23-load-transient-pfm-pwm-buck-operation.circuit-simulation.snap.svg b/lib/simulations/__snapshots__/TPS63802-Figure-10-23-load-transient-pfm-pwm-buck-operation.circuit-simulation.snap.svg
new file mode 100644
index 0000000..64fc858
--- /dev/null
+++ b/lib/simulations/__snapshots__/TPS63802-Figure-10-23-load-transient-pfm-pwm-buck-operation.circuit-simulation.snap.svg
@@ -0,0 +1,19 @@
+-2000200400600800VO2.5 V2.7 V2.9 V3.1 V3.3 V3.5 V3.7 VI Load-600 mA200 mA1 A1.8 A2.6 A3.4 A4.2 ATime (µs)VO100 mV/div0 div3.1 VI Load400 mA/div0 div1.8 AFigure 10-23. Load Transient, PFM/PWM Buck Operation
\ No newline at end of file
diff --git a/lib/simulations/__snapshots__/TPS63802-Figure-10-24-load-transient-pwm-boost-operation.circuit-simulation.snap.svg b/lib/simulations/__snapshots__/TPS63802-Figure-10-24-load-transient-pwm-boost-operation.circuit-simulation.snap.svg
new file mode 100644
index 0000000..7b6bb73
--- /dev/null
+++ b/lib/simulations/__snapshots__/TPS63802-Figure-10-24-load-transient-pwm-boost-operation.circuit-simulation.snap.svg
@@ -0,0 +1,19 @@
+-2000200400600800VO2.5 V2.7 V2.9 V3.1 V3.3 V3.5 V3.7 VI Load-600 mA200 mA1 A1.8 A2.6 A3.4 A4.2 ATime (µs)VO100 mV/div0 div3.1 VI Load400 mA/div0 div1.8 AFigure 10-24. Load Transient, PWM Boost Operation
\ No newline at end of file
diff --git a/lib/simulations/__snapshots__/TPS63802-Figure-10-25-load-transient-pwm-buck-boost-operation.circuit-simulation.snap.svg b/lib/simulations/__snapshots__/TPS63802-Figure-10-25-load-transient-pwm-buck-boost-operation.circuit-simulation.snap.svg
new file mode 100644
index 0000000..46c08f4
--- /dev/null
+++ b/lib/simulations/__snapshots__/TPS63802-Figure-10-25-load-transient-pwm-buck-boost-operation.circuit-simulation.snap.svg
@@ -0,0 +1,19 @@
+-2000200400600800VO2.5 V2.7 V2.9 V3.1 V3.3 V3.5 V3.7 VI Load-600 mA200 mA1 A1.8 A2.6 A3.4 A4.2 ATime (µs)VO100 mV/div0 div3.1 VI Load400 mA/div0 div1.8 AFigure 10-25. Load Transient, PWM Buck-Boost Operation
\ No newline at end of file
diff --git a/lib/simulations/__snapshots__/TPS63802-Figure-10-26-load-transient-pwm-buck-operation.circuit-simulation.snap.svg b/lib/simulations/__snapshots__/TPS63802-Figure-10-26-load-transient-pwm-buck-operation.circuit-simulation.snap.svg
new file mode 100644
index 0000000..73be864
--- /dev/null
+++ b/lib/simulations/__snapshots__/TPS63802-Figure-10-26-load-transient-pwm-buck-operation.circuit-simulation.snap.svg
@@ -0,0 +1,19 @@
+-2000200400600800VO2.5 V2.7 V2.9 V3.1 V3.3 V3.5 V3.7 VI Load-600 mA200 mA1 A1.8 A2.6 A3.4 A4.2 ATime (µs)VO100 mV/div0 div3.1 VI Load400 mA/div0 div1.8 AFigure 10-26. Load Transient, PWM Buck Operation
\ No newline at end of file
diff --git a/lib/simulations/__snapshots__/TPS63802-Figure-10-27-line-transient-pwm-operation.circuit-simulation.snap.svg b/lib/simulations/__snapshots__/TPS63802-Figure-10-27-line-transient-pwm-operation.circuit-simulation.snap.svg
new file mode 100644
index 0000000..57e936a
--- /dev/null
+++ b/lib/simulations/__snapshots__/TPS63802-Figure-10-27-line-transient-pwm-operation.circuit-simulation.snap.svg
@@ -0,0 +1,19 @@
+-2000200400600800VO2.7 V3.2 V3.7 V4.2 VVI1.2 V3.7 V6.2 V8.7 VTime (µs)VO100 mV/div1 div3.3 VVI500 mV/div-1 div3.2 VFigure 10-27. Line Transient, PWM Operation
\ No newline at end of file
diff --git a/lib/simulations/__snapshots__/TPS63802-Figure-10-28-line-transient-pwm-operation.circuit-simulation.snap.svg b/lib/simulations/__snapshots__/TPS63802-Figure-10-28-line-transient-pwm-operation.circuit-simulation.snap.svg
new file mode 100644
index 0000000..2d7046d
--- /dev/null
+++ b/lib/simulations/__snapshots__/TPS63802-Figure-10-28-line-transient-pwm-operation.circuit-simulation.snap.svg
@@ -0,0 +1,19 @@
+-2000200400600800VO2.7 V3.2 V3.7 V4.2 VVI1.2 V3.7 V6.2 V8.7 VTime (µs)VO100 mV/div1 div3.3 VVI500 mV/div-1 div3.2 VFigure 10-28. Line Transient, PWM Operation
\ No newline at end of file
diff --git a/lib/simulations/__snapshots__/TPS63802-Figure-10-29-line-transient-pwm-operation.circuit-simulation.snap.svg b/lib/simulations/__snapshots__/TPS63802-Figure-10-29-line-transient-pwm-operation.circuit-simulation.snap.svg
new file mode 100644
index 0000000..4465ebb
--- /dev/null
+++ b/lib/simulations/__snapshots__/TPS63802-Figure-10-29-line-transient-pwm-operation.circuit-simulation.snap.svg
@@ -0,0 +1,19 @@
+-2000200400600800VO3 V3.2 V3.4 V3.6 V3.8 VVI2.8 V3.8 V4.8 V5.8 V6.8 VTime (µs)VO100 mV/div1 div3.3 VVI500 mV/div-1 div3.3 VFigure 10-29. Line Transient, PWM Operation
\ No newline at end of file
diff --git a/lib/simulations/__snapshots__/TPS63802-Figure-10-30-start-up-behavior-from-rising-enable-pfm-operation.circuit-simulation.snap.svg b/lib/simulations/__snapshots__/TPS63802-Figure-10-30-start-up-behavior-from-rising-enable-pfm-operation.circuit-simulation.snap.svg
new file mode 100644
index 0000000..3bf08dd
--- /dev/null
+++ b/lib/simulations/__snapshots__/TPS63802-Figure-10-30-start-up-behavior-from-rising-enable-pfm-operation.circuit-simulation.snap.svg
@@ -0,0 +1,19 @@
+0200400600800VO-12.3 V-8.35 V-4.35 V-350 mV3.65 V7.65 VEN-7.9 V-3.9 V100 mV4.1 V8.1 V12.1 VPG-3.9 V100 mV4.1 V8.1 V12.1 V16.1 VIL-10.5 A-4.5 A1.5 A7.5 A13.5 A19.5 ATime (µs)VO2 V/div3 div1.65 VEN2 V/div1 div2.1 VPG2 V/div-1 div2.1 VIL3 A/div0 div1.5 AFigure 10-30. Start-up Behavior from Rising Enable, PFM Operation
\ No newline at end of file
diff --git a/lib/simulations/__snapshots__/TPS63802-Figure-10-31-start-up-behavior-from-rising-enable-pwm-operation.circuit-simulation.snap.svg b/lib/simulations/__snapshots__/TPS63802-Figure-10-31-start-up-behavior-from-rising-enable-pwm-operation.circuit-simulation.snap.svg
new file mode 100644
index 0000000..dd1b731
--- /dev/null
+++ b/lib/simulations/__snapshots__/TPS63802-Figure-10-31-start-up-behavior-from-rising-enable-pwm-operation.circuit-simulation.snap.svg
@@ -0,0 +1,19 @@
+0200400600800VO-12.3 V-8.35 V-4.35 V-350 mV3.65 V7.65 VEN-7.9 V-3.9 V100 mV4.1 V8.1 V12.1 VPG-3.9 V100 mV4.1 V8.1 V12.1 V16.1 VIL-10.5 A-4.5 A1.5 A7.5 A13.5 A19.5 ATime (µs)VO2 V/div3 div1.65 VEN2 V/div1 div2.1 VPG2 V/div-1 div2.1 VIL3 A/div0 div1.5 AFigure 10-31. Start-up Behavior from Rising Enable, PWM Operation
\ No newline at end of file
diff --git a/lib/simulations/__snapshots__/TPS63802-switching-waveforms-pfm-buck-operation.circuit-simulation.snap.svg b/lib/simulations/__snapshots__/TPS63802-switching-waveforms-pfm-buck-operation.circuit-simulation.snap.svg
deleted file mode 100644
index 02102b1..0000000
--- a/lib/simulations/__snapshots__/TPS63802-switching-waveforms-pfm-buck-operation.circuit-simulation.snap.svg
+++ /dev/null
@@ -1,19 +0,0 @@
-0.6860.690.6950.70.704VO2.7 V2.85 V3 V3.15 V3.3 V3.45 VL1-19.5 V-13 V-6.5 V0 V6.5 V13 VL2-11 V-5.5 V0 V5.5 V11 V16.5 VIL-800 mA0 A800 mA1.6 A2.4 A3.2 ATime (ms)VO150 mV/div3 div3.3 VL16.5 V/div2 div0 VL25.5 V/div1 div0 VIL800 mA/div0 div0 ATPS63802 Switching Waveforms PFM Buck Operation
\ No newline at end of file
diff --git a/lib/simulations/combine-measurement-series-for-graph.ts b/lib/simulations/combine-measurement-series-for-graph.ts
new file mode 100644
index 0000000..17ab001
--- /dev/null
+++ b/lib/simulations/combine-measurement-series-for-graph.ts
@@ -0,0 +1,22 @@
+import type { SimulationMeasurementResult } from "circuit-json";
+
+export const combineMeasurementSeriesForGraph = (
+ measurementResults: SimulationMeasurementResult[],
+) => {
+ const firstResult = measurementResults[0];
+ if (!firstResult) {
+ throw new Error("At least one measurement result is required");
+ }
+
+ const simulationExperimentId = firstResult.simulation_experiment_id;
+ const combinedResults = measurementResults.map((result, index) => ({
+ ...result,
+ simulation_measurement_result_id: `${result.simulation_measurement_result_id}_combined_${index}`,
+ simulation_experiment_id: simulationExperimentId,
+ }));
+
+ return {
+ simulationExperimentId,
+ combinedResults,
+ };
+};
diff --git a/lib/simulations/create-TPS63802-datasheet-application-circuit.tsx b/lib/simulations/create-TPS63802-datasheet-application-circuit.tsx
new file mode 100644
index 0000000..781f96d
--- /dev/null
+++ b/lib/simulations/create-TPS63802-datasheet-application-circuit.tsx
@@ -0,0 +1,423 @@
+import type {
+ CurrentSourceProps,
+ SubcircuitProps,
+ VoltageSourceProps,
+} from "@tscircuit/props";
+import type { ReactNode } from "react";
+import { TPS63802DLAR } from "../chips/TPS63802DLAR.circuit";
+
+type VoltageGraphDisplay = {
+ graphCenter?: number;
+ graphVerticalOffset?: number | string;
+ graphVoltagePerDiv?: number | string;
+};
+
+type CurrentGraphDisplay = {
+ graphCenter?: number;
+ graphCurrentPerDiv?: number | string;
+ graphVerticalOffset?: number | string;
+};
+
+type TPS63802DatasheetApplicationCircuitProps = SubcircuitProps & {
+ children: ReactNode;
+ enableVoltageGraphDisplay?: VoltageGraphDisplay;
+ enableVoltageWaveform?: VoltageSourceProps["voltageWaveform"];
+ inductorCurrentGraphDisplay?: CurrentGraphDisplay;
+ inputVoltage?: number | string;
+ inputVoltageGraphDisplay?: VoltageGraphDisplay;
+ inputVoltageWaveform?: VoltageSourceProps["voltageWaveform"];
+ loadCurrent?: number | string;
+ loadCurrentGraphDisplay?: CurrentGraphDisplay;
+ loadCurrentWaveform?: CurrentSourceProps["currentWaveform"];
+ loadEnableTime?: number | string;
+ loadResistance?: number | string;
+ mode: "pfm" | "pwm";
+ outputVoltage?: number;
+ probeEnableVoltage?: boolean;
+ probeFeedbackVoltage?: boolean;
+ probeInductorCurrent?: boolean;
+ probeInputCurrent?: boolean;
+ probeInputVoltage?: boolean;
+ probeLoadCurrent?: boolean;
+ probePowerGoodVoltage?: boolean;
+ outputVoltageGraphDisplay?: VoltageGraphDisplay;
+ powerGoodVoltageGraphDisplay?: VoltageGraphDisplay;
+};
+
+export const TPS63802DatasheetApplicationCircuit = ({
+ children,
+ enableVoltageGraphDisplay,
+ enableVoltageWaveform,
+ inductorCurrentGraphDisplay,
+ inputVoltage,
+ inputVoltageGraphDisplay,
+ inputVoltageWaveform,
+ loadCurrent = "100mA",
+ loadCurrentGraphDisplay,
+ loadCurrentWaveform,
+ loadEnableTime,
+ loadResistance,
+ mode,
+ outputVoltage = 3.3,
+ probeEnableVoltage = false,
+ probeFeedbackVoltage = false,
+ probeInductorCurrent = false,
+ probeInputCurrent = false,
+ probeInputVoltage = false,
+ probeLoadCurrent = false,
+ probePowerGoodVoltage = false,
+ outputVoltageGraphDisplay,
+ powerGoodVoltageGraphDisplay,
+ ...props
+}: TPS63802DatasheetApplicationCircuitProps) => {
+ const feedbackBottomResistance = 91_000;
+ const recommendedFeedbackTopResistance = new Map([
+ [2.5, 365_000],
+ [3.3, 511_000],
+ [3.6, 562_000],
+ [5, 806_000],
+ ]);
+ const feedbackTopResistance =
+ recommendedFeedbackTopResistance.get(outputVoltage) ??
+ feedbackBottomResistance * (outputVoltage / 0.5 - 1);
+ // TPS63802 Section 8.3 specifies the effective capacitances used by the
+ // converter after tolerance and DC-bias derating. Tables 10-3, 10-4, and
+ // 10-6 list the corresponding nominal 10 µF and 22 µF Murata parts.
+ const inputCapacitance = "5uF";
+ const outputCapacitance = outputVoltage <= 3.6 ? "8.2uF" : "16.4uF";
+
+ return (
+
+
+
+
+
+
+
+
+
+
+ {inputVoltage !== undefined && (
+
+ )}
+ {inputVoltage !== undefined && (
+ <>
+
+
+ >
+ )}
+
+ {probeInputCurrent && (
+
+ )}
+
+ {enableVoltageWaveform ? (
+ <>
+
+ >
+ ) : (
+
+ )}
+
+
+ {probeInductorCurrent && (
+
+ )}
+ {!probeInductorCurrent && }
+
+
+ {/* TPS63802 Tables 10-3 and 10-4 specify 10 mΩ ESR for the
+ GRM188R60J106ME84 input and GRM188R60J226MEA0 output capacitors. */}
+
+
+
+
+
+
+
+
+
+
+
+ {loadResistance === undefined && loadEnableTime !== undefined && (
+
+ )}
+ {loadResistance === undefined &&
+ loadEnableTime !== undefined &&
+ probeLoadCurrent && (
+
+ )}
+ {loadResistance === undefined &&
+ loadEnableTime === undefined &&
+ probeLoadCurrent && (
+
+ )}
+ {loadResistance === undefined &&
+ loadEnableTime === undefined &&
+ !probeLoadCurrent && }
+ {loadResistance === undefined && loadEnableTime !== undefined && (
+
+ )}
+ {loadResistance !== undefined && probeLoadCurrent && (
+
+ )}
+ {loadResistance !== undefined && !probeLoadCurrent && (
+
+ )}
+ {loadResistance === undefined ? (
+
+ ) : (
+ <>
+
+ {loadCurrentWaveform && (
+
+ )}
+ >
+ )}
+
+ {mode === "pwm" ? (
+
+ ) : (
+
+ )}
+
+
+
+
+ {probeInputVoltage && (
+
+ )}
+ {probeFeedbackVoltage && (
+
+ )}
+ {probeEnableVoltage && (
+
+ )}
+ {probePowerGoodVoltage && (
+
+ )}
+
+ {children}
+
+ );
+};
diff --git a/lib/simulations/create-TPS63802-efficiency-vs-input-voltage-figure-circuit.tsx b/lib/simulations/create-TPS63802-efficiency-vs-input-voltage-figure-circuit.tsx
new file mode 100644
index 0000000..5c85ce5
--- /dev/null
+++ b/lib/simulations/create-TPS63802-efficiency-vs-input-voltage-figure-circuit.tsx
@@ -0,0 +1,70 @@
+import type { SubcircuitProps } from "@tscircuit/props";
+import { analog } from "tscircuit";
+import { TPS63802DatasheetApplicationCircuit } from "./create-TPS63802-datasheet-application-circuit";
+import { measureEfficiencyPercent } from "./TPS63802-datasheet-measurements";
+
+type TPS63802EfficiencyVsInputVoltageFigureCircuitProps = SubcircuitProps & {
+ figureName: string;
+ inputVoltages: string[];
+ loadCurrentValues?: string[];
+ mode: "pfm" | "pwm";
+ outputVoltage?: number;
+ seriesName?: string;
+};
+
+export const createTPS63802EfficiencyVsInputVoltageFigureCircuit = ({
+ figureName,
+ inputVoltages,
+ loadCurrentValues,
+ mode,
+ outputVoltage = 3.3,
+ seriesName,
+ ...props
+}: TPS63802EfficiencyVsInputVoltageFigureCircuitProps) => (
+ // TI's official model omits quiescent-current behavior, so low-load
+ // efficiency cannot reproduce the bench curves quantitatively.
+
+
+ {loadCurrentValues && (
+
+ )}
+
+
+
+
+);
diff --git a/lib/simulations/create-TPS63802-efficiency-vs-output-current-figure-circuit.tsx b/lib/simulations/create-TPS63802-efficiency-vs-output-current-figure-circuit.tsx
new file mode 100644
index 0000000..879590e
--- /dev/null
+++ b/lib/simulations/create-TPS63802-efficiency-vs-output-current-figure-circuit.tsx
@@ -0,0 +1,61 @@
+import type { SubcircuitProps } from "@tscircuit/props";
+import { analog } from "tscircuit";
+import { TPS63802DatasheetApplicationCircuit } from "./create-TPS63802-datasheet-application-circuit";
+import { measureEfficiencyPercent } from "./TPS63802-datasheet-measurements";
+
+type TPS63802EfficiencyVsOutputCurrentFigureCircuitProps = SubcircuitProps & {
+ figureName: string;
+ inputVoltages: string[];
+ mode: "pfm" | "pwm";
+};
+
+export const createTPS63802EfficiencyVsOutputCurrentFigureCircuit = ({
+ figureName,
+ inputVoltages,
+ mode,
+ ...props
+}: TPS63802EfficiencyVsOutputCurrentFigureCircuitProps) => (
+ // TI's official model omits quiescent-current behavior, so low-load
+ // efficiency cannot reproduce the bench curves quantitatively.
+
+
+
+
+
+
+
+);
diff --git a/lib/simulations/create-TPS63802-line-regulation-figure-circuit.tsx b/lib/simulations/create-TPS63802-line-regulation-figure-circuit.tsx
new file mode 100644
index 0000000..d9e0d32
--- /dev/null
+++ b/lib/simulations/create-TPS63802-line-regulation-figure-circuit.tsx
@@ -0,0 +1,66 @@
+import type { SubcircuitProps } from "@tscircuit/props";
+import { analog } from "tscircuit";
+import { TPS63802DatasheetApplicationCircuit } from "./create-TPS63802-datasheet-application-circuit";
+import { mean } from "./TPS63802-datasheet-measurements";
+
+type TPS63802LineRegulationFigureCircuitProps = SubcircuitProps & {
+ figureName: string;
+ mode: "pfm" | "pwm";
+ outputVoltage: number;
+};
+
+export const createTPS63802LineRegulationFigureCircuit = ({
+ figureName,
+ mode,
+ outputVoltage,
+ ...props
+}: TPS63802LineRegulationFigureCircuitProps) => (
+
+
+
+
+ ((mean(getVoltage(".V_FB_PROBE").values.slice(-1_000)) - 0.5) / 0.5) *
+ 100
+ }
+ />
+
+
+);
diff --git a/lib/simulations/create-TPS63802-line-transient-figure-circuit.tsx b/lib/simulations/create-TPS63802-line-transient-figure-circuit.tsx
new file mode 100644
index 0000000..3767ea8
--- /dev/null
+++ b/lib/simulations/create-TPS63802-line-transient-figure-circuit.tsx
@@ -0,0 +1,58 @@
+import type { SubcircuitProps } from "@tscircuit/props";
+import { analog } from "tscircuit";
+import { TPS63802DatasheetApplicationCircuit } from "./create-TPS63802-datasheet-application-circuit";
+
+type TPS63802LineTransientFigureCircuitProps = SubcircuitProps & {
+ figureName: string;
+ inputVoltageHigh: string;
+ inputVoltageLow: string;
+ loadResistance: string;
+};
+
+export const createTPS63802LineTransientFigureCircuit = ({
+ figureName,
+ inputVoltageHigh,
+ inputVoltageLow,
+ loadResistance,
+ ...props
+}: TPS63802LineTransientFigureCircuitProps) => {
+ const inputVoltageCenter =
+ (Number.parseFloat(inputVoltageLow) + Number.parseFloat(inputVoltageHigh)) /
+ 2;
+
+ return (
+
+
+
+ );
+};
diff --git a/lib/simulations/create-TPS63802-load-regulation-figure-circuit.tsx b/lib/simulations/create-TPS63802-load-regulation-figure-circuit.tsx
new file mode 100644
index 0000000..386ef9f
--- /dev/null
+++ b/lib/simulations/create-TPS63802-load-regulation-figure-circuit.tsx
@@ -0,0 +1,59 @@
+import type { SubcircuitProps } from "@tscircuit/props";
+import { analog } from "tscircuit";
+import { TPS63802DatasheetApplicationCircuit } from "./create-TPS63802-datasheet-application-circuit";
+
+const mean = (values: readonly number[]) =>
+ values.reduce((sum, value) => sum + value, 0) / values.length;
+
+type TPS63802LoadRegulationFigureCircuitProps = SubcircuitProps & {
+ figureName: string;
+ mode: "pfm" | "pwm";
+};
+
+export const createTPS63802LoadRegulationFigureCircuit = ({
+ figureName,
+ mode,
+ ...props
+}: TPS63802LoadRegulationFigureCircuitProps) => (
+
+
+
+
+ {
+ const settledOutput = getVoltage("net.VOUT").values;
+ return ((mean(settledOutput.slice(-1_000)) - 3.3) / 3.3) * 100;
+ }}
+ />
+
+
+);
diff --git a/lib/simulations/create-TPS63802-load-transient-figure-circuit.tsx b/lib/simulations/create-TPS63802-load-transient-figure-circuit.tsx
new file mode 100644
index 0000000..c9fa9d2
--- /dev/null
+++ b/lib/simulations/create-TPS63802-load-transient-figure-circuit.tsx
@@ -0,0 +1,56 @@
+import type { SubcircuitProps } from "@tscircuit/props";
+import { analog } from "tscircuit";
+import { TPS63802DatasheetApplicationCircuit } from "./create-TPS63802-datasheet-application-circuit";
+
+type TPS63802LoadTransientFigureCircuitProps = SubcircuitProps & {
+ figureName: string;
+ inputVoltage: string;
+ mode: "pfm" | "pwm";
+};
+
+export const createTPS63802LoadTransientFigureCircuit = ({
+ figureName,
+ inputVoltage,
+ mode,
+ ...props
+}: TPS63802LoadTransientFigureCircuitProps) => (
+
+
+
+);
diff --git a/lib/simulations/create-TPS63802-startup-figure-circuit.tsx b/lib/simulations/create-TPS63802-startup-figure-circuit.tsx
new file mode 100644
index 0000000..10d1a75
--- /dev/null
+++ b/lib/simulations/create-TPS63802-startup-figure-circuit.tsx
@@ -0,0 +1,64 @@
+import type { SubcircuitProps } from "@tscircuit/props";
+import { analog } from "tscircuit";
+import { TPS63802DatasheetApplicationCircuit } from "./create-TPS63802-datasheet-application-circuit";
+
+type TPS63802StartupFigureCircuitProps = SubcircuitProps & {
+ figureName: string;
+ mode: "pfm" | "pwm";
+};
+
+export const createTPS63802StartupFigureCircuit = ({
+ figureName,
+ mode,
+ ...props
+}: TPS63802StartupFigureCircuitProps) => (
+ // The figures specify VI = 4.2 V. Their "100 mΩ resistive load" annotation
+ // would demand 33 A at 3.3 V and cannot describe the plotted startup, so use
+ // the 10 mA load specified by Table 10-7.
+
+
+
+);
diff --git a/lib/simulations/create-TPS63802-switching-waveforms-figure-circuit.tsx b/lib/simulations/create-TPS63802-switching-waveforms-figure-circuit.tsx
new file mode 100644
index 0000000..94da05f
--- /dev/null
+++ b/lib/simulations/create-TPS63802-switching-waveforms-figure-circuit.tsx
@@ -0,0 +1,278 @@
+import type { SubcircuitProps } from "@tscircuit/props";
+import { analog } from "tscircuit";
+import { TPS63802DLAR } from "../chips/TPS63802DLAR.circuit.tsx";
+
+type TPS63802SwitchingWaveformsFigureCircuitProps = SubcircuitProps & {
+ duration: string;
+ figureName: string;
+ inputVoltage: string;
+ inductorCurrentCenter?: number;
+ l1Center?: number;
+ loadCurrent?: string;
+ mode?: "pfm" | "pwm";
+ outputVoltageCenter?: number;
+ startTime: string;
+};
+
+export const createTPS63802SwitchingWaveformsFigureCircuit = ({
+ duration,
+ figureName,
+ inputVoltage,
+ inductorCurrentCenter,
+ l1Center,
+ loadCurrent = "40mA",
+ mode = "pfm",
+ outputVoltageCenter,
+ startTime,
+ ...props
+}: TPS63802SwitchingWaveformsFigureCircuitProps) => {
+ const isPwm = mode === "pwm";
+ const voltageCenter = outputVoltageCenter ?? (isPwm ? 3.24 : 3.15);
+ const currentCenter = inductorCurrentCenter ?? (isPwm ? 4.4 : 2);
+ const l1DisplayCenter = l1Center ?? -3;
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+ {/* TPS63802 Tables 10-3 and 10-4 specify 10 mΩ ESR for both selected
+ Murata capacitors. */}
+
+
+ 2.3 V. Table 10-6 obtains it from the nominal 22 µF Murata
+ // part after tolerance and DC-bias derating.
+ capacitance="8.2uF"
+ footprint="0603"
+ schX={5.5}
+ schY={-1}
+ schOrientation="vertical"
+ />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {mode === "pwm" ? (
+
+ ) : (
+
+ )}
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
diff --git a/package.json b/package.json
index ac6abe7..eeb6c99 100644
--- a/package.json
+++ b/package.json
@@ -23,8 +23,10 @@
},
"devDependencies": {
"@biomejs/biome": "^2.4.16",
+ "@types/bun": "^1.2.8",
"@types/react": "^19.2.17",
- "tscircuit": "^0.0.2139",
+ "@tscircuit/ngspice-spice-engine": "0.0.20",
+ "tscircuit": "^0.0.2170",
"typescript": "^5.0.0"
},
"peerDependencies": {
diff --git a/tests/TPS63802-Figure-10-11-load-regulation-pwm-only.test.tsx b/tests/TPS63802-Figure-10-11-load-regulation-pwm-only.test.tsx
new file mode 100644
index 0000000..3dc45db
--- /dev/null
+++ b/tests/TPS63802-Figure-10-11-load-regulation-pwm-only.test.tsx
@@ -0,0 +1,91 @@
+import { expect, test } from "bun:test";
+import { writeFileSync } from "node:fs";
+import { convertCircuitJsonToSimulationGraphSvg } from "circuit-to-svg";
+import type { SpiceEngine } from "@tscircuit/props";
+import { Circuit } from "tscircuit";
+import { TPS63802Figure1011LoadRegulationPwmOnlyCircuit } from "../lib/simulations/TPS63802-Figure-10-11-load-regulation-pwm-only.circuit";
+import { TPS63802Figure1012LoadRegulationPfmPwmCircuit } from "../lib/simulations/TPS63802-Figure-10-12-load-regulation-pfm-pwm.circuit";
+import { createCdnNgspiceSpiceEngine } from "../lib/spice/create-encrypted-pspice-ngspice-engine";
+
+const fixtureEngine: SpiceEngine = {
+ async simulate(spiceString) {
+ const probeMetadata = spiceString.match(
+ /^\* tscircuit_probe (\{.+\})$/m,
+ )?.[1];
+ if (!probeMetadata) throw new Error("VOUT probe metadata is missing");
+ const probe = JSON.parse(probeMetadata) as {
+ simulation_voltage_probe_id: string;
+ };
+ return {
+ simulationResultCircuitJson: [
+ {
+ type: "simulation_transient_voltage_graph",
+ simulation_transient_voltage_graph_id: "fixture_vout",
+ simulation_experiment_id: "fixture",
+ source_probe_id: probe.simulation_voltage_probe_id,
+ timestamps_ms: [673, 696],
+ voltage_levels: [3.3, 3.3],
+ time_per_step: 23,
+ start_time_ms: 673,
+ end_time_ms: 696,
+ },
+ ],
+ };
+ },
+};
+
+const renderLoadRegulationFigure = async ({
+ circuitElement,
+ outputPath,
+}: {
+ circuitElement: React.ReactElement;
+ outputPath: string;
+}) => {
+ const spiceEngine =
+ process.env.RUN_TPS63802_DATASHEET_SIMULATIONS === "1"
+ ? createCdnNgspiceSpiceEngine()
+ : fixtureEngine;
+ const circuit = new Circuit({
+ platform: {
+ spiceEngineMap: {
+ ngspice: spiceEngine,
+ },
+ },
+ });
+ circuit.add(circuitElement);
+
+ await circuit.renderUntilSettled();
+
+ expect(circuit.db.simulation_unknown_experiment_error.list()).toHaveLength(0);
+ const measurement = circuit.db.simulation_measurement_result.list()[0];
+ expect(measurement?.measurement_values).toHaveLength(12);
+
+ const experiment = circuit.db.simulation_experiment.list()[0]!;
+ const svg = convertCircuitJsonToSimulationGraphSvg({
+ circuitJson: circuit.getCircuitJson(),
+ simulation_experiment_id: experiment.simulation_experiment_id,
+ simulation_result_ids: [measurement!.simulation_measurement_result_id],
+ });
+
+ writeFileSync(outputPath, svg);
+ expect(svg).toContain("Output Current (A)");
+ expect(svg).toContain("Output Voltage Accuracy (%)");
+};
+
+test("Figure 10-11. Load Regulation (PWM Only)", async () => {
+ await renderLoadRegulationFigure({
+ circuitElement: (
+
+ ),
+ outputPath: "/tmp/TPS63802-Figure-10-11.svg",
+ });
+}, 1_000_000);
+
+test("Figure 10-12. Load Regulation (PFM/PWM)", async () => {
+ await renderLoadRegulationFigure({
+ circuitElement: (
+
+ ),
+ outputPath: "/tmp/TPS63802-Figure-10-12.svg",
+ });
+}, 1_000_000);
diff --git a/tests/TPS63802-datasheet-waveform-snapshots.test.tsx b/tests/TPS63802-datasheet-waveform-snapshots.test.tsx
new file mode 100644
index 0000000..040ab2b
--- /dev/null
+++ b/tests/TPS63802-datasheet-waveform-snapshots.test.tsx
@@ -0,0 +1,258 @@
+import { expect, test } from "bun:test";
+import { existsSync, readFileSync, writeFileSync } from "node:fs";
+import { join, resolve } from "node:path";
+import { convertCircuitJsonToSimulationGraphSvg } from "circuit-to-svg";
+import { Circuit } from "tscircuit";
+import Figure1015 from "../lib/simulations/TPS63802-Figure-10-15-switching-waveforms-pfm-boost-operation.circuit";
+import Figure1016 from "../lib/simulations/TPS63802-Figure-10-16-switching-waveforms-pfm-buck-boost-operation.circuit";
+import Figure1017 from "../lib/simulations/TPS63802-Figure-10-17-switching-waveforms-pfm-buck-operation.circuit";
+import Figure1018 from "../lib/simulations/TPS63802-Figure-10-18-switching-waveforms-pwm-boost-operation.circuit";
+import Figure1019 from "../lib/simulations/TPS63802-Figure-10-19-switching-waveforms-pwm-buck-boost-operation.circuit";
+import Figure1020 from "../lib/simulations/TPS63802-Figure-10-20-switching-waveforms-pwm-buck-operation.circuit";
+import Figure1021 from "../lib/simulations/TPS63802-Figure-10-21-load-transient-pfm-pwm-boost-operation.circuit";
+import Figure1022 from "../lib/simulations/TPS63802-Figure-10-22-load-transient-pfm-pwm-buck-boost-operation.circuit";
+import Figure1023 from "../lib/simulations/TPS63802-Figure-10-23-load-transient-pfm-pwm-buck-operation.circuit";
+import Figure1024 from "../lib/simulations/TPS63802-Figure-10-24-load-transient-pwm-boost-operation.circuit";
+import Figure1025 from "../lib/simulations/TPS63802-Figure-10-25-load-transient-pwm-buck-boost-operation.circuit";
+import Figure1026 from "../lib/simulations/TPS63802-Figure-10-26-load-transient-pwm-buck-operation.circuit";
+import Figure1027 from "../lib/simulations/TPS63802-Figure-10-27-line-transient-pwm-operation.circuit";
+import Figure1028 from "../lib/simulations/TPS63802-Figure-10-28-line-transient-pwm-operation.circuit";
+import Figure1029 from "../lib/simulations/TPS63802-Figure-10-29-line-transient-pwm-operation.circuit";
+import Figure1030 from "../lib/simulations/TPS63802-Figure-10-30-start-up-behavior-from-rising-enable-pfm-operation.circuit";
+import Figure1031 from "../lib/simulations/TPS63802-Figure-10-31-start-up-behavior-from-rising-enable-pwm-operation.circuit";
+import { createCdnNgspiceSpiceEngine } from "../lib/spice/create-encrypted-pspice-ngspice-engine";
+
+const datasheetSimulationTest =
+ process.env.RUN_TPS63802_DATASHEET_SIMULATIONS === "1" ? test : test.skip;
+const updateSnapshots = process.env.UPDATE_TPS63802_DATASHEET_SNAPSHOTS === "1";
+const useSimulationCache =
+ process.env.CACHE_TPS63802_DATASHEET_SIMULATIONS === "1";
+const snapshotDirectory = resolve(
+ import.meta.dir,
+ "../lib/simulations/__snapshots__",
+);
+
+type WaveformFigure = {
+ currentGraphCount: number;
+ element: React.ReactElement;
+ name: string;
+ slug: string;
+ voltageGraphCount: number;
+ xAxisOffsetMs: number;
+ xAxisTimeUnit: "us";
+};
+
+const figures: WaveformFigure[] = [
+ {
+ name: "Figure 10-15. Switching Waveforms, PFM Boost Operation",
+ slug: "TPS63802-Figure-10-15-switching-waveforms-pfm-boost-operation",
+ element: ,
+ voltageGraphCount: 3,
+ currentGraphCount: 1,
+ xAxisOffsetMs: -0.686,
+ xAxisTimeUnit: "us",
+ },
+ {
+ name: "Figure 10-16. Switching Waveforms, PFM Buck-Boost Operation",
+ slug: "TPS63802-Figure-10-16-switching-waveforms-pfm-buck-boost-operation",
+ element: ,
+ voltageGraphCount: 3,
+ currentGraphCount: 1,
+ xAxisOffsetMs: -0.682,
+ xAxisTimeUnit: "us",
+ },
+ {
+ name: "Figure 10-17. Switching Waveforms, PFM Buck Operation",
+ slug: "TPS63802-Figure-10-17-switching-waveforms-pfm-buck-operation",
+ element: ,
+ voltageGraphCount: 3,
+ currentGraphCount: 1,
+ xAxisOffsetMs: -0.686,
+ xAxisTimeUnit: "us",
+ },
+ {
+ name: "Figure 10-18. Switching Waveforms, PWM Boost Operation",
+ slug: "TPS63802-Figure-10-18-switching-waveforms-pwm-boost-operation",
+ element: ,
+ voltageGraphCount: 3,
+ currentGraphCount: 1,
+ xAxisOffsetMs: -0.686,
+ xAxisTimeUnit: "us",
+ },
+ {
+ name: "Figure 10-19. Switching Waveforms, PWM Buck-Boost Operation",
+ slug: "TPS63802-Figure-10-19-switching-waveforms-pwm-buck-boost-operation",
+ element: ,
+ voltageGraphCount: 3,
+ currentGraphCount: 1,
+ xAxisOffsetMs: -0.678,
+ xAxisTimeUnit: "us",
+ },
+ {
+ name: "Figure 10-20. Switching Waveforms, PWM Buck Operation",
+ slug: "TPS63802-Figure-10-20-switching-waveforms-pwm-buck-operation",
+ element: ,
+ voltageGraphCount: 3,
+ currentGraphCount: 1,
+ xAxisOffsetMs: -0.686,
+ xAxisTimeUnit: "us",
+ },
+ {
+ name: "Figure 10-21. Load Transient, PFM/PWM Boost Operation",
+ slug: "TPS63802-Figure-10-21-load-transient-pfm-pwm-boost-operation",
+ element: ,
+ voltageGraphCount: 1,
+ currentGraphCount: 1,
+ xAxisOffsetMs: -0.75,
+ xAxisTimeUnit: "us",
+ },
+ {
+ name: "Figure 10-22. Load Transient, PFM/PWM Buck-Boost Operation",
+ slug: "TPS63802-Figure-10-22-load-transient-pfm-pwm-buck-boost-operation",
+ element: ,
+ voltageGraphCount: 1,
+ currentGraphCount: 1,
+ xAxisOffsetMs: -0.75,
+ xAxisTimeUnit: "us",
+ },
+ {
+ name: "Figure 10-23. Load Transient, PFM/PWM Buck Operation",
+ slug: "TPS63802-Figure-10-23-load-transient-pfm-pwm-buck-operation",
+ element: ,
+ voltageGraphCount: 1,
+ currentGraphCount: 1,
+ xAxisOffsetMs: -0.75,
+ xAxisTimeUnit: "us",
+ },
+ {
+ name: "Figure 10-24. Load Transient, PWM Boost Operation",
+ slug: "TPS63802-Figure-10-24-load-transient-pwm-boost-operation",
+ element: ,
+ voltageGraphCount: 1,
+ currentGraphCount: 1,
+ xAxisOffsetMs: -0.75,
+ xAxisTimeUnit: "us",
+ },
+ {
+ name: "Figure 10-25. Load Transient, PWM Buck-Boost Operation",
+ slug: "TPS63802-Figure-10-25-load-transient-pwm-buck-boost-operation",
+ element: ,
+ voltageGraphCount: 1,
+ currentGraphCount: 1,
+ xAxisOffsetMs: -0.75,
+ xAxisTimeUnit: "us",
+ },
+ {
+ name: "Figure 10-26. Load Transient, PWM Buck Operation",
+ slug: "TPS63802-Figure-10-26-load-transient-pwm-buck-operation",
+ element: ,
+ voltageGraphCount: 1,
+ currentGraphCount: 1,
+ xAxisOffsetMs: -0.75,
+ xAxisTimeUnit: "us",
+ },
+ {
+ name: "Figure 10-27. Line Transient, PWM Operation",
+ slug: "TPS63802-Figure-10-27-line-transient-pwm-operation",
+ element: ,
+ voltageGraphCount: 2,
+ currentGraphCount: 0,
+ xAxisOffsetMs: -0.75,
+ xAxisTimeUnit: "us",
+ },
+ {
+ name: "Figure 10-28. Line Transient, PWM Operation",
+ slug: "TPS63802-Figure-10-28-line-transient-pwm-operation",
+ element: ,
+ voltageGraphCount: 2,
+ currentGraphCount: 0,
+ xAxisOffsetMs: -0.75,
+ xAxisTimeUnit: "us",
+ },
+ {
+ name: "Figure 10-29. Line Transient, PWM Operation",
+ slug: "TPS63802-Figure-10-29-line-transient-pwm-operation",
+ element: ,
+ voltageGraphCount: 2,
+ currentGraphCount: 0,
+ xAxisOffsetMs: -0.75,
+ xAxisTimeUnit: "us",
+ },
+ {
+ name: "Figure 10-30. Start-up Behavior from Rising Enable, PFM Operation",
+ slug: "TPS63802-Figure-10-30-start-up-behavior-from-rising-enable-pfm-operation",
+ element: ,
+ voltageGraphCount: 3,
+ currentGraphCount: 1,
+ xAxisOffsetMs: -0.301,
+ xAxisTimeUnit: "us",
+ },
+ {
+ name: "Figure 10-31. Start-up Behavior from Rising Enable, PWM Operation",
+ slug: "TPS63802-Figure-10-31-start-up-behavior-from-rising-enable-pwm-operation",
+ element: ,
+ voltageGraphCount: 3,
+ currentGraphCount: 1,
+ xAxisOffsetMs: -0.301,
+ xAxisTimeUnit: "us",
+ },
+];
+
+const renderFigure = async (figure: WaveformFigure) => {
+ const outputPath = updateSnapshots
+ ? join(snapshotDirectory, `${figure.slug}.circuit-simulation.snap.svg`)
+ : `/tmp/${figure.slug}.svg`;
+ const circuit = new Circuit({
+ platform: {
+ spiceEngineMap: {
+ ngspice: {
+ async simulate(spiceString) {
+ writeFileSync(`/tmp/${figure.slug}.spice`, spiceString);
+ const cachePath = `/tmp/${figure.slug}.engine-cache.json`;
+ if (useSimulationCache && existsSync(cachePath)) {
+ const cached = JSON.parse(readFileSync(cachePath, "utf8"));
+ if (cached.spiceString === spiceString) {
+ return cached.result;
+ }
+ }
+
+ const result =
+ await createCdnNgspiceSpiceEngine().simulate(spiceString);
+ if (useSimulationCache) {
+ writeFileSync(cachePath, JSON.stringify({ spiceString, result }));
+ }
+ return result;
+ },
+ },
+ },
+ },
+ });
+ circuit.add(figure.element);
+ await circuit.renderUntilSettled();
+
+ expect(circuit.db.simulation_unknown_experiment_error.list()).toEqual([]);
+ expect(circuit.db.simulation_transient_voltage_graph.list()).toHaveLength(
+ figure.voltageGraphCount,
+ );
+ expect(circuit.db.simulation_transient_current_graph.list()).toHaveLength(
+ figure.currentGraphCount,
+ );
+
+ const experiment = circuit.db.simulation_experiment.list()[0]!;
+ const circuitJson = circuit.getCircuitJson();
+ writeFileSync(
+ `/tmp/${figure.slug}.circuit.json`,
+ JSON.stringify(circuitJson),
+ );
+ const svg = convertCircuitJsonToSimulationGraphSvg({
+ circuitJson,
+ simulation_experiment_id: experiment.simulation_experiment_id,
+ x_axis_offset_ms: figure.xAxisOffsetMs,
+ x_axis_time_unit: figure.xAxisTimeUnit,
+ });
+ writeFileSync(outputPath, svg);
+};
+
+for (const figure of figures) {
+ datasheetSimulationTest(figure.name, () => renderFigure(figure), 3_600_000);
+}
diff --git a/tests/TPS63802-efficiency-vs-input-voltage-figures.test.tsx b/tests/TPS63802-efficiency-vs-input-voltage-figures.test.tsx
new file mode 100644
index 0000000..a3cccb4
--- /dev/null
+++ b/tests/TPS63802-efficiency-vs-input-voltage-figures.test.tsx
@@ -0,0 +1,182 @@
+import { expect, test } from "bun:test";
+import { writeFileSync } from "node:fs";
+import { convertCircuitJsonToSimulationGraphSvg } from "circuit-to-svg";
+import type { AnyCircuitElementInput } from "circuit-json";
+import type { SpiceEngine } from "@tscircuit/props";
+import { Circuit } from "tscircuit";
+import TPS63802Figure1010EfficiencyVsInputVoltagePwmOnlyCircuit from "../lib/simulations/TPS63802-Figure-10-10-efficiency-vs-input-voltage-pwm-only.circuit";
+import TPS63802Figure105EfficiencyVsOutputCurrentPfmPwmCircuit from "../lib/simulations/TPS63802-Figure-10-5-efficiency-vs-output-current-pfm-pwm.circuit";
+import TPS63802Figure106EfficiencyVsOutputCurrentPwmOnlyCircuit from "../lib/simulations/TPS63802-Figure-10-6-efficiency-vs-output-current-pwm-only.circuit";
+import TPS63802Figure107EfficiencyVsOutputCurrentPfmPwmCircuit from "../lib/simulations/TPS63802-Figure-10-7-efficiency-vs-output-current-pfm-pwm.circuit";
+import TPS63802Figure108EfficiencyVsOutputCurrentPwmOnlyCircuit from "../lib/simulations/TPS63802-Figure-10-8-efficiency-vs-output-current-pwm-only.circuit";
+import TPS63802Figure109EfficiencyVsInputVoltagePfmPwmCircuit from "../lib/simulations/TPS63802-Figure-10-9-efficiency-vs-input-voltage-pfm-pwm.circuit";
+import { combineMeasurementSeriesForGraph } from "../lib/simulations/combine-measurement-series-for-graph";
+
+const efficiencyFixtureEngine: SpiceEngine = {
+ async simulate(spiceString) {
+ const probes = Array.from(
+ spiceString.matchAll(/^\* tscircuit(?:_current)?_probe (\{.+\})$/gm),
+ (match) =>
+ JSON.parse(match[1]!) as {
+ name: string;
+ simulation_current_probe_id?: string;
+ simulation_voltage_probe_id?: string;
+ },
+ );
+ const simulationResultCircuitJson: AnyCircuitElementInput[] = [];
+ for (const [index, probe] of probes.entries()) {
+ if (probe.simulation_voltage_probe_id) {
+ simulationResultCircuitJson.push({
+ type: "simulation_transient_voltage_graph",
+ simulation_transient_voltage_graph_id: `fixture_voltage_${index}`,
+ simulation_experiment_id: "fixture",
+ source_probe_id: probe.simulation_voltage_probe_id,
+ timestamps_ms: [0, 1],
+ voltage_levels: probe.name === "V_IN_PROBE" ? [3.6, 3.6] : [3.3, 3.3],
+ time_per_step: 1,
+ start_time_ms: 0,
+ end_time_ms: 1,
+ } as AnyCircuitElementInput);
+ }
+ if (probe.simulation_current_probe_id) {
+ simulationResultCircuitJson.push({
+ type: "simulation_transient_current_graph",
+ simulation_transient_current_graph_id: `fixture_current_${index}`,
+ simulation_experiment_id: "fixture",
+ source_probe_id: probe.simulation_current_probe_id,
+ timestamps_ms: [0, 1],
+ current_levels: probe.name === "I_IN_PROBE" ? [1, 1] : [0.9, 0.9],
+ time_per_step: 1,
+ start_time_ms: 0,
+ end_time_ms: 1,
+ } as AnyCircuitElementInput);
+ }
+ }
+ return { simulationResultCircuitJson };
+ },
+};
+
+const renderEfficiencyFigure = async ({
+ circuitElement,
+ outputPath,
+ xAxisScale,
+}: {
+ circuitElement: React.ReactElement;
+ outputPath: string;
+ xAxisScale?: "linear" | "logarithmic";
+}) => {
+ const circuit = new Circuit({
+ platform: { spiceEngineMap: { ngspice: efficiencyFixtureEngine } },
+ });
+ circuit.add(circuitElement);
+ await circuit.renderUntilSettled();
+
+ expect(circuit.db.simulation_unknown_experiment_error.list()).toHaveLength(0);
+ const measurements = circuit.db.simulation_measurement_result.list();
+ const { combinedResults, simulationExperimentId } =
+ combineMeasurementSeriesForGraph(measurements);
+ const svg = convertCircuitJsonToSimulationGraphSvg({
+ circuitJson: [...circuit.getCircuitJson(), ...combinedResults],
+ simulation_experiment_id: simulationExperimentId,
+ simulation_result_ids: combinedResults.map(
+ (result) => result.simulation_measurement_result_id,
+ ),
+ x_axis_scale: xAxisScale,
+ y_axis_title: "Efficiency (%)",
+ });
+ writeFileSync(outputPath, svg);
+ return { measurements, svg };
+};
+
+test("Figure 10-5. Efficiency versus Output Current (PFM/PWM)", async () => {
+ const { measurements, svg } = await renderEfficiencyFigure({
+ circuitElement: (
+
+ ),
+ outputPath: "/tmp/TPS63802-Figure-10-5.svg",
+ xAxisScale: "logarithmic",
+ });
+
+ expect(measurements[0]?.measurement_values).toHaveLength(18);
+ expect(svg).toContain("Output Current (A)");
+ expect(svg).toContain(">Input Voltage");
+ expect(svg).toContain(">2.5V");
+ expect(svg).toContain(">4.2V");
+});
+
+test("Figure 10-6. Efficiency versus Output Current (PWM Only)", async () => {
+ const { measurements, svg } = await renderEfficiencyFigure({
+ circuitElement: (
+
+ ),
+ outputPath: "/tmp/TPS63802-Figure-10-6.svg",
+ xAxisScale: "logarithmic",
+ });
+
+ expect(measurements[0]?.measurement_values).toHaveLength(18);
+ expect(svg).toContain("Output Current (A)");
+});
+
+test("Figure 10-7. Efficiency versus Output Current (PFM/PWM)", async () => {
+ const { measurements, svg } = await renderEfficiencyFigure({
+ circuitElement: (
+
+ ),
+ outputPath: "/tmp/TPS63802-Figure-10-7.svg",
+ xAxisScale: "logarithmic",
+ });
+
+ expect(measurements[0]?.measurement_values).toHaveLength(18);
+ expect(svg).toContain(">Input Voltage");
+ expect(svg).toContain(">1.8V");
+ expect(svg).toContain(">5V");
+});
+
+test("Figure 10-8. Efficiency versus Output Current (PWM Only)", async () => {
+ const { measurements, svg } = await renderEfficiencyFigure({
+ circuitElement: (
+
+ ),
+ outputPath: "/tmp/TPS63802-Figure-10-8.svg",
+ xAxisScale: "logarithmic",
+ });
+
+ expect(measurements[0]?.measurement_values).toHaveLength(18);
+ expect(svg).toContain("Output Current (A)");
+});
+
+test("Figure 10-9. Efficiency versus Input Voltage (PFM/PWM)", async () => {
+ const { measurements, svg } = await renderEfficiencyFigure({
+ circuitElement: (
+
+ ),
+ outputPath: "/tmp/TPS63802-Figure-10-9.svg",
+ });
+
+ expect(measurements).toHaveLength(1);
+ expect(measurements[0]?.measurement_values).toHaveLength(50);
+ expect(measurements[0]?.measurement_values[0]).toBeCloseTo(82.5, 6);
+ expect(svg).toContain("Input Voltage (V)");
+ expect(svg).toContain(">Output");
+ expect(svg).toContain(">Current");
+ expect(svg).toContain(">0.0001A");
+ expect(svg).toContain("Efficiency (%)");
+});
+
+test("Figure 10-10. Efficiency versus Input Voltage (PWM Only)", async () => {
+ const { measurements, svg } = await renderEfficiencyFigure({
+ circuitElement: (
+
+ ),
+ outputPath: "/tmp/TPS63802-Figure-10-10.svg",
+ });
+
+ expect(measurements).toHaveLength(3);
+ expect(
+ measurements.flatMap((measurement) => measurement.measurement_values),
+ ).toHaveLength(24);
+ expect(svg).toContain("VO = 1.8 V");
+ expect(svg).toContain("VO = 3.3 V");
+ expect(svg).toContain("VO = 5.2 V");
+ expect(svg).toContain("Efficiency (%)");
+});
diff --git a/tests/TPS63802-frequency-figures.test.tsx b/tests/TPS63802-frequency-figures.test.tsx
new file mode 100644
index 0000000..d714bd6
--- /dev/null
+++ b/tests/TPS63802-frequency-figures.test.tsx
@@ -0,0 +1,148 @@
+import { expect, test } from "bun:test";
+import { writeFileSync } from "node:fs";
+import { convertCircuitJsonToSimulationGraphSvg } from "circuit-to-svg";
+import type { AnyCircuitElementInput } from "circuit-json";
+import type { SpiceEngine } from "@tscircuit/props";
+import { Circuit } from "tscircuit";
+import TPS63802Figure103SwitchingFrequencyVsInputVoltageCircuit from "../lib/simulations/TPS63802-Figure-10-3-switching-frequency-vs-input-voltage.circuit";
+import TPS63802Figure104InductorBurstFrequencyVsOutputCurrentCircuit from "../lib/simulations/TPS63802-Figure-10-4-inductor-burst-frequency-vs-output-current.circuit";
+import { combineMeasurementSeriesForGraph } from "../lib/simulations/combine-measurement-series-for-graph";
+
+const createFrequencyFixtureEngine = ({
+ frequencyHz,
+ sampleCount,
+ timePerStepMs,
+}: {
+ frequencyHz: number;
+ sampleCount: number;
+ timePerStepMs: number;
+}): SpiceEngine => ({
+ async simulate(spiceString) {
+ const probes = Array.from(
+ spiceString.matchAll(/^\* tscircuit(?:_current)?_probe (\{.+\})$/gm),
+ (match) =>
+ JSON.parse(match[1]!) as {
+ simulation_current_probe_id?: string;
+ simulation_voltage_probe_id?: string;
+ },
+ );
+ const timestampsMs = Array.from(
+ { length: sampleCount },
+ (_, index) => index * timePerStepMs,
+ );
+
+ const simulationResultCircuitJson: AnyCircuitElementInput[] = [];
+ for (const [index, probe] of probes.entries()) {
+ if (probe.simulation_voltage_probe_id) {
+ simulationResultCircuitJson.push({
+ type: "simulation_transient_voltage_graph",
+ simulation_transient_voltage_graph_id: `fixture_voltage_${index}`,
+ simulation_experiment_id: "fixture",
+ source_probe_id: probe.simulation_voltage_probe_id,
+ timestamps_ms: timestampsMs,
+ voltage_levels: timestampsMs.map(() => 3.3),
+ time_per_step: timePerStepMs,
+ start_time_ms: timestampsMs[0]!,
+ end_time_ms: timestampsMs.at(-1)!,
+ } as AnyCircuitElementInput);
+ }
+ if (probe.simulation_current_probe_id) {
+ simulationResultCircuitJson.push({
+ type: "simulation_transient_current_graph",
+ simulation_transient_current_graph_id: `fixture_current_${index}`,
+ simulation_experiment_id: "fixture",
+ source_probe_id: probe.simulation_current_probe_id,
+ timestamps_ms: timestampsMs,
+ current_levels: timestampsMs.map(
+ (timeMs) =>
+ 1 + 0.5 * Math.sin(2 * Math.PI * frequencyHz * (timeMs / 1_000)),
+ ),
+ time_per_step: timePerStepMs,
+ start_time_ms: timestampsMs[0]!,
+ end_time_ms: timestampsMs.at(-1)!,
+ } as AnyCircuitElementInput);
+ }
+ }
+ return { simulationResultCircuitJson };
+ },
+});
+
+const renderFigure = async ({
+ circuitElement,
+ fixtureEngine,
+ outputPath,
+ xAxisScale,
+}: {
+ circuitElement: React.ReactElement;
+ fixtureEngine: SpiceEngine;
+ outputPath: string;
+ xAxisScale?: "linear" | "logarithmic";
+}) => {
+ const circuit = new Circuit({
+ platform: { spiceEngineMap: { ngspice: fixtureEngine } },
+ });
+ circuit.add(circuitElement);
+ await circuit.renderUntilSettled();
+
+ expect(circuit.db.simulation_unknown_experiment_error.list()).toHaveLength(0);
+ const measurements = circuit.db.simulation_measurement_result.list();
+ const { combinedResults, simulationExperimentId } =
+ combineMeasurementSeriesForGraph(measurements);
+ const svg = convertCircuitJsonToSimulationGraphSvg({
+ circuitJson: [...circuit.getCircuitJson(), ...combinedResults],
+ simulation_experiment_id: simulationExperimentId,
+ simulation_result_ids: combinedResults.map(
+ (result) => result.simulation_measurement_result_id,
+ ),
+ x_axis_scale: xAxisScale,
+ y_axis_title:
+ combinedResults[0]?.measurement_unit === "MHz"
+ ? "Switching Frequency (MHz)"
+ : "PFM Burst Frequency (Hz)",
+ });
+ writeFileSync(outputPath, svg);
+ return { measurements, svg };
+};
+
+test("Figure 10-3. Typical Inductor Switching Frequency versus Input Voltage", async () => {
+ const { measurements, svg } = await renderFigure({
+ circuitElement: (
+
+ ),
+ fixtureEngine: createFrequencyFixtureEngine({
+ frequencyHz: 2_000_000,
+ sampleCount: 1_001,
+ timePerStepMs: 0.00002,
+ }),
+ outputPath: "/tmp/TPS63802-Figure-10-3.svg",
+ });
+
+ expect(measurements).toHaveLength(3);
+ expect(
+ measurements.flatMap((measurement) => measurement.measurement_values),
+ ).toHaveLength(30);
+ expect(measurements[0]?.measurement_values[0]).toBeCloseTo(2, 6);
+ expect(svg).toContain("Input Voltage (V)");
+ expect(svg).toContain("Switching Frequency (MHz)");
+});
+
+test("Figure 10-4. Typical Inductor Burst Frequency versus Output Current", async () => {
+ const { measurements, svg } = await renderFigure({
+ circuitElement: (
+
+ ),
+ fixtureEngine: createFrequencyFixtureEngine({
+ frequencyHz: 50_000,
+ sampleCount: 1_001,
+ timePerStepMs: 0.0002,
+ }),
+ outputPath: "/tmp/TPS63802-Figure-10-4.svg",
+ xAxisScale: "logarithmic",
+ });
+
+ expect(measurements).toHaveLength(1);
+ expect(measurements[0]?.measurement_values).toHaveLength(15);
+ expect(measurements[0]?.measurement_values[0]).toBeCloseTo(50_000, -1);
+ expect(svg).toContain("Output Current (A)");
+ expect(svg).toContain("PFM Burst Frequency (Hz)");
+});
diff --git a/tests/TPS63802-line-regulation-figures.test.tsx b/tests/TPS63802-line-regulation-figures.test.tsx
new file mode 100644
index 0000000..44000c4
--- /dev/null
+++ b/tests/TPS63802-line-regulation-figures.test.tsx
@@ -0,0 +1,100 @@
+import { expect, test } from "bun:test";
+import { writeFileSync } from "node:fs";
+import { convertCircuitJsonToSimulationGraphSvg } from "circuit-to-svg";
+import type { AnyCircuitElementInput } from "circuit-json";
+import type { SpiceEngine } from "@tscircuit/props";
+import { Circuit } from "tscircuit";
+import TPS63802Figure1013LineRegulationPwmOnlyCircuit from "../lib/simulations/TPS63802-Figure-10-13-line-regulation-pwm-only.circuit";
+import TPS63802Figure1014LineRegulationPfmPwmCircuit from "../lib/simulations/TPS63802-Figure-10-14-line-regulation-pfm-pwm.circuit";
+import { combineMeasurementSeriesForGraph } from "../lib/simulations/combine-measurement-series-for-graph";
+
+const lineRegulationFixtureEngine: SpiceEngine = {
+ async simulate(spiceString) {
+ const probes = Array.from(
+ spiceString.matchAll(/^\* tscircuit_probe (\{.+\})$/gm),
+ (match) =>
+ JSON.parse(match[1]!) as {
+ name: string;
+ simulation_voltage_probe_id: string;
+ },
+ );
+ const simulationResultCircuitJson = probes.map(
+ (probe, index) =>
+ ({
+ type: "simulation_transient_voltage_graph",
+ simulation_transient_voltage_graph_id: `fixture_voltage_${index}`,
+ simulation_experiment_id: "fixture",
+ source_probe_id: probe.simulation_voltage_probe_id,
+ timestamps_ms: [0, 1],
+ voltage_levels:
+ probe.name === "V_FB_PROBE" ? [0.4995, 0.4995] : [3.3, 3.3],
+ time_per_step: 1,
+ start_time_ms: 0,
+ end_time_ms: 1,
+ }) as AnyCircuitElementInput,
+ );
+ return { simulationResultCircuitJson };
+ },
+};
+
+const renderLineRegulationFigure = async ({
+ circuitElement,
+ outputPath,
+}: {
+ circuitElement: React.ReactElement;
+ outputPath: string;
+}) => {
+ const circuit = new Circuit({
+ platform: { spiceEngineMap: { ngspice: lineRegulationFixtureEngine } },
+ });
+ circuit.add(circuitElement);
+ await circuit.renderUntilSettled();
+
+ expect(circuit.db.simulation_unknown_experiment_error.list()).toHaveLength(0);
+ const measurements = circuit.db.simulation_measurement_result.list();
+ const { combinedResults, simulationExperimentId } =
+ combineMeasurementSeriesForGraph(measurements);
+ const svg = convertCircuitJsonToSimulationGraphSvg({
+ circuitJson: [...circuit.getCircuitJson(), ...combinedResults],
+ simulation_experiment_id: simulationExperimentId,
+ simulation_result_ids: combinedResults.map(
+ (result) => result.simulation_measurement_result_id,
+ ),
+ y_axis_title: "Output Voltage Regulation (%)",
+ });
+ writeFileSync(outputPath, svg);
+ return { measurements, svg };
+};
+
+test("Figure 10-13. Line Regulation (PWM Only)", async () => {
+ const { measurements, svg } = await renderLineRegulationFigure({
+ circuitElement: (
+
+ ),
+ outputPath: "/tmp/TPS63802-Figure-10-13.svg",
+ });
+
+ expect(measurements).toHaveLength(3);
+ expect(
+ measurements.flatMap((measurement) => measurement.measurement_values),
+ ).toHaveLength(30);
+ expect(svg).toContain("VO = 1.8 V");
+ expect(svg).toContain("VO = 3.3 V");
+ expect(svg).toContain("VO = 5.2 V");
+ expect(svg).toContain("Output Voltage Regulation (%)");
+});
+
+test("Figure 10-14. Line Regulation (PFM/PWM)", async () => {
+ const { measurements, svg } = await renderLineRegulationFigure({
+ circuitElement: (
+
+ ),
+ outputPath: "/tmp/TPS63802-Figure-10-14.svg",
+ });
+
+ expect(measurements).toHaveLength(3);
+ expect(
+ measurements.flatMap((measurement) => measurement.measurement_values),
+ ).toHaveLength(30);
+ expect(svg).toContain("Output Voltage Regulation (%)");
+});
diff --git a/tests/TPS63802-load-and-line-transient-figures.test.tsx b/tests/TPS63802-load-and-line-transient-figures.test.tsx
new file mode 100644
index 0000000..7431ee6
--- /dev/null
+++ b/tests/TPS63802-load-and-line-transient-figures.test.tsx
@@ -0,0 +1,158 @@
+import { expect, test } from "bun:test";
+import type { AnyCircuitElementInput } from "circuit-json";
+import type { SpiceEngine } from "@tscircuit/props";
+import { Circuit } from "tscircuit";
+import Figure1021 from "../lib/simulations/TPS63802-Figure-10-21-load-transient-pfm-pwm-boost-operation.circuit";
+import Figure1022 from "../lib/simulations/TPS63802-Figure-10-22-load-transient-pfm-pwm-buck-boost-operation.circuit";
+import Figure1023 from "../lib/simulations/TPS63802-Figure-10-23-load-transient-pfm-pwm-buck-operation.circuit";
+import Figure1024 from "../lib/simulations/TPS63802-Figure-10-24-load-transient-pwm-boost-operation.circuit";
+import Figure1025 from "../lib/simulations/TPS63802-Figure-10-25-load-transient-pwm-buck-boost-operation.circuit";
+import Figure1026 from "../lib/simulations/TPS63802-Figure-10-26-load-transient-pwm-buck-operation.circuit";
+import Figure1027 from "../lib/simulations/TPS63802-Figure-10-27-line-transient-pwm-operation.circuit";
+import Figure1028 from "../lib/simulations/TPS63802-Figure-10-28-line-transient-pwm-operation.circuit";
+import Figure1029 from "../lib/simulations/TPS63802-Figure-10-29-line-transient-pwm-operation.circuit";
+
+const timestampsMs = [0.65, 0.75, 1.15, 1.45];
+
+const transientFixtureEngine: SpiceEngine = {
+ async simulate(spiceString) {
+ const probes = Array.from(
+ spiceString.matchAll(/^\* tscircuit(?:_current)?_probe (\{.+\})$/gm),
+ (match) =>
+ JSON.parse(match[1]!) as {
+ name: string;
+ simulation_current_probe_id?: string;
+ simulation_voltage_probe_id?: string;
+ },
+ );
+ const simulationResultCircuitJson: AnyCircuitElementInput[] = [];
+ for (const [index, probe] of probes.entries()) {
+ if (probe.simulation_voltage_probe_id) {
+ simulationResultCircuitJson.push({
+ type: "simulation_transient_voltage_graph",
+ simulation_transient_voltage_graph_id: `fixture_voltage_${index}`,
+ simulation_experiment_id: "fixture",
+ source_probe_id: probe.simulation_voltage_probe_id,
+ timestamps_ms: timestampsMs,
+ voltage_levels:
+ probe.name === "V_IN_PROBE"
+ ? [2.2, 4.2, 4.2, 2.2]
+ : [3.3, 3.25, 3.3, 3.35],
+ time_per_step: 0.1,
+ start_time_ms: timestampsMs[0]!,
+ end_time_ms: timestampsMs.at(-1)!,
+ } as AnyCircuitElementInput);
+ }
+ if (probe.simulation_current_probe_id) {
+ simulationResultCircuitJson.push({
+ type: "simulation_transient_current_graph",
+ simulation_transient_current_graph_id: `fixture_current_${index}`,
+ simulation_experiment_id: "fixture",
+ source_probe_id: probe.simulation_current_probe_id,
+ timestamps_ms: timestampsMs,
+ current_levels: [0.1, 1, 1, 0.1],
+ time_per_step: 0.1,
+ start_time_ms: timestampsMs[0]!,
+ end_time_ms: timestampsMs.at(-1)!,
+ } as AnyCircuitElementInput);
+ }
+ }
+ return { simulationResultCircuitJson };
+ },
+};
+
+const verifyTransientFigure = async ({
+ circuitElement,
+ currentGraphCount,
+ voltageGraphCount,
+}: {
+ circuitElement: React.ReactElement;
+ currentGraphCount: number;
+ voltageGraphCount: number;
+}) => {
+ const circuit = new Circuit({
+ platform: { spiceEngineMap: { ngspice: transientFixtureEngine } },
+ });
+ circuit.add(circuitElement);
+ await circuit.renderUntilSettled();
+
+ expect(circuit.db.simulation_unknown_experiment_error.list()).toHaveLength(0);
+ expect(circuit.db.simulation_transient_voltage_graph.list()).toHaveLength(
+ voltageGraphCount,
+ );
+ expect(circuit.db.simulation_transient_current_graph.list()).toHaveLength(
+ currentGraphCount,
+ );
+};
+
+test("Figure 10-21. Load Transient, PFM/PWM Boost Operation", async () => {
+ await verifyTransientFigure({
+ circuitElement: ,
+ voltageGraphCount: 1,
+ currentGraphCount: 1,
+ });
+});
+
+test("Figure 10-22. Load Transient, PFM/PWM Buck-Boost Operation", async () => {
+ await verifyTransientFigure({
+ circuitElement: ,
+ voltageGraphCount: 1,
+ currentGraphCount: 1,
+ });
+});
+
+test("Figure 10-23. Load Transient, PFM/PWM Buck Operation", async () => {
+ await verifyTransientFigure({
+ circuitElement: ,
+ voltageGraphCount: 1,
+ currentGraphCount: 1,
+ });
+});
+
+test("Figure 10-24. Load Transient, PWM Boost Operation", async () => {
+ await verifyTransientFigure({
+ circuitElement: ,
+ voltageGraphCount: 1,
+ currentGraphCount: 1,
+ });
+});
+
+test("Figure 10-25. Load Transient, PWM Buck-Boost Operation", async () => {
+ await verifyTransientFigure({
+ circuitElement: ,
+ voltageGraphCount: 1,
+ currentGraphCount: 1,
+ });
+});
+
+test("Figure 10-26. Load Transient, PWM Buck Operation", async () => {
+ await verifyTransientFigure({
+ circuitElement: ,
+ voltageGraphCount: 1,
+ currentGraphCount: 1,
+ });
+});
+
+test("Figure 10-27. Line Transient, PWM Operation", async () => {
+ await verifyTransientFigure({
+ circuitElement: ,
+ voltageGraphCount: 2,
+ currentGraphCount: 0,
+ });
+});
+
+test("Figure 10-28. Line Transient, PWM Operation", async () => {
+ await verifyTransientFigure({
+ circuitElement: ,
+ voltageGraphCount: 2,
+ currentGraphCount: 0,
+ });
+});
+
+test("Figure 10-29. Line Transient, PWM Operation", async () => {
+ await verifyTransientFigure({
+ circuitElement: ,
+ voltageGraphCount: 2,
+ currentGraphCount: 0,
+ });
+});
diff --git a/tests/TPS63802-output-current-capability.test.tsx b/tests/TPS63802-output-current-capability.test.tsx
new file mode 100644
index 0000000..d460238
--- /dev/null
+++ b/tests/TPS63802-output-current-capability.test.tsx
@@ -0,0 +1,53 @@
+import { expect, test } from "bun:test";
+import type { AnyCircuitElementInput } from "circuit-json";
+import type { SpiceEngine } from "@tscircuit/props";
+import { Circuit } from "tscircuit";
+import Figure102 from "../lib/simulations/TPS63802-Figure-10-2-output-current-capability-vs-input-voltage.circuit";
+
+const outputCapabilityFixtureEngine: SpiceEngine = {
+ async simulate(spiceString) {
+ const probes = Array.from(
+ spiceString.matchAll(/^\* tscircuit_probe (\{.+\})$/gm),
+ (match) =>
+ JSON.parse(match[1]!) as {
+ name: string;
+ simulation_voltage_probe_id: string;
+ },
+ );
+ return {
+ simulationResultCircuitJson: probes.map(
+ (probe, index) =>
+ ({
+ type: "simulation_transient_voltage_graph",
+ simulation_transient_voltage_graph_id: `fixture_voltage_${index}`,
+ simulation_experiment_id: "fixture",
+ source_probe_id: probe.simulation_voltage_probe_id,
+ timestamps_ms: [0, 1],
+ voltage_levels:
+ probe.name === "V_FB_PROBE" ? [0.5, 0.5] : [3.3, 3.3],
+ time_per_step: 1,
+ start_time_ms: 0,
+ end_time_ms: 1,
+ }) as AnyCircuitElementInput,
+ ),
+ };
+ },
+};
+
+test("Figure 10-2. Typical Output Current Capability versus Input Voltage", async () => {
+ const circuit = new Circuit({
+ platform: { spiceEngineMap: { ngspice: outputCapabilityFixtureEngine } },
+ });
+ circuit.add();
+ await circuit.renderUntilSettled();
+
+ expect(circuit.db.simulation_unknown_experiment_error.list()).toHaveLength(0);
+ const measurements = circuit.db.simulation_measurement_result.list();
+ expect(measurements).toHaveLength(6);
+ for (const measurement of measurements) {
+ expect([16, 128]).toContain(measurement.measurement_values.length);
+ expect([1, 2]).toContain(
+ measurement.simulation_parameter_sweep_coordinate_sets?.[0]?.length ?? 0,
+ );
+ }
+}, 120_000);
diff --git a/tests/TPS63802-startup-figures.test.tsx b/tests/TPS63802-startup-figures.test.tsx
new file mode 100644
index 0000000..47b37f5
--- /dev/null
+++ b/tests/TPS63802-startup-figures.test.tsx
@@ -0,0 +1,117 @@
+import { expect, test } from "bun:test";
+import { writeFileSync } from "node:fs";
+import { convertCircuitJsonToSimulationGraphSvg } from "circuit-to-svg";
+import type { AnyCircuitElementInput } from "circuit-json";
+import type { SpiceEngine } from "@tscircuit/props";
+import { Circuit } from "tscircuit";
+import TPS63802Figure1030StartupFromRisingEnablePfmCircuit from "../lib/simulations/TPS63802-Figure-10-30-start-up-behavior-from-rising-enable-pfm-operation.circuit";
+import TPS63802Figure1031StartupFromRisingEnablePwmCircuit from "../lib/simulations/TPS63802-Figure-10-31-start-up-behavior-from-rising-enable-pwm-operation.circuit";
+
+const timestampsMs = Array.from({ length: 901 }, (_, index) => index / 1_000);
+
+const startupFixtureEngine: SpiceEngine = {
+ async simulate(spiceString) {
+ const probes = Array.from(
+ spiceString.matchAll(/^\* tscircuit(?:_current)?_probe (\{.+\})$/gm),
+ (match) =>
+ JSON.parse(match[1]!) as {
+ name: string;
+ simulation_current_probe_id?: string;
+ simulation_voltage_probe_id?: string;
+ },
+ );
+ const simulationResultCircuitJson: AnyCircuitElementInput[] = [];
+ for (const [index, probe] of probes.entries()) {
+ if (probe.simulation_voltage_probe_id) {
+ const voltageLevels = timestampsMs.map((timeMs) => {
+ if (probe.name === "V_ENABLE_PROBE") return timeMs < 0.301 ? 0 : 2.2;
+ if (probe.name === "V_POWER_GOOD_PROBE")
+ return timeMs < 0.52 ? 0 : 2.2;
+ if (timeMs < 0.301) return 0;
+ return Math.min(3.3, ((timeMs - 0.301) / 0.2) * 3.3);
+ });
+ simulationResultCircuitJson.push({
+ type: "simulation_transient_voltage_graph",
+ simulation_transient_voltage_graph_id: `fixture_voltage_${index}`,
+ simulation_experiment_id: "fixture",
+ source_probe_id: probe.simulation_voltage_probe_id,
+ timestamps_ms: timestampsMs,
+ voltage_levels: voltageLevels,
+ time_per_step: 0.001,
+ start_time_ms: 0,
+ end_time_ms: 0.9,
+ } as AnyCircuitElementInput);
+ }
+ if (probe.simulation_current_probe_id) {
+ simulationResultCircuitJson.push({
+ type: "simulation_transient_current_graph",
+ simulation_transient_current_graph_id: `fixture_current_${index}`,
+ simulation_experiment_id: "fixture",
+ source_probe_id: probe.simulation_current_probe_id,
+ timestamps_ms: timestampsMs,
+ current_levels: timestampsMs.map((timeMs) =>
+ timeMs < 0.301
+ ? 0
+ : 0.4 + 0.2 * Math.sin(2 * Math.PI * 20_000 * (timeMs / 1_000)),
+ ),
+ time_per_step: 0.001,
+ start_time_ms: 0,
+ end_time_ms: 0.9,
+ } as AnyCircuitElementInput);
+ }
+ }
+ return { simulationResultCircuitJson };
+ },
+};
+
+const renderStartupFigure = async ({
+ circuitElement,
+ outputPath,
+}: {
+ circuitElement: React.ReactElement;
+ outputPath: string;
+}) => {
+ const circuit = new Circuit({
+ platform: { spiceEngineMap: { ngspice: startupFixtureEngine } },
+ });
+ circuit.add(circuitElement);
+ await circuit.renderUntilSettled();
+
+ expect(circuit.db.simulation_unknown_experiment_error.list()).toHaveLength(0);
+ const experiment = circuit.db.simulation_experiment.list()[0]!;
+ const svg = convertCircuitJsonToSimulationGraphSvg({
+ circuitJson: circuit.getCircuitJson(),
+ simulation_experiment_id: experiment.simulation_experiment_id,
+ });
+ writeFileSync(outputPath, svg);
+ return { circuit, svg };
+};
+
+test("Figure 10-30. Start-up Behavior from Rising Enable, PFM Operation", async () => {
+ const { circuit, svg } = await renderStartupFigure({
+ circuitElement: (
+
+ ),
+ outputPath: "/tmp/TPS63802-Figure-10-30.svg",
+ });
+
+ expect(circuit.db.simulation_transient_voltage_graph.list()).toHaveLength(3);
+ expect(circuit.db.simulation_transient_current_graph.list()).toHaveLength(1);
+ expect(svg).toContain("Figure 10-30.");
+ expect(svg).toContain(">EN<");
+ expect(svg).toContain(">PG<");
+ expect(svg).toContain(">IL<");
+});
+
+test("Figure 10-31. Start-up Behavior from Rising Enable, PWM Operation", async () => {
+ const { circuit, svg } = await renderStartupFigure({
+ circuitElement: (
+
+ ),
+ outputPath: "/tmp/TPS63802-Figure-10-31.svg",
+ });
+
+ expect(circuit.db.simulation_transient_voltage_graph.list()).toHaveLength(3);
+ expect(circuit.db.simulation_transient_current_graph.list()).toHaveLength(1);
+ expect(svg).toContain("Figure 10-31.");
+});
diff --git a/tests/TPS63802-switching-waveform-figures.test.tsx b/tests/TPS63802-switching-waveform-figures.test.tsx
new file mode 100644
index 0000000..dc3ca9c
--- /dev/null
+++ b/tests/TPS63802-switching-waveform-figures.test.tsx
@@ -0,0 +1,111 @@
+import { expect, test } from "bun:test";
+import type { AnyCircuitElementInput } from "circuit-json";
+import type { SpiceEngine } from "@tscircuit/props";
+import { Circuit } from "tscircuit";
+import TPS63802Figure1015SwitchingWaveformsPfmBoostOperationCircuit from "../lib/simulations/TPS63802-Figure-10-15-switching-waveforms-pfm-boost-operation.circuit";
+import TPS63802Figure1016SwitchingWaveformsPfmBuckBoostOperationCircuit from "../lib/simulations/TPS63802-Figure-10-16-switching-waveforms-pfm-buck-boost-operation.circuit";
+import TPS63802Figure1017SwitchingWaveformsPfmBuckOperationCircuit from "../lib/simulations/TPS63802-Figure-10-17-switching-waveforms-pfm-buck-operation.circuit";
+import TPS63802Figure1018SwitchingWaveformsPwmBoostOperationCircuit from "../lib/simulations/TPS63802-Figure-10-18-switching-waveforms-pwm-boost-operation.circuit";
+import TPS63802Figure1019SwitchingWaveformsPwmBuckBoostOperationCircuit from "../lib/simulations/TPS63802-Figure-10-19-switching-waveforms-pwm-buck-boost-operation.circuit";
+import TPS63802Figure1020SwitchingWaveformsPwmBuckOperationCircuit from "../lib/simulations/TPS63802-Figure-10-20-switching-waveforms-pwm-buck-operation.circuit";
+
+const timestampsMs = Array.from({ length: 401 }, (_, index) => index / 20_000);
+
+const switchingFixtureEngine: SpiceEngine = {
+ async simulate(spiceString) {
+ const probes = Array.from(
+ spiceString.matchAll(/^\* tscircuit(?:_current)?_probe (\{.+\})$/gm),
+ (match) =>
+ JSON.parse(match[1]!) as {
+ simulation_current_probe_id?: string;
+ simulation_voltage_probe_id?: string;
+ },
+ );
+ const simulationResultCircuitJson: AnyCircuitElementInput[] = [];
+ for (const [index, probe] of probes.entries()) {
+ if (probe.simulation_voltage_probe_id) {
+ simulationResultCircuitJson.push({
+ type: "simulation_transient_voltage_graph",
+ simulation_transient_voltage_graph_id: `fixture_voltage_${index}`,
+ simulation_experiment_id: "fixture",
+ source_probe_id: probe.simulation_voltage_probe_id,
+ timestamps_ms: timestampsMs,
+ voltage_levels: timestampsMs.map(
+ (timeMs) =>
+ 3.3 + 0.01 * Math.sin(2 * Math.PI * 2_000_000 * (timeMs / 1_000)),
+ ),
+ time_per_step: 0.00005,
+ start_time_ms: 0,
+ end_time_ms: 0.02,
+ } as AnyCircuitElementInput);
+ }
+ if (probe.simulation_current_probe_id) {
+ simulationResultCircuitJson.push({
+ type: "simulation_transient_current_graph",
+ simulation_transient_current_graph_id: `fixture_current_${index}`,
+ simulation_experiment_id: "fixture",
+ source_probe_id: probe.simulation_current_probe_id,
+ timestamps_ms: timestampsMs,
+ current_levels: timestampsMs.map(
+ (timeMs) =>
+ 1 + 0.5 * Math.sin(2 * Math.PI * 2_000_000 * (timeMs / 1_000)),
+ ),
+ time_per_step: 0.00005,
+ start_time_ms: 0,
+ end_time_ms: 0.02,
+ } as AnyCircuitElementInput);
+ }
+ }
+ return { simulationResultCircuitJson };
+ },
+};
+
+const verifySwitchingWaveformFigure = async (
+ circuitElement: React.ReactElement,
+) => {
+ const circuit = new Circuit({
+ platform: { spiceEngineMap: { ngspice: switchingFixtureEngine } },
+ });
+ circuit.add(circuitElement);
+ await circuit.renderUntilSettled();
+
+ expect(circuit.db.simulation_unknown_experiment_error.list()).toHaveLength(0);
+ expect(circuit.db.simulation_transient_voltage_graph.list()).toHaveLength(3);
+ expect(circuit.db.simulation_transient_current_graph.list()).toHaveLength(1);
+};
+
+test("Figure 10-15. Switching Waveforms, PFM Boost Operation", async () => {
+ await verifySwitchingWaveformFigure(
+ ,
+ );
+});
+
+test("Figure 10-16. Switching Waveforms, PFM Buck-Boost Operation", async () => {
+ await verifySwitchingWaveformFigure(
+ ,
+ );
+});
+
+test("Figure 10-17. Switching Waveforms, PFM Buck Operation", async () => {
+ await verifySwitchingWaveformFigure(
+ ,
+ );
+});
+
+test("Figure 10-18. Switching Waveforms, PWM Boost Operation", async () => {
+ await verifySwitchingWaveformFigure(
+ ,
+ );
+});
+
+test("Figure 10-19. Switching Waveforms, PWM Buck-Boost Operation", async () => {
+ await verifySwitchingWaveformFigure(
+ ,
+ );
+});
+
+test("Figure 10-20. Switching Waveforms, PWM Buck Operation", async () => {
+ await verifySwitchingWaveformFigure(
+ ,
+ );
+});
diff --git a/tsconfig.json b/tsconfig.json
index 17b7e88..3a5face 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -7,6 +7,7 @@
"rootDir": ".",
"baseUrl": ".",
"strict": true,
+ "allowImportingTsExtensions": true,
"esModuleInterop": true,
"moduleResolution": "node",
"skipLibCheck": true,
@@ -15,7 +16,7 @@
"sourceMap": true,
"allowSyntheticDefaultImports": true,
"experimentalDecorators": true,
- "types": ["tscircuit"]
+ "types": ["tscircuit", "bun"]
},
"include": ["**/*.ts", "**/*.tsx"],
"exclude": ["node_modules", "dist", ".claude"]