#!/usr/bin/python # KicadtoNgspice.py is a python script to convert a Kicad spice netlist to a ngspice netlist. It developed for OSCAD software. It is written by FOSSEE team, IIT B. # Copyright (C) FOSSEE Project, IIT Bombay. # This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. # This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. # You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. import sys import os.path def readNetlist(filename): """Read Pspice netList""" # Open file if it exists if os.path.exists(filename): try: f = open(filename) except : print("Error in opening file") sys.exit() else: print filename + " does not exist" sys.exit() # Read the data from file data=f.read() # Close the file f.close() return data.splitlines() def readParamInfo(data): """Read Parameter information and store it into dictionary""" param={} for eachline in lines: eachline=eachline.strip() if len(eachline)>1: words=eachline.split(); option=words[0].lower() if option=='.param': for i in range(1, len(words), 1): paramList=words[i].split('=') param[paramList[0]]=paramList[1] return param def preprocessNetlist(lines,param): """Preprocess netlist (replace parameters)""" netlist=[] for eachline in lines: # Remove leading and trailing blanks spaces from line eachline=eachline.strip() # Remove special character $ eachline=eachline.replace('$','') # Replace parameter with values for subParam in eachline.split(): if '}' in subParam: key=subParam.split()[0] key=key.strip('{') key=key.strip('}') if key in param: eachline=eachline.replace('{'+key+'}',param[key]) else: print "Parameter " + key +" does not exists" value=raw_input('Enter parameter value: ') eachline=eachline.replace('{'+key+'}',value) # Convert netlist into lower case letter eachline=eachline.lower() # Construct netlist if len(eachline)>1: if eachline[0]=='+': netlist.append(netlist.pop()+eachline.replace('+',' ')) else: netlist.append(eachline) # Copy information line infoline=netlist[0] netlist.remove(netlist[0]) return netlist,infoline def separateNetlistInfo(netlist): optionInfo=[] schematicInfo=[] for eachline in netlist: if eachline[0]=='*': continue elif eachline[0]=='.': optionInfo.append(eachline) else: schematicInfo.append(eachline) return optionInfo,schematicInfo def addAnalysis(optionInfo): """Add Analysis to the netlist""" # Open file if it exists filename="analysis" if os.path.exists(filename): try: f = open(filename) except : print("Error in opening file") sys.exit() else: print filename + " does not exist" sys.exit() # Read the data from file data=f.read() # Close the file f.close() analysisData=data.splitlines() for eachline in analysisData: eachline=eachline.strip() if len(eachline)>1: if eachline[0]=='.': optionInfo.append(eachline) else: pass return optionInfo def findCurrent(schematicInfo,outputOption): """Find current through component by placing voltage source series with the component""" i=0 for eachline in outputOption: words=eachline.split() option=words[0] # Add voltage sources in series with component to find current if option=="print" or option=="plot": words.remove(option) updatedline=eachline for outputVar in words: # Find component name if output variable is current if outputVar[0]=='i': outputVar=outputVar.strip('i') outputVar=outputVar.strip('(') compName=outputVar.strip(')') # If component is voltage source, skip if compName[0]=='v': continue # Find the component from the circuit for compline in schematicInfo: compInfo=compline.split() if compInfo[0]==compName: # Construct dummy node dummyNode='dummy_'+str(i) i+=1 # Break the one node component and place zero value voltage source in between. index=schematicInfo.index(compline) schematicInfo.remove(compline) compline=compline.replace(compInfo[2],dummyNode) schematicInfo.insert(index,compline) schematicInfo.append('v'+compName+' '+dummyNode+' '+compInfo[2]+' 0') # Update option information updatedline=updatedline.replace('i('+compName+')','i(v'+compName+')') index=outputOption.index(eachline) outputOption.remove(eachline) outputOption.insert(index,updatedline) return schematicInfo, outputOption def insertSpecialSourceParam(schematicInfo): """Insert Special source parameters""" schematicInfo1=[] for compline in schematicInfo: words=compline.split() compName=words[0] # Ask for parameters of the source if compName[0]=='v' or compName[0]=='i': # Find the index component from the circuit index=schematicInfo.index(compline) schematicInfo.remove(compline) if words[3]=="pulse": print "----------------------------------------------\n" print "Add parameters for pulse source "+compName v1=raw_input(' Enter initial value(Volts/Amps): ') v2=raw_input(' Enter pulsed value(Volts/Amps): ') td=raw_input(' Enter delay time (seconds): ') tr=raw_input(' Enter rise time (seconds): ') tf=raw_input(' Enter fall time (seconds): ') pw=raw_input(' Enter pulse width (seconds): ') tp=raw_input(' Enter period (seconds): ') print "----------------------------------------------" compline=compline + "("+v1+" "+v2+" "+td+" "+tr+" "+tf+" "+pw+" "+tp+")" elif words[3]=="sine": print "----------------------------------------------\n" print "Add parameters for sine source "+compName vo=raw_input(' Enter offset value (Volts/Amps): ') va=raw_input(' Enter amplitude (Volts/Amps): ') freq=raw_input(' Enter frequency (Hz): ') td=raw_input(' Enter delay time (seconds): ') theta=raw_input(' Enter damping factor (1/seconds): ') print "----------------------------------------------" compline=compline + "("+vo+" "+va+" "+freq+" "+td+" "+theta+")" elif words[3]=="ac": print "----------------------------------------------\n" print "Add parameters for ac source "+compName v_a=raw_input(' Enter amplitude (Volts/Amps): ') print "----------------------------------------------" compline=compline + " " + v_a elif words[3]=="exp": print "----------------------------------------------\n" print "Add parameters for exponential source "+compName v1=raw_input(' Enter initial value(Volts/Amps): ') v2=raw_input(' Enter pulsed value(Volts/Amps): ') td1=raw_input(' Enter rise delay time (seconds): ') tau1=raw_input(' Enter rise time constant (seconds): ') td2=raw_input(' Enter fall time (seconds): ') tau2=raw_input(' Enter fall time constant (seconds): ') print "----------------------------------------------" compline=compline + "("+v1+" "+v2+" "+td1+" "+tau1+" "+td2+" "+tau2+")" elif words[3]=="pwl": print "----------------------------------------------\n" print "Add parameters for piecewise linear source "+compName inp="y" compline=compline + "(" while inp=="y": t1=raw_input(' Enter time (seconds): ') v1=raw_input(' Enter value(Volts/Amps): ') compline=compline + t1+" "+v1+" " inp=raw_input(' Do you want to continue(y/n): ') print "----------------------------------------------" compline=compline + ")" elif words[3]=="dc": print "----------------------------------------------\n" print "Add parameters for DC source "+compName v1=raw_input(' Enter value(Volts/Amps): ') print "----------------------------------------------" compline=compline + " "+v1 schematicInfo.insert(index,compline) elif compName[0]=='h' or compName[0]=='f': # Find the index component from the circuit index=schematicInfo.index(compline) schematicInfo.remove(compline) schematicInfo.insert(index,"* "+compName) schematicInfo1.append("V"+compName+" "+words[3]+" "+words[4]+" 0") schematicInfo1.append(compName+" "+words[1]+" "+words[2]+" "+"V"+compName+" "+words[5]) schematicInfo=schematicInfo+schematicInfo1 return schematicInfo def convertICintoBasicBlocks(schematicInfo,outputOption): """Insert Special source parameters""" k=1 for compline in schematicInfo: words=compline.split() compName=words[0] # Find the IC from schematic if compName[0]=='u': # Find the component from the circuit index=schematicInfo.index(compline) schematicInfo.remove(compline) compType=words[len(words)-1]; if (compType=="7404" or compType=="74hc04" or compType=="74hct04" or compType=="74ls04" or compType=="74ls14"): i=1; # Add first three Not gates while words[i]!="0": # Add analog to digital converter for input A schematicInfo.append("a"+str(k)+" ["+words[i]+"] ["+words[i]+"_in] "+" "+compName+"adc") k=k+1 # Add Not gate schematicInfo.append("a"+str(k)+" "+words[i]+"_in "+words[i+1]+"_out "+compName) k=k+1 # Add digital to analog converter for output B schematicInfo.append("a"+str(k)+" ["+words[i+1]+"_out] ["+words[i+1]+"] "+" "+compName+"dac") k=k+1 i=i+2 i=i+1 # Add last three Not gates while i11: # Add analog to digital converter for inputs schematicInfo.append("a"+str(k)+" ["+words[12]+" "+words[11]+" "+words[10]+" "+words[13]+"] ["+words[12]+"_in "+words[11]+"_in "+words[10]+"_in "+words[13]+"_in] "+compName+"adc") k=k+1 # Add D Flip-flop schematicInfo.append("a"+str(k)+" "+words[12]+"_in "+words[11]+"_in ~"+words[10]+"_in ~"+words[13]+"_in "+words[9]+"_out "+words[8]+"_out "+compName) k=k+1 # Add digital to analog converter for outputs schematicInfo.append("a"+str(k)+" ["+words[9]+"_out "+words[8]+"_out] ["+words[9]+" "+words[8]+"] "+" "+compName+"dac") k=k+1 # Insert comment in-place of components schematicInfo.insert(index,"* "+compType) # Add model for D Flip-Flop schematicInfo.append(".model "+ compName+" d_dff") # Add model for analog-to-digital bridge schematicInfo.append(".model "+ compName+"adc adc_bridge(in_low=0.8 in_high=2.0)") # Add model for digital-to-analog bridge schematicInfo.append(".model "+ compName+"dac dac_bridge(out_low=0.25 out_high=5.0 out_undef=1.8 t_rise=0.5e-9 t_fall=0.5e-9)") elif (compType=="74107" or compType=="74hc107" or compType=="74ls107"): if len(words)>11: # Add analog to digital converter for inputs schematicInfo.append("a"+str(k)+" ["+words[1]+" "+words[4]+" "+words[12]+" "+words[13]+"] ["+words[1]+"_in "+words[4]+"_in "+words[12]+"_in "+words[13]+"_in] "+compName+"adc") k=k+1 # Add J-K Flip-flop schematicInfo.append("a"+str(k)+" "+words[1]+"_in "+words[4]+"_in ~"+words[12]+"_in ~"+words[13]+"_in ~"+words[13]+"_in "+words[3]+"_out "+words[2]+"_out "+compName) k=k+1 # Add digital to analog converter for outputs schematicInfo.append("a"+str(k)+" ["+words[3]+"_out "+words[2]+"_out] ["+words[3]+" "+words[2]+"] "+" "+compName+"dac") k=k+1 # Add analog to digital converter for inputs schematicInfo.append("a"+str(k)+" ["+words[8]+" "+words[11]+" "+words[9]+" "+words[10]+"] ["+words[8]+"_in "+words[11]+"_in "+words[9]+"_in "+words[10]+"_in] "+compName+"adc") k=k+1 # Add J-K Flip-flop schematicInfo.append("a"+str(k)+" "+words[8]+"_in "+words[11]+"_in ~"+words[9]+"_in ~"+words[10]+"_in ~"+words[10]+"_in "+words[5]+"_out "+words[6]+"_out "+compName) k=k+1 # Add digital to analog converter for outputs schematicInfo.append("a"+str(k)+" ["+words[5]+"_out "+words[6]+"_out] ["+words[5]+" "+words[6]+"] "+" "+compName+"dac") k=k+1 else: # Add analog to digital converter for inputs schematicInfo.append("a"+str(k)+" ["+words[1]+" "+words[4]+" "+words[12]+" "+words[13]+"] ["+words[1]+"_in "+words[4]+"_in "+words[12]+"_in "+words[13]+"_in] "+compName+"adc") k=k+1 # Add J-K Flip-flop schematicInfo.append("a"+str(k)+" "+words[1]+"_in "+words[4]+"_in ~"+words[12]+"_in ~"+words[13]+"_in ~"+words[13]+"_in "+words[3]+"_out "+words[2]+"_out "+compName) k=k+1 # Add digital to analog converter for outputs schematicInfo.append("a"+str(k)+" ["+words[3]+"_out "+words[2]+"_out] ["+words[3]+" "+words[2]+"] "+" "+compName+"dac") k=k+1 # Insert comment in-place of components schematicInfo.insert(index,"* "+compType) # Add model for JK Flip-Flop schematicInfo.append(".model "+ compName+" d_jkff") # Add model for analog-to-digital bridge schematicInfo.append(".model "+ compName+"adc adc_bridge(in_low=0.8 in_high=2.0)") # Add model for digital-to-analog bridge schematicInfo.append(".model "+ compName+"dac dac_bridge(out_low=0.25 out_high=5.0 out_undef=1.8 t_rise=0.5e-9 t_fall=0.5e-9)") elif (compType=="74109" or compType=="74hc109" or compType=="74ls109"): # Add analog to digital converter for inputs schematicInfo.append("a"+str(k)+" ["+words[2]+" "+words[3]+" "+words[4]+" "+words[5]+" "+words[1]+"] ["+words[2]+"_in "+words[3]+"_in "+words[4]+"_in "+words[5]+"_in "+words[1]+"_in] "+compName+"adc") k=k+1 # Add J-K Flip-flop schematicInfo.append("a"+str(k)+" "+words[2]+"_in ~"+words[3]+"_in "+words[4]+"_in ~"+words[5]+"_in ~"+words[1]+"_in "+words[6]+"_out "+words[7]+"_out "+compName) k=k+1 # Add digital to analog converter for outputs schematicInfo.append("a"+str(k)+" ["+words[6]+"_out "+words[7]+"_out] ["+words[6]+" "+words[7]+"] "+" "+compName+"dac") k=k+1 if len(words)>12: # Add analog to digital converter for inputs schematicInfo.append("a"+str(k)+" ["+words[14]+" "+words[13]+" "+words[12]+" "+words[11]+" "+words[15]+"] ["+words[14]+"_in "+words[13]+"_in "+words[12]+"_in "+words[11]+"_in "+words[15]+"_in] "+compName+"adc") k=k+1 # Add J-K Flip-flop schematicInfo.append("a"+str(k)+" "+words[14]+"_in ~"+words[13]+"_in "+words[12]+"_in ~"+words[11]+"_in ~"+words[15]+"_in "+words[10]+"_out "+words[9]+"_out "+compName) k=k+1 # Add digital to analog converter for outputs schematicInfo.append("a"+str(k)+" ["+words[10]+"_out "+words[9]+"_out] ["+words[10]+" "+words[9]+"] "+" "+compName+"dac") k=k+1 # Insert comment in-place of components schematicInfo.insert(index,"* "+compType) # Add model for JK Flip-Flop schematicInfo.append(".model "+ compName+" d_jkff") # Add model for analog-to-digital bridge schematicInfo.append(".model "+ compName+"adc adc_bridge(in_low=0.8 in_high=2.0)") # Add model for digital-to-analog bridge schematicInfo.append(".model "+ compName+"dac dac_bridge(out_low=0.25 out_high=5.0 out_undef=1.8 t_rise=0.5e-9 t_fall=0.5e-9)") elif (compType=="74112" or compType=="74hc112" or compType=="74ls112"): if len(words)>12: schematicInfo.append("a"+str(k)+" "+words[3]+" "+words[2]+" ~"+words[1]+" ~"+words[4]+" ~"+words[15]+" "+words[5]+" "+words[6]+" "+compName) k=k+1 schematicInfo.append("a"+str(k)+" "+words[11]+" "+words[12]+" ~"+words[13]+" ~"+words[10]+" ~"+words[14]+" "+words[9]+" "+words[7]+" "+compName) k=k+1 else: schematicInfo.append("a"+str(k)+" "+words[3]+" "+words[2]+" ~"+words[1]+" ~"+words[4]+" ~"+words[8]+" "+words[5]+" "+words[6]+" "+compName) k=k+1 schematicInfo.insert(index,"* "+compType) schematicInfo.append(".model "+ compName+" d_jkff") elif compType=="dac": schematicInfo.append("a"+str(k)+" ["+words[1]+"] ["+words[2]+"] "+compName) k=k+1 schematicInfo.insert(index,"* Digital to Analog converter "+compType) schematicInfo.append(".model "+ compName+" dac_bridge") elif compType=="adc": schematicInfo.append("a"+str(k)+" ["+words[1]+"] ["+words[2]+"] "+compName) k=k+1 schematicInfo.insert(index,"* Analog to Digital converter "+compType) schematicInfo.append(".model "+ compName+" adc_bridge") elif compType=="adc8": for i in range(0,len(words)/2-1): schematicInfo.append("a"+str(k)+" ["+words[i+1]+"] ["+words[i+len(words)/2]+"] "+compName) k=k+1 schematicInfo.insert(index,"* Analog to Digital converter "+compType) print "-----------------------------------------------------------\n" print "Add parameters for analog to digital converter "+compName in_low=raw_input(' Enter input low level voltage (default=0.8): ') in_high=raw_input(' Enter input high level voltage (default=2.0): ') print "-----------------------------------------------------------" if in_low=="": in_low="0.8" if in_high=="": in_high="2.0" schematicInfo.append(".model "+ compName+" adc_bridge(in_low="+in_low+" in_high="+in_high+" )") elif compType=="dac8": for i in range(0,len(words)/2-1): schematicInfo.append("a"+str(k)+" ["+words[i+1]+"] ["+words[i+len(words)/2]+"] "+compName) k=k+1 schematicInfo.insert(index,"* Digital to Analog converter "+compType) print "-----------------------------------------------------------\n" print "Add parameters for digital to analog converter "+compName out_low=raw_input(' Enter output low level voltage (default=0.2): ') out_high=raw_input(' Enter output high level voltage (default=5.0): ') out_undef=raw_input(' Enter output for undefined voltage level (default=2.2): ') print "-----------------------------------------------------------" if out_low=="": out_low="0.2" if out_high=="": out_high="5.0" if out_undef=="": out_undef="5.0" schematicInfo.append(".model "+ compName+" dac_bridge(out_low="+out_low+" out_high="+out_high+" out_undef="+out_undef+" )") elif compType=="gain": schematicInfo.append("a"+str(k)+" "+words[1]+" "+words[2]+" "+compName) k=k+1 schematicInfo.insert(index,"* Gain "+compType) print "-----------------------------------------------------------\n" print "Add parameters for Gain "+compName in_offset=raw_input(' Enter offset for input (default=0.0): ') gain=raw_input(' Enter gain (default=1.0): ') out_offset=raw_input(' Enter offset for output (default=0.0): ') print "-----------------------------------------------------------" if in_offset=="": in_offset="0.0" if gain=="": gain="1.0" if out_offset=="": out_offset="0.0" schematicInfo.append(".model "+ compName+" gain(in_offset="+in_offset+" out_offset="+out_offset+" gain="+gain+")") elif compType=="summer": schematicInfo.append("a"+str(k)+" ["+words[1]+" "+words[2]+"] "+words[3]+" "+compName) k=k+1 schematicInfo.insert(index,"* Summer "+compType) print "-----------------------------------------------------------\n" print "Add parameters for Summer "+compName in1_offset=raw_input(' Enter offset for input 1 (default=0.0): ') in2_offset=raw_input(' Enter offset for input 2 (default=0.0): ') in1_gain=raw_input(' Enter gain for input 1 (default=1.0): ') in2_gain=raw_input(' Enter gain for input 2 (default=1.0): ') out_gain=raw_input(' Enter gain for output (default=1.0): ') out_offset=raw_input(' Enter offset for output (default=0.0): ') print "-----------------------------------------------------------" if in1_offset=="": in1_offset="0.0" if in2_offset=="": in2_offset="0.0" if in1_gain=="": in1_gain="1.0" if in2_gain=="": in2_gain="1.0" if out_gain=="": out_gain="1.0" if out_offset=="": out_offset="0.0" schematicInfo.append(".model "+ compName+" summer(in_offset=["+in1_offset+" "+in2_offset+"] in_gain=["+in1_gain+" "+in2_gain+"] out_offset="+out_offset+" out_gain="+out_gain+")") elif compType=="multiplier": schematicInfo.append("a"+str(k)+" ["+words[1]+" "+words[2]+"] "+words[3]+" "+compName) k=k+1 schematicInfo.insert(index,"* Multiplier "+compType) print "-----------------------------------------------------------\n" print "Add parameters for Multiplier "+compName in1_offset=raw_input(' Enter offset for input 1 (default=0.0): ') in2_offset=raw_input(' Enter offset for input 2 (default=0.0): ') in1_gain=raw_input(' Enter gain for input 1 (default=1.0): ') in2_gain=raw_input(' Enter gain for input 2 (default=1.0): ') out_gain=raw_input(' Enter gain for output (default=1.0): ') out_offset=raw_input(' Enter offset for output (default=0.0): ') print "-----------------------------------------------------------" if in1_offset=="": in1_offset="0.0" if in2_offset=="": in2_offset="0.0" if in1_gain=="": in1_gain="1.0" if in2_gain=="": in2_gain="1.0" if out_gain=="": out_gain="1.0" if out_offset=="": out_offset="0.0" schematicInfo.append(".model "+ compName+" mult(in_offset=["+in1_offset+" "+in2_offset+"] in_gain=["+in1_gain+" "+in2_gain+"] out_offset="+out_offset+" out_gain="+out_gain+")") elif compType=="divider": schematicInfo.append("a"+str(k)+" "+words[1]+" "+words[2]+" "+words[3]+" "+compName) k=k+1 schematicInfo.insert(index,"* Divider "+compType) print "-----------------------------------------------------------\n" print "Add parameters for Divider "+compName num_offset=raw_input(' Enter offset for numerator (default=0.0): ') den_offset=raw_input(' Enter offset for denominator (default=0.0): ') num_gain=raw_input(' Enter gain for numerator (default=1.0): ') den_gain=raw_input(' Enter gain for denominator (default=1.0): ') out_gain=raw_input(' Enter gain for output (default=1.0): ') out_offset=raw_input(' Enter offset for output (default=0.0): ') den_lower_limit=raw_input(' Enter lower limit for denominator value (default=1.0e-10): ') print "-----------------------------------------------------------" if num_offset=="": num_offset="0.0" if den_offset=="": den_offset="0.0" if num_gain=="": num_gain="1.0" if den_gain=="": den_gain="1.0" if out_gain=="": out_gain="1.0" if out_offset=="": out_offset="0.0" if den_lower_limit=="": den_lower_limit="1.0e-10" schematicInfo.append(".model "+ compName+" divide(num_offset="+num_offset+" den_offset="+den_offset+" num_gain="+num_gain+" den_gain="+den_gain+" out_offset="+out_offset+" out_gain="+out_gain+" den_lower_limit="+den_lower_limit+")") elif compType=="limit": schematicInfo.append("a"+str(k)+" "+words[1]+" "+words[2]+" "+compName) k=k+1 schematicInfo.insert(index,"* Limiter "+compType) print "-----------------------------------------------------------\n" print "Add parameters for Limiter "+compName lowerLimit=raw_input(' Enter out lower limit (default=0.0): ') upperLimit=raw_input(' Enter out upper limit (default=5.0): ') in_offset=raw_input(' Enter offset for input (default=0.0): ') gain=raw_input(' Enter gain (default=1.0): ') print "-----------------------------------------------------------" if lowerLimit=="": lowerLimit="0.0" if upperLimit=="": upperLimit="5.0" if in_offset=="": in_offset="0.0" if gain=="": gain="1.0" schematicInfo.append(".model "+ compName+" limit(out_lower_limit="+lowerLimit+" out_upper_limit="+upperLimit+" in_offset="+in_offset+" gain="+gain+")") elif compType=="integrator": schematicInfo.append("a"+str(k)+" "+words[1]+" "+words[2]+" "+compName) k=k+1 schematicInfo.insert(index,"* Integrator "+compType) print "-----------------------------------------------------------\n" print "Add parameters for Integrator "+compName out_lower_limit=raw_input(' Enter out lower limit (default=0.0): ') out_upper_limit=raw_input(' Enter out upper limit (default=5.0): ') in_offset=raw_input(' Enter offset for input (default=0.0): ') gain=raw_input(' Enter gain (default=1.0): ') out_ic=raw_input(' Enter initial condition on output (default=0.0): ') print "-----------------------------------------------------------" if out_lower_limit=="": out_lower_limit="0.0" if out_upper_limit=="": out_upper_limit="5.0" if in_offset=="": in_offset="0.0" if gain=="": gain="1.0" if out_ic=="": out_ic="0.0" schematicInfo.append(".model "+ compName+" int(out_lower_limit="+out_lower_limit+" out_upper_limit="+out_upper_limit+" in_offset="+in_offset+" gain="+gain+" out_ic="+out_ic+")") elif compType=="differentiator": schematicInfo.append("a"+str(k)+" "+words[1]+" "+words[2]+" "+compName) k=k+1 schematicInfo.insert(index,"* Differentiator "+compType) print "-----------------------------------------------------------\n" print "Add parameters for Differentiator "+compName out_lower_limit=raw_input(' Enter out lower limit (default=0.0): ') out_upper_limit=raw_input(' Enter out upper limit (default=5.0): ') out_offset=raw_input(' Enter offset for output (default=0.0): ') gain=raw_input(' Enter gain (default=1.0): ') print "-----------------------------------------------------------" if out_lower_limit=="": out_lower_limit="0.0" if out_upper_limit=="": out_upper_limit="5.0" if out_offset=="": out_offset="0.0" if gain=="": gain="1.0" schematicInfo.append(".model "+ compName+" d_dt(out_lower_limit="+out_lower_limit+" out_upper_limit="+out_upper_limit+" out_offset="+out_offset+" gain="+gain+")") elif compType=="limit8": for i in range(0,len(words)/2-1): schematicInfo.append("a"+str(k)+" "+words[i+1]+" "+words[i+len(words)/2]+" "+compName) k=k+1 schematicInfo.insert(index,"* Limiter "+compType) print "-----------------------------------------------------------\n" print "Add parameters for Limiter "+compName lowerLimit=raw_input(' Enter out lower limit (default=0.0): ') upperLimit=raw_input(' Enter out upper limit (default=5.0): ') in_offset=raw_input(' Enter offset for input (default=0.0): ') gain=raw_input(' Enter gain (default=1.0): ') print "-----------------------------------------------------------" if lowerLimit=="": lowerLimit="0.0" if upperLimit=="": upperLimit="5.0" if in_offset=="": in_offset="0.0" if gain=="": gain="1.0" schematicInfo.append(".model "+ compName+" limit(out_lower_limit="+lowerLimit+" out_upper_limit="+upperLimit+" in_offset="+in_offset+" gain="+gain+")") elif compType=="controlledlimiter": schematicInfo.append("a"+str(k)+" "+words[1]+" "+words[2]+" "+words[3]+" "+words[4]+" "+compName) k=k+1 schematicInfo.insert(index,"* Controlled Limiter "+compType) print "-----------------------------------------------------------\n" print "Add parameters for Controlled Limiter "+compName in_offset=raw_input(' Enter offset for input (default=0.0): ') gain=raw_input(' Enter gain (default=1.0): ') print "-----------------------------------------------------------" if in_offset=="": in_offset="0.0" if gain=="": gain="1.0" schematicInfo.append(".model "+ compName+" climit(in_offset="+in_offset+" gain="+gain+")") elif compType=="analogswitch": schematicInfo.append("a"+str(k)+" "+words[1]+" ("+words[2]+" "+words[3]+") "+compName) k=k+1 schematicInfo.insert(index,"* Analog Switch "+compType) print "-----------------------------------------------------------\n" print "Add parameters for Analog Switch "+compName cntl_on=raw_input(' Enter control ON voltage (default=5.0): ') cntl_off=raw_input(' Enter control OFF voltage (default=0.0): ') r_on=raw_input(' Enter ON resistance value (default=10.0): ') r_off=raw_input(' Enter OFF resistance value (default=1e6): ') print "-----------------------------------------------------------" if cntl_on=="": cntl_on="5.0" if cntl_off=="": cntl_off="0.0" if r_on=="": r_on="10.0" if r_off=="": r_off="1e6" schematicInfo.append(".model "+ compName+" aswitch(cntl_on="+cntl_on+" cntl_off="+cntl_off+" r_on="+r_on+" r_off="+r_off+")") elif compType=="zener": schematicInfo.append("a"+str(k)+" "+words[1]+" "+words[2]+" "+compName) k=k+1 schematicInfo.insert(index,"* Zener Diode "+compType) print "-----------------------------------------------------------\n" print "Add parameters for Zener Diode "+compName v_breakdown=raw_input(' Enter Breakdown voltage (default=5.6): ') i_breakdown=raw_input(' Enter Breakdown current (default=2.0e-2): ') i_sat=raw_input(' Enter saturation current (default=1.0e-12): ') n_forward=raw_input(' Enter forward emission coefficient (default=0.0): ') print "-----------------------------------------------------------" if v_breakdown=="": v_breakdown="5.6" if i_breakdown=="": i_breakdown="1.0e-2" if i_sat=="": i_sat="1.0e-12" if n_forward=="": n_forward="1.0" schematicInfo.append(".model "+ compName+" zener(v_breakdown="+v_breakdown+" i_breakdown="+i_breakdown+" i_sat="+i_sat+" n_forward="+n_forward+")") elif compType=="d_buffer": schematicInfo.append("a"+str(k)+" "+words[1]+" "+words[2]+" "+compName) k=k+1 schematicInfo.insert(index,"* Buffer "+compType) print "-----------------------------------------------------------\n" print "Add parameters for Buffer "+compName rise_delay=raw_input(' Enter rise delay (default=1e-12): ') fall_delay=raw_input(' Enter fall delay (default=1e-12): ') input_load=raw_input(' Enter input load capacitance (default=1e-12): ') print "-----------------------------------------------------------" if rise_delay=="": rise_delay="1e-12" if fall_delay=="": fall_delay="1e-12" if input_load=="": input_load="1e-12" schematicInfo.append(".model "+ compName+" d_buffer(rise_delay="+rise_delay+" fall_delay="+fall_delay+" input_load="+input_load+")") elif compType=="d_inverter": schematicInfo.append("a"+str(k)+" "+words[1]+" "+words[2]+" "+compName) k=k+1 schematicInfo.insert(index,"* Inverter "+compType) print "-----------------------------------------------------------\n" print "Add parameters for Inverter "+compName rise_delay=raw_input(' Enter rise delay (default=1e-12): ') fall_delay=raw_input(' Enter fall delay (default=1e-12): ') input_load=raw_input(' Enter input load capacitance (default=1e-12): ') print "-----------------------------------------------------------" if rise_delay=="": rise_delay="1e-12" if fall_delay=="": fall_delay="1e-12" if input_load=="": input_load="1e-12" schematicInfo.append(".model "+ compName+" d_inverter(rise_delay="+rise_delay+" fall_delay="+fall_delay+" input_load="+input_load+")") elif compType=="d_and": schematicInfo.append("a"+str(k)+" ["+words[1]+" "+words[2]+"] "+words[3]+" "+compName) k=k+1 schematicInfo.insert(index,"* And "+compType) print "-----------------------------------------------------------\n" print "Add parameters for And "+compName rise_delay=raw_input(' Enter rise delay (default=1e-12): ') fall_delay=raw_input(' Enter fall delay (default=1e-12): ') input_load=raw_input(' Enter input load capacitance (default=1e-12): ') print "-----------------------------------------------------------" if rise_delay=="": rise_delay="1e-12" if fall_delay=="": fall_delay="1e-12" if input_load=="": input_load="1e-12" schematicInfo.append(".model "+ compName+" d_and(rise_delay="+rise_delay+" fall_delay="+fall_delay+" input_load="+input_load+")") elif compType=="d_nand": schematicInfo.append("a"+str(k)+" ["+words[1]+" "+words[2]+"] "+words[3]+" "+compName) k=k+1 schematicInfo.insert(index,"* Nand "+compType) print "-----------------------------------------------------------\n" print "Add parameters for Nand "+compName rise_delay=raw_input(' Enter rise delay (default=1e-12): ') fall_delay=raw_input(' Enter fall delay (default=1e-12): ') input_load=raw_input(' Enter input load capacitance (default=1e-12): ') print "-----------------------------------------------------------" if rise_delay=="": rise_delay="1e-12" if fall_delay=="": fall_delay="1e-12" if input_load=="": input_load="1e-12" schematicInfo.append(".model "+ compName+" d_nand(rise_delay="+rise_delay+" fall_delay="+fall_delay+" input_load="+input_load+")") elif compType=="d_or": schematicInfo.append("a"+str(k)+" ["+words[1]+" "+words[2]+"] "+words[3]+" "+compName) k=k+1 schematicInfo.insert(index,"* OR "+compType) print "-----------------------------------------------------------\n" print "Add parameters for OR "+compName rise_delay=raw_input(' Enter rise delay (default=1e-12): ') fall_delay=raw_input(' Enter fall delay (default=1e-12): ') input_load=raw_input(' Enter input load capacitance (default=1e-12): ') print "-----------------------------------------------------------" if rise_delay=="": rise_delay="1e-12" if fall_delay=="": fall_delay="1e-12" if input_load=="": input_load="1e-12" schematicInfo.append(".model "+ compName+" d_or(rise_delay="+rise_delay+" fall_delay="+fall_delay+" input_load="+input_load+")") elif compType=="d_nor": schematicInfo.append("a"+str(k)+" ["+words[1]+" "+words[2]+"] "+words[3]+" "+compName) k=k+1 schematicInfo.insert(index,"* NOR "+compType) print "-----------------------------------------------------------\n" print "Add parameters for NOR "+compName rise_delay=raw_input(' Enter rise delay (default=1e-12): ') fall_delay=raw_input(' Enter fall delay (default=1e-12): ') input_load=raw_input(' Enter input load capacitance (default=1e-12): ') print "-----------------------------------------------------------" if rise_delay=="": rise_delay="1e-12" if fall_delay=="": fall_delay="1e-12" if input_load=="": input_load="1e-12" schematicInfo.append(".model "+ compName+" d_nor(rise_delay="+rise_delay+" fall_delay="+fall_delay+" input_load="+input_load+")") elif compType=="d_xor": schematicInfo.append("a"+str(k)+" ["+words[1]+" "+words[2]+"] "+words[3]+" "+compName) k=k+1 schematicInfo.insert(index,"* XOR "+compType) print "-----------------------------------------------------------\n" print "Add parameters for XOR "+compName rise_delay=raw_input(' Enter rise delay (default=1e-12): ') fall_delay=raw_input(' Enter fall delay (default=1e-12): ') input_load=raw_input(' Enter input load capacitance (default=1e-12): ') print "-----------------------------------------------------------" if rise_delay=="": rise_delay="1e-12" if fall_delay=="": fall_delay="1e-12" if input_load=="": input_load="1e-12" schematicInfo.append(".model "+ compName+" d_xor(rise_delay="+rise_delay+" fall_delay="+fall_delay+" input_load="+input_load+")") elif compType=="d_xnor": schematicInfo.append("a"+str(k)+" ["+words[1]+" "+words[2]+"] "+words[3]+" "+compName) k=k+1 schematicInfo.insert(index,"* XNOR "+compType) print "-----------------------------------------------------------\n" print "Add parameters for XNOR "+compName rise_delay=raw_input(' Enter rise delay (default=1e-12): ') fall_delay=raw_input(' Enter fall delay (default=1e-12): ') input_load=raw_input(' Enter input load capacitance (default=1e-12): ') print "-----------------------------------------------------------" if rise_delay=="": rise_delay="1e-12" if fall_delay=="": fall_delay="1e-12" if input_load=="": input_load="1e-12" schematicInfo.append(".model "+ compName+" d_xnor(rise_delay="+rise_delay+" fall_delay="+fall_delay+" input_load="+input_load+")") elif compType=="d_tristate": schematicInfo.append("a"+str(k)+" "+words[1]+" "+words[2]+" "+words[3]+" "+compName) k=k+1 schematicInfo.insert(index,"* Tristate "+compType) print "-----------------------------------------------------------\n" print "Add parameters for Tristate "+compName delay=raw_input(' Enter delay (default=1e-12): ') input_load=raw_input(' Enter input load capacitance (default=1e-12): ') enable_load=raw_input(' Enter enable load capacitance (default=1e-12): ') print "-----------------------------------------------------------" if delay=="": delay="1e-12" if input_load=="": input_load="1e-12" if enable_load=="": enable_load="1e-12" schematicInfo.append(".model "+ compName+" d_tristate(delay="+delay+" enable_load="+enable_load+" input_load="+input_load+")") elif compType=="d_pullup": schematicInfo.append("a"+str(k)+" "+words[1]+" "+compName) k=k+1 schematicInfo.insert(index,"* Pullup "+compType) print "-----------------------------------------------------------\n" print "Add parameters for Pullup "+compName load=raw_input(' Enter load capacitance (default=1e-12): ') print "-----------------------------------------------------------" if load=="": load="1e-12" schematicInfo.append(".model "+ compName+" d_pullup(load="+load+")") elif compType=="d_pulldown": schematicInfo.append("a"+str(k)+" "+words[1]+" "+compName) k=k+1 schematicInfo.insert(index,"* Pullup "+compType) print "-----------------------------------------------------------\n" print "Add parameters for Pullup "+compName load=raw_input(' Enter load capacitance (default=1e-12): ') print "-----------------------------------------------------------" if load=="": load="1e-12" schematicInfo.append(".model "+ compName+" d_pulldown(load="+load+")") elif compType=="d_srlatch": schematicInfo.append("a"+str(k)+" "+words[1]+" "+words[2]+" "+words[3]+" "+words[4]+" "+words[5]+" "+words[6]+" "+words[7]+" "+compName) k=k+1 schematicInfo.insert(index,"* SR Latch "+compType) print "-----------------------------------------------------------\n" print "Add parameters for SR Latch "+compName sr_delay=raw_input(' Enter input to set-reset delay (default=1e-12): ') enable_delay=raw_input(' Enter enable delay (default=1e-12): ') set_delay=raw_input(' Enter set delay (default=1e-12): ') reset_delay=raw_input(' Enter reset delay (default=1e-12): ') ic=raw_input(' Enter initial condition on output (default=0): ') sr_load=raw_input(' Enter input to set-reset load (default=1e-12): ') enable_load=raw_input(' Enter enable load (default=1e-12): ') set_load=raw_input(' Enter set load (default=1e-12): ') reset_load=raw_input(' Enter reset load (default=1e-12): ') rise_delay=raw_input(' Enter rise delay (default=1e-12): ') fall_delay=raw_input(' Enter fall delay (default=1e-12): ') print "-----------------------------------------------------------" if sr_delay=="": sr_delay="1e-12" if enable_delay=="": enable_delay="1e-12" if set_delay=="": set_delay="1e-12" if reset_delay=="": reset_delay="1e-12" if ic=="": ic="0" if sr_load=="": sr_load="1e-12" if enable_load=="": enable_load="1e-12" if set_load=="": set_load="1e-12" if reset_load=="": reset_load="1e-12" if rise_delay=="": rise_delay="1e-12" if fall_delay=="": fall_delay="1e-12" schematicInfo.append(".model "+ compName+" d_srlatch(rise_delay="+rise_delay+" fall_delay="+fall_delay+" ic="+ic+"\n+sr_load="+sr_load+" enable_load="+enable_load+" set_load="+set_load+" reset_load="+reset_load+"\n+sr_delay="+sr_delay+" enable_delay="+enable_delay+" set_delay="+set_delay+" reset_delay="+reset_delay+")") elif compType=="d_jklatch": schematicInfo.append("a"+str(k)+" "+words[1]+" "+words[2]+" "+words[3]+" "+words[4]+" "+words[5]+" "+words[6]+" "+words[7]+" "+compName) k=k+1 schematicInfo.insert(index,"* JK Latch "+compType) print "-----------------------------------------------------------\n" print "Add parameters for JK Latch "+compName jk_delay=raw_input(' Enter input to j-k delay (default=1e-12): ') enable_delay=raw_input(' Enter enable delay (default=1e-12): ') set_delay=raw_input(' Enter set delay (default=1e-12): ') reset_delay=raw_input(' Enter reset delay (default=1e-12): ') ic=raw_input(' Enter initial condition on output (default=0): ') jk_load=raw_input(' Enter input to j-k load (default=1e-12): ') enable_load=raw_input(' Enter enable load (default=1e-12): ') set_load=raw_input(' Enter set load (default=1e-12): ') reset_load=raw_input(' Enter reset load (default=1e-12): ') rise_delay=raw_input(' Enter rise delay (default=1e-12): ') fall_delay=raw_input(' Enter fall delay (default=1e-12): ') print "-----------------------------------------------------------" if jk_delay=="": jk_delay="1e-12" if enable_delay=="": enable_delay="1e-12" if set_delay=="": set_delay="1e-12" if reset_delay=="": reset_delay="1e-12" if ic=="": ic="0" if jk_load=="": jk_load="1e-12" if enable_load=="": enable_load="1e-12" if set_load=="": set_load="1e-12" if reset_load=="": reset_load="1e-12" if rise_delay=="": rise_delay="1e-12" if fall_delay=="": fall_delay="1e-12" schematicInfo.append(".model "+ compName+" d_jklatch(rise_delay="+rise_delay+" fall_delay="+fall_delay+" ic="+ic+"\n+jk_load="+jk_load+" enable_load="+enable_load+" set_load="+set_load+" reset_load="+reset_load+"\n+jk_delay="+jk_delay+" enable_delay="+enable_delay+" set_delay="+set_delay+" reset_delay="+reset_delay+")") elif compType=="d_dlatch": schematicInfo.append("a"+str(k)+" "+words[1]+" "+words[2]+" "+words[3]+" "+words[4]+" "+words[5]+" "+words[6]+" "+compName) k=k+1 schematicInfo.insert(index,"* D Latch "+compType) print "-----------------------------------------------------------\n" print "Add parameters for D Latch "+compName data_delay=raw_input(' Enter input to data delay (default=1e-12): ') enable_delay=raw_input(' Enter enable delay (default=1e-12): ') set_delay=raw_input(' Enter set delay (default=1e-12): ') reset_delay=raw_input(' Enter reset delay (default=1e-12): ') ic=raw_input(' Enter initial condition on output (default=0): ') data_load=raw_input(' Enter input to data load (default=1e-12): ') enable_load=raw_input(' Enter enable load (default=1e-12): ') set_load=raw_input(' Enter set load (default=1e-12): ') reset_load=raw_input(' Enter reset load (default=1e-12): ') rise_delay=raw_input(' Enter rise delay (default=1e-12): ') fall_delay=raw_input(' Enter fall delay (default=1e-12): ') print "-----------------------------------------------------------" if data_delay=="": data_delay="1e-12" if enable_delay=="": enable_delay="1e-12" if set_delay=="": set_delay="1e-12" if reset_delay=="": reset_delay="1e-12" if ic=="": ic="0" if data_load=="": data_load="1e-12" if enable_load=="": enable_load="1e-12" if set_load=="": set_load="1e-12" if reset_load=="": reset_load="1e-12" if rise_delay=="": rise_delay="1e-12" if fall_delay=="": fall_delay="1e-12" schematicInfo.append(".model "+ compName+" d_dlatch(rise_delay="+rise_delay+" fall_delay="+fall_delay+" ic="+ic+"\n+data_load="+data_load+" enable_load="+enable_load+" set_load="+set_load+" reset_load="+reset_load+"\n+data_delay="+data_delay+" enable_delay="+enable_delay+" set_delay="+set_delay+" reset_delay="+reset_delay+")") elif compType=="d_tlatch": schematicInfo.append("a"+str(k)+" "+words[1]+" "+words[2]+" "+words[3]+" "+words[4]+" "+words[5]+" "+words[6]+" "+compName) k=k+1 schematicInfo.insert(index,"* T Latch "+compType) print "-----------------------------------------------------------\n" print "Add parameters for T Latch "+compName t_delay=raw_input(' Enter input to t delay (default=1e-12): ') enable_delay=raw_input(' Enter enable delay (default=1e-12): ') set_delay=raw_input(' Enter set delay (default=1e-12): ') reset_delay=raw_input(' Enter reset delay (default=1e-12): ') ic=raw_input(' Enter initial condition on output (default=0): ') t_load=raw_input(' Enter input to t load (default=1e-12): ') enable_load=raw_input(' Enter enable load (default=1e-12): ') set_load=raw_input(' Enter set load (default=1e-12): ') reset_load=raw_input(' Enter reset load (default=1e-12): ') rise_delay=raw_input(' Enter rise delay (default=1e-12): ') fall_delay=raw_input(' Enter fall delay (default=1e-12): ') print "-----------------------------------------------------------" if t_delay=="": t_delay="1e-12" if enable_delay=="": enable_delay="1e-12" if set_delay=="": set_delay="1e-12" if reset_delay=="": reset_delay="1e-12" if ic=="": ic="0" if t_load=="": t_load="1e-12" if enable_load=="": enable_load="1e-12" if set_load=="": set_load="1e-12" if reset_load=="": reset_load="1e-12" if rise_delay=="": rise_delay="1e-12" if fall_delay=="": fall_delay="1e-12" schematicInfo.append(".model "+ compName+" d_tlatch(rise_delay="+rise_delay+" fall_delay="+fall_delay+" ic="+ic+"\n+t_load="+t_load+" enable_load="+enable_load+" set_load="+set_load+" reset_load="+reset_load+"\n+t_delay="+t_delay+" enable_delay="+enable_delay+" set_delay="+set_delay+" reset_delay="+reset_delay+")") elif compType=="d_srff": schematicInfo.append("a"+str(k)+" "+words[1]+" "+words[2]+" "+words[3]+" "+words[4]+" "+words[5]+" "+words[6]+" "+words[7]+" "+compName) k=k+1 schematicInfo.insert(index,"* SR Flip-Flop "+compType) print "-----------------------------------------------------------\n" print "Add parameters for SR Flip-Flop "+compName clk_delay=raw_input(' Enter clk delay (default=1e-12): ') set_delay=raw_input(' Enter set delay (default=1e-12): ') reset_delay=raw_input(' Enter reset delay (default=1e-12): ') ic=raw_input(' Enter initial condition on output (default=0): ') sr_load=raw_input(' Enter input to set-reset load (default=1e-12): ') clk_load=raw_input(' Enter clk load (default=1e-12): ') set_load=raw_input(' Enter set load (default=1e-12): ') reset_load=raw_input(' Enter reset load (default=1e-12): ') rise_delay=raw_input(' Enter rise delay (default=1e-12): ') fall_delay=raw_input(' Enter fall delay (default=1e-12): ') print "-----------------------------------------------------------" if clk_delay=="": clk_delay="1e-12" if set_delay=="": set_delay="1e-12" if reset_delay=="": reset_delay="1e-12" if ic=="": ic="0" if sr_load=="": sr_load="1e-12" if clk_load=="": clk_load="1e-12" if set_load=="": set_load="1e-12" if reset_load=="": reset_load="1e-12" if rise_delay=="": rise_delay="1e-12" if fall_delay=="": fall_delay="1e-12" schematicInfo.append(".model "+ compName+" d_srff(rise_delay="+rise_delay+" fall_delay="+fall_delay+" ic="+ic+"\n+sr_load="+sr_load+" clk_load="+clk_load+" set_load="+set_load+" reset_load="+reset_load+"\n+clk_delay="+clk_delay+" set_delay="+set_delay+" reset_delay="+reset_delay+")") elif compType=="d_jkff": schematicInfo.append("a"+str(k)+" "+words[1]+" "+words[2]+" "+words[3]+" "+words[4]+" "+words[5]+" "+words[6]+" "+words[7]+" "+compName) k=k+1 schematicInfo.insert(index,"* JK Flip-Flop "+compType) print "-----------------------------------------------------------\n" print "Add parameters for JK Flip-Flop "+compName clk_delay=raw_input(' Enter clk delay (default=1e-12): ') set_delay=raw_input(' Enter set delay (default=1e-12): ') reset_delay=raw_input(' Enter reset delay (default=1e-12): ') ic=raw_input(' Enter initial condition on output (default=0): ') jk_load=raw_input(' Enter input to j-k load (default=1e-12): ') clk_load=raw_input(' Enter clk load (default=1e-12): ') set_load=raw_input(' Enter set load (default=1e-12): ') reset_load=raw_input(' Enter reset load (default=1e-12): ') rise_delay=raw_input(' Enter rise delay (default=1e-12): ') fall_delay=raw_input(' Enter fall delay (default=1e-12): ') print "-----------------------------------------------------------" if clk_delay=="": clk_delay="1e-12" if set_delay=="": set_delay="1e-12" if reset_delay=="": reset_delay="1e-12" if ic=="": ic="0" if jk_load=="": jk_load="1e-12" if clk_load=="": clk_load="1e-12" if set_load=="": set_load="1e-12" if reset_load=="": reset_load="1e-12" if rise_delay=="": rise_delay="1e-12" if fall_delay=="": fall_delay="1e-12" schematicInfo.append(".model "+ compName+" d_jkff(rise_delay="+rise_delay+" fall_delay="+fall_delay+" ic="+ic+"\n+jk_load="+jk_load+" clk_load="+clk_load+" set_load="+set_load+" reset_load="+reset_load+"\n+clk_delay="+clk_delay+" set_delay="+set_delay+" reset_delay="+reset_delay+")") elif compType=="d_dff": schematicInfo.append("a"+str(k)+" "+words[1]+" "+words[2]+" "+words[3]+" "+words[4]+" "+words[5]+" "+words[6]+" "+compName) k=k+1 schematicInfo.insert(index,"* D Flip-Flop "+compType) print "-----------------------------------------------------------\n" print "Add parameters for D Flip-Flop "+compName clk_delay=raw_input(' Enter clk delay (default=1e-12): ') set_delay=raw_input(' Enter set delay (default=1e-12): ') reset_delay=raw_input(' Enter reset delay (default=1e-12): ') ic=raw_input(' Enter initial condition on output (default=0): ') data_load=raw_input(' Enter input to data load (default=1e-12): ') clk_load=raw_input(' Enter clk load (default=1e-12): ') set_load=raw_input(' Enter set load (default=1e-12): ') reset_load=raw_input(' Enter reset load (default=1e-12): ') rise_delay=raw_input(' Enter rise delay (default=1e-12): ') fall_delay=raw_input(' Enter fall delay (default=1e-12): ') print "-----------------------------------------------------------" if clk_delay=="": clk_delay="1e-12" if set_delay=="": set_delay="1e-12" if reset_delay=="": reset_delay="1e-12" if ic=="": ic="0" if data_load=="": data_load="1e-12" if clk_load=="": clk_load="1e-12" if set_load=="": set_load="1e-12" if reset_load=="": reset_load="1e-12" if rise_delay=="": rise_delay="1e-12" if fall_delay=="": fall_delay="1e-12" schematicInfo.append(".model "+ compName+" d_dff(rise_delay="+rise_delay+" fall_delay="+fall_delay+" ic="+ic+"\n+data_load="+data_load+" clk_load="+clk_load+" set_load="+set_load+" reset_load="+reset_load+"\n+clk_delay="+clk_delay+" set_delay="+set_delay+" reset_delay="+reset_delay+")") elif compType=="d_tff": schematicInfo.append("a"+str(k)+" "+words[1]+" "+words[2]+" "+words[3]+" "+words[4]+" "+words[5]+" "+words[6]+" "+compName) k=k+1 schematicInfo.insert(index,"* T Flip-Flop "+compType) print "-----------------------------------------------------------\n" print "Add parameters for T Flip-Flip "+compName clk_delay=raw_input(' Enter clk delay (default=1e-12): ') set_delay=raw_input(' Enter set delay (default=1e-12): ') reset_delay=raw_input(' Enter reset delay (default=1e-12): ') ic=raw_input(' Enter initial condition on output (default=0): ') t_load=raw_input(' Enter input to t load (default=1e-12): ') clk_load=raw_input(' Enter clk load (default=1e-12): ') set_load=raw_input(' Enter set load (default=1e-12): ') reset_load=raw_input(' Enter reset load (default=1e-12): ') rise_delay=raw_input(' Enter rise delay (default=1e-12): ') fall_delay=raw_input(' Enter fall delay (default=1e-12): ') print "-----------------------------------------------------------" if t_delay=="": t_delay="1e-12" if enable_delay=="": enable_delay="1e-12" if set_delay=="": set_delay="1e-12" if reset_delay=="": reset_delay="1e-12" if ic=="": ic="0" if t_load=="": t_load="1e-12" if enable_load=="": enable_load="1e-12" if set_load=="": set_load="1e-12" if reset_load=="": reset_load="1e-12" if rise_delay=="": rise_delay="1e-12" if fall_delay=="": fall_delay="1e-12" schematicInfo.append(".model "+ compName+" d_tff(rise_delay="+rise_delay+" fall_delay="+fall_delay+" ic="+ic+"\n+t_load="+t_load+" clk_load="+clk_load+" set_load="+set_load+" reset_load="+reset_load+"\n+clk_delay="+clk_delay+" set_delay="+set_delay+" reset_delay="+reset_delay+")") elif compType=="vplot1": outputOption.append("plot v("+words[1]+")\n") schematicInfo.insert(index,"* Plotting option "+compType) elif compType=="vplot8_1": outputOption.append("plot ") for i in range(1,len(words)-1): outputOption.append("v("+words[i]+") ") outputOption.append("\n") schematicInfo.insert(index,"* Plotting option "+compType) elif compType=="vprint1": outputOption.append("print v("+words[1]+")\n") schematicInfo.insert(index,"* Printing option "+compType) elif compType=="vprint8_1": outputOption.append("print ") for i in range(1,len(words)-1): outputOption.append("v("+words[i]+") ") outputOption.append("\n") schematicInfo.insert(index,"* Printing option "+compType) elif compType=="vplot": outputOption.append("plot v("+words[1]+")-v("+words[2]+")\n") schematicInfo.insert(index,"* Plotting option "+compType) elif compType=="vplot8": outputOption.append("plot ") for i in range(0,len(words)/2-1): if words[i+1]=="0": outputOption.append("-v("+words[i+len(words)/2]+") ") elif words[i+len(words)/2]=="0": outputOption.append("v("+words[i+1]+") ") else: outputOption.append("v("+words[i+1]+")-v("+words[i+len(words)/2]+") ") outputOption.append("\n") elif compType=="vprint": outputOption.append("print v("+words[1]+")-v("+words[2]+")\n") schematicInfo.insert(index,"* Printting option "+compType) elif compType=="iplot": schematicInfo.insert(index,"V_"+words[0]+" "+words[1]+" "+words[2]+" 0") outputOption.append("plot i(V_"+words[0]+")\n") elif compType=="ic": print "-----------------------------------------------------------" ic=raw_input(' Enter initial condition on output (default=0): ') print "-----------------------------------------------------------" if ic=="": ic="0" schematicInfo.insert(index,".ic v("+words[1]+")="+ic) elif compType=="transfo": schematicInfo.append("a"+str(k)+" ("+words[1]+" "+words[2]+") (2mmf "+words[2]+") primary") k=k+1 print "-----------------------------------------------------------\n" print "Add parameters for primary " num_turns=raw_input(' Enter the number of turns in primary (default=310): ') print "-----------------------------------------------------------\n" if num_turns=="": num_turns="310" schematicInfo.append(".model primary lcouple (num_turns = "+num_turns+ ")") schematicInfo.append("a"+str(k)+" (2mmf 3mmf) iron_core") k=k+1 print "-----------------------------------------------------------\n" inp1=raw_input(' Do you want to populate the B-H table?y/n (if n, default values will be used): ') if inp1=='y' or inp1=='Y': print "Enter the values in the H, B table to construct B-H curve " inp="y" h_array= "H_array = [ " b_array = "B_array = [ " while inp=="y": h1=raw_input(' Enter H value: ') h_array = h_array+ h1+" " b1=raw_input(' Enter corresponding B value: ') b_array = b_array+ b1+" " inp=raw_input(' Do you want to continue(y/n): ') modelline = h_array+" ] " + b_array+" ]" else: modelline = "H_array = [-1000 -500 -375 -250 -188 -125 -63 0 63 125 188 250 375 500 1000] B_array = [-3.13e-3 -2.63e-3 -2.33e-3 -1.93e-3 -1.5e-3 -6.25e-4 -2.5e-4 0 2.5e-4 6.25e-4 1.5e-3 1.93e-3 2.33e-3 2.63e-3 3.13e-3]" area =raw_input( 'Enter the cross-sectional area of the core: (default = 1)') length =raw_input( 'Enter the core length: (default = 0.01)') print "----------------------------------------------\n" if area=="": area="1" if length=="":length="0.01" schematicInfo.append(".model iron_core core ("+modelline+" area = "+area+" length = "+length +")") schematicInfo.append("a"+str(k)+" ("+words[4]+" "+words[3]+") (3mmf "+words[3]+") secondary") k=k+1 print "-----------------------------------------------------------\n" print "Add parameters for secondary " num_turns2=raw_input(' Enter the number of turns in secondary (default=620): ') print "-----------------------------------------------------------\n" if num_turns2=="": num_turns2="620" schematicInfo.append(".model secondary lcouple (num_turns = "+num_turns2+ ")") else: schematicInfo.insert(index,compline) # Update option information return schematicInfo,outputOption # Accept input file name from user if not provided if len(sys.argv) < 2: filename=raw_input('Enter file name: ') else: filename=sys.argv[1] if len(sys.argv) < 3: finalNetlist=int(raw_input('Do you want to create final file: ')) else: finalNetlist=int(sys.argv[2]) print "==================================" print "Kicad to Ngspice netlist converter " print "==================================" print "converting "+filename # Read the netlist lines=readNetlist(filename) # Construct parameter information param=readParamInfo(lines) # Replace parameter with values netlist, infoline=preprocessNetlist(lines,param) # Separate option and schematic information optionInfo, schematicInfo=separateNetlistInfo(netlist) if finalNetlist: # Insert analysis from file optionInfo=addAnalysis(optionInfo) # Find the analysis option analysisOption=[] outputOption=[] initialCondOption=[] simulatorOption=[] includeOption=[] model=[] for eachline in optionInfo: words=eachline.split() option=words[0] if (option=='.ac' or option=='.dc' or option=='.disto' or option=='.noise' or option=='.op' or option=='.pz' or option=='.sens' or option=='.tf' or option=='.tran'): analysisOption.append(eachline+'\n') print eachline elif (option=='.save' or option=='.print' or option=='.plot' or option=='.four'): eachline=eachline.strip('.') outputOption.append(eachline+'\n') elif (option=='.nodeset' or option=='.ic'): initialCondOption.append(eachline+'\n') elif option=='.option': simulatorOption.append(eachline+'\n') elif (option=='.include' or option=='.lib'): includeOption.append(eachline+'\n') elif (option=='.model'): model.append(eachline+'\n') elif option=='.end': continue; # Find the various model library required modelList=[] subcktList=[] for eachline in schematicInfo: words=eachline.split() if eachline[0]=='d': modelName=words[3] if modelName in modelList: continue modelList.append(modelName) elif eachline[0]=='q': modelName=words[4] index=schematicInfo.index(eachline) schematicInfo.remove(eachline) schematicInfo.insert(index,words[0]+" "+words[3]+" "+words[2]+" "+words[1]+" "+words[4]) if modelName in modelList: continue modelList.append(modelName) elif eachline[0]=='m': modelName=words[4] index=schematicInfo.index(eachline) schematicInfo.remove(eachline) width=raw_input(' Enter width of mosfet '+words[0]+'(default=100u):') length=raw_input(' Enter length of mosfet '+words[0]+'(default=5u):') multiplicative_factor=raw_input(' Enter multiplicative factor of mosfet '+words[0]+'(default=1):') AD=raw_input(' Enter drain area, AD of mosfet '+words[0]+'(default=5*(L/2)*W): ') AS=raw_input(' Enter source area, AS of mosfet '+words[0]+'(default=5*(L/2)*W): ') PD=raw_input(' Enter drain perimeter, PD of mosfet '+words[0]+'(default=2*W+10*L/2): ') PS=raw_input(' Enter source perimeter, PS of mosfet '+words[0]+'(default=2*W+10*L/2): ') if width=="": width="0.0001" if multiplicative_factor=="": multiplicative_factor="1" if length=="": length="0.000005" if PD=="": PD = 2*float(width)+10*float(length)/2 if PS=="": PS = 2*float(width)+10*float(length)/2 if AD=="": AD = 5*(float(length)/2)*float(width) if AS=="": AS = 5*(float(length)/2)*float(width) schematicInfo.insert(index,words[0]+" "+words[1]+" "+words[2]+" "+words[3]+" "+words[3]+" "+words[4]+" "+'M='+multiplicative_factor+" "+'L='+length+" "+'W='+width+" "+'PD='+str(PD)+" "+'PS='+str(PS)+" "+'AD='+str(AD)+" "+'AS='+str(AS)) if modelName in modelList: continue modelList.append(modelName) elif eachline[0]=='j': modelName=words[4] index=schematicInfo.index(eachline) schematicInfo.remove(eachline) schematicInfo.insert(index,words[0]+" "+words[1]+" "+words[2]+" "+words[3]+" "+words[4]) if modelName in modelList: continue modelList.append(modelName) elif eachline[0]=='x': subcktName=words[len(words)-1] if subcktName in subcktList: continue subcktList.append(subcktName) # Find current through components schematicInfo,outputOption=findCurrent(schematicInfo,outputOption) # Add parameter to sources schematicInfo=insertSpecialSourceParam(schematicInfo) schematicInfo,outputOption=convertICintoBasicBlocks(schematicInfo,outputOption) # Add newline in the schematic information for i in range(len(schematicInfo),0,-1): schematicInfo.insert(i,'\n') outfile=filename+".out" cktfile=filename+".ckt" out=open(outfile,"w") ckt=open(cktfile,"w") out.writelines(infoline) out.writelines('\n') ckt.writelines(infoline) ckt.writelines('\n') for modelName in modelList: if os.path.exists(modelName+".lib"): out.writelines('.include '+modelName+'.lib\n') ckt.writelines('.include '+modelName+'.lib\n') for subcktName in subcktList: out.writelines('.include '+subcktName+'.sub\n') ckt.writelines('.include '+subcktName+'.sub\n') if finalNetlist: sections=[simulatorOption, initialCondOption, schematicInfo, analysisOption] else: sections=[simulatorOption, initialCondOption, schematicInfo] for section in sections: if len(section) == 0: continue else: out.writelines('\n') out.writelines(section) ckt.writelines('\n') ckt.writelines(section) if finalNetlist: out.writelines('\n* Control Statements \n') out.writelines('.control\n') out.writelines('run\n') out.writelines(outputOption) outputOption1=[] for option in outputOption: if (("plot" in option) or ("print" in option)): outputOption1.append("."+option) else: outputOption1.append(option) ckt.writelines(outputOption1) out.writelines('.endc\n') out.writelines('.end\n') ckt.writelines('.end\n') out.close() ckt.close() print "The ngspice netlist has been written in "+filename+".out" print "The scilab netlist has been written in "+filename+".ckt" dummy=raw_input('Press Enter to quit')