from PySpice.Spice.Netlist import Circuit
from .pyspice_handler import PySpiceHandler, SettingsPySpice
[docs]
class PySpiceLoad(PySpiceHandler):
r_shunt: float = 1.
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