summaryrefslogtreecommitdiff
path: root/src/ngspicetoModelica/NgspicetoModelica.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/ngspicetoModelica/NgspicetoModelica.py')
-rw-r--r--src/ngspicetoModelica/NgspicetoModelica.py1302
1 files changed, 678 insertions, 624 deletions
diff --git a/src/ngspicetoModelica/NgspicetoModelica.py b/src/ngspicetoModelica/NgspicetoModelica.py
index 0e326f17..a80b2248 100644
--- a/src/ngspicetoModelica/NgspicetoModelica.py
+++ b/src/ngspicetoModelica/NgspicetoModelica.py
@@ -1,640 +1,694 @@
-
-
-
import sys
-import os.path
+import os
from string import maketrans
-def readNetlist(filename):
- """Read Ngspice Netlist"""
- 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()
-
- data = f.read()
-# data = data.translate(maketrans('\n+', ' '))
- f.close()
- return data.splitlines()
-
-
-def separateNetlistInfo(data):
- """ Separate schematic data and option data"""
- optionInfo=[]
- schematicInfo=[]
-
- for eachline in data:
- if len(eachline) > 1:
-## if eachline[0] == '+':
-## eachline=eachline.translate(maketrans('\n+',' '))
- if eachline[0]=='*':
- continue
- elif eachline[0]=='.':
- optionInfo.append(eachline.lower())
- else:
- schematicInfo.append(eachline.lower())
- return optionInfo,schematicInfo
-
-
-def addModel(optionInfo):
- """ Add model parameters in the modelica file and create dictionary of model parameters"""
- modelName = []
- modelInfo = {}
- subcktName = []
- paramInfo = []
- #modelInfo['paramInfo'] = {}
- for eachline in optionInfo:
- words = eachline.split()
- if words[0] == '.include':
- name = words[1].split('.')
- if name[1] == 'lib':
- modelName.append(name[0])
- if name[1] == 'sub':
- subcktName.append(name[0])
- elif words[0] == '.param':
- paramInfo.append(eachline)
- for eachmodel in modelName:
- filename = eachmodel + '.lib'
- if os.path.exists(filename):
- try:
- f = open(filename)
- except:
- print("Error in opening file")
+class NgMoConverter:
+ def __init__(self):
+ pass
+
+ def readNetlist(self,filename):
+ """
+ Read Ngspice Netlist
+ """
+ if os.path.exists(filename):
+ try:
+ f = open(filename)
+ except Exception as e:
+ print("Error in opening file")
+ print(str(e))
+ sys.exit()
+ else:
+ print filename + " does not exist"
sys.exit()
- else:
- print filename + " does not exist"
- sys.exit()
-
- data = f.read()
- data = data.lower()
- newdata = data.split('(')
- newdata = newdata[1].split()
- modelInfo[eachmodel] = {}
- for eachline in newdata:
- if len(eachline) > 1:
- info = eachline.split('=')
- # modelInfo[eachmodel][info[0]] = {}
- for eachitem in info:
- modelInfo[eachmodel][info[0]] = info[1] #dic within a dic
- #modelInfo[eachmodel] = modelInfo[eachmodel].split()
- # modelInfo[eachmodel] = modelInfo[eachmodel].lower()
- f.close()
-
- return modelName, modelInfo, subcktName, paramInfo
-
-
-def processParam(paramInfo):
- """ Process parameter info and update in Modelica syntax"""
- modelicaParam = []
- for eachline in paramInfo:
- eachline = eachline.split('.param')
- stat = 'parameter Real ' + eachline[1] + ';'
- stat = stat.translate(maketrans('{}', ' '))
- modelicaParam.append(stat)
- return modelicaParam
-
-def separatePlot(schematicInfo):
- """ separate print plot and component statements"""
- compInfo = []
- plotInfo = []
-
- for eachline in schematicInfo:
- words = eachline.split()
- if words[0] == 'run':
- continue
- elif words[0] == 'plot' or words[0] == 'print':
- plotInfo.append(eachline)
+ data = f.read()
+ #data = data.translate(maketrans('\n+', ' '))
+ f.close()
+ return data.splitlines()
+
+ def separateNetlistInfo(self,data):
+ """
+ Separate schematic data and option data
+ """
+ optionInfo = []
+ schematicInfo = []
+ for eachline in data:
+ if len(eachline) > 1:
+ #if eachline[0] == '+':
+ # eachline=eachline.translate(maketrans('\n+',' '))
+ if eachline[0]=='*':
+ continue
+ elif eachline[0]=='.':
+ optionInfo.append(eachline.lower())
+ else:
+ schematicInfo.append(eachline.lower())
+ return optionInfo,schematicInfo
+
+ def addModel(self,optionInfo):
+ """
+ Add model parameters in the modelica file and create dictionary of model parameters
+ """
+ modelName = []
+ modelInfo = {}
+ subcktName = []
+ paramInfo = []
+ #modelInfo['paramInfo'] = {}
+ for eachline in optionInfo:
+ words = eachline.split()
+ if words[0] == '.include':
+ name = words[1].split('.')
+ if name[1] == 'lib':
+ modelName.append(name[0])
+ if name[1] == 'sub':
+ subcktName.append(name[0])
+ elif words[0] == '.param':
+ paramInfo.append(eachline)
+
+ for eachmodel in modelName:
+ filename = eachmodel + '.lib'
+ 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()
+ data = f.read()
+ data = data.lower()
+ newdata = data.split('(')
+ newdata = newdata[1].split()
+ modelInfo[eachmodel] = {}
+
+ for eachline in newdata:
+ if len(eachline) > 1:
+ info = eachline.split('=')
+ # modelInfo[eachmodel][info[0]] = {}
+ for eachitem in info:
+ modelInfo[eachmodel][info[0]] = info[1] #dic within a dic
+ #modelInfo[eachmodel] = modelInfo[eachmodel].split()
+ # modelInfo[eachmodel] = modelInfo[eachmodel].lower()
+ f.close()
+ return modelName, modelInfo, subcktName, paramInfo
+
+ def processParam(self,paramInfo):
+ """
+ Process parameter info and update in Modelica syntax
+ """
+ modelicaParam = []
+ for eachline in paramInfo:
+ eachline = eachline.split('.param')
+ stat = 'parameter Real ' + eachline[1] + ';'
+ stat = stat.translate(maketrans('{}', ' '))
+ modelicaParam.append(stat)
+ return modelicaParam
+
+
+ def separatePlot(self,schematicInfo):
+ """
+ separate print plot and component statements
+ """
+ compInfo = []
+ plotInfo = []
+ for eachline in schematicInfo:
+ words = eachline.split()
+ if words[0] == 'run':
+ continue
+ elif words[0] == 'plot' or words[0] == 'print':
+ plotInfo.append(eachline)
+ else:
+ compInfo.append(eachline)
+ return compInfo, plotInfo
+
+ def separateSource(self,compInfo):
+ """
+ Find if dependent sources are present in the schematic and if so make a dictionary with source details
+ """
+ sourceInfo = {}
+ source = []
+ for eachline in compInfo:
+ words = eachline.split() ##This line need to be confirmed with Manas
+ if eachline[0] in ['f', 'h']:
+ source.append(words[3])
+ if len(source) > 0:
+ for eachline in compInfo:
+ words_s = eachline.split()
+ if words_s[0] in source:
+ sourceInfo[words_s[0]] = words_s[1:3]
+ return sourceInfo
+
+ def splitIntoVal(self,val):
+ """
+ Split the number k,u,p,t,g etc into powers e3,e-6 etc
+ """
+ for i in range(0,len(val),1):
+ if val[i] in ['k','u','p','t','g','m','n','f']:
+ newval = val.split(val[i])
+ if val[i] == 'k':
+ value = newval[0] + 'e3'
+ if val[i] == 'u':
+ value = newval[0] + 'e-6'
+ if val[i] == 'p':
+ value = newval[0] + 'e-12'
+ if val[i] == 't':
+ value = newval[0] + 'e12'
+ if val[i] == 'g':
+ value = newval[0] + 'e9'
+ if val[i] == 'm':
+ if i != len(val)-1:
+ if val[i+1] == 'e':
+ value = newval[0] + 'e6'
+ else:
+ value = newval[0] +'e-3'
+ if val[i] == 'n':
+ value = newval[0] + 'e-9'
+ if val[i] == 'f':
+ value = newval[0] +'e-15'
+
+ else:
+ value = val
+ return value
+
+ def compInit(self,compInfo, node, modelInfo, subcktName):
+ """
+ For each component in the netlist initialise it acc to Modelica format
+ """
+ #### initial processing to check if MOs is present. If so, library to be used is BondLib
+ modelicaCompInit = []
+ numNodesSub = {}
+ IfMOS = '0'
+ for eachline in compInfo:
+ #words = eachline.split()
+ if eachline[0] == 'm':
+ IfMOS = '1'
+ break
+ if len(subcktName) > 0:
+ subOptionInfo = []
+ subSchemInfo = []
+ for eachsub in subcktName:
+ filename_tem = eachsub + '.sub'
+ data = self.readNetlist(filename_tem)
+ subOptionInfo, subSchemInfo = self.separateNetlistInfo(data)
+ for eachline in subSchemInfo:
+ #words = eachline.split()
+ if eachline[0] == 'm':
+ IfMOS = '1'
+ break
+ for eachline in compInfo:
+ words = eachline.split()
+ val = words[3]
+ value = self.splitIntoVal(val)
+ if eachline[0] == 'r':
+ stat = 'Analog.Basic.Resistor ' + words[0] + '(R = ' + value + ');'
+ modelicaCompInit.append(stat)
+ elif eachline[0] == 'c':
+ stat = 'Analog.Basic.Capacitor ' + words[0] + '(C = ' + value + ');'
+ modelicaCompInit.append(stat)
+ elif eachline[0] == 'l':
+ stat = 'Analog.Basic.Inductor ' + words[0] + '(L = ' + value + ');'
+ modelicaCompInit.append(stat)
+ elif eachline[0] == 'e':
+ stat = 'Analog.Basic.VCV ' + words[0] + '(gain = ' + self.splitIntoVal(words[5]) + ');'
+ modelicaCompInit.append(stat)
+ elif eachline[0] == 'g':
+ stat = 'Analog.Basic.VCC ' + words[0] + '(transConductance = ' + self.splitIntoVal(words[5]) + ');'
+ modelicaCompInit.append(stat)
+ elif eachline[0] == 'f':
+ stat = 'Analog.Basic.CCC ' + words[0] + '(gain = ' + self.splitIntoVal(words[4]) + ');'
+ modelicaCompInit.append(stat)
+ elif eachline[0] == 'h':
+ stat = 'Analog.Basic.CCV ' + words[0] + '(transResistance = ' + self.splitIntoVal(words[4]) + ');'
+ modelicaCompInit.append(stat)
+ elif eachline[0] == 'd':
+ if len(words) > 3:
+ n = float(modelInfo[words[3]]['n'])
+ vt_temp = 0.025*n
+ vt = str(vt_temp)
+ stat = 'Analog.Semiconductors.Diode ' + words[0] + '(Ids = ' + modelInfo[words[3]]['is'] + ', Vt = ' + vt + ', R = 1e12' +');'
+ else:
+ stat = 'Analog.Semiconductors.Diode ' + words[0] +';'
+ modelicaCompInit.append(stat)
+ elif eachline[0] == 'm':
+ line_l = words[7].split('=')
+ line_w = words[8].split('=')
+ line_pd = words[9].split('=')
+ line_ps = words[10].split('=')
+ line_ad = words[11].split('=')
+ line_as = words[12].split('=')
+ if words[5] == "mos_n" or words[5] == "mosfet_n":
+ start = 'BondLib.Electrical.Analog.Spice.Mn '
+ if words[5] == "mos_p" or words[5] == "mosfet_p":
+ start = 'BondLib.Electrical.Analog.Spice.Mp '
+ stat = start + words[0] + '(Tnom = 300, VT0 = ' + modelInfo[\
+ words[5]]['vto'] + ', GAMMA = ' + modelInfo[words[5]]['gamma'] +\
+ ', PHI = ' + modelInfo[words[5]]['phi'] + ', LD = ' + self.splitIntoVal(modelInfo[words[5]]['ld'])\
+ + ', U0 = ' + str(float(self.splitIntoVal(modelInfo[words[5]]['uo']))*0.0001) + ', LAMBDA = ' \
+ + modelInfo[words[5]]['lambda'] + ', TOX = ' + self.splitIntoVal(modelInfo[words[5]]['tox']) \
+ + ', PB = ' + modelInfo[words[5]]['pb'] + ', CJ = ' + self.splitIntoVal(modelInfo[words[5]]['cj']) \
+ + ', CJSW = ' + self.splitIntoVal(modelInfo[words[5]]['cjsw']) + ', MJ = ' + modelInfo[words[5]]['mj'] \
+ + ', MJSW = ' + modelInfo[words[5]]['mjsw'] + ', CGD0 = ' + self.splitIntoVal(modelInfo[words[5]]['cgdo']) \
+ + ', JS = ' + self.splitIntoVal(modelInfo[words[5]]['js']) + ', CGB0 = ' + self.splitIntoVal(modelInfo[words[5]]['cgbo']) \
+ + ', CGS0 = ' + self.splitIntoVal(modelInfo[words[5]]['cgso']) + ', L = ' + self.splitIntoVal(line_l[1]) + ', W = ' \
+ + line_w[1] + ', Level = 1' + ', AD = ' + line_ad[1] + ', AS = ' + line_as[1] + ', PD = ' \
+ + line_pd[1] + ', PS = ' + line_pd[1] + ');'
+ stat = stat.translate(maketrans('{}', ' '))
+ modelicaCompInit.append(stat)
+ elif eachline[0] == 'v':
+ typ = words[3].split('(')
+ if typ[0] == "pulse":
+ per = words[9].split(')')
+ #if IfMOS == '0':
+ #stat = 'Spice3.Sources.V_pulse '+words[0]+'(TR = '+words[6]+', V2 = '+words[4]+', PW = '+words[8]+', PER = '+per[0]+', V1 = '+typ[1]+', TD = '+words[5]+', TF = '+words[7]+');'
+ #elif IfMOS == '1':
+ stat = 'Analog.Sources.TrapezoidVoltage '+words[0]+'(rising = '+words[6]+', V = '+words[4]\
+ +', width = '+words[8]+', period = '+per[0]+', offset = '+typ[1]+', startTime = '+words[5]+', falling = '+words[7]+');'
+ modelicaCompInit.append(stat)
+ if typ[0] == "sine":
+ theta = words[7].split(')')
+ #if IfMOS == '0':
+ #stat = 'Spice3.Sources.V_sin '+words[0]+'(VO = '+typ[1]+', VA = '+words[4]+', FREQ = '+words[5]+', TD = '+words[6]+', THETA = '+theta[0]+');'
+ #elif IfMOS == '1':
+ stat = 'Analog.Sources.SineVoltage '+words[0]+'(offset = '+typ[1]+', V = '+words[4]+', freqHz = '+words[5]+', startTime = '+words[6]+', phase = '+theta[0]+');'
+ modelicaCompInit.append(stat)
+ if typ[0] == "pwl":
+ #if IfMOS == '0':
+ #keyw = 'Spice3.Sources.V_pwl '
+ #elif IfMOS == '1':
+ keyw = 'Analog.Sources.TableVoltage '
+ stat = keyw + words[0] + '(table = [' + typ[1] + ',' + words[4] + ';'
+ length = len(words);
+ for i in range(6,length,2):
+ if i == length-2:
+ w = words[i].split(')')
+ stat = stat + words[i-1] + ',' + w[0]
+ else:
+ stat = stat + words[i-1] + ',' + words[i] + ';'
+ stat = stat + ']);'
+ modelicaCompInit.append(stat)
+ if typ[0] == words[3] and typ[0] != "dc":
+ val_temp = typ[0].split('v')
+ #if IfMOS == '0':
+ stat = 'Analog.Sources.ConstantVoltage ' + words[0] + '(V = ' + val_temp[0] + ');'
+ #elif IfMOS == '1':
+ #stat = 'Analog.Sources.ConstantVoltage ' + words[0] + '(V = ' + val_temp[0] + ');'
+ modelicaCompInit.append(stat)
+ elif typ[0] == words[3] and typ[0] == "dc":
+ #if IfMOS == '0':
+ #stat = 'Spice3.Sources.V_constant ' + words[0] + '(V = ' + words[4] + ');' ### check this
+ #elif IfMOS == '1':
+ stat = 'Analog.Sources.ConstantVoltage ' + words[0] + '(V = ' + words[4] + ');' ### check this
+ modelicaCompInit.append(stat)
+
+ elif eachline[0] == 'x':
+ temp_line = eachline.split()
+ temp = temp_line[0].split('x')
+ index = temp[1]
+ for i in range(0,len(temp_line),1):
+ if temp_line[i] in subcktName:
+ subname = temp_line[i]
+ numNodesSub[subname] = i - 1
+ point = i
+ if len(temp_line) > point + 1:
+ rem = temp_line[point+1:len(temp_line)]
+ rem_new = ','.join(rem)
+ stat = subname + ' ' + subname +'_instance' + index + '(' + rem_new + ');'
+ else:
+ stat = subname + ' ' + subname +'_instance' + index + ';'
+ modelicaCompInit.append(stat)
+ else:
+ continue
+
+ if '0' in node:
+ modelicaCompInit.append('Analog.Basic.Ground g;')
+ return modelicaCompInit, numNodesSub
+
+ def getSubInterface(self,subname,numNodesSub):
+ """
+ Get the list of nodes for subcircuit in .subckt line
+ """
+ subOptionInfo_p = []
+ subSchemInfo_p = []
+ filename_t = subname + '.sub'
+ data_p = self.readNetlist(filename_t)
+ subOptionInfo_p, subSchemInfo_p = self.separateNetlistInfo(data_p)
+ if len(subOptionInfo_p) > 0:
+ newline = subOptionInfo_p[0]
+ newline = newline.split('.subckt '+ subname)
+ intLine = newline[1].split()
+ newindex = numNodesSub[subname]
+ nodesInfoLine = intLine[0:newindex]
+ return nodesInfoLine
+
+ def getSubParamLine(self,subname, numNodesSub, subParamInfo):
+ """
+ Take subcircuit name and give the info related to parameters in the first line and initislise it in
+ """
+ #nodeSubInterface = []
+ subOptionInfo_p = []
+ subSchemInfo_p = []
+ filename_t = subname + '.sub'
+ data_p = self.readNetlist(filename_t)
+ subOptionInfo_p, subSchemInfo_p = self.separateNetlistInfo(data_p)
+ if len(subOptionInfo_p) > 0:
+ newline = subOptionInfo_p[0]
+ newline = newline.split('.subckt '+ subname)
+ intLine = newline[1].split()
+ newindex = numNodesSub[subname]
+ appen_line = intLine[newindex:len(intLine)]
+ appen_param = ','.join(appen_line)
+ paramLine = 'parameter Real ' + appen_param + ';'
+ paramLine = paramLine.translate(maketrans('{}', ' '))
+ subParamInfo.append(paramLine)
+ return subParamInfo
+
+ def nodeSeparate(self,compInfo, ifSub, subname, subcktName):
+ """
+ separate the node numbers and create nodes in modelica file;
+ the nodes in the subckt line should not be inside protected keyword. pinInit is the one that goes under protected keyword.
+ """
+ node = []
+ nodeTemp = []
+ nodeDic = {}
+ pinInit = 'Modelica.Electrical.Analog.Interfaces.Pin '
+ pinProtectedInit = 'Modelica.Electrical.Analog.Interfaces.Pin '
+ protectedNode = []
+ for eachline in compInfo:
+ words = eachline.split()
+ if eachline[0] in ['m', 'e', 'g', 't']:
+ nodeTemp.append(words[1])
+ nodeTemp.append(words[2])
+ nodeTemp.append(words[3])
+ nodeTemp.append(words[4])
+ elif eachline[0] in ['q', 'j']:
+ nodeTemp.append(words[1])
+ nodeTemp.append(words[2])
+ nodeTemp.append(words[3])
+ elif eachline[0] == 'x':
+ templine = eachline.split()
+ for i in range(0,len(templine),1):
+ if templine[i] in subcktName:
+ point = i
+ nodeTemp.extend(words[1:point])
+ else:
+ nodeTemp.append(words[1])
+ nodeTemp.append(words[2])
+ for i in nodeTemp:
+ if i not in node:
+ node.append(i)
+ for i in range(0, len(node),1):
+ nodeDic[node[i]] = 'n' + node[i]
+ if ifSub == '0':
+ if i != len(node)-1:
+ pinInit = pinInit + nodeDic[node[i]] + ', '
+ else:
+ pinInit = pinInit + nodeDic[node[i]]
+ else:
+ nonprotectedNode = self.getSubInterface(subname, numNodesSub)#self.getSubInterface(subname, numNodesSub) #Need to ask Manas then uncomment
+ if node[i] in nonprotectedNode:
+ continue
+ else:
+ protectedNode.append(node[i])
+ if ifSub == '1':
+ if len(nonprotectedNode) > 0:
+ for i in range(0, len(nonprotectedNode),1):
+ if i != len(nonprotectedNode)-1:
+ pinProtectedInit = pinProtectedInit + nodeDic[nonprotectedNode[i]] + ','
+ else:
+ pinProtectedInit = pinProtectedInit + nodeDic[nonprotectedNode[i]]
+ if len(protectedNode) > 0:
+ for i in range(0, len(protectedNode),1):
+ if i != len(protectedNode)-1:
+ pinInit = pinInit + nodeDic[protectedNode[i]] + ','
+ else:
+ pinInit = pinInit + nodeDic[protectedNode[i]]
+ pinInit = pinInit + ';'
+ pinProtectedInit = pinProtectedInit + ';'
+ return node, nodeDic, pinInit, pinProtectedInit
+
+
+ def connectInfo(self,compInfo, node, nodeDic, numNodesSub,subcktName):
+ """
+ Make node connections in the modelica netlist
+ """
+ connInfo = []
+ sourcesInfo = self.separateSource(compInfo)
+ for eachline in compInfo:
+ words = eachline.split()
+ if eachline[0] == 'r' or eachline[0] == 'c' or eachline[0] == 'd' or eachline[0] == 'l' or eachline[0] == 'v':
+ conn = 'connect(' + words[0] + '.p,' + nodeDic[words[1]] + ');'
+ connInfo.append(conn)
+ conn = 'connect(' + words[0] + '.n,' + nodeDic[words[2]] + ');'
+ connInfo.append(conn)
+ elif eachline[0] == 'm':
+ conn = 'connect(' + words[0] + '.D,' + nodeDic[words[1]] + ');'
+ connInfo.append(conn)
+ conn = 'connect(' + words[0] + '.G,' + nodeDic[words[2]] + ');'
+ connInfo.append(conn)
+ conn = 'connect(' + words[0] + '.S,' + nodeDic[words[3]] + ');'
+ connInfo.append(conn)
+ conn = 'connect(' + words[0] + '.B,' + nodeDic[words[4]] + ');'
+ connInfo.append(conn)
+ elif eachline[0] in ['f','h']:
+ vsource = words[3]
+ sourceNodes = sourcesInfo[vsource]
+ sourceNodes = sourceNodes.split()
+ conn = 'connect(' + words[0] + '.p1,'+ nodeDic[sourceNodes[0]] + ');'
+ connInfo.append(conn)
+ conn = 'connect(' + words[0] + '.n1,'+ nodeDic[sourceNodes[1]] + ');'
+ connInfo.append(conn)
+ conn = 'connect(' + words[0] + '.p2,'+ nodeDic[words[1]] + ');'
+ connInfo.append(conn)
+ conn = 'connect(' + words[0] + '.n2,'+ nodeDic[words[2]] + ');'
+ connInfo.append(conn)
+ elif eachline[0] in ['g','e']:
+ conn = 'connect(' + words[0] + '.p1,'+ nodeDic[words[3]] + ');'
+ connInfo.append(conn)
+ conn = 'connect(' + words[0] + '.n1,'+ nodeDic[words[4]] + ');'
+ connInfo.append(conn)
+ conn = 'connect(' + words[0] + '.p2,'+ nodeDic[words[1]] + ');'
+ connInfo.append(conn)
+ conn = 'connect(' + words[0] + '.n2,'+ nodeDic[words[2]] + ');'
+ connInfo.append(conn)
+ elif eachline[0] == 'x':
+ templine = eachline.split()
+ temp = templine[0].split('x')
+ index = temp[1]
+ for i in range(0,len(templine),1):
+ print "Test------------------>"
+ if templine[i] in subcktName: #Ask Manas Added subcktName in function Call
+ subname = templine[i]
+ nodeNumInfo = self.getSubInterface(subname, numNodesSub)
+ for i in range(0, numNodesSub[subname], 1):
+ #conn = 'connect(' + subname + '_instance' + index + '.' + nodeDic[nodeNumInfo[i]] + ',' + nodeDic[words[i+1]] + ');'
+ conn = 'connect(' + subname + '_instance' + index + '.' + 'n'+ nodeNumInfo[i] + ',' + nodeDic[words[i+1]] + ');'
+ connInfo.append(conn)
+ else:
+ continue
+ if '0' in node:
+ conn = 'connect(g.p,n0);'
+ connInfo.append(conn)
+
+ return connInfo
+
+
+ def procesSubckt(self,subcktName):
+
+ #Process the subcircuit file .sub in the project folder
+
+ #subcktDic = {}
+ subOptionInfo = []
+ subSchemInfo = []
+ subModel = []
+ subModelInfo = {}
+ subsubName = []
+ subParamInfo = []
+ nodeSubInterface = []
+ nodeSub = []
+ nodeDicSub = {}
+ pinInitsub = []
+ connSubInfo = []
+
+ if len(subcktName) > 0:
+ for eachsub in subcktName:
+ filename = eachsub + '.sub'
+ data = self.readNetlist(filename)
+ subOptionInfo, subSchemInfo = self.separateNetlistInfo(data)
+ if len(subOptionInfo) > 0:
+ newline = subOptionInfo[0]
+ subInitLine = newline
+ newline = newline.split('.subckt')
+ intLine = newline[1].split()
+ for i in range(0,len(intLine),1):
+ nodeSubInterface.append(intLine[i])
+ subModel, subModelInfo, subsubName, subParamInfo = self.addModel(subOptionInfo)
+ IfMOSsub = '0'
+ for eachline in subSchemInfo:
+ #words = eachline.split()
+ if eachline[0] == 'm':
+ IfMOSsub = '1'
+ break
+ if len(subsubName) > 0:
+ subsubOptionInfo = []
+ subsubSchemInfo = []
+ for eachsub in subsubName:
+ filename_stemp = eachsub + '.sub'
+ data = self.readNetlist(filename_stemp)
+ subsubOptionInfo, subsubSchemInfo = self.separateNetlistInfo(data)
+ for eachline in subsubSchemInfo:
+ #words = eachline.split()
+ if eachline[0] == 'm':
+ IfMOSsub = '1'
+ break
+ modelicaSubParam = self.processParam(subParamInfo)
+ nodeSub, nodeDicSub, pinInitSub, pinProtectedInitSub = self.nodeSeparate(subSchemInfo, '1', eachsub, subsubName)
+ modelicaSubCompInit, numNodesSubsub = self.compInit(subSchemInfo, nodeSub, subModelInfo, subsubName)
+ modelicaSubParamNew = self.getSubParamLine(eachsub, numNodesSubsub, modelicaSubParam) ###Ask Manas
+ connSubInfo = self.connectInfo(subSchemInfo, nodeSub, nodeDicSub, numNodesSubsub,subcktName)
+ newname = filename.split('.')
+ newfilename = newname[0]
+ outfilename = newfilename+ ".mo"
+ out = open(outfilename,"w")
+ out.writelines('model ' + os.path.basename(newfilename))
+ out.writelines('\n')
+ if IfMOSsub == '0':
+ out.writelines('import Modelica.Electrical.*;')
+ elif IfMOSsub == '1':
+ out.writelines('import BondLib.Electrical.*;')
+ out.writelines('\n')
+ for eachline in modelicaSubParamNew:
+ if len(subParamInfo) == 0:
+ continue
+ else:
+ out.writelines(eachline)
+ out.writelines('\n')
+ for eachline in modelicaSubCompInit:
+ if len(subSchemInfo) == 0:
+ continue
+ else:
+ out.writelines(eachline)
+ out.writelines('\n')
+
+ out.writelines(pinProtectedInitSub)
+ out.writelines('\n')
+ if pinInitSub != 'Modelica.Electrical.Analog.Interfaces.Pin ;':
+ out.writelines('protected')
+ out.writelines('\n')
+ out.writelines(pinInitSub)
+ out.writelines('\n')
+ out.writelines('equation')
+ out.writelines('\n')
+ for eachline in connSubInfo:
+ if len(connSubInfo) == 0:
+ continue
+ else:
+ out.writelines(eachline)
+ out.writelines('\n')
+ out.writelines('end '+ os.path.basename(newfilename) + ';')
+ out.writelines('\n')
+ out.close()
+
+ return data, subOptionInfo, subSchemInfo, subModel, subModelInfo, subsubName, \
+ subParamInfo, modelicaSubCompInit, modelicaSubParam, nodeSubInterface, nodeSub, nodeDicSub, pinInitSub, connSubInfo
+
+
+
+def main(args):
+ """
+ It is main function of module Ngspice to Modelica converter
+ """
+ if len(sys.argv) == 2:
+ filename = sys.argv[1]
else:
- compInfo.append(eachline)
- return compInfo, plotInfo
-
-def separateSource(compInfo):
- """Find if dependent sources are present in the schematic and if so make a dictionary with source details"""
- sourceInfo = {}
- source = []
- for eachline in compInfo:
- if eachline[0] in ['f', 'h']:
- source.append(words[3])
- if len(source) > 0:
- for eachline in compInfo:
- words_s = eachline.split()
- if words_s[0] in source:
- sourceInfo[words_s[0]] = words_s[1:3]
- return sourceInfo
-
-
-def splitIntoVal(val):
- """ Split the number k,u,p,t,g etc into powers e3,e-6 etc"""
- for i in range(0,len(val),1):
- if val[i] in ['k','u','p','t','g','m','n','f']:
- newval = val.split(val[i])
- if val[i] == 'k':
- value = newval[0] + 'e3'
- if val[i] == 'u':
- value = newval[0] + 'e-6'
- if val[i] == 'p':
- value = newval[0] + 'e-12'
- if val[i] == 't':
- value = newval[0] + 'e12'
- if val[i] == 'g':
- value = newval[0] + 'e9'
- if val[i] == 'm':
- if i != len(val)-1:
- if val[i+1] == 'e':
- value = newval[0] + 'e6'
- else:
- value = newval[0] +'e-3'
- if val[i] == 'n':
- value = newval[0] + 'e-9'
- if val[i] == 'f':
- value = newval[0] +'e-15'
- else:
- value = val
- return value
-
-
-def compInit(compInfo, node, modelInfo, subcktName):
- """For each component in the netlist initialise it acc to Modelica format"""
-#### initial processign to check if MOs is present. If so, library to be used is BondLib
- modelicaCompInit = []
- numNodesSub = {}
- IfMOS = '0'
- for eachline in compInfo:
-# words = eachline.split()
- if eachline[0] == 'm':
- IfMOS = '1'
- break
- if len(subcktName) > 0:
- subOptionInfo = []
- subSchemInfo = []
- for eachsub in subcktName:
- filename_tem = eachsub + '.sub'
- data = readNetlist(filename_tem)
- subOptionInfo, subSchemInfo = separateNetlistInfo(data)
- for eachline in subSchemInfo:
-# words = eachline.split()
+ print "USAGE:"
+ print "python NgspicetoModelica.py <filename>"
+ sys.exit()
+
+ obj_NgMoConverter = NgMoConverter()
+ #Getting all the require information
+ lines = obj_NgMoConverter.readNetlist(filename)
+ optionInfo, schematicInfo=obj_NgMoConverter.separateNetlistInfo(lines)
+ modelName, modelInfo, subcktName, paramInfo = obj_NgMoConverter.addModel(optionInfo)
+ modelicaParamInit = obj_NgMoConverter.processParam(paramInfo)
+ compInfo, plotInfo = obj_NgMoConverter.separatePlot(schematicInfo)
+ IfMOS = '0'
+
+ for eachline in compInfo:
+ words = eachline.split()
if eachline[0] == 'm':
- IfMOS = '1'
- break
- for eachline in compInfo:
- words = eachline.split()
- val = words[3]
- value = splitIntoVal(val)
- if eachline[0] == 'r':
- stat = 'Analog.Basic.Resistor ' + words[0] + '(R = ' + value + ');'
- modelicaCompInit.append(stat)
- elif eachline[0] == 'c':
- stat = 'Analog.Basic.Capacitor ' + words[0] + '(C = ' + value + ');'
- modelicaCompInit.append(stat)
- elif eachline[0] == 'l':
- stat = 'Analog.Basic.Inductor ' + words[0] + '(L = ' + value + ');'
- modelicaCompInit.append(stat)
- elif eachline[0] == 'e':
- stat = 'Analog.Basic.VCV ' + words[0] + '(gain = ' + splitIntoVal(words[5]) + ');'
- modelicaCompInit.append(stat)
- elif eachline[0] == 'g':
- stat = 'Analog.Basic.VCC ' + words[0] + '(transConductance = ' + splitIntoVal(words[5]) + ');'
- modelicaCompInit.append(stat)
- elif eachline[0] == 'f':
- stat = 'Analog.Basic.CCC ' + words[0] + '(gain = ' + splitIntoVal(words[4]) + ');'
- modelicaCompInit.append(stat)
- elif eachline[0] == 'h':
- stat = 'Analog.Basic.CCV ' + words[0] + '(transResistance = ' + splitIntoVal(words[4]) + ');'
- modelicaCompInit.append(stat)
- elif eachline[0] == 'd':
- if len(words) > 3:
- n = float(modelInfo[words[3]]['n'])
- vt_temp = 0.025*n
- vt = str(vt_temp)
- stat = 'Analog.Semiconductors.Diode ' + words[0] + '(Ids = ' + modelInfo[words[3]]['is'] + ', Vt = ' + vt + ', R = 1e12' +');'
- else:
- stat = 'Analog.Semiconductors.Diode ' + words[0] +';'
- modelicaCompInit.append(stat)
- elif eachline[0] == 'm':
- line_l = words[7].split('=')
- line_w = words[8].split('=')
- line_pd = words[9].split('=')
- line_ps = words[10].split('=')
- line_ad = words[11].split('=')
- line_as = words[12].split('=')
- if words[5] == "mos_n" or words[5] == "mosfet_n":
- start = 'BondLib.Electrical.Analog.Spice.Mn '
- if words[5] == "mos_p" or words[5] == "mosfet_p":
- start = 'BondLib.Electrical.Analog.Spice.Mp '
- stat = start + words[0] + '(Tnom = 300, VT0 = ' + modelInfo[words[5]]['vto'] + ', GAMMA = ' + modelInfo[words[5]]['gamma'] + ', PHI = ' + modelInfo[words[5]]['phi'] + ', LD = ' + splitIntoVal(modelInfo[words[5]]['ld']) + ', U0 = ' + str(float(splitIntoVal(modelInfo[words[5]]['uo']))*0.0001) + ', LAMBDA = ' + modelInfo[words[5]]['lambda'] + ', TOX = ' + splitIntoVal(modelInfo[words[5]]['tox']) + ', PB = ' + modelInfo[words[5]]['pb'] + ', CJ = ' + splitIntoVal(modelInfo[words[5]]['cj']) + ', CJSW = ' + splitIntoVal(modelInfo[words[5]]['cjsw']) + ', MJ = ' + modelInfo[words[5]]['mj'] + ', MJSW = ' + modelInfo[words[5]]['mjsw'] + ', CGD0 = ' + splitIntoVal(modelInfo[words[5]]['cgdo']) + ', JS = ' + splitIntoVal(modelInfo[words[5]]['js']) + ', CGB0 = ' + splitIntoVal(modelInfo[words[5]]['cgbo']) + ', CGS0 = ' + splitIntoVal(modelInfo[words[5]]['cgso']) + ', L = ' + splitIntoVal(line_l[1]) + ', W = ' + line_w[1] + ', Level = 1' + ', AD = ' + line_ad[1] + ', AS = ' + line_as[1] + ', PD = ' + line_pd[1] + ', PS = ' + line_pd[1] + ');'
- stat = stat.translate(maketrans('{}', ' '))
- modelicaCompInit.append(stat)
- elif eachline[0] == 'v':
- typ = words[3].split('(')
- if typ[0] == "pulse":
- per = words[9].split(')')
- # if IfMOS == '0':
- # stat = 'Spice3.Sources.V_pulse '+words[0]+'(TR = '+words[6]+', V2 = '+words[4]+', PW = '+words[8]+', PER = '+per[0]+', V1 = '+typ[1]+', TD = '+words[5]+', TF = '+words[7]+');'
- # elif IfMOS == '1':
- stat = 'Analog.Sources.TrapezoidVoltage '+words[0]+'(rising = '+words[6]+', V = '+words[4]+', width = '+words[8]+', period = '+per[0]+', offset = '+typ[1]+', startTime = '+words[5]+', falling = '+words[7]+');'
- modelicaCompInit.append(stat)
- if typ[0] == "sine":
- theta = words[7].split(')')
-# if IfMOS == '0':
-# stat = 'Spice3.Sources.V_sin '+words[0]+'(VO = '+typ[1]+', VA = '+words[4]+', FREQ = '+words[5]+', TD = '+words[6]+', THETA = '+theta[0]+');'
-# elif IfMOS == '1':
- stat = 'Analog.Sources.SineVoltage '+words[0]+'(offset = '+typ[1]+', V = '+words[4]+', freqHz = '+words[5]+', startTime = '+words[6]+', phase = '+theta[0]+');'
- modelicaCompInit.append(stat)
- if typ[0] == "pwl":
-# if IfMOS == '0':
-# keyw = 'Spice3.Sources.V_pwl '
-# elif IfMOS == '1':
- keyw = 'Analog.Sources.TableVoltage '
- stat = keyw + words[0] + '(table = [' + typ[1] + ',' + words[4] + ';'
- length = len(words);
- for i in range(6,length,2):
- if i == length-2:
- w = words[i].split(')')
- stat = stat + words[i-1] + ',' + w[0]
- else:
- stat = stat + words[i-1] + ',' + words[i] + ';'
- stat = stat + ']);'
- modelicaCompInit.append(stat)
- if typ[0] == words[3] and typ[0] != "dc":
- val_temp = typ[0].split('v')
-# if IfMOS == '0':
- stat = 'Analog.Sources.ConstantVoltage ' + words[0] + '(V = ' + val_temp[0] + ');'
-# elif IfMOS == '1':
-# stat = 'Analog.Sources.ConstantVoltage ' + words[0] + '(V = ' + val_temp[0] + ');'
- modelicaCompInit.append(stat)
- elif typ[0] == words[3] and typ[0] == "dc":
-# if IfMOS == '0':
-# stat = 'Spice3.Sources.V_constant ' + words[0] + '(V = ' + words[4] + ');' ### check this
-# elif IfMOS == '1':
- stat = 'Analog.Sources.ConstantVoltage ' + words[0] + '(V = ' + words[4] + ');' ### check this
- modelicaCompInit.append(stat)
- elif eachline[0] == 'x':
- temp_line = eachline.split()
- temp = temp_line[0].split('x')
- index = temp[1]
- for i in range(0,len(temp_line),1):
- if temp_line[i] in subcktName:
- subname = temp_line[i]
- numNodesSub[subname] = i - 1
- point = i
- if len(temp_line) > point + 1:
- rem = temp_line[point+1:len(temp_line)]
- rem_new = ','.join(rem)
- stat = subname + ' ' + subname +'_instance' + index + '(' + rem_new + ');'
- else:
- stat = subname + ' ' + subname +'_instance' + index + ';'
- modelicaCompInit.append(stat)
- else:
- continue
- if '0' in node:
- modelicaCompInit.append('Analog.Basic.Ground g;')
- return modelicaCompInit, numNodesSub
-
-def getSubInterface(subname, numNodesSub):
- """ Get the list of nodes for subcircuit in .subckt line"""
- subOptionInfo_p = []
- subSchemInfo_p = []
- filename_t = subname + '.sub'
- data_p = readNetlist(filename_t)
- subOptionInfo_p, subSchemInfo_p = separateNetlistInfo(data_p)
- if len(subOptionInfo_p) > 0:
- newline = subOptionInfo_p[0]
- newline = newline.split('.subckt '+ subname)
- intLine = newline[1].split()
- newindex = numNodesSub[subname]
- nodesInfoLine = intLine[0:newindex]
- return nodesInfoLine
-
-
-def getSubParamLine(subname, numNodesSub, subParamInfo):
- """ Take subcircuit name and give the info related to parameters in the first line and initislise it in """
-# nodeSubInterface = []
- subOptionInfo_p = []
- subSchemInfo_p = []
- filename_t = subname + '.sub'
- data_p = readNetlist(filename_t)
- subOptionInfo_p, subSchemInfo_p = separateNetlistInfo(data_p)
- if len(subOptionInfo_p) > 0:
- newline = subOptionInfo_p[0]
- newline = newline.split('.subckt '+ subname)
- intLine = newline[1].split()
- newindex = numNodesSub[subname]
- appen_line = intLine[newindex:len(intLine)]
- appen_param = ','.join(appen_line)
- paramLine = 'parameter Real ' + appen_param + ';'
- paramLine = paramLine.translate(maketrans('{}', ' '))
- subParamInfo.append(paramLine)
- return subParamInfo
-
-def nodeSeparate(compInfo, ifSub, subname, subcktName):
- """ separate the node numbers and create nodes in modelica file; the nodes in the subckt line should not be inside protected keyword. pinInit is the one that goes under protected keyword."""
- node = []
- nodeTemp = []
- nodeDic = {}
- pinInit = 'Modelica.Electrical.Analog.Interfaces.Pin '
- pinProtectedInit = 'Modelica.Electrical.Analog.Interfaces.Pin '
- protectedNode = []
- for eachline in compInfo:
- words = eachline.split()
- if eachline[0] in ['m', 'e', 'g', 't']:
- nodeTemp.append(words[1])
- nodeTemp.append(words[2])
- nodeTemp.append(words[3])
- nodeTemp.append(words[4])
- elif eachline[0] in ['q', 'j']:
- nodeTemp.append(words[1])
- nodeTemp.append(words[2])
- nodeTemp.append(words[3])
- elif eachline[0] == 'x':
- templine = eachline.split()
- for i in range(0,len(templine),1):
- if templine[i] in subcktName:
- point = i
- nodeTemp.extend(words[1:point])
- else:
- nodeTemp.append(words[1])
- nodeTemp.append(words[2])
- for i in nodeTemp:
- if i not in node:
- node.append(i)
- for i in range(0, len(node),1):
- nodeDic[node[i]] = 'n' + node[i]
- if ifSub == '0':
- if i != len(node)-1:
- pinInit = pinInit + nodeDic[node[i]] + ', '
- else:
- pinInit = pinInit + nodeDic[node[i]]
- else:
- nonprotectedNode = getSubInterface(subname, numNodesSub)
- if node[i] in nonprotectedNode:
- continue
- else:
- protectedNode.append(node[i])
- if ifSub == '1':
- if len(nonprotectedNode) > 0:
- for i in range(0, len(nonprotectedNode),1):
- if i != len(nonprotectedNode)-1:
- pinProtectedInit = pinProtectedInit + nodeDic[nonprotectedNode[i]] + ','
+ IfMOS = '1'
+ break
+ if len(subcktName) > 0:
+ subOptionInfo = []
+ subSchemInfo = []
+ for eachsub in subcktName:
+ filename_temp = eachsub + '.sub'
+ data = obj_NgMoConverter.readNetlist(filename_temp)
+ subOptionInfo, subSchemInfo = obj_NgMoConverter.separateNetlistInfo(data)
+ for eachline in subSchemInfo:
+ words = eachline.split()
+ if eachline[0] == 'm':
+ IfMOS = '1'
+ break
+
+ node, nodeDic, pinInit, pinProtectedInit = obj_NgMoConverter.nodeSeparate(compInfo, '0', [], subcktName)
+ modelicaCompInit, numNodesSub = obj_NgMoConverter.compInit(compInfo,node, modelInfo, subcktName)
+ connInfo = obj_NgMoConverter.connectInfo(compInfo, node, nodeDic, numNodesSub,subcktName)
+
+ ###After Sub Ckt Func
+ if len(subcktName) > 0:
+ data, subOptionInfo, subSchemInfo, subModel, subModelInfo, subsubName, \
+ subParamInfo, modelicaSubCompInit, modelicaSubParam, nodeSubInterface,\
+ nodeSub, nodeDicSub, pinInitSub, connSubInfo = obj_NgMoConverter.procesSubckt(subcktName)
+
+ #Creating Final Output file
+ newfile = filename.split('.')
+ newfilename = newfile[0]
+ outfile = newfilename + ".mo"
+ out = open(outfile,"w")
+ out.writelines('model ' + os.path.basename(newfilename))
+ out.writelines('\n')
+ if IfMOS == '0':
+ out.writelines('import Modelica.Electrical.*;')
+ elif IfMOS == '1':
+ out.writelines('import BondLib.Electrical.*;')
+ #out.writelines('import Modelica.Electrical.*;')
+ out.writelines('\n')
+
+ for eachline in modelicaParamInit:
+ if len(paramInfo) == 0:
+ continue
else:
- pinProtectedInit = pinProtectedInit + nodeDic[nonprotectedNode[i]]
- if len(protectedNode) > 0:
- for i in range(0, len(protectedNode),1):
- if i != len(protectedNode)-1:
- pinInit = pinInit + nodeDic[protectedNode[i]] + ','
+ out.writelines(eachline)
+ out.writelines('\n')
+ for eachline in modelicaCompInit:
+ if len(compInfo) == 0:
+ continue
else:
- pinInit = pinInit + nodeDic[protectedNode[i]]
- pinInit = pinInit + ';'
- pinProtectedInit = pinProtectedInit + ';'
- return node, nodeDic, pinInit, pinProtectedInit
-
-def connectInfo(compInfo, node, nodeDic, numNodesSub):
- """Make node connections in the modelica netlist"""
- connInfo = []
- sourcesInfo = separateSource(compInfo)
- for eachline in compInfo:
- words = eachline.split()
- if eachline[0] == 'r' or eachline[0] == 'c' or eachline[0] == 'd' or eachline[0] == 'l' or eachline[0] == 'v':
- conn = 'connect(' + words[0] + '.p,' + nodeDic[words[1]] + ');'
- connInfo.append(conn)
- conn = 'connect(' + words[0] + '.n,' + nodeDic[words[2]] + ');'
- connInfo.append(conn)
- elif eachline[0] == 'm':
- conn = 'connect(' + words[0] + '.D,' + nodeDic[words[1]] + ');'
- connInfo.append(conn)
- conn = 'connect(' + words[0] + '.G,' + nodeDic[words[2]] + ');'
- connInfo.append(conn)
- conn = 'connect(' + words[0] + '.S,' + nodeDic[words[3]] + ');'
- connInfo.append(conn)
- conn = 'connect(' + words[0] + '.B,' + nodeDic[words[4]] + ');'
- connInfo.append(conn)
- elif eachline[0] in ['f','h']:
- vsource = words[3]
- sourceNodes = sourcesInfo[vsource]
- sourceNodes = sourceNodes.split()
- conn = 'connect(' + words[0] + '.p1,'+ nodeDic[sourceNodes[0]] + ');'
- connInfo.append(conn)
- conn = 'connect(' + words[0] + '.n1,'+ nodeDic[sourceNodes[1]] + ');'
- connInfo.append(conn)
- conn = 'connect(' + words[0] + '.p2,'+ nodeDic[words[1]] + ');'
- connInfo.append(conn)
- conn = 'connect(' + words[0] + '.n2,'+ nodeDic[words[2]] + ');'
- connInfo.append(conn)
- elif eachline[0] in ['g','e']:
- conn = 'connect(' + words[0] + '.p1,'+ nodeDic[words[3]] + ');'
- connInfo.append(conn)
- conn = 'connect(' + words[0] + '.n1,'+ nodeDic[words[4]] + ');'
- connInfo.append(conn)
- conn = 'connect(' + words[0] + '.p2,'+ nodeDic[words[1]] + ');'
- connInfo.append(conn)
- conn = 'connect(' + words[0] + '.n2,'+ nodeDic[words[2]] + ');'
- connInfo.append(conn)
- elif eachline[0] == 'x':
- templine = eachline.split()
- temp = templine[0].split('x')
- index = temp[1]
- for i in range(0,len(templine),1):
- if templine[i] in subcktName:
- subname = templine[i]
- nodeNumInfo = getSubInterface(subname, numNodesSub)
- for i in range(0, numNodesSub[subname], 1):
-# conn = 'connect(' + subname + '_instance' + index + '.' + nodeDic[nodeNumInfo[i]] + ',' + nodeDic[words[i+1]] + ');'
- conn = 'connect(' + subname + '_instance' + index + '.' + 'n'+ nodeNumInfo[i] + ',' + nodeDic[words[i+1]] + ');'
- connInfo.append(conn)
- else:
- #elif eachline[0] == 'q':
- #elif eachline[0] == 'j':
- continue
- if '0' in node:
- conn = 'connect(g.p,n0);'
- connInfo.append(conn)
- return connInfo
-## For testing
-
-
-if len(sys.argv) < 2:
- filename=raw_input('Enter file name: ')
-else:
- filename=sys.argv[1]
-
-
-# get all the required info
-lines=readNetlist(filename)
-optionInfo, schematicInfo=separateNetlistInfo(lines)
-modelName, modelInfo, subcktName, paramInfo = addModel(optionInfo)
-modelicaParamInit = processParam(paramInfo)
-compInfo, plotInfo = separatePlot(schematicInfo)
-IfMOS = '0'
-for eachline in compInfo:
- words = eachline.split()
- if eachline[0] == 'm':
- IfMOS = '1'
- break
-if len(subcktName) > 0:
- subOptionInfo = []
- subSchemInfo = []
- for eachsub in subcktName:
- filename_temp = eachsub + '.sub'
- data = readNetlist(filename_temp)
- subOptionInfo, subSchemInfo = separateNetlistInfo(data)
- for eachline in subSchemInfo:
- words = eachline.split()
- if eachline[0] == 'm':
- IfMOS = '1'
- break
-node, nodeDic, pinInit, pinProtectedInit = nodeSeparate(compInfo, '0', [], subcktName)
-modelicaCompInit, numNodesSub = compInit(compInfo,node, modelInfo, subcktName)
-connInfo = connectInfo(compInfo, node, nodeDic, numNodesSub)
-
-####Extract subckt data
-def procesSubckt(subcktName):
- """ Process the subcircuit file .sub in the project folder"""
-# subcktDic = {}
- subOptionInfo = []
- subSchemInfo = []
- subModel = []
- subModelInfo = {}
- subsubName = []
- subParamInfo = []
- nodeSubInterface = []
- nodeSub = []
- nodeDicSub = {}
- pinInitsub = []
- connSubInfo = []
- if len(subcktName) > 0:
- for eachsub in subcktName:
- filename = eachsub + '.sub'
- data = readNetlist(filename)
- subOptionInfo, subSchemInfo = separateNetlistInfo(data)
- if len(subOptionInfo) > 0:
- newline = subOptionInfo[0]
- subInitLine = newline
- newline = newline.split('.subckt')
- intLine = newline[1].split()
- for i in range(0,len(intLine),1):
- nodeSubInterface.append(intLine[i])
- subModel, subModelInfo, subsubName, subParamInfo = addModel(subOptionInfo)
- IfMOSsub = '0'
- for eachline in subSchemInfo:
-# words = eachline.split()
- if eachline[0] == 'm':
- IfMOSsub = '1'
- break
- if len(subsubName) > 0:
- subsubOptionInfo = []
- subsubSchemInfo = []
- for eachsub in subsubName:
- filename_stemp = eachsub + '.sub'
- data = readNetlist(filename_stemp)
- subsubOptionInfo, subsubSchemInfo = separateNetlistInfo(data)
- for eachline in subsubSchemInfo:
-# words = eachline.split()
- if eachline[0] == 'm':
- IfMOSsub = '1'
- break
- modelicaSubParam = processParam(subParamInfo)
- nodeSub, nodeDicSub, pinInitSub, pinProtectedInitSub = nodeSeparate(subSchemInfo, '1', eachsub, subsubName)
- modelicaSubCompInit, numNodesSubsub = compInit(subSchemInfo, nodeSub, subModelInfo, subsubName)
- modelicaSubParamNew = getSubParamLine(eachsub, numNodesSub, modelicaSubParam)
- connSubInfo = connectInfo(subSchemInfo, nodeSub, nodeDicSub, numNodesSubsub)
- newname = filename.split('.')
- newfilename = newname[0]
- outfilename = newfilename+ ".mo"
- out = open(outfilename,"w")
- out.writelines('model ' + os.path.basename(newfilename))
- out.writelines('\n')
- if IfMOSsub == '0':
- out.writelines('import Modelica.Electrical.*;')
- elif IfMOSsub == '1':
- out.writelines('import BondLib.Electrical.*;')
- out.writelines('\n')
- for eachline in modelicaSubParamNew:
- if len(subParamInfo) == 0:
- continue
- else:
- out.writelines(eachline)
- out.writelines('\n')
- for eachline in modelicaSubCompInit:
- if len(subSchemInfo) == 0:
- continue
- else:
- out.writelines(eachline)
- out.writelines('\n')
- out.writelines(pinProtectedInitSub)
- out.writelines('\n')
- if pinInitSub != 'Modelica.Electrical.Analog.Interfaces.Pin ;':
- out.writelines('protected')
- out.writelines('\n')
- out.writelines(pinInitSub)
- out.writelines('\n')
- out.writelines('equation')
- out.writelines('\n')
- for eachline in connSubInfo:
- if len(connSubInfo) == 0:
- continue
- else:
- out.writelines(eachline)
- out.writelines('\n')
- out.writelines('end '+ os.path.basename(newfilename) + ';')
- out.writelines('\n')
- out.close()
-
- return data, subOptionInfo, subSchemInfo, subModel, subModelInfo, subsubName, subParamInfo, modelicaSubCompInit, modelicaSubParam, nodeSubInterface, nodeSub, nodeDicSub, pinInitSub, connSubInfo
-
-if len(subcktName) > 0:
- data, subOptionInfo, subSchemInfo, subModel, subModelInfo, subsubName, subParamInfo, modelicaSubCompInit, modelicaSubParam, nodeSubInterface, nodeSub, nodeDicSub, pinInitSub, connSubInfo = procesSubckt(subcktName)
-
-# creating final output
-
-newfile = filename.split('.')
-newfilename = newfile[0]
-outfile = newfilename + ".mo"
-out = open(outfile,"w")
-out.writelines('model ' + os.path.basename(newfilename))
-out.writelines('\n')
-if IfMOS == '0':
- out.writelines('import Modelica.Electrical.*;')
-elif IfMOS == '1':
- out.writelines('import BondLib.Electrical.*;')
-#out.writelines('import Modelica.Electrical.*;')
-out.writelines('\n')
-
-for eachline in modelicaParamInit:
- if len(paramInfo) == 0:
- continue
- else:
- out.writelines(eachline)
+ out.writelines(eachline)
+ out.writelines('\n')
+
+ out.writelines('protected')
out.writelines('\n')
-for eachline in modelicaCompInit:
- if len(compInfo) == 0:
- continue
- else:
- out.writelines(eachline)
+ out.writelines(pinInit)
out.writelines('\n')
-
-out.writelines('protected')
-out.writelines('\n')
-out.writelines(pinInit)
-out.writelines('\n')
-out.writelines('equation')
-out.writelines('\n')
-
-for eachline in connInfo:
- if len(connInfo) == 0:
- continue
- else:
- out.writelines(eachline)
+ out.writelines('equation')
+ out.writelines('\n')
+
+ for eachline in connInfo:
+ if len(connInfo) == 0:
+ continue
+ else:
+ out.writelines(eachline)
+ out.writelines('\n')
+
+ out.writelines('end '+ os.path.basename(newfilename) + ';')
out.writelines('\n')
-
-out.writelines('end '+ os.path.basename(newfilename) + ';')
-out.writelines('\n')
-out.close()
+ out.close()
+# Call main function
+if __name__ == '__main__':
+ main(sys.argv) \ No newline at end of file