def __init__(self, subcircuit_json):
        self.__name__ = subcircuit_json["name"]
        # Get components that make up subcircuit 
        elements = subcircuit_json["components"]
        # Extract input and output nodes of subcircuit
        ports = elements.pop('P')
        nodes = []
        for port in ports:
            if port["node1"] == "gnd":
                nodes.append(port["node2"])
            elif port["node2"] == "gnd":
                nodes.append(port["node1"])

        self.__nodes__ = nodes[::-1]
        # Initialize subcircuit netlist using PySpice SubCircuit module
        SubCircuit.__init__(self, self.__name__, *self.__nodes__)
        # build netlist
        for element in elements:
            if element == "R":
                for resistor in elements["R"]:
                    self.R(resistor["id"], resistor["node1"], resistor["node2"], resistor["value"] @u_Ohm)

            elif element == "L":
                for inductor in elements["L"]:
                    self.L(inductor["id"], inductor["node1"], inductor["node2"], inductor["value"] @u_H)

            elif element == "C":
                for capacitor in elements["C"]:
                    self.C(capacitor["id"], capacitor["node1"], capacitor["node2"], capacitor["value"] @u_F)
Exemple #2
0
    def __init__(self, name, K, KI, AWG, MINV, MAXV):

        # super().__init__()
        SubCircuit.__init__(self, name, *self.__nodes__)

        self.BehavioralSource(
            'Vprop',
            'prop',
            self.gnd,
            voltage_expression='{}*(V(In+)-V(In-))'.format(K),
        )
        self.BehavioralSource(
            'Vsum',
            'sum',
            self.gnd,
            voltage_expression='V(prop)+V(integ)',
        )
        self.BehavioralSource(
            'Vdiffclip',
            'overfl',
            self.gnd,
            voltage_expression='{}*(V(Out)-V(sum))'.format(AWG),
        )
        self.BehavioralSource(
            'Vsum2',
            'antiwind',
            self.gnd,
            voltage_expression='V(overfl)+V(prop)',
        )
        self.BehavioralSource(
            'VClip',
            'Out',
            self.gnd,
            voltage_expression='V(sum)< {0} ? {0} : V(sum) > {1} ? {1} : V(sum)'
            .format(MINV, MAXV),
        )

        # integrator part - fixme with int model from NGSpice ?
        self.VoltageControlledCurrentSource(
            'I_Int',
            'antiwind',
            self.gnd,
            self.gnd,
            'integ',
            multiplier=KI,
        )
        self.C('i', 'integ', self.gnd, 1)
        self.R('i', 'integ', self.gnd, 1000000)
Exemple #3
0
    def __init__(self, name, K, KI, AWG, MINV, MAXV):

        # super().__init__()
        SubCircuit.__init__(self, name, *self.__nodes__)

        self.BehavioralSource(
            'Vprop',
            'prop', self.gnd,
            voltage_expression='{}*(V(In+)-V(In-))'.format(K),
        )
        self.BehavioralSource(
            'Vsum',
            'sum', self.gnd,
            voltage_expression='V(prop)+V(integ)',
        )
        self.BehavioralSource(
            'Vdiffclip',
            'overfl', self.gnd,
            voltage_expression='{}*(V(Out)-V(sum))'.format(AWG),
        )
        self.BehavioralSource(
            'Vsum2',
            'antiwind', self.gnd,
            voltage_expression='V(overfl)+V(prop)',
        )
        self.BehavioralSource(
            'VClip',
            'Out', self.gnd,
            voltage_expression='V(sum)< {0} ? {0} : V(sum) > {1} ? {1} : V(sum)'.format(MINV, MAXV),
        )

        # integrator part - fixme with int model from NGSpice ?
        self.VoltageControlledCurrentSource(
            'I_Int',
            'antiwind', self.gnd, self.gnd,
            'integ', multiplier=KI,
        )
        self.C('i', 'integ', self.gnd, 1)
        self.R('i', 'integ', self.gnd, 1000000)
Exemple #4
0
 def __init__(self, name, R1=1 @ u_Ω, R2=2 @ u_Ω):
     SubCircuit.__init__(self, name, *self.__nodes__)
     self.R(1, 'n1', 'n2', R1)
     self.R(2, 'n1', 'n2', R2)