Source code for denspp.offline.analog.pyspice_load

from PySpice.Spice.Netlist import Circuit

from .pyspice_handler import PySpiceHandler, SettingsPySpice


[docs] class PySpiceLoad(PySpiceHandler): r_shunt: float = 1.0 def __init__(self, settings: SettingsPySpice): super().__init__(settings) self._register_device(short_label="R", description="Resistor Circuit", func_circ=self._resistor) self._register_device(short_label="L", description="Inductor Circuit", func_circ=self._inductor) self._register_device( short_label="C", description="Capacitive Circuit", func_circ=self._capacitor ) self._register_device( short_label="Ds", description="Diode 1N4148 Circuit", func_circ=self._diode_1n4148, ) self._register_device( short_label="RDs", description="Resitive Diode (single) Circuit", func_circ=self._resistive_diode, ) self._register_device( short_label="RDd", description="Resitive Diode (anti-parallel) Circuit", func_circ=self._resistive_diode_antiparallel, ) self._register_device( short_label="SR", description="Simple Randles Circuit", func_circ=self._simple_randles_model, ) self._register_device( short_label="VD", description="Voltage divider Circuit", func_circ=self._voltage_divider, ) def _resistor(self, r: float = 10e3) -> Circuit: """PySpice model for handling a resistor in simulation :param value: The resistance of the circuit. :return: The circuit model including voltage sources (input, common mode) """ circuit0 = Circuit("Resistive Load") circuit0.R(0, "input", "output", r) circuit0.V("cm", "output", circuit0.gnd, self.vcm) return circuit0 def _capacitor(self, c: float = 1e-9) -> Circuit: """Using capacitor as load element""" circuit = Circuit("Capacitive Load") circuit.R(0, "input", "middle", self.r_shunt) circuit.C(0, "middle", "output", c) circuit.V("cm", "output", circuit.gnd, self.vcm) return circuit def _inductor(self, l: float = 1e-9) -> Circuit: """Using capacitor as load element""" circuit = Circuit("Capacitive Load") circuit.R(0, "input", "middle", self.r_shunt) circuit.L(0, "middle", "output", l) circuit.V("cm", "output", circuit.gnd, self.vcm) return circuit def _diode_1n4148(self) -> Circuit: """PySpice model for using a 1N4148 diode in simulation :return: The circuit model including voltage sources (input, common mode) """ circuit0 = Circuit("Diode_1N4148") circuit0.model( "1N4148", "D", IS=4.352e-9, N=1.906, BV=110, IBV=1e-5, RS=0.6458, CJO=7.048e-13, V=0.869, M=0.03, FC=0.5, TT=3.48e-9, ) circuit0.Diode(0, "input", "middle", model="1N4148") circuit0.R(0, "middle", "output", self.r_shunt) circuit0.V("cm", "output", circuit0.gnd, self.vcm) return circuit0 def _resistive_diode( self, r0: float = 1e3, Uth: float = 0.7, IS0: float = 4e-12, N: float = 2.0 ) -> Circuit: """PySpice model for handling a custom-made diode (series) in simulation :param r0: The resistance of the diode. :param Uth: Threshold voltage of the diode. :param IS0: Saturation current of the diode. :param N: Nonlinear factor of the diode. :return: The circuit model including voltage sources (input, common mode) """ circuit0 = Circuit("Resistive Diode") circuit0.model( "myDiode", "D", IS=IS0, RS=0, N=N, VJ=Uth, BV=10, IBV=1e-12, ) circuit0.R(1, "input", "middle", r0 + self.r_shunt) circuit0.Diode(0, "middle", "output", model="myDiode") circuit0.V("cm", "output", circuit0.gnd, self.vcm) return circuit0 def _resistive_diode_antiparallel( self, r0: float = 1e3, Uth: float = 0.7, IS0: float = 4e-12, N: float = 2.0 ) -> Circuit: """PySpice model for handling a custom-made diode (antiparallel) in simulation :param r0: The resistance of the diode. :param Uth: Threshold voltage of the diode. :param IS0: Saturation current of the diode. :param N: Nonlinear factor of the diode. :return: The circuit model including voltage sources (input, common mode) """ circuit0 = Circuit("Resistive Diode (Antiparallel)") circuit0.model("myDiode", "D", IS=IS0, RS=0, N=N, VJ=Uth, BV=10, IBV=1e-12) circuit0.R(1, "input", "middle", r0 + self.r_shunt) circuit0.Diode(0, "middle", "output", model="myDiode") circuit0.Diode(1, "output", "middle", model="myDiode") circuit0.V("cm", "output", circuit0.gnd, self.vcm) return circuit0 def _simple_randles_model( self, r_tis: float = 10e3, r_far: float = 100e6, c_dl: float = 10e-9 ) -> Circuit: """PySpice model for handling a Randles model in simulation :param r_tis: Tissue resistance. :param r_far: Faraday resistance. :param c_dl: Double layer capacity. :return: The circuit model including voltage sources (input, common mode) """ circuit0 = Circuit("Simple Randles Model") circuit0.R(1, "input", "middle", r_tis) circuit0.R(2, "middle", "output", r_far) circuit0.C(1, "middle", "output", c_dl) circuit0.V("cm", "output", circuit0.gnd, self.vcm) return circuit0 def _voltage_divider( self, r0: float = 10e3, r1: float = 10e3, rl: float = 10e12, cl: float = 0.0 ) -> Circuit: """PySpice model for handling a custom-made diode (series) in simulation :param r0: The resistance of the diode. :param r1: The resistance of the diode. :param rl: The resistance of the diode. :param cl: The resistance of the diode. :return: The circuit model including voltage sources (input, common mode) """ circuit0 = Circuit("Voltage Divider with Load") circuit0.R(1, "input", "output", r0) circuit0.R(2, "output", "ref", r1) circuit0.R(3, "output", "ref", rl) if cl: circuit0.C(0, "output", "ref", cl) circuit0.V(0, "ref", circuit0.gnd, self.vcm) return circuit0