#################################################################################################### 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),
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)
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)
#################################################################################################### 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)
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, )
#################################################################################################### 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))
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_Ω)
#################################################################################################### 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,
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)
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)
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')