Esempio n. 1
0
####################################################################################################

libraries_path = os.path.join(os.environ['PySpice_examples_path'], 'libraries')
spice_library = SpiceLibrary(libraries_path)

####################################################################################################

from RingModulator import RingModulator

####################################################################################################

circuit = Circuit('Ring Modulator')

modulator = circuit.Sinusoidal('modulator',
                               'in',
                               circuit.gnd,
                               amplitude=1,
                               frequency=kilo(1))
carrier = circuit.Sinusoidal('carrier',
                             'carrier',
                             circuit.gnd,
                             amplitude=10,
                             frequency=kilo(100))
circuit.R('in', 'in', 1, 50)
circuit.R('carrier', 'carrier', 2, 50)

circuit.include(spice_library['1N4148'])
circuit.subcircuit(
    RingModulator(
        outer_inductance=micro(1),
        inner_inductance=micro(1),
Esempio n. 2
0
def mkschematic(ind, nnodes, nodelist, spice_library):
    circuit = Circuit('generated circuit')

    circuit.V('vcc', 'vcc', circuit.gnd, '5V')
    circuit.V('vdd', 'vdd', circuit.gnd, '-5V')
    circuit.Sinusoidal('input', 'vin', circuit.gnd, amplitude=5)

    nodes = 0
    for i in range(nnodes):
        if ind[5 * i] == 1:
            circuit.R(
                nodes,
                nodelist[ind[5 * i +
                             2]] if ind[5 * i + 2] != 0 else circuit.gnd,
                nodelist[ind[5 * i +
                             3]] if ind[5 * i + 3] != 0 else circuit.gnd,
                values.E12R[ind[5 * i + 1]])
        elif ind[5 * i] == 2:
            circuit.C(
                nodes,
                nodelist[ind[5 * i +
                             2]] if ind[5 * i + 2] != 0 else circuit.gnd,
                nodelist[ind[5 * i +
                             3]] if ind[5 * i + 3] != 0 else circuit.gnd,
                values.E12C[ind[5 * i + 1]])
        elif ind[5 * i] == 3:
            circuit.include(spice_library['2n2222a'])
            circuit.BJT(
                nodes,
                nodelist[ind[5 * i +
                             2]] if ind[5 * i + 2] != 0 else circuit.gnd,
                nodelist[ind[5 * i +
                             3]] if ind[5 * i + 3] != 0 else circuit.gnd,
                nodelist[ind[5 * i +
                             4]] if ind[5 * i + 4] != 0 else circuit.gnd,
                '2n2222a')
        elif ind[5 * i] == 4:
            circuit.include(spice_library['2n2907'])
            circuit.BJT(
                nodes,
                nodelist[ind[5 * i +
                             2]] if ind[5 * i + 2] != 0 else circuit.gnd,
                nodelist[ind[5 * i +
                             3]] if ind[5 * i + 3] != 0 else circuit.gnd,
                nodelist[ind[5 * i +
                             4]] if ind[5 * i + 4] != 0 else circuit.gnd,
                '2n2907')
        elif ind[5 * i] == 6:
            circuit.include(spice_library['1N4148'])
            circuit.X(
                'D{}'.format(nodes), '1N4148',
                nodelist[ind[5 * i +
                             2]] if ind[5 * i + 2] != 0 else circuit.gnd,
                nodelist[ind[5 * i +
                             3]] if ind[5 * i + 3] != 0 else circuit.gnd)
        elif ind[5 * i] == 5:
            circuit.L(
                nodes,
                nodelist[ind[5 * i +
                             2]] if ind[5 * i + 2] != 0 else circuit.gnd,
                nodelist[ind[5 * i +
                             3]] if ind[5 * i + 3] != 0 else circuit.gnd,
                values.E12I[ind[5 * i + 1]])
        elif ind[5 * i] == 0:
            continue
        else:
            continue
        nodes += 1
    print(circuit)
Esempio n. 3
0
import PySpice.Logging.Logging as Logging
logger = Logging.setup_logging()

####################################################################################################

from PySpice.Plot.BodeDiagram import bode_diagram
from PySpice.Spice.Netlist import Circuit
from PySpice.Unit import *

####################################################################################################

#cm# low-pass-rc-filter.m4

circuit = Circuit('Low-Pass RC Filter')

circuit.Sinusoidal('input', 'in', circuit.gnd, amplitude=1 @ u_V)
R1 = circuit.R(1, 'in', 'out', 1 @ u_kΩ)
C1 = circuit.C(1, 'out', circuit.gnd, 1 @ u_uF)

#!# The break frequency is given by :math:`f_c = \frac{1}{2 \pi R C}`

break_frequency = 1 / (2 * math.pi * float(R1.resistance * C1.capacitance))
print("Break frequency = {:.1f} Hz".format(break_frequency))
#o#

simulator = circuit.simulator(temperature=25, nominal_temperature=25)
analysis = simulator.ac(start_frequency=1 @ u_Hz,
                        stop_frequency=1 @ u_MHz,
                        number_of_points=10,
                        variation='dec')
# print(analysis.out)
Esempio n. 4
0
####################################################################################################

libraries_path = os.path.join(os.environ['PySpice_examples_path'], 'libraries')
spice_library = SpiceLibrary(libraries_path)

####################################################################################################

figure1 = plt.figure(1, (20, 10))

####################################################################################################

circuit = Circuit('half-wave rectification')
circuit.include(spice_library['1N4148'])
source = circuit.Sinusoidal('input',
                            'in',
                            circuit.gnd,
                            amplitude=10 @ u_V,
                            frequency=50 @ u_Hz)
circuit.X('D1', '1N4148', 'in', 'output')
circuit.R('load', 'output', circuit.gnd, 100 @ u_Ω)

simulator = circuit.simulator(temperature=25, nominal_temperature=25)
analysis = simulator.transient(step_time=source.period / 200,
                               end_time=source.period * 2)

axe = plt.subplot(221)
plt.title('Half-Wave Rectification')
plt.xlabel('Time [s]')
plt.ylabel('Voltage [V]')
plt.grid()
plot(analysis['in'], axis=axe)
Esempio n. 5
0
    def generate_and_test(self, gui, ind):
        circuit = Circuit('generated circuit')
        sys.stdout.write('  {:.1%}%\b\r'.format(self.GENCOUNTER /
                                                self.POPSIZE))
        sys.stdout.flush()

        circuit.V('vcc', 'vcc', circuit.gnd, '5V')
        circuit.V('vdd', 'vdd', circuit.gnd, '-5V')
        circuit.Sinusoidal('input', 'vin', circuit.gnd, amplitude=2)

        nodes = 0
        try:
            for i in range(self.N_NODES):
                if ind[5 * i] == 1:
                    circuit.R(
                        nodes, self.NODELIST[ind[5 * i + 2]]
                        if ind[5 * i + 2] != 0 else circuit.gnd,
                        self.NODELIST[ind[5 * i + 3]] if ind[5 * i + 3] != 0
                        else circuit.gnd, values.E12R[ind[5 * i + 1]])
                elif ind[5 * i] == 2:
                    circuit.C(
                        nodes, self.NODELIST[ind[5 * i + 2]]
                        if ind[5 * i + 2] != 0 else circuit.gnd,
                        self.NODELIST[ind[5 * i + 3]] if ind[5 * i + 3] != 0
                        else circuit.gnd, values.E12C[ind[5 * i + 1]])
                elif ind[5 * i] == 3:
                    circuit.include(self.spice_library['2n2222a'])
                    circuit.BJT(
                        nodes, self.NODELIST[ind[5 * i + 2]]
                        if ind[5 * i + 2] != 0 else circuit.gnd,
                        self.NODELIST[ind[5 * i + 3]] if ind[5 * i + 3] != 0
                        else circuit.gnd, self.NODELIST[ind[5 * i + 4]]
                        if ind[5 * i + 4] != 0 else circuit.gnd, '2n2222a')
                elif ind[5 * i] == 4:
                    circuit.include(self.spice_library['2n2907'])
                    circuit.BJT(
                        nodes, self.NODELIST[ind[5 * i + 2]]
                        if ind[5 * i + 2] != 0 else circuit.gnd,
                        self.NODELIST[ind[5 * i + 3]] if ind[5 * i + 3] != 0
                        else circuit.gnd, self.NODELIST[ind[5 * i + 4]]
                        if ind[5 * i + 4] != 0 else circuit.gnd, '2n2907')
                elif ind[5 * i] == 6:
                    circuit.include(self.spice_library['1N4148'])
                    circuit.X(
                        'D{}'.format(nodes), '1N4148',
                        self.NODELIST[ind[5 * i + 2]] if ind[5 * i + 2] != 0
                        else circuit.gnd, self.NODELIST[ind[5 * i + 3]]
                        if ind[5 * i + 3] != 0 else circuit.gnd)
                elif ind[5 * i] == 5:
                    circuit.L(
                        nodes, self.NODELIST[ind[5 * i + 2]]
                        if ind[5 * i + 2] != 0 else circuit.gnd,
                        self.NODELIST[ind[5 * i + 3]] if ind[5 * i + 3] != 0
                        else circuit.gnd, values.E12I[ind[5 * i + 1]])
                elif ind[5 * i] == 0:
                    continue
                else:
                    continue
                nodes += 1
            simulator = circuit.simulator(temperature=25,
                                          nominal_temperature=25)
            analysis = simulator.transient(start_time="2ms",
                                           step_time='1ms',
                                           end_time='40ms',
                                           max_time='40ms ')
        except:
            self.DEAD += 1
            self.s['pop'][self.s['counter']] = [self.GEN, -1, self.GENCOUNTER]
            self.s['counter'] += 1
            self.GENCOUNTER += 1
            return (-1., )
        result = 0
        try:
            j = 0.
            for n, m in zip(analysis.nodes['vin'][1:-1],
                            analysis.nodes['out'][1:-1]):
                j += self.toolbox.evaluator(n, m)
            result = (j / max([
                len(analysis.nodes['out'][1:-1]),
                len(analysis.nodes['out'][1:-1])
            ])) * (1 + 0.01 * (self.N_NODES - nodes))
            if result > 0 and gui != None:
                gui.dc.update_data(result, analysis.nodes['out'][1:-1],
                                   analysis.nodes['vin'][1:-1])
            self.s['pop'][self.s['counter']] = [
                self.GEN, result, self.GENCOUNTER
            ]
            self.GENCOUNTER += 1
            self.s['counter'] += 1
            return (result if result > 0 else 0, )
        except:
            self.s['pop'][self.s['counter']] = [
                self.GEN, -0.5, self.GENCOUNTER
            ]
            self.s['counter'] += 1
            self.GENCOUNTER += 1
            return (-0.5, )
Esempio n. 6
0
####################################################################################################

libraries_path = os.path.join(os.path.dirname(os.path.dirname(__file__)),
                              'libraries')
spice_library = SpiceLibrary(libraries_path)

####################################################################################################

#cm# ac-coupled-amplifier.m4

circuit = Circuit('Transistor')

circuit.V('power', 5, circuit.gnd, 15 @ u_V)
source = circuit.Sinusoidal('in',
                            'in',
                            circuit.gnd,
                            amplitude=.5 @ u_V,
                            frequency=1 @ u_kHz)
circuit.C(1, 'in', 2, 10 @ u_uF)
circuit.R(1, 5, 2, 100 @ u_kΩ)
circuit.R(2, 2, 0, 20 @ u_kΩ)
circuit.R('C', 5, 4, 10 @ u_kΩ)
circuit.BJT(1, 4, 2, 3, 'bjt')  # Q is mapped to BJT !
circuit.model('bjt', 'npn', bf=80, cjc=pico(5), rb=100)
circuit.R('E', 3, 0, 2 @ u_kΩ)
circuit.C(2, 4, 'out', 10 @ u_uF)
circuit.R('Load', 'out', 0, 1 @ u_MΩ)

####################################################################################################

figure = plt.figure(1, (20, 10))
Esempio n. 7
0
from PySpice.Plot.BodeDiagram import bode_diagram
from PySpice.Spice.Netlist import Circuit
from PySpice.Unit import *

####################################################################################################

#!# We define four low-pass RLC filters with the following factor of quality: .5, 1, 2 and 4.

#cm# low-pass-rlc-filter.m4

circuit1 = Circuit('Four double-pole Low-Pass RLC Filter')

inductance = 10 @ u_mH
capacitance = 1 @ u_uF

circuit1.Sinusoidal('input', 'in', circuit1.gnd, amplitude=1 @ u_V)
#?# pulse 0 5 10 ms
# Q = .5
circuit1.R(1, 'in', 1, 200 @ u_Ω)
circuit1.L(1, 1, 'out5', inductance)
circuit1.C(1, 'out5', circuit1.gnd, capacitance)
# Q = 1
circuit1.R(2, 'in', 2, 100 @ u_Ω)
circuit1.L(2, 2, 'out1', inductance)
circuit1.C(2, 'out1', circuit1.gnd, capacitance)
# Q = 2
circuit1.R(3, 'in', 3, 50 @ u_Ω)
circuit1.L(3, 3, 'out2', inductance)
circuit1.C(3, 'out2', circuit1.gnd, capacitance)
# Q = 4
R4 = circuit1.R(4, 'in', 4, 25 @ u_Ω)
Esempio n. 8
0
####################################################################################################

libraries_path = os.path.join(os.environ['PySpice_examples_path'], 'libraries')
spice_library = SpiceLibrary(libraries_path)

####################################################################################################

from RingModulator import RingModulator

####################################################################################################

circuit = Circuit('Ring Modulator')

modulator = circuit.Sinusoidal('modulator',
                               'in',
                               circuit.gnd,
                               amplitude=1 @ u_V,
                               frequency=1 @ u_kHz)
carrier = circuit.Sinusoidal('carrier',
                             'carrier',
                             circuit.gnd,
                             amplitude=10 @ u_V,
                             frequency=100 @ u_kHz)
circuit.R('in', 'in', 1, 50 @ u_Ω)
circuit.R('carrier', 'carrier', 2, 50 @ u_Ω)

circuit.include(spice_library['1N4148'])
circuit.subcircuit(
    RingModulator(
        outer_inductance=1 @ u_uH,
        inner_inductance=1 @ u_uH,
Esempio n. 9
0
from PySpice.Unit import *

####################################################################################################

libraries_path = os.path.join(os.environ['PySpice_examples_path'], 'libraries')
spice_library = SpiceLibrary(libraries_path)

####################################################################################################

#cm# voltage-multiplier-circuit.m4

circuit = Circuit('Voltage Multiplier')
circuit.include(spice_library['1N4148'])
source = circuit.Sinusoidal('input',
                            'in',
                            circuit.gnd,
                            amplitude=10 @ u_V,
                            frequency=50 @ u_Hz)

multiplier = 5
for i in range(multiplier):
    if i:
        top_node = i - 1
    else:
        top_node = 'in'
    midlle_node, bottom_node = i + 1, i
    circuit.C(i, top_node, midlle_node, 1 @ u_mF)
    circuit.X(i, '1N4148', midlle_node, bottom_node)
circuit.R(1, multiplier, multiplier + 1, 1 @ u_MΩ)

simulator = circuit.simulator(temperature=25, nominal_temperature=25)
Esempio n. 10
0
    print("Quiescent {:.1f} mV {:.1f} mA".format(quiescent_voltage * 1e3,
                                                 quiescent_current * 1e3))
dynamic_resistance = ((quiescent_points[0]['quiescent_voltage'] -
                       quiescent_points[-1]['quiescent_voltage']) /
                      (quiescent_points[0]['quiescent_current'] -
                       quiescent_points[-1]['quiescent_current']))

print("Dynamic Resistance", dynamic_resistance)

####################################################################################################

circuit = Circuit('Diode')
circuit.include(spice_library['BAV21'])
circuit.Sinusoidal('input',
                   'in',
                   circuit.gnd,
                   dc_offset=dc_offset,
                   offset=dc_offset,
                   amplitude=ac_amplitude)
R = circuit.R(1, 'in', 'out', kilo(1))
circuit.D('1', 'out', circuit.gnd, model='BAV21')

simulator = circuit.simulator(temperature=25, nominal_temperature=25)
analysis = simulator.ac(start_frequency=kilo(10),
                        stop_frequency=giga(1),
                        number_of_points=10,
                        variation='dec')

figure = plt.figure(1, (20, 10))

axe = plt.subplot(311)
axe.semilogx(analysis.frequency, np.absolute(analysis.out) * 1e3)
Esempio n. 11
0
pyspice_examples_spice_library = SpiceLibrary(pyspice_examples_libraries_path)

# My own custom spice libraries, already next to this script.
custom_libraries_path = os.path.join(
    os.path.dirname(os.path.realpath(__file__)), 'libraries')
custom_spice_library = SpiceLibrary(custom_libraries_path)

circuit = Circuit('dynamo hub LED driver')
circuit.include(pyspice_examples_spice_library['1N4148'])  # standard diode
circuit.include(custom_spice_library['CONSTANT_POWER_LOAD']
                )  # models a switching regulator

# Hub dynamo model
source = circuit.Sinusoidal('input',
                            'in',
                            circuit.gnd,
                            amplitude=Vp,
                            frequency=Vf)
circuit.L('L_hub', 'in', 'L_hub_out', Lh)
circuit.R('R_hub', 'L_hub_out', 'bridge_in_plus', Rh)
circuit.R('R_hub_parasitic', 'L_hub_out', circuit.gnd, Rhp)

# bridge rectifier
circuit.X('D1', '1N4148', 'bridge_in_plus', 'output_plus')
circuit.X('D2', '1N4148', 'output_minus', circuit.gnd)
circuit.X('D3', '1N4148', circuit.gnd, 'output_plus')
circuit.X('D4', '1N4148', 'output_minus', 'bridge_in_plus')

# load and filter cap
circuit.X('load', 'CONSTANT_POWER_LOAD', 'output_plus', 'output_minus', P=Pl)
circuit.C('1', 'output_plus', 'output_minus', C, initial_condition=10 @ u_V)
    dc_signal = 0.5
    f_sample = 100E6
    t_sample = 1/f_sample
    #Simulator Vars
    tran_sim_end_time = 1E2/f_signal

    #Test Bench Definition
    circuit = Circuit('TestBench')
    circuit.subcircuit(IdealDac(nbits=dac_nbits))
    circuit.subcircuit(BitLogic())
    circuit.subcircuit(IdealSampleHold())
    circuit.subcircuit(IdealPipelineStage())
    circuit.subcircuit(IdealAdc(nbits=adc_nbits))
    #Instantiating Sources
    # -input source
    circuit.Sinusoidal('in1', 'in1', circuit.gnd, dc_offset=dc_signal, offset=dc_signal, amplitude=amp_signal, frequency=f_signal, delay=0, damping_factor=0)
    # -supply rails and references
    circuit.V('vdd', 'vdd', circuit.gnd, 1)
    circuit.V('refp', 'vrefp', circuit.gnd, 1)
    circuit.V('refn', 'vrefn', circuit.gnd, 0)
    # - clock
    circuit.Pulse('clk', 'clk', circuit.gnd, 0, 1, t_sample/2, t_sample, fall_time=0.01*t_sample, rise_time=0.01*t_sample)
    # -ADC/DAC
    circuit.X('ADC', 'IDEALADC', 'vrefp', 'vrefn', 'vdd', circuit.gnd, 'in1', 'clk', ', '.join([('b'+str(i)) for i in range(adc_nbits)]))
    circuit.X('DAC', 'IDEALDAC', 'vrefp', 'vrefn', 'vdd', circuit.gnd, ', '.join([('b'+str(i)) for i in range(dac_nbits)]), 'out')
    #Transient Sims
    # -instantiating a simulator
    simulator = circuit.simulator(temperature=25, nominal_temperature=25)
    # -defining Simulator Properties
    simulator.options('MAXORD=5')
    simulator.options('METHOD=Gear')