From 9cd12d4668dd7876b3338a67b144cdcadb12078d Mon Sep 17 00:00:00 2001 From: ShiboSoftwareDev Date: Sat, 25 Jul 2026 13:26:27 +0200 Subject: [PATCH 1/5] Add TPS63802 analysis simulations --- .../TPS63802-analysis-test-bench.tsx | 249 ++++++++++++++++++ ...63802-line-regulation-dc-sweep.circuit.tsx | 31 +++ ...63802-load-regulation-dc-sweep.circuit.tsx | 31 +++ ...-rated-load-dc-operating-point.circuit.tsx | 27 ++ ...TPS63802-small-signal-ac-sweep.circuit.tsx | 30 +++ ...weep.circuit-schematic-simulation.snap.svg | 86 ++++++ ...ation-dc-sweep.circuit-simulation.snap.svg | 19 ++ ...weep.circuit-schematic-simulation.snap.svg | 86 ++++++ ...ation-dc-sweep.circuit-simulation.snap.svg | 19 ++ ...oint.circuit-schematic-simulation.snap.svg | 86 ++++++ ...perating-point.circuit-simulation.snap.svg | 19 ++ ...weep.circuit-schematic-simulation.snap.svg | 100 +++++++ ...ignal-ac-sweep.circuit-simulation.snap.svg | 19 ++ package.json | 2 +- tsconfig.json | 1 + 15 files changed, 804 insertions(+), 1 deletion(-) create mode 100644 lib/simulations/TPS63802-analysis-test-bench.tsx create mode 100644 lib/simulations/TPS63802-line-regulation-dc-sweep.circuit.tsx create mode 100644 lib/simulations/TPS63802-load-regulation-dc-sweep.circuit.tsx create mode 100644 lib/simulations/TPS63802-rated-load-dc-operating-point.circuit.tsx create mode 100644 lib/simulations/TPS63802-small-signal-ac-sweep.circuit.tsx create mode 100644 lib/simulations/__snapshots__/TPS63802-line-regulation-dc-sweep.circuit-schematic-simulation.snap.svg create mode 100644 lib/simulations/__snapshots__/TPS63802-line-regulation-dc-sweep.circuit-simulation.snap.svg create mode 100644 lib/simulations/__snapshots__/TPS63802-load-regulation-dc-sweep.circuit-schematic-simulation.snap.svg create mode 100644 lib/simulations/__snapshots__/TPS63802-load-regulation-dc-sweep.circuit-simulation.snap.svg create mode 100644 lib/simulations/__snapshots__/TPS63802-rated-load-dc-operating-point.circuit-schematic-simulation.snap.svg create mode 100644 lib/simulations/__snapshots__/TPS63802-rated-load-dc-operating-point.circuit-simulation.snap.svg create mode 100644 lib/simulations/__snapshots__/TPS63802-small-signal-ac-sweep.circuit-schematic-simulation.snap.svg create mode 100644 lib/simulations/__snapshots__/TPS63802-small-signal-ac-sweep.circuit-simulation.snap.svg diff --git a/lib/simulations/TPS63802-analysis-test-bench.tsx b/lib/simulations/TPS63802-analysis-test-bench.tsx new file mode 100644 index 0000000..79c3510 --- /dev/null +++ b/lib/simulations/TPS63802-analysis-test-bench.tsx @@ -0,0 +1,249 @@ +import type { SubcircuitProps } from "@tscircuit/props"; +import { TPS63802DLAR } from "../chips/TPS63802DLAR.circuit.tsx"; + +const tps63802AveragedAnalysisModel = ` +* Averaged TPS63802 model for DC operating-point, DC sweep, and AC analyses. +* TI's TPS63802_TRANS model is intentionally retained for transient examples. +* DC coefficients approximate datasheet Figures 10-11 and 10-13. +* The control pole is illustrative because the datasheet publishes no Bode plot. +.SUBCKT TPS63802_AVERAGED AGND EN FB GND L1 L2 MODE PG VIN VOUT +B_ERROR ERROR_RAW GND V=3.3077+80*(0.5-V(FB,GND))+0.00055*(V(VIN,GND)-3.6) +R_CONTROL_POLE ERROR_RAW ERROR_FILTERED 1k +C_CONTROL_POLE ERROR_FILTERED GND 15.9n +B_DRIVER DRIVE GND V=V(ERROR_FILTERED,GND) +R_OUTPUT DRIVE VOUT 0.5m +R_L1_BIAS L1 GND 1G +R_L2_BIAS L2 GND 1G +R_MODE_BIAS MODE GND 1G +R_PG_BIAS PG GND 1G +R_AGND_BIAS AGND GND 1m +.ENDS TPS63802_AVERAGED +`; + +type TPS63802AnalysisTestBenchProps = SubcircuitProps & { + inputVoltage: string; + feedbackAcMagnitude?: string; + loadResistance?: string; + loadCurrent?: string; + mode: "pfm" | "pwm"; +}; + +export const TPS63802AnalysisTestBench = ({ + children, + inputVoltage, + feedbackAcMagnitude, + loadResistance, + loadCurrent, + mode, + ...props +}: TPS63802AnalysisTestBenchProps) => ( + + + } + /> + + + + + + + + + + + + + {feedbackAcMagnitude && ( + + )} + + {loadResistance && ( + + )} + {loadCurrent && ( + + )} + + + + + + + + + + + + + + + + + + + + {feedbackAcMagnitude ? ( + <> + + + + ) : ( + + )} + + + + + + + {loadResistance && ( + <> + + + + )} + {loadCurrent && ( + <> + + + + )} + + + + + + {children} + +); diff --git a/lib/simulations/TPS63802-line-regulation-dc-sweep.circuit.tsx b/lib/simulations/TPS63802-line-regulation-dc-sweep.circuit.tsx new file mode 100644 index 0000000..72157ba --- /dev/null +++ b/lib/simulations/TPS63802-line-regulation-dc-sweep.circuit.tsx @@ -0,0 +1,31 @@ +import type { SubcircuitProps } from "@tscircuit/props"; +import { analog } from "tscircuit"; +import { TPS63802AnalysisTestBench } from "./TPS63802-analysis-test-bench"; + +export const TPS63802LineRegulationDcSweepCircuit = ( + props: SubcircuitProps, +) => ( + + + +); + +export default TPS63802LineRegulationDcSweepCircuit; diff --git a/lib/simulations/TPS63802-load-regulation-dc-sweep.circuit.tsx b/lib/simulations/TPS63802-load-regulation-dc-sweep.circuit.tsx new file mode 100644 index 0000000..df4b0a0 --- /dev/null +++ b/lib/simulations/TPS63802-load-regulation-dc-sweep.circuit.tsx @@ -0,0 +1,31 @@ +import type { SubcircuitProps } from "@tscircuit/props"; +import { analog } from "tscircuit"; +import { TPS63802AnalysisTestBench } from "./TPS63802-analysis-test-bench"; + +export const TPS63802LoadRegulationDcSweepCircuit = ( + props: SubcircuitProps, +) => ( + + + +); + +export default TPS63802LoadRegulationDcSweepCircuit; diff --git a/lib/simulations/TPS63802-rated-load-dc-operating-point.circuit.tsx b/lib/simulations/TPS63802-rated-load-dc-operating-point.circuit.tsx new file mode 100644 index 0000000..8601700 --- /dev/null +++ b/lib/simulations/TPS63802-rated-load-dc-operating-point.circuit.tsx @@ -0,0 +1,27 @@ +import type { SubcircuitProps } from "@tscircuit/props"; +import { analog } from "tscircuit"; +import { TPS63802AnalysisTestBench } from "./TPS63802-analysis-test-bench"; + +export const TPS63802RatedLoadDcOperatingPointCircuit = ( + props: SubcircuitProps, +) => ( + + + +); + +export default TPS63802RatedLoadDcOperatingPointCircuit; diff --git a/lib/simulations/TPS63802-small-signal-ac-sweep.circuit.tsx b/lib/simulations/TPS63802-small-signal-ac-sweep.circuit.tsx new file mode 100644 index 0000000..53a2634 --- /dev/null +++ b/lib/simulations/TPS63802-small-signal-ac-sweep.circuit.tsx @@ -0,0 +1,30 @@ +import type { SubcircuitProps } from "@tscircuit/props"; +import { analog } from "tscircuit"; +import { TPS63802AnalysisTestBench } from "./TPS63802-analysis-test-bench"; + +export const TPS63802SmallSignalAcSweepCircuit = (props: SubcircuitProps) => ( + + + +); + +export default TPS63802SmallSignalAcSweepCircuit; diff --git a/lib/simulations/__snapshots__/TPS63802-line-regulation-dc-sweep.circuit-schematic-simulation.snap.svg b/lib/simulations/__snapshots__/TPS63802-line-regulation-dc-sweep.circuit-schematic-simulation.snap.svg new file mode 100644 index 0000000..2e3a244 --- /dev/null +++ b/lib/simulations/__snapshots__/TPS63802-line-regulation-dc-sweep.circuit-schematic-simulation.snap.svg @@ -0,0 +1,86 @@ +U11EN2MODE3AGND4FB5PG6VOUT7L28GND9L110VINV_IN3.6VL1470nHR_L1_DCR7.6mΩC_IN10uFC_OUT22uFR_FB_TOP511kΩR_FB_BOTTOM91kΩR_PG100kΩR_LOAD3.3ΩU1_ENU1_ENU1_ENGNDGNDGNDFB_DIVIDERFB_DIVIDERU1_VOUTU1_VOUTU1_VOUTTPS63802 PWM analysis test bench2.533.544.53.3083.3083.3083.3083.3083.308Voltage (V)DC Sweep (V)VOUT_PROBETPS63802 Line Regulation, 1 A Load (Datasheet Figure 10-13) diff --git a/lib/simulations/__snapshots__/TPS63802-line-regulation-dc-sweep.circuit-simulation.snap.svg b/lib/simulations/__snapshots__/TPS63802-line-regulation-dc-sweep.circuit-simulation.snap.svg new file mode 100644 index 0000000..000a93f --- /dev/null +++ b/lib/simulations/__snapshots__/TPS63802-line-regulation-dc-sweep.circuit-simulation.snap.svg @@ -0,0 +1,19 @@ +2.533.544.53.3083.3083.3083.3083.3083.308Voltage (V)DC Sweep (V)VOUT_PROBETPS63802 Line Regulation, 1 A Load (Datasheet Figure 10-13) \ No newline at end of file diff --git a/lib/simulations/__snapshots__/TPS63802-load-regulation-dc-sweep.circuit-schematic-simulation.snap.svg b/lib/simulations/__snapshots__/TPS63802-load-regulation-dc-sweep.circuit-schematic-simulation.snap.svg new file mode 100644 index 0000000..48a86cf --- /dev/null +++ b/lib/simulations/__snapshots__/TPS63802-load-regulation-dc-sweep.circuit-schematic-simulation.snap.svg @@ -0,0 +1,86 @@ +U11EN2MODE3AGND4FB5PG6VOUT7L28GND9L110VINV_IN3.6VL1470nHR_L1_DCR7.6mΩC_IN10uFC_OUT22uFR_FB_TOP511kΩR_FB_BOTTOM91kΩR_PG100kΩI_LOAD100mAU1_ENU1_ENU1_ENGNDGNDGNDFB_DIVIDERFB_DIVIDERU1_VOUTU1_VOUTU1_VOUTTPS63802 PWM analysis test bench00.511.522.53.3083.3083.3083.3083.3083.308Voltage (V)DC Sweep (A)VOUT_PROBETPS63802 Load Regulation (Datasheet Figure 10-11) diff --git a/lib/simulations/__snapshots__/TPS63802-load-regulation-dc-sweep.circuit-simulation.snap.svg b/lib/simulations/__snapshots__/TPS63802-load-regulation-dc-sweep.circuit-simulation.snap.svg new file mode 100644 index 0000000..d1d2328 --- /dev/null +++ b/lib/simulations/__snapshots__/TPS63802-load-regulation-dc-sweep.circuit-simulation.snap.svg @@ -0,0 +1,19 @@ +00.511.522.53.3083.3083.3083.3083.3083.308Voltage (V)DC Sweep (A)VOUT_PROBETPS63802 Load Regulation (Datasheet Figure 10-11) \ No newline at end of file diff --git a/lib/simulations/__snapshots__/TPS63802-rated-load-dc-operating-point.circuit-schematic-simulation.snap.svg b/lib/simulations/__snapshots__/TPS63802-rated-load-dc-operating-point.circuit-schematic-simulation.snap.svg new file mode 100644 index 0000000..cee0a69 --- /dev/null +++ b/lib/simulations/__snapshots__/TPS63802-rated-load-dc-operating-point.circuit-schematic-simulation.snap.svg @@ -0,0 +1,86 @@ +U11EN2MODE3AGND4FB5PG6VOUT7L28GND9L110VINV_IN3.6VL1470nHR_L1_DCR7.6mΩC_IN10uFC_OUT22uFR_FB_TOP511kΩR_FB_BOTTOM91kΩR_PG100kΩR_LOAD3.3ΩU1_ENU1_ENU1_ENGNDGNDGNDFB_DIVIDERFB_DIVIDERU1_VOUTU1_VOUTU1_VOUTTPS63802 PWM analysis test bench-1012.9773.3083.638Voltage (V)Operating PointVOUT_PROBETPS63802 3.6 V Input, 1 A Load Operating Point diff --git a/lib/simulations/__snapshots__/TPS63802-rated-load-dc-operating-point.circuit-simulation.snap.svg b/lib/simulations/__snapshots__/TPS63802-rated-load-dc-operating-point.circuit-simulation.snap.svg new file mode 100644 index 0000000..f04ce5f --- /dev/null +++ b/lib/simulations/__snapshots__/TPS63802-rated-load-dc-operating-point.circuit-simulation.snap.svg @@ -0,0 +1,19 @@ +-1012.9773.3083.638Voltage (V)Operating PointVOUT_PROBETPS63802 3.6 V Input, 1 A Load Operating Point \ No newline at end of file diff --git a/lib/simulations/__snapshots__/TPS63802-small-signal-ac-sweep.circuit-schematic-simulation.snap.svg b/lib/simulations/__snapshots__/TPS63802-small-signal-ac-sweep.circuit-schematic-simulation.snap.svg new file mode 100644 index 0000000..4248702 --- /dev/null +++ b/lib/simulations/__snapshots__/TPS63802-small-signal-ac-sweep.circuit-schematic-simulation.snap.svg @@ -0,0 +1,100 @@ +U11EN2MODE3AGND4FB5PG6VOUT7L28GND9L110VINV_IN3.6VL1470nHR_L1_DCR7.6mΩC_IN10uFC_OUT22uFR_FB_TOP511kΩR_FB_BOTTOM91kΩR_PG100kΩV_FB_INJECT0VR_LOAD3.3ΩU1_ENU1_ENU1_ENGNDGNDGNDU1_FBU1_FBU1_VOUTU1_VOUTU1_VOUTFB_DIVIDERFB_DIVIDERTPS63802 PWM analysis test bench101001000100001000001000000-0.0200.020.040.060.080.1Voltage (V)Frequency (Hz)VOUT_PROBETPS63802 Small-Signal Control-Loop Response diff --git a/lib/simulations/__snapshots__/TPS63802-small-signal-ac-sweep.circuit-simulation.snap.svg b/lib/simulations/__snapshots__/TPS63802-small-signal-ac-sweep.circuit-simulation.snap.svg new file mode 100644 index 0000000..b4f4e16 --- /dev/null +++ b/lib/simulations/__snapshots__/TPS63802-small-signal-ac-sweep.circuit-simulation.snap.svg @@ -0,0 +1,19 @@ +101001000100001000001000000-0.0200.020.040.060.080.1Voltage (V)Frequency (Hz)VOUT_PROBETPS63802 Small-Signal Control-Loop Response \ No newline at end of file diff --git a/package.json b/package.json index ac6abe7..537d40b 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "devDependencies": { "@biomejs/biome": "^2.4.16", "@types/react": "^19.2.17", - "tscircuit": "^0.0.2139", + "tscircuit": "^0.0.2144", "typescript": "^5.0.0" }, "peerDependencies": { diff --git a/tsconfig.json b/tsconfig.json index 17b7e88..068fe8b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -7,6 +7,7 @@ "rootDir": ".", "baseUrl": ".", "strict": true, + "allowImportingTsExtensions": true, "esModuleInterop": true, "moduleResolution": "node", "skipLibCheck": true, From de6f200c387a1caccf8b20ef9bc9eaa2b881b5d6 Mon Sep 17 00:00:00 2001 From: ShiboSoftwareDev Date: Sat, 25 Jul 2026 15:25:46 +0200 Subject: [PATCH 2/5] Use vendor model for TPS63802 figure simulations --- ...-waveforms-pfm-boost-operation.circuit.tsx | 15 ++ ...forms-pfm-buck-boost-operation.circuit.tsx | 14 + ...g-waveforms-pfm-buck-operation.circuit.tsx | 15 ++ .../TPS63802-analysis-test-bench.tsx | 249 ------------------ ...63802-line-regulation-dc-sweep.circuit.tsx | 31 --- ...63802-load-regulation-dc-sweep.circuit.tsx | 31 --- ...-rated-load-dc-operating-point.circuit.tsx | 27 -- ...TPS63802-small-signal-ac-sweep.circuit.tsx | 30 --- ...tion.circuit-schematic-simulation.snap.svg | 44 ++++ ...oost-operation.circuit-simulation.snap.svg | 19 ++ ...tion.circuit-schematic-simulation.snap.svg | 44 ++++ ...oost-operation.circuit-simulation.snap.svg | 19 ++ ...ion.circuit-schematic-simulation.snap.svg} | 53 ++-- ...uck-operation.circuit-simulation.snap.svg} | 4 +- ...weep.circuit-schematic-simulation.snap.svg | 86 ------ ...ation-dc-sweep.circuit-simulation.snap.svg | 19 -- ...weep.circuit-schematic-simulation.snap.svg | 86 ------ ...ation-dc-sweep.circuit-simulation.snap.svg | 19 -- ...oint.circuit-schematic-simulation.snap.svg | 86 ------ ...perating-point.circuit-simulation.snap.svg | 19 -- ...weep.circuit-schematic-simulation.snap.svg | 100 ------- ...ignal-ac-sweep.circuit-simulation.snap.svg | 19 -- ...02-switching-waveforms-figure-circuit.tsx} | 30 ++- package.json | 1 + 24 files changed, 209 insertions(+), 851 deletions(-) create mode 100644 lib/simulations/TPS63802-Figure-10-15-switching-waveforms-pfm-boost-operation.circuit.tsx create mode 100644 lib/simulations/TPS63802-Figure-10-16-switching-waveforms-pfm-buck-boost-operation.circuit.tsx create mode 100644 lib/simulations/TPS63802-Figure-10-17-switching-waveforms-pfm-buck-operation.circuit.tsx delete mode 100644 lib/simulations/TPS63802-analysis-test-bench.tsx delete mode 100644 lib/simulations/TPS63802-line-regulation-dc-sweep.circuit.tsx delete mode 100644 lib/simulations/TPS63802-load-regulation-dc-sweep.circuit.tsx delete mode 100644 lib/simulations/TPS63802-rated-load-dc-operating-point.circuit.tsx delete mode 100644 lib/simulations/TPS63802-small-signal-ac-sweep.circuit.tsx create mode 100644 lib/simulations/__snapshots__/TPS63802-Figure-10-15-switching-waveforms-pfm-boost-operation.circuit-schematic-simulation.snap.svg create mode 100644 lib/simulations/__snapshots__/TPS63802-Figure-10-15-switching-waveforms-pfm-boost-operation.circuit-simulation.snap.svg create mode 100644 lib/simulations/__snapshots__/TPS63802-Figure-10-16-switching-waveforms-pfm-buck-boost-operation.circuit-schematic-simulation.snap.svg create mode 100644 lib/simulations/__snapshots__/TPS63802-Figure-10-16-switching-waveforms-pfm-buck-boost-operation.circuit-simulation.snap.svg rename lib/simulations/__snapshots__/{TPS63802-switching-waveforms-pfm-buck-operation.circuit-schematic-simulation.snap.svg => TPS63802-Figure-10-17-switching-waveforms-pfm-buck-operation.circuit-schematic-simulation.snap.svg} (97%) rename lib/simulations/__snapshots__/{TPS63802-switching-waveforms-pfm-buck-operation.circuit-simulation.snap.svg => TPS63802-Figure-10-17-switching-waveforms-pfm-buck-operation.circuit-simulation.snap.svg} (99%) delete mode 100644 lib/simulations/__snapshots__/TPS63802-line-regulation-dc-sweep.circuit-schematic-simulation.snap.svg delete mode 100644 lib/simulations/__snapshots__/TPS63802-line-regulation-dc-sweep.circuit-simulation.snap.svg delete mode 100644 lib/simulations/__snapshots__/TPS63802-load-regulation-dc-sweep.circuit-schematic-simulation.snap.svg delete mode 100644 lib/simulations/__snapshots__/TPS63802-load-regulation-dc-sweep.circuit-simulation.snap.svg delete mode 100644 lib/simulations/__snapshots__/TPS63802-rated-load-dc-operating-point.circuit-schematic-simulation.snap.svg delete mode 100644 lib/simulations/__snapshots__/TPS63802-rated-load-dc-operating-point.circuit-simulation.snap.svg delete mode 100644 lib/simulations/__snapshots__/TPS63802-small-signal-ac-sweep.circuit-schematic-simulation.snap.svg delete mode 100644 lib/simulations/__snapshots__/TPS63802-small-signal-ac-sweep.circuit-simulation.snap.svg rename lib/simulations/{TPS63802-switching-waveforms-pfm-buck-operation.circuit.tsx => create-TPS63802-switching-waveforms-figure-circuit.tsx} (90%) 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..103a5f1 --- /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: "696us", + figureName: "Figure 10-16. Switching Waveforms, PFM Buck-Boost Operation", + inputVoltage: "3.3V", + startTime: "673us", + }); + +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-analysis-test-bench.tsx b/lib/simulations/TPS63802-analysis-test-bench.tsx deleted file mode 100644 index 79c3510..0000000 --- a/lib/simulations/TPS63802-analysis-test-bench.tsx +++ /dev/null @@ -1,249 +0,0 @@ -import type { SubcircuitProps } from "@tscircuit/props"; -import { TPS63802DLAR } from "../chips/TPS63802DLAR.circuit.tsx"; - -const tps63802AveragedAnalysisModel = ` -* Averaged TPS63802 model for DC operating-point, DC sweep, and AC analyses. -* TI's TPS63802_TRANS model is intentionally retained for transient examples. -* DC coefficients approximate datasheet Figures 10-11 and 10-13. -* The control pole is illustrative because the datasheet publishes no Bode plot. -.SUBCKT TPS63802_AVERAGED AGND EN FB GND L1 L2 MODE PG VIN VOUT -B_ERROR ERROR_RAW GND V=3.3077+80*(0.5-V(FB,GND))+0.00055*(V(VIN,GND)-3.6) -R_CONTROL_POLE ERROR_RAW ERROR_FILTERED 1k -C_CONTROL_POLE ERROR_FILTERED GND 15.9n -B_DRIVER DRIVE GND V=V(ERROR_FILTERED,GND) -R_OUTPUT DRIVE VOUT 0.5m -R_L1_BIAS L1 GND 1G -R_L2_BIAS L2 GND 1G -R_MODE_BIAS MODE GND 1G -R_PG_BIAS PG GND 1G -R_AGND_BIAS AGND GND 1m -.ENDS TPS63802_AVERAGED -`; - -type TPS63802AnalysisTestBenchProps = SubcircuitProps & { - inputVoltage: string; - feedbackAcMagnitude?: string; - loadResistance?: string; - loadCurrent?: string; - mode: "pfm" | "pwm"; -}; - -export const TPS63802AnalysisTestBench = ({ - children, - inputVoltage, - feedbackAcMagnitude, - loadResistance, - loadCurrent, - mode, - ...props -}: TPS63802AnalysisTestBenchProps) => ( - - - } - /> - - - - - - - - - - - - - {feedbackAcMagnitude && ( - - )} - - {loadResistance && ( - - )} - {loadCurrent && ( - - )} - - - - - - - - - - - - - - - - - - - - {feedbackAcMagnitude ? ( - <> - - - - ) : ( - - )} - - - - - - - {loadResistance && ( - <> - - - - )} - {loadCurrent && ( - <> - - - - )} - - - - - - {children} - -); diff --git a/lib/simulations/TPS63802-line-regulation-dc-sweep.circuit.tsx b/lib/simulations/TPS63802-line-regulation-dc-sweep.circuit.tsx deleted file mode 100644 index 72157ba..0000000 --- a/lib/simulations/TPS63802-line-regulation-dc-sweep.circuit.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import type { SubcircuitProps } from "@tscircuit/props"; -import { analog } from "tscircuit"; -import { TPS63802AnalysisTestBench } from "./TPS63802-analysis-test-bench"; - -export const TPS63802LineRegulationDcSweepCircuit = ( - props: SubcircuitProps, -) => ( - - - -); - -export default TPS63802LineRegulationDcSweepCircuit; diff --git a/lib/simulations/TPS63802-load-regulation-dc-sweep.circuit.tsx b/lib/simulations/TPS63802-load-regulation-dc-sweep.circuit.tsx deleted file mode 100644 index df4b0a0..0000000 --- a/lib/simulations/TPS63802-load-regulation-dc-sweep.circuit.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import type { SubcircuitProps } from "@tscircuit/props"; -import { analog } from "tscircuit"; -import { TPS63802AnalysisTestBench } from "./TPS63802-analysis-test-bench"; - -export const TPS63802LoadRegulationDcSweepCircuit = ( - props: SubcircuitProps, -) => ( - - - -); - -export default TPS63802LoadRegulationDcSweepCircuit; diff --git a/lib/simulations/TPS63802-rated-load-dc-operating-point.circuit.tsx b/lib/simulations/TPS63802-rated-load-dc-operating-point.circuit.tsx deleted file mode 100644 index 8601700..0000000 --- a/lib/simulations/TPS63802-rated-load-dc-operating-point.circuit.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import type { SubcircuitProps } from "@tscircuit/props"; -import { analog } from "tscircuit"; -import { TPS63802AnalysisTestBench } from "./TPS63802-analysis-test-bench"; - -export const TPS63802RatedLoadDcOperatingPointCircuit = ( - props: SubcircuitProps, -) => ( - - - -); - -export default TPS63802RatedLoadDcOperatingPointCircuit; diff --git a/lib/simulations/TPS63802-small-signal-ac-sweep.circuit.tsx b/lib/simulations/TPS63802-small-signal-ac-sweep.circuit.tsx deleted file mode 100644 index 53a2634..0000000 --- a/lib/simulations/TPS63802-small-signal-ac-sweep.circuit.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import type { SubcircuitProps } from "@tscircuit/props"; -import { analog } from "tscircuit"; -import { TPS63802AnalysisTestBench } from "./TPS63802-analysis-test-bench"; - -export const TPS63802SmallSignalAcSweepCircuit = (props: SubcircuitProps) => ( - - - -); - -export default TPS63802SmallSignalAcSweepCircuit; 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 @@ +U11EN2MODE3AGND4FB5PG6VOUT7L28GND9L110VINV_IN2.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.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)Ch1VO150 mV/div3 div3.3 VCh2L16.5 V/div2 div0 VCh3L25.5 V/div1 div0 VCh4IL800 mA/div0 div0 AFigure 10-15. Switching Waveforms, PFM Boost Operation 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..806bd68 --- /dev/null +++ b/lib/simulations/__snapshots__/TPS63802-Figure-10-15-switching-waveforms-pfm-boost-operation.circuit-simulation.snap.svg @@ -0,0 +1,19 @@ +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)Ch1VO150 mV/div3 div3.3 VCh2L16.5 V/div2 div0 VCh3L25.5 V/div1 div0 VCh4IL800 mA/div0 div0 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)Ch1VO150 mV/div3 div3.3 VCh2L16.5 V/div2 div0 VCh3L25.5 V/div1 div0 VCh4IL800 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..c75c10a --- /dev/null +++ b/lib/simulations/__snapshots__/TPS63802-Figure-10-16-switching-waveforms-pfm-buck-boost-operation.circuit-simulation.snap.svg @@ -0,0 +1,19 @@ +0.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)Ch1VO150 mV/div3 div3.3 VCh2L16.5 V/div2 div0 VCh3L25.5 V/div1 div0 VCh4IL800 mA/div0 div0 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)Ch1VO150 mV/div3 div3.3 VCh2L16.5 V/div2 div0 VCh3L25.5 V/div1 div0 VCh4IL800 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)Ch1VO150 mV/div3 div3.3 VCh2L16.5 V/div2 div0 VCh3L25.5 V/div1 div0 VCh4IL800 mA/div0 div0 AFigure 10-17. Switching Waveforms, PFM Buck 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-Figure-10-17-switching-waveforms-pfm-buck-operation.circuit-simulation.snap.svg similarity index 99% rename from lib/simulations/__snapshots__/TPS63802-switching-waveforms-pfm-buck-operation.circuit-simulation.snap.svg rename to lib/simulations/__snapshots__/TPS63802-Figure-10-17-switching-waveforms-pfm-buck-operation.circuit-simulation.snap.svg index 02102b1..51e93a0 100644 --- a/lib/simulations/__snapshots__/TPS63802-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 @@ -1,4 +1,4 @@ -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)Ch1VO150 mV/div3 div3.3 VCh2L16.5 V/div2 div0 VCh3L25.5 V/div1 div0 VCh4IL800 mA/div0 div0 AFigure 10-17. Switching Waveforms, PFM Buck Operation \ No newline at end of file diff --git a/lib/simulations/__snapshots__/TPS63802-line-regulation-dc-sweep.circuit-schematic-simulation.snap.svg b/lib/simulations/__snapshots__/TPS63802-line-regulation-dc-sweep.circuit-schematic-simulation.snap.svg deleted file mode 100644 index 2e3a244..0000000 --- a/lib/simulations/__snapshots__/TPS63802-line-regulation-dc-sweep.circuit-schematic-simulation.snap.svg +++ /dev/null @@ -1,86 +0,0 @@ -U11EN2MODE3AGND4FB5PG6VOUT7L28GND9L110VINV_IN3.6VL1470nHR_L1_DCR7.6mΩC_IN10uFC_OUT22uFR_FB_TOP511kΩR_FB_BOTTOM91kΩR_PG100kΩR_LOAD3.3ΩU1_ENU1_ENU1_ENGNDGNDGNDFB_DIVIDERFB_DIVIDERU1_VOUTU1_VOUTU1_VOUTTPS63802 PWM analysis test bench2.533.544.53.3083.3083.3083.3083.3083.308Voltage (V)DC Sweep (V)VOUT_PROBETPS63802 Line Regulation, 1 A Load (Datasheet Figure 10-13) diff --git a/lib/simulations/__snapshots__/TPS63802-line-regulation-dc-sweep.circuit-simulation.snap.svg b/lib/simulations/__snapshots__/TPS63802-line-regulation-dc-sweep.circuit-simulation.snap.svg deleted file mode 100644 index 000a93f..0000000 --- a/lib/simulations/__snapshots__/TPS63802-line-regulation-dc-sweep.circuit-simulation.snap.svg +++ /dev/null @@ -1,19 +0,0 @@ -2.533.544.53.3083.3083.3083.3083.3083.308Voltage (V)DC Sweep (V)VOUT_PROBETPS63802 Line Regulation, 1 A Load (Datasheet Figure 10-13) \ No newline at end of file diff --git a/lib/simulations/__snapshots__/TPS63802-load-regulation-dc-sweep.circuit-schematic-simulation.snap.svg b/lib/simulations/__snapshots__/TPS63802-load-regulation-dc-sweep.circuit-schematic-simulation.snap.svg deleted file mode 100644 index 48a86cf..0000000 --- a/lib/simulations/__snapshots__/TPS63802-load-regulation-dc-sweep.circuit-schematic-simulation.snap.svg +++ /dev/null @@ -1,86 +0,0 @@ -U11EN2MODE3AGND4FB5PG6VOUT7L28GND9L110VINV_IN3.6VL1470nHR_L1_DCR7.6mΩC_IN10uFC_OUT22uFR_FB_TOP511kΩR_FB_BOTTOM91kΩR_PG100kΩI_LOAD100mAU1_ENU1_ENU1_ENGNDGNDGNDFB_DIVIDERFB_DIVIDERU1_VOUTU1_VOUTU1_VOUTTPS63802 PWM analysis test bench00.511.522.53.3083.3083.3083.3083.3083.308Voltage (V)DC Sweep (A)VOUT_PROBETPS63802 Load Regulation (Datasheet Figure 10-11) diff --git a/lib/simulations/__snapshots__/TPS63802-load-regulation-dc-sweep.circuit-simulation.snap.svg b/lib/simulations/__snapshots__/TPS63802-load-regulation-dc-sweep.circuit-simulation.snap.svg deleted file mode 100644 index d1d2328..0000000 --- a/lib/simulations/__snapshots__/TPS63802-load-regulation-dc-sweep.circuit-simulation.snap.svg +++ /dev/null @@ -1,19 +0,0 @@ -00.511.522.53.3083.3083.3083.3083.3083.308Voltage (V)DC Sweep (A)VOUT_PROBETPS63802 Load Regulation (Datasheet Figure 10-11) \ No newline at end of file diff --git a/lib/simulations/__snapshots__/TPS63802-rated-load-dc-operating-point.circuit-schematic-simulation.snap.svg b/lib/simulations/__snapshots__/TPS63802-rated-load-dc-operating-point.circuit-schematic-simulation.snap.svg deleted file mode 100644 index cee0a69..0000000 --- a/lib/simulations/__snapshots__/TPS63802-rated-load-dc-operating-point.circuit-schematic-simulation.snap.svg +++ /dev/null @@ -1,86 +0,0 @@ -U11EN2MODE3AGND4FB5PG6VOUT7L28GND9L110VINV_IN3.6VL1470nHR_L1_DCR7.6mΩC_IN10uFC_OUT22uFR_FB_TOP511kΩR_FB_BOTTOM91kΩR_PG100kΩR_LOAD3.3ΩU1_ENU1_ENU1_ENGNDGNDGNDFB_DIVIDERFB_DIVIDERU1_VOUTU1_VOUTU1_VOUTTPS63802 PWM analysis test bench-1012.9773.3083.638Voltage (V)Operating PointVOUT_PROBETPS63802 3.6 V Input, 1 A Load Operating Point diff --git a/lib/simulations/__snapshots__/TPS63802-rated-load-dc-operating-point.circuit-simulation.snap.svg b/lib/simulations/__snapshots__/TPS63802-rated-load-dc-operating-point.circuit-simulation.snap.svg deleted file mode 100644 index f04ce5f..0000000 --- a/lib/simulations/__snapshots__/TPS63802-rated-load-dc-operating-point.circuit-simulation.snap.svg +++ /dev/null @@ -1,19 +0,0 @@ --1012.9773.3083.638Voltage (V)Operating PointVOUT_PROBETPS63802 3.6 V Input, 1 A Load Operating Point \ No newline at end of file diff --git a/lib/simulations/__snapshots__/TPS63802-small-signal-ac-sweep.circuit-schematic-simulation.snap.svg b/lib/simulations/__snapshots__/TPS63802-small-signal-ac-sweep.circuit-schematic-simulation.snap.svg deleted file mode 100644 index 4248702..0000000 --- a/lib/simulations/__snapshots__/TPS63802-small-signal-ac-sweep.circuit-schematic-simulation.snap.svg +++ /dev/null @@ -1,100 +0,0 @@ -U11EN2MODE3AGND4FB5PG6VOUT7L28GND9L110VINV_IN3.6VL1470nHR_L1_DCR7.6mΩC_IN10uFC_OUT22uFR_FB_TOP511kΩR_FB_BOTTOM91kΩR_PG100kΩV_FB_INJECT0VR_LOAD3.3ΩU1_ENU1_ENU1_ENGNDGNDGNDU1_FBU1_FBU1_VOUTU1_VOUTU1_VOUTFB_DIVIDERFB_DIVIDERTPS63802 PWM analysis test bench101001000100001000001000000-0.0200.020.040.060.080.1Voltage (V)Frequency (Hz)VOUT_PROBETPS63802 Small-Signal Control-Loop Response diff --git a/lib/simulations/__snapshots__/TPS63802-small-signal-ac-sweep.circuit-simulation.snap.svg b/lib/simulations/__snapshots__/TPS63802-small-signal-ac-sweep.circuit-simulation.snap.svg deleted file mode 100644 index b4f4e16..0000000 --- a/lib/simulations/__snapshots__/TPS63802-small-signal-ac-sweep.circuit-simulation.snap.svg +++ /dev/null @@ -1,19 +0,0 @@ -101001000100001000001000000-0.0200.020.040.060.080.1Voltage (V)Frequency (Hz)VOUT_PROBETPS63802 Small-Signal Control-Loop Response \ No newline at end of file diff --git a/lib/simulations/TPS63802-switching-waveforms-pfm-buck-operation.circuit.tsx b/lib/simulations/create-TPS63802-switching-waveforms-figure-circuit.tsx similarity index 90% rename from lib/simulations/TPS63802-switching-waveforms-pfm-buck-operation.circuit.tsx rename to lib/simulations/create-TPS63802-switching-waveforms-figure-circuit.tsx index d6e2ed0..7453574 100644 --- a/lib/simulations/TPS63802-switching-waveforms-pfm-buck-operation.circuit.tsx +++ b/lib/simulations/create-TPS63802-switching-waveforms-figure-circuit.tsx @@ -1,9 +1,21 @@ import type { SubcircuitProps } from "@tscircuit/props"; +import { analog } from "tscircuit"; import { TPS63802DLAR } from "../chips/TPS63802DLAR.circuit.tsx"; -export const TPS63802SwitchingWaveformsPfmBuckOperationCircuit = ( - props: SubcircuitProps, -) => ( +type TPS63802SwitchingWaveformsFigureCircuitProps = SubcircuitProps & { + duration: string; + figureName: string; + inputVoltage: string; + startTime: string; +}; + +export const createTPS63802SwitchingWaveformsFigureCircuit = ({ + duration, + figureName, + inputVoltage, + startTime, + ...props +}: TPS63802SwitchingWaveformsFigureCircuitProps) => ( - ); - -export default TPS63802SwitchingWaveformsPfmBuckOperationCircuit; diff --git a/package.json b/package.json index 537d40b..8dc4cbb 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "devDependencies": { "@biomejs/biome": "^2.4.16", "@types/react": "^19.2.17", + "@tscircuit/ngspice-spice-engine": "0.0.18", "tscircuit": "^0.0.2144", "typescript": "^5.0.0" }, From 2a090b71d1719a181d3296f51dfc38b9ad07fa6e Mon Sep 17 00:00:00 2001 From: ShiboSoftwareDev Date: Wed, 29 Jul 2026 05:56:53 +0200 Subject: [PATCH 3/5] Complete TPS63802 datasheet simulations --- README.md | 24 ++ ...ency-vs-input-voltage-pwm-only.circuit.tsx | 50 +++ ...10-11-load-regulation-pwm-only.circuit.tsx | 13 + ...-10-12-load-regulation-pfm-pwm.circuit.tsx | 13 + ...10-13-line-regulation-pwm-only.circuit.tsx | 33 ++ ...-10-14-line-regulation-pfm-pwm.circuit.tsx | 33 ++ ...-waveforms-pwm-boost-operation.circuit.tsx | 17 + ...forms-pwm-buck-boost-operation.circuit.tsx | 16 + ...nt-capability-vs-input-voltage.circuit.tsx | 126 ++++++ ...g-waveforms-pwm-buck-operation.circuit.tsx | 17 + ...nsient-pfm-pwm-boost-operation.circuit.tsx | 14 + ...t-pfm-pwm-buck-boost-operation.circuit.tsx | 14 + ...ansient-pfm-pwm-buck-operation.circuit.tsx | 14 + ...-transient-pwm-boost-operation.circuit.tsx | 14 + ...sient-pwm-buck-boost-operation.circuit.tsx | 14 + ...d-transient-pwm-buck-operation.circuit.tsx | 14 + ...7-line-transient-pwm-operation.circuit.tsx | 15 + ...8-line-transient-pwm-operation.circuit.tsx | 15 + ...9-line-transient-pwm-operation.circuit.tsx | 15 + ...ing-frequency-vs-input-voltage.circuit.tsx | 83 ++++ ...om-rising-enable-pfm-operation.circuit.tsx | 14 + ...om-rising-enable-pwm-operation.circuit.tsx | 14 + ...st-frequency-vs-output-current.circuit.tsx | 52 +++ ...ency-vs-output-current-pfm-pwm.circuit.tsx | 14 + ...ncy-vs-output-current-pwm-only.circuit.tsx | 14 + ...ency-vs-output-current-pfm-pwm.circuit.tsx | 14 + ...ncy-vs-output-current-pwm-only.circuit.tsx | 14 + ...iency-vs-input-voltage-pfm-pwm.circuit.tsx | 26 ++ .../TPS63802-datasheet-measurements.ts | 135 ++++++ ...oost-operation.circuit-simulation.snap.svg | 19 + ...-pwm-operation.circuit-simulation.snap.svg | 19 + .../combine-measurement-series-for-graph.ts | 22 + ...TPS63802-datasheet-application-circuit.tsx | 385 ++++++++++++++++++ ...ciency-vs-input-voltage-figure-circuit.tsx | 70 ++++ ...iency-vs-output-current-figure-circuit.tsx | 61 +++ ...PS63802-line-regulation-figure-circuit.tsx | 66 +++ ...TPS63802-line-transient-figure-circuit.tsx | 48 +++ ...PS63802-load-regulation-figure-circuit.tsx | 59 +++ ...TPS63802-load-transient-figure-circuit.tsx | 46 +++ ...create-TPS63802-startup-figure-circuit.tsx | 46 +++ ...802-switching-waveforms-figure-circuit.tsx | 12 +- package.json | 5 +- ...re-10-11-load-regulation-pwm-only.test.tsx | 91 +++++ ...ficiency-vs-input-voltage-figures.test.tsx | 182 +++++++++ tests/TPS63802-frequency-figures.test.tsx | 148 +++++++ .../TPS63802-line-regulation-figures.test.tsx | 100 +++++ ...2-load-and-line-transient-figures.test.tsx | 158 +++++++ ...PS63802-output-current-capability.test.tsx | 53 +++ tests/TPS63802-startup-figures.test.tsx | 117 ++++++ ...S63802-switching-waveform-figures.test.tsx | 111 +++++ tests/TPS63802-transient-figures.test.tsx | 83 ++++ tsconfig.json | 2 +- 52 files changed, 2749 insertions(+), 5 deletions(-) create mode 100644 lib/simulations/TPS63802-Figure-10-10-efficiency-vs-input-voltage-pwm-only.circuit.tsx create mode 100644 lib/simulations/TPS63802-Figure-10-11-load-regulation-pwm-only.circuit.tsx create mode 100644 lib/simulations/TPS63802-Figure-10-12-load-regulation-pfm-pwm.circuit.tsx create mode 100644 lib/simulations/TPS63802-Figure-10-13-line-regulation-pwm-only.circuit.tsx create mode 100644 lib/simulations/TPS63802-Figure-10-14-line-regulation-pfm-pwm.circuit.tsx create mode 100644 lib/simulations/TPS63802-Figure-10-18-switching-waveforms-pwm-boost-operation.circuit.tsx create mode 100644 lib/simulations/TPS63802-Figure-10-19-switching-waveforms-pwm-buck-boost-operation.circuit.tsx create mode 100644 lib/simulations/TPS63802-Figure-10-2-output-current-capability-vs-input-voltage.circuit.tsx create mode 100644 lib/simulations/TPS63802-Figure-10-20-switching-waveforms-pwm-buck-operation.circuit.tsx create mode 100644 lib/simulations/TPS63802-Figure-10-21-load-transient-pfm-pwm-boost-operation.circuit.tsx create mode 100644 lib/simulations/TPS63802-Figure-10-22-load-transient-pfm-pwm-buck-boost-operation.circuit.tsx create mode 100644 lib/simulations/TPS63802-Figure-10-23-load-transient-pfm-pwm-buck-operation.circuit.tsx create mode 100644 lib/simulations/TPS63802-Figure-10-24-load-transient-pwm-boost-operation.circuit.tsx create mode 100644 lib/simulations/TPS63802-Figure-10-25-load-transient-pwm-buck-boost-operation.circuit.tsx create mode 100644 lib/simulations/TPS63802-Figure-10-26-load-transient-pwm-buck-operation.circuit.tsx create mode 100644 lib/simulations/TPS63802-Figure-10-27-line-transient-pwm-operation.circuit.tsx create mode 100644 lib/simulations/TPS63802-Figure-10-28-line-transient-pwm-operation.circuit.tsx create mode 100644 lib/simulations/TPS63802-Figure-10-29-line-transient-pwm-operation.circuit.tsx create mode 100644 lib/simulations/TPS63802-Figure-10-3-switching-frequency-vs-input-voltage.circuit.tsx create mode 100644 lib/simulations/TPS63802-Figure-10-30-start-up-behavior-from-rising-enable-pfm-operation.circuit.tsx create mode 100644 lib/simulations/TPS63802-Figure-10-31-start-up-behavior-from-rising-enable-pwm-operation.circuit.tsx create mode 100644 lib/simulations/TPS63802-Figure-10-4-inductor-burst-frequency-vs-output-current.circuit.tsx create mode 100644 lib/simulations/TPS63802-Figure-10-5-efficiency-vs-output-current-pfm-pwm.circuit.tsx create mode 100644 lib/simulations/TPS63802-Figure-10-6-efficiency-vs-output-current-pwm-only.circuit.tsx create mode 100644 lib/simulations/TPS63802-Figure-10-7-efficiency-vs-output-current-pfm-pwm.circuit.tsx create mode 100644 lib/simulations/TPS63802-Figure-10-8-efficiency-vs-output-current-pwm-only.circuit.tsx create mode 100644 lib/simulations/TPS63802-Figure-10-9-efficiency-vs-input-voltage-pfm-pwm.circuit.tsx create mode 100644 lib/simulations/TPS63802-datasheet-measurements.ts create mode 100644 lib/simulations/__snapshots__/TPS63802-Figure-10-21-load-transient-pfm-pwm-boost-operation.circuit-simulation.snap.svg create mode 100644 lib/simulations/__snapshots__/TPS63802-Figure-10-27-line-transient-pwm-operation.circuit-simulation.snap.svg create mode 100644 lib/simulations/combine-measurement-series-for-graph.ts create mode 100644 lib/simulations/create-TPS63802-datasheet-application-circuit.tsx create mode 100644 lib/simulations/create-TPS63802-efficiency-vs-input-voltage-figure-circuit.tsx create mode 100644 lib/simulations/create-TPS63802-efficiency-vs-output-current-figure-circuit.tsx create mode 100644 lib/simulations/create-TPS63802-line-regulation-figure-circuit.tsx create mode 100644 lib/simulations/create-TPS63802-line-transient-figure-circuit.tsx create mode 100644 lib/simulations/create-TPS63802-load-regulation-figure-circuit.tsx create mode 100644 lib/simulations/create-TPS63802-load-transient-figure-circuit.tsx create mode 100644 lib/simulations/create-TPS63802-startup-figure-circuit.tsx create mode 100644 tests/TPS63802-Figure-10-11-load-regulation-pwm-only.test.tsx create mode 100644 tests/TPS63802-efficiency-vs-input-voltage-figures.test.tsx create mode 100644 tests/TPS63802-frequency-figures.test.tsx create mode 100644 tests/TPS63802-line-regulation-figures.test.tsx create mode 100644 tests/TPS63802-load-and-line-transient-figures.test.tsx create mode 100644 tests/TPS63802-output-current-capability.test.tsx create mode 100644 tests/TPS63802-startup-figures.test.tsx create mode 100644 tests/TPS63802-switching-waveform-figures.test.tsx create mode 100644 tests/TPS63802-transient-figures.test.tsx diff --git a/README.md b/README.md index 48ccd70..f101771 100644 --- a/README.md +++ b/README.md @@ -239,3 +239,27 @@ changes: ```bash bun run snapshot:update ``` + +The full TPS63802 datasheet transient checks use the vendor switching model at +a 5 ns step and can take tens of minutes per figure. Run them explicitly: + +```bash +RUN_TPS63802_DATASHEET_SIMULATIONS=1 bun test tests/TPS63802-transient-figures.test.tsx +``` + +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 +follow Table 10-7. + +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-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..befabfd --- /dev/null +++ b/lib/simulations/TPS63802-Figure-10-18-switching-waveforms-pwm-boost-operation.circuit.tsx @@ -0,0 +1,17 @@ +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", + inputVoltage: "2.3V", + loadResistance: "1.65Ω", + mode: "pwm", + 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..23ee975 --- /dev/null +++ b/lib/simulations/TPS63802-Figure-10-19-switching-waveforms-pwm-buck-boost-operation.circuit.tsx @@ -0,0 +1,16 @@ +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", + inputVoltage: "3.3V", + loadResistance: "1.65Ω", + mode: "pwm", + startTime: "673us", + }); + +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..bcd8a1a --- /dev/null +++ b/lib/simulations/TPS63802-Figure-10-20-switching-waveforms-pwm-buck-operation.circuit.tsx @@ -0,0 +1,17 @@ +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", + inputVoltage: "4.2V", + loadResistance: "1.65Ω", + mode: "pwm", + 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..dd819e2 --- /dev/null +++ b/lib/simulations/TPS63802-Figure-10-23-load-transient-pfm-pwm-buck-operation.circuit.tsx @@ -0,0 +1,14 @@ +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", + 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..3de927b --- /dev/null +++ b/lib/simulations/TPS63802-Figure-10-26-load-transient-pwm-buck-operation.circuit.tsx @@ -0,0 +1,14 @@ +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", + 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/__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..4abbee5 --- /dev/null +++ b/lib/simulations/__snapshots__/TPS63802-Figure-10-21-load-transient-pfm-pwm-boost-operation.circuit-simulation.snap.svg @@ -0,0 +1,19 @@ +0.650.811.21.45VO3 V3.1 V3.2 V3.3 V3.4 V3.5 V3.6 VIO-14.2 mA549 mA1.11 A1.68 A2.24 A2.8 A3.37 ATime (ms)Ch1VO100 mV/div1 div3.3 VCh2IO564 mA/div-1 div549 mAFigure 10-21. Load Transient, PFM/PWM Boost 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..3386bd8 --- /dev/null +++ b/lib/simulations/__snapshots__/TPS63802-Figure-10-27-line-transient-pwm-operation.circuit-simulation.snap.svg @@ -0,0 +1,19 @@ +0.650.811.21.45VO3 V3.2 V3.4 V3.6 V3.8 V4 VVI1.95 V4.45 V6.95 V9.45 V11.9 V14.4 VTime (ms)Ch1VO100 mV/div1 div3.3 VCh2VI1.25 V/div-1 div3.2 VFigure 10-27. Line Transient, PWM 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..a80f61b --- /dev/null +++ b/lib/simulations/create-TPS63802-datasheet-application-circuit.tsx @@ -0,0 +1,385 @@ +import type { + CurrentSourceProps, + SubcircuitProps, + VoltageSourceProps, +} from "@tscircuit/props"; +import type { ReactNode } from "react"; +import { TPS63802DLAR } from "../chips/TPS63802DLAR.circuit"; + +type TPS63802DatasheetApplicationCircuitProps = SubcircuitProps & { + children: ReactNode; + enableVoltageWaveform?: VoltageSourceProps["voltageWaveform"]; + inputVoltage?: number | string; + inputVoltageWaveform?: VoltageSourceProps["voltageWaveform"]; + loadCurrent?: number | string; + 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; +}; + +export const TPS63802DatasheetApplicationCircuit = ({ + children, + enableVoltageWaveform, + inputVoltage, + inputVoltageWaveform, + loadCurrent = "100mA", + loadCurrentWaveform, + loadEnableTime, + loadResistance, + mode, + outputVoltage = 3.3, + probeEnableVoltage = false, + probeFeedbackVoltage = false, + probeInductorCurrent = false, + probeInputCurrent = false, + probeInputVoltage = false, + probeLoadCurrent = false, + probePowerGoodVoltage = false, + ...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); + const outputCapacitance = outputVoltage <= 2.3 ? "10uF" : "8.2uF"; + + return ( + + + + + + + + + + + {inputVoltage !== undefined && ( + + )} + {inputVoltage !== undefined && ( + <> + + + + )} + + {probeInputCurrent && ( + + )} + + {enableVoltageWaveform ? ( + <> + + + ) : ( + + )} + + + {probeInductorCurrent && ( + + )} + {!probeInductorCurrent && } + + + + + + + + + + + + + + {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..1db0f9d --- /dev/null +++ b/lib/simulations/create-TPS63802-line-transient-figure-circuit.tsx @@ -0,0 +1,48 @@ +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) => ( + + + +); 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..ab86b33 --- /dev/null +++ b/lib/simulations/create-TPS63802-load-transient-figure-circuit.tsx @@ -0,0 +1,46 @@ +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..031fc6c --- /dev/null +++ b/lib/simulations/create-TPS63802-startup-figure-circuit.tsx @@ -0,0 +1,46 @@ +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) => ( + // Table 10-7 specifies VI = 2.2 V and IO = 10 mA. The annotations under + // Figures 10-30/10-31 instead say 4.2 V and 100 mΩ, which would demand 33 A + // at 3.3 V and cannot describe the plotted startup. Follow the table. + + + +); diff --git a/lib/simulations/create-TPS63802-switching-waveforms-figure-circuit.tsx b/lib/simulations/create-TPS63802-switching-waveforms-figure-circuit.tsx index 7453574..08f5d98 100644 --- a/lib/simulations/create-TPS63802-switching-waveforms-figure-circuit.tsx +++ b/lib/simulations/create-TPS63802-switching-waveforms-figure-circuit.tsx @@ -6,6 +6,8 @@ type TPS63802SwitchingWaveformsFigureCircuitProps = SubcircuitProps & { duration: string; figureName: string; inputVoltage: string; + loadResistance?: string; + mode?: "pfm" | "pwm"; startTime: string; }; @@ -13,6 +15,8 @@ export const createTPS63802SwitchingWaveformsFigureCircuit = ({ duration, figureName, inputVoltage, + loadResistance = "82.5", + mode = "pfm", startTime, ...props }: TPS63802SwitchingWaveformsFigureCircuitProps) => ( @@ -146,7 +150,7 @@ export const createTPS63802SwitchingWaveformsFigureCircuit = ({ - + {mode === "pwm" ? ( + + ) : ( + + )} diff --git a/package.json b/package.json index 8dc4cbb..eeb6c99 100644 --- a/package.json +++ b/package.json @@ -23,9 +23,10 @@ }, "devDependencies": { "@biomejs/biome": "^2.4.16", + "@types/bun": "^1.2.8", "@types/react": "^19.2.17", - "@tscircuit/ngspice-spice-engine": "0.0.18", - "tscircuit": "^0.0.2144", + "@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-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/tests/TPS63802-transient-figures.test.tsx b/tests/TPS63802-transient-figures.test.tsx new file mode 100644 index 0000000..822ddc1 --- /dev/null +++ b/tests/TPS63802-transient-figures.test.tsx @@ -0,0 +1,83 @@ +import { expect, test } from "bun:test"; +import { writeFileSync } from "node:fs"; +import { convertCircuitJsonToSimulationGraphSvg } from "circuit-to-svg"; +import { Circuit } from "tscircuit"; +import TPS63802Figure1021LoadTransientPfmPwmBoostOperationCircuit from "../lib/simulations/TPS63802-Figure-10-21-load-transient-pfm-pwm-boost-operation.circuit"; +import TPS63802Figure1027LineTransientPwmOperationCircuit from "../lib/simulations/TPS63802-Figure-10-27-line-transient-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 renderSimulationFigure = async ({ + circuitElement, + outputPath, +}: { + circuitElement: React.ReactElement; + outputPath: string; +}) => { + const circuit = new Circuit({ + platform: { + spiceEngineMap: { + ngspice: { + async simulate(spiceString) { + writeFileSync(`${outputPath}.spice`, spiceString); + return createCdnNgspiceSpiceEngine().simulate(spiceString); + }, + }, + }, + }, + }); + 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; +}; + +datasheetSimulationTest( + "Figure 10-21. Load Transient, PFM/PWM Boost Operation", + async () => { + const circuit = await renderSimulationFigure({ + circuitElement: ( + + ), + outputPath: "/tmp/TPS63802-Figure-10-21.svg", + }); + + expect(circuit.db.simulation_transient_voltage_graph.list()).toHaveLength( + 1, + ); + expect(circuit.db.simulation_transient_current_graph.list()).toHaveLength( + 1, + ); + }, + 2_000_000, +); + +datasheetSimulationTest( + "Figure 10-27. Line Transient, PWM Operation", + async () => { + const circuit = await renderSimulationFigure({ + circuitElement: ( + + ), + outputPath: "/tmp/TPS63802-Figure-10-27.svg", + }); + + expect(circuit.db.simulation_transient_voltage_graph.list()).toHaveLength( + 2, + ); + expect(circuit.db.simulation_transient_current_graph.list()).toHaveLength( + 0, + ); + }, + 2_000_000, +); diff --git a/tsconfig.json b/tsconfig.json index 068fe8b..3a5face 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -16,7 +16,7 @@ "sourceMap": true, "allowSyntheticDefaultImports": true, "experimentalDecorators": true, - "types": ["tscircuit"] + "types": ["tscircuit", "bun"] }, "include": ["**/*.ts", "**/*.tsx"], "exclude": ["node_modules", "dist", ".claude"] From a5d4b878dcf9dba0372196f1ac24e7f8e0beab29 Mon Sep 17 00:00:00 2001 From: ShiboSoftwareDev Date: Thu, 30 Jul 2026 18:32:16 +0200 Subject: [PATCH 4/5] Generate TPS63802 waveform snapshots from vendor model --- README.md | 34 +- ...forms-pfm-buck-boost-operation.circuit.tsx | 4 +- ...-waveforms-pwm-boost-operation.circuit.tsx | 5 +- ...forms-pwm-buck-boost-operation.circuit.tsx | 6 +- ...g-waveforms-pwm-buck-operation.circuit.tsx | 4 +- ...ansient-pfm-pwm-buck-operation.circuit.tsx | 1 + ...d-transient-pwm-buck-operation.circuit.tsx | 1 + ...oost-operation.circuit-simulation.snap.svg | 4 +- ...oost-operation.circuit-simulation.snap.svg | 4 +- ...buck-operation.circuit-simulation.snap.svg | 4 +- ...oost-operation.circuit-simulation.snap.svg | 19 + ...oost-operation.circuit-simulation.snap.svg | 19 + ...buck-operation.circuit-simulation.snap.svg | 19 + ...oost-operation.circuit-simulation.snap.svg | 2 +- ...oost-operation.circuit-simulation.snap.svg | 19 + ...buck-operation.circuit-simulation.snap.svg | 19 + ...oost-operation.circuit-simulation.snap.svg | 19 + ...oost-operation.circuit-simulation.snap.svg | 19 + ...buck-operation.circuit-simulation.snap.svg | 19 + ...-pwm-operation.circuit-simulation.snap.svg | 2 +- ...-pwm-operation.circuit-simulation.snap.svg | 19 + ...-pwm-operation.circuit-simulation.snap.svg | 19 + ...-pfm-operation.circuit-simulation.snap.svg | 19 + ...-pwm-operation.circuit-simulation.snap.svg | 19 + ...TPS63802-datasheet-application-circuit.tsx | 56 ++- ...TPS63802-line-transient-figure-circuit.tsx | 70 +-- ...TPS63802-load-transient-figure-circuit.tsx | 20 +- ...create-TPS63802-startup-figure-circuit.tsx | 34 +- ...802-switching-waveforms-figure-circuit.tsx | 460 +++++++++--------- .../create-encrypted-pspice-ngspice-engine.ts | 2 +- package.json | 2 +- ...3802-datasheet-waveform-snapshots.test.tsx | 258 ++++++++++ tests/TPS63802-transient-figures.test.tsx | 83 ---- 33 files changed, 909 insertions(+), 375 deletions(-) create mode 100644 lib/simulations/__snapshots__/TPS63802-Figure-10-18-switching-waveforms-pwm-boost-operation.circuit-simulation.snap.svg create mode 100644 lib/simulations/__snapshots__/TPS63802-Figure-10-19-switching-waveforms-pwm-buck-boost-operation.circuit-simulation.snap.svg create mode 100644 lib/simulations/__snapshots__/TPS63802-Figure-10-20-switching-waveforms-pwm-buck-operation.circuit-simulation.snap.svg create mode 100644 lib/simulations/__snapshots__/TPS63802-Figure-10-22-load-transient-pfm-pwm-buck-boost-operation.circuit-simulation.snap.svg create mode 100644 lib/simulations/__snapshots__/TPS63802-Figure-10-23-load-transient-pfm-pwm-buck-operation.circuit-simulation.snap.svg create mode 100644 lib/simulations/__snapshots__/TPS63802-Figure-10-24-load-transient-pwm-boost-operation.circuit-simulation.snap.svg create mode 100644 lib/simulations/__snapshots__/TPS63802-Figure-10-25-load-transient-pwm-buck-boost-operation.circuit-simulation.snap.svg create mode 100644 lib/simulations/__snapshots__/TPS63802-Figure-10-26-load-transient-pwm-buck-operation.circuit-simulation.snap.svg create mode 100644 lib/simulations/__snapshots__/TPS63802-Figure-10-28-line-transient-pwm-operation.circuit-simulation.snap.svg create mode 100644 lib/simulations/__snapshots__/TPS63802-Figure-10-29-line-transient-pwm-operation.circuit-simulation.snap.svg create mode 100644 lib/simulations/__snapshots__/TPS63802-Figure-10-30-start-up-behavior-from-rising-enable-pfm-operation.circuit-simulation.snap.svg create mode 100644 lib/simulations/__snapshots__/TPS63802-Figure-10-31-start-up-behavior-from-rising-enable-pwm-operation.circuit-simulation.snap.svg create mode 100644 tests/TPS63802-datasheet-waveform-snapshots.test.tsx delete mode 100644 tests/TPS63802-transient-figures.test.tsx diff --git a/README.md b/README.md index f101771..d9ae788 100644 --- a/README.md +++ b/README.md @@ -240,11 +240,37 @@ changes: bun run snapshot:update ``` -The full TPS63802 datasheet transient checks use the vendor switching model at -a 5 ns step and can take tens of minutes per figure. Run them explicitly: +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-transient-figures.test.tsx +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 @@ -257,7 +283,7 @@ 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 -follow Table 10-7. +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 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 index 103a5f1..9c5bcd6 100644 --- 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 @@ -5,10 +5,10 @@ export const TPS63802Figure1016SwitchingWaveformsPfmBuckBoostOperationCircuit = (props: SubcircuitProps) => createTPS63802SwitchingWaveformsFigureCircuit({ ...props, - duration: "696us", + duration: "700us", figureName: "Figure 10-16. Switching Waveforms, PFM Buck-Boost Operation", inputVoltage: "3.3V", - startTime: "673us", + startTime: "682us", }); export default TPS63802Figure1016SwitchingWaveformsPfmBuckBoostOperationCircuit; 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 index befabfd..dd06d81 100644 --- 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 @@ -8,9 +8,12 @@ export const TPS63802Figure1018SwitchingWaveformsPwmBoostOperationCircuit = ( ...props, duration: "704us", figureName: "Figure 10-18. Switching Waveforms, PWM Boost Operation", + inductorCurrentCenter: 4.4, inputVoltage: "2.3V", - loadResistance: "1.65Ω", + l1Center: -1.02, + loadCurrent: "2A", mode: "pwm", + outputVoltageCenter: 3.23, startTime: "686us", }); 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 index 23ee975..1c7501f 100644 --- 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 @@ -7,10 +7,12 @@ export const TPS63802Figure1019SwitchingWaveformsPwmBuckBoostOperationCircuit = ...props, duration: "696us", figureName: "Figure 10-19. Switching Waveforms, PWM Buck-Boost Operation", + inductorCurrentCenter: 4.4, inputVoltage: "3.3V", - loadResistance: "1.65Ω", + loadCurrent: "2A", mode: "pwm", - startTime: "673us", + outputVoltageCenter: 3.24, + startTime: "678us", }); export default TPS63802Figure1019SwitchingWaveformsPwmBuckBoostOperationCircuit; 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 index bcd8a1a..37f3b9e 100644 --- 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 @@ -8,9 +8,11 @@ export const TPS63802Figure1020SwitchingWaveformsPwmBuckOperationCircuit = ( ...props, duration: "704us", figureName: "Figure 10-20. Switching Waveforms, PWM Buck Operation", + inductorCurrentCenter: 3.62, inputVoltage: "4.2V", - loadResistance: "1.65Ω", + loadCurrent: "2A", mode: "pwm", + outputVoltageCenter: 3.24, startTime: "686us", }); 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 index dd819e2..4a6c437 100644 --- 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 @@ -7,6 +7,7 @@ export const TPS63802Figure1023LoadTransientPfmPwmBuckOperationCircuit = ( 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", }); 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 index 3de927b..e3c9030 100644 --- 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 @@ -7,6 +7,7 @@ export const TPS63802Figure1026LoadTransientPwmBuckOperationCircuit = ( 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", }); 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 index 806bd68..d0ec641 100644 --- 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 @@ -1,4 +1,4 @@ -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)Ch1VO50 mV/div0 div3.15 VCh2L13 V/div0 div-3 VCh3L23 V/div0 div3 VCh4IL500 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-simulation.snap.svg b/lib/simulations/__snapshots__/TPS63802-Figure-10-16-switching-waveforms-pfm-buck-boost-operation.circuit-simulation.snap.svg index c75c10a..3c21a35 100644 --- 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 @@ -1,4 +1,4 @@ -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)Ch1VO50 mV/div0 div3.15 VCh2L13 V/div0 div-3 VCh3L23 V/div0 div3 VCh4IL500 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-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 index 51e93a0..a3170ca 100644 --- 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 @@ -1,4 +1,4 @@ -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)Ch1VO50 mV/div0 div3.15 VCh2L13 V/div0 div-3 VCh3L23 V/div0 div3 VCh4IL500 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)Ch1VO20 mV/div0 div3.23 VCh2L13 V/div0 div-1.02 VCh3L23 V/div0 div3 VCh4IL500 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)Ch1VO20 mV/div0 div3.24 VCh2L13 V/div0 div-3 VCh3L23 V/div0 div3 VCh4IL500 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)Ch1VO20 mV/div0 div3.24 VCh2L13 V/div0 div-3 VCh3L23 V/div0 div3 VCh4IL500 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 index 4abbee5..69d68fa 100644 --- 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 @@ -16,4 +16,4 @@ svg { font-family: 'Inter', 'Helvetica Neue', Arial, sans-serif; } .simulation-line { fill: none; stroke-width: 2.5; } .simulation-point { stroke-width: 0; } .chart-title { fill: rgba(0, 0, 0, 0.85); font-size: 18px; font-weight: 600; } -0.650.811.21.45VO3 V3.1 V3.2 V3.3 V3.4 V3.5 V3.6 VIO-14.2 mA549 mA1.11 A1.68 A2.24 A2.8 A3.37 ATime (ms)Ch1VO100 mV/div1 div3.3 VCh2IO564 mA/div-1 div549 mAFigure 10-21. Load Transient, PFM/PWM Boost Operation \ No newline at end of file +-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)Ch1VO100 mV/div0 div3.1 VCh2I 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)Ch1VO100 mV/div0 div3.1 VCh2I 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)Ch1VO100 mV/div0 div3.1 VCh2I 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)Ch1VO100 mV/div0 div3.1 VCh2I 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)Ch1VO100 mV/div0 div3.1 VCh2I 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)Ch1VO100 mV/div0 div3.1 VCh2I 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 index 3386bd8..57e936a 100644 --- 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 @@ -16,4 +16,4 @@ svg { font-family: 'Inter', 'Helvetica Neue', Arial, sans-serif; } .simulation-line { fill: none; stroke-width: 2.5; } .simulation-point { stroke-width: 0; } .chart-title { fill: rgba(0, 0, 0, 0.85); font-size: 18px; font-weight: 600; } -0.650.811.21.45VO3 V3.2 V3.4 V3.6 V3.8 V4 VVI1.95 V4.45 V6.95 V9.45 V11.9 V14.4 VTime (ms)Ch1VO100 mV/div1 div3.3 VCh2VI1.25 V/div-1 div3.2 VFigure 10-27. Line Transient, PWM Operation \ No newline at end of file +-2000200400600800VO2.7 V3.2 V3.7 V4.2 VVI1.2 V3.7 V6.2 V8.7 VTime (µs)Ch1VO100 mV/div1 div3.3 VCh2VI500 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)Ch1VO100 mV/div1 div3.3 VCh2VI500 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)Ch1VO100 mV/div1 div3.3 VCh2VI500 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)Ch1VO2 V/div3 div1.65 VCh2EN2 V/div1 div2.1 VCh3PG2 V/div-1 div2.1 VCh4IL3 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)Ch1VO2 V/div3 div1.65 VCh2EN2 V/div1 div2.1 VCh3PG2 V/div-1 div2.1 VCh4IL3 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/create-TPS63802-datasheet-application-circuit.tsx b/lib/simulations/create-TPS63802-datasheet-application-circuit.tsx index a80f61b..781f96d 100644 --- a/lib/simulations/create-TPS63802-datasheet-application-circuit.tsx +++ b/lib/simulations/create-TPS63802-datasheet-application-circuit.tsx @@ -6,12 +6,28 @@ import type { 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; @@ -24,14 +40,20 @@ type TPS63802DatasheetApplicationCircuitProps = SubcircuitProps & { 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, @@ -44,6 +66,8 @@ export const TPS63802DatasheetApplicationCircuit = ({ probeInputVoltage = false, probeLoadCurrent = false, probePowerGoodVoltage = false, + outputVoltageGraphDisplay, + powerGoodVoltageGraphDisplay, ...props }: TPS63802DatasheetApplicationCircuitProps) => { const feedbackBottomResistance = 91_000; @@ -56,7 +80,11 @@ export const TPS63802DatasheetApplicationCircuit = ({ const feedbackTopResistance = recommendedFeedbackTopResistance.get(outputVoltage) ?? feedbackBottomResistance * (outputVoltage / 0.5 - 1); - const outputCapacitance = outputVoltage <= 2.3 ? "10uF" : "8.2uF"; + // 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 ( @@ -151,6 +179,7 @@ export const TPS63802DatasheetApplicationCircuit = ({ graphCenter={0} graphVerticalOffset={0} graphCurrentPerDiv={0.8} + {...inductorCurrentGraphDisplay} schX={-1.8} schY={5} /> @@ -166,6 +195,8 @@ export const TPS63802DatasheetApplicationCircuit = ({ connections={{ pin1: "L1.pin2", pin2: "U1.L2" }} /> + {/* TPS63802 Tables 10-3 and 10-4 specify 10 mΩ ESR for the + GRM188R60J106ME84 input and GRM188R60J226MEA0 output capacitors. */} @@ -265,8 +297,9 @@ export const TPS63802DatasheetApplicationCircuit = ({ @@ -285,8 +318,9 @@ export const TPS63802DatasheetApplicationCircuit = ({ @@ -344,6 +378,7 @@ export const TPS63802DatasheetApplicationCircuit = ({ graphDisplayName="VO" graphCenter={outputVoltage} graphVoltagePerDiv={0.1} + {...outputVoltageGraphDisplay} /> {probeInputVoltage && ( )} {probeFeedbackVoltage && ( @@ -368,6 +404,7 @@ export const TPS63802DatasheetApplicationCircuit = ({ connectsTo="U1.EN" referenceTo="U1.GND" graphDisplayName="EN" + {...enableVoltageGraphDisplay} /> )} {probePowerGoodVoltage && ( @@ -376,6 +413,7 @@ export const TPS63802DatasheetApplicationCircuit = ({ connectsTo="U1.PG" referenceTo="U1.GND" graphDisplayName="PG" + {...powerGoodVoltageGraphDisplay} /> )} diff --git a/lib/simulations/create-TPS63802-line-transient-figure-circuit.tsx b/lib/simulations/create-TPS63802-line-transient-figure-circuit.tsx index 1db0f9d..3767ea8 100644 --- a/lib/simulations/create-TPS63802-line-transient-figure-circuit.tsx +++ b/lib/simulations/create-TPS63802-line-transient-figure-circuit.tsx @@ -15,34 +15,44 @@ export const createTPS63802LineTransientFigureCircuit = ({ inputVoltageLow, loadResistance, ...props -}: TPS63802LineTransientFigureCircuitProps) => ( - - { + const inputVoltageCenter = + (Number.parseFloat(inputVoltageLow) + Number.parseFloat(inputVoltageHigh)) / + 2; + + return ( + - -); + inputVoltageWaveform={[ + { time: "0us", voltage: inputVoltageLow }, + { time: "750us", voltage: inputVoltageLow }, + { time: "751us", voltage: inputVoltageHigh }, + { time: "1250us", voltage: inputVoltageHigh }, + { time: "1251us", voltage: inputVoltageLow }, + ]} + loadResistance={loadResistance} + mode="pwm" + probeInputVoltage + > + + + ); +}; diff --git a/lib/simulations/create-TPS63802-load-transient-figure-circuit.tsx b/lib/simulations/create-TPS63802-load-transient-figure-circuit.tsx index ab86b33..c9fa9d2 100644 --- a/lib/simulations/create-TPS63802-load-transient-figure-circuit.tsx +++ b/lib/simulations/create-TPS63802-load-transient-figure-circuit.tsx @@ -22,17 +22,27 @@ export const createTPS63802LoadTransientFigureCircuit = ({ { time: "0us", current: "0A" }, { time: "750us", current: "0A" }, { time: "751us", current: "900mA" }, - { time: "1150us", current: "900mA" }, - { time: "1151us", current: "0A" }, + { time: "1250us", current: "900mA" }, + { time: "1251us", current: "0A" }, ]} mode={mode} probeLoadCurrent + loadCurrentGraphDisplay={{ + graphCenter: 1.8, + graphCurrentPerDiv: "400mA", + graphVerticalOffset: 0, + }} + outputVoltageGraphDisplay={{ + graphCenter: 3.1, + graphVoltagePerDiv: "100mV", + graphVerticalOffset: 0, + }} > ( - // Table 10-7 specifies VI = 2.2 V and IO = 10 mA. The annotations under - // Figures 10-30/10-31 instead say 4.2 V and 100 mΩ, which would demand 33 A - // at 3.3 V and cannot describe the plotted startup. Follow the table. + // 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. ( - - +}: 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" ? ( - - ) : ( - - )} - - - - - + + + - - - + {mode === "pwm" ? ( + + ) : ( + + )} + + + + + - - -); + + + + + + + ); +}; diff --git a/lib/spice/create-encrypted-pspice-ngspice-engine.ts b/lib/spice/create-encrypted-pspice-ngspice-engine.ts index 98f326c..22cdb9b 100644 --- a/lib/spice/create-encrypted-pspice-ngspice-engine.ts +++ b/lib/spice/create-encrypted-pspice-ngspice-engine.ts @@ -24,7 +24,7 @@ const importNgspiceSpiceEngine = async () => { }>( isNodeRuntime ? "@tscircuit/ngspice-spice-engine" - : "https://jscdn.tscircuit.com/@tscircuit/ngspice-spice-engine/0.0.18/+esm", + : "https://jscdn.tscircuit.com/@tscircuit/ngspice-spice-engine/0.0.21/+esm", ); } diff --git a/package.json b/package.json index eeb6c99..55e7fed 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "@biomejs/biome": "^2.4.16", "@types/bun": "^1.2.8", "@types/react": "^19.2.17", - "@tscircuit/ngspice-spice-engine": "0.0.20", + "@tscircuit/ngspice-spice-engine": "0.0.21", "tscircuit": "^0.0.2170", "typescript": "^5.0.0" }, 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-transient-figures.test.tsx b/tests/TPS63802-transient-figures.test.tsx deleted file mode 100644 index 822ddc1..0000000 --- a/tests/TPS63802-transient-figures.test.tsx +++ /dev/null @@ -1,83 +0,0 @@ -import { expect, test } from "bun:test"; -import { writeFileSync } from "node:fs"; -import { convertCircuitJsonToSimulationGraphSvg } from "circuit-to-svg"; -import { Circuit } from "tscircuit"; -import TPS63802Figure1021LoadTransientPfmPwmBoostOperationCircuit from "../lib/simulations/TPS63802-Figure-10-21-load-transient-pfm-pwm-boost-operation.circuit"; -import TPS63802Figure1027LineTransientPwmOperationCircuit from "../lib/simulations/TPS63802-Figure-10-27-line-transient-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 renderSimulationFigure = async ({ - circuitElement, - outputPath, -}: { - circuitElement: React.ReactElement; - outputPath: string; -}) => { - const circuit = new Circuit({ - platform: { - spiceEngineMap: { - ngspice: { - async simulate(spiceString) { - writeFileSync(`${outputPath}.spice`, spiceString); - return createCdnNgspiceSpiceEngine().simulate(spiceString); - }, - }, - }, - }, - }); - 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; -}; - -datasheetSimulationTest( - "Figure 10-21. Load Transient, PFM/PWM Boost Operation", - async () => { - const circuit = await renderSimulationFigure({ - circuitElement: ( - - ), - outputPath: "/tmp/TPS63802-Figure-10-21.svg", - }); - - expect(circuit.db.simulation_transient_voltage_graph.list()).toHaveLength( - 1, - ); - expect(circuit.db.simulation_transient_current_graph.list()).toHaveLength( - 1, - ); - }, - 2_000_000, -); - -datasheetSimulationTest( - "Figure 10-27. Line Transient, PWM Operation", - async () => { - const circuit = await renderSimulationFigure({ - circuitElement: ( - - ), - outputPath: "/tmp/TPS63802-Figure-10-27.svg", - }); - - expect(circuit.db.simulation_transient_voltage_graph.list()).toHaveLength( - 2, - ); - expect(circuit.db.simulation_transient_current_graph.list()).toHaveLength( - 0, - ); - }, - 2_000_000, -); From 04651d5ad88ed9da2a366131739e8ebe9981aab1 Mon Sep 17 00:00:00 2001 From: ShiboSoftwareDev Date: Thu, 30 Jul 2026 19:01:31 +0200 Subject: [PATCH 5/5] Keep TI on released ngspice engine --- lib/spice/create-encrypted-pspice-ngspice-engine.ts | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/spice/create-encrypted-pspice-ngspice-engine.ts b/lib/spice/create-encrypted-pspice-ngspice-engine.ts index 22cdb9b..98f326c 100644 --- a/lib/spice/create-encrypted-pspice-ngspice-engine.ts +++ b/lib/spice/create-encrypted-pspice-ngspice-engine.ts @@ -24,7 +24,7 @@ const importNgspiceSpiceEngine = async () => { }>( isNodeRuntime ? "@tscircuit/ngspice-spice-engine" - : "https://jscdn.tscircuit.com/@tscircuit/ngspice-spice-engine/0.0.21/+esm", + : "https://jscdn.tscircuit.com/@tscircuit/ngspice-spice-engine/0.0.18/+esm", ); } diff --git a/package.json b/package.json index 55e7fed..eeb6c99 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "@biomejs/biome": "^2.4.16", "@types/bun": "^1.2.8", "@types/react": "^19.2.17", - "@tscircuit/ngspice-spice-engine": "0.0.21", + "@tscircuit/ngspice-spice-engine": "0.0.20", "tscircuit": "^0.0.2170", "typescript": "^5.0.0" },