summaryrefslogtreecommitdiff
path: root/src/kicadtoNgspice
diff options
context:
space:
mode:
authorFahim2015-06-24 11:26:33 +0530
committerFahim2015-06-24 11:26:33 +0530
commitf7cf0e9a67627ed6ce73892a75445ba84e6b9b21 (patch)
tree3d4eb335a02347d289dad226d5b2ca202da9edad /src/kicadtoNgspice
parentf47a744451fe634efb487023f073321ceed4664c (diff)
parent6af9f606a72d3c4399873840de3c683d423df5a6 (diff)
downloadeSim-f7cf0e9a67627ed6ce73892a75445ba84e6b9b21.tar.gz
eSim-f7cf0e9a67627ed6ce73892a75445ba84e6b9b21.tar.bz2
eSim-f7cf0e9a67627ed6ce73892a75445ba84e6b9b21.zip
Merge pull request #34 from FOSSEE-Manipal/master
Added subcircuit module and storing previous values for same
Diffstat (limited to 'src/kicadtoNgspice')
-rw-r--r--src/kicadtoNgspice/Convert.py66
-rw-r--r--src/kicadtoNgspice/DeviceModel.py88
-rw-r--r--src/kicadtoNgspice/KicadtoNgspice.py101
-rw-r--r--src/kicadtoNgspice/Processing.py214
-rw-r--r--src/kicadtoNgspice/SubcircuitTab.py177
-rw-r--r--src/kicadtoNgspice/TrackWidget.py7
6 files changed, 525 insertions, 128 deletions
diff --git a/src/kicadtoNgspice/Convert.py b/src/kicadtoNgspice/Convert.py
index 739963ba..baf842d9 100644
--- a/src/kicadtoNgspice/Convert.py
+++ b/src/kicadtoNgspice/Convert.py
@@ -1,3 +1,5 @@
+from PyQt4 import QtGui
+
import os
import sys
import shutil
@@ -352,11 +354,69 @@ class Convert:
#Adding .include line to Schematic Info at the start of line
for item in list(set(includeLine)):
schematicInfo.insert(0,item)
-
-
-
+
return schematicInfo
+ def addSubcircuit(self,schematicInfo,kicadFile):
+ """
+ This function add the subcircuit to schematicInfo
+ """
+ print "Adding Subcircuit to Schematic info file"
+
+ (projpath,filename) = os.path.split(kicadFile)
+
+ subList = self.obj_track.subcircuitTrack
+ subLine = {} #Key:Index, Value:with its updated line in the form of list
+ includeLine = [] #All .include line list
+ if len(self.obj_track.subcircuitList) != len(self.obj_track.subcircuitTrack):
+ self.msg = QtGui.QErrorMessage()
+ self.msg.showMessage("Conversion failed. Please add all Subcircuits.")
+ self.msg.setWindowTitle("Error Message")
+ self.msg.show()
+ raise Exception('All subcircuit directories need to be specified.')
+ elif not subList:
+ print "No Subcircuit Added in the schematic"
+ pass
+ else:
+ for eachline in schematicInfo:
+ words = eachline.split()
+ if words[0] in subList:
+ print "Found Subcircuit line"
+ index = schematicInfo.index(eachline)
+ completeSubPath = subList[words[0]]
+ (subpath,subname) = os.path.split(completeSubPath)
+ print "Library Path :",subpath
+ #Copying library from devicemodelLibrary to Project Path
+
+ #Replace last word with library name
+ words[-1] = subname.split('.')[0]
+ subLine[index] = words
+ includeLine.append(".include "+subname+".sub")
+
+ src = completeSubPath
+ dst = projpath
+ print os.listdir(src)
+ for files in os.listdir(src):
+ if os.path.isfile(os.path.join(src,files)):
+ if files != "analysis":
+ shutil.copy2(os.path.join(src,files),dst)
+ else:
+ pass
+
+
+ #Adding subcircuit line to schematicInfo
+ for index,value in subLine.iteritems():
+ #Update the subcircuit line
+ strLine = " ".join(str(item) for item in value)
+ schematicInfo[index] = strLine
+
+ #This has to be second i.e after subcircuitLine details
+ #Adding .include line to Schematic Info at the start of line
+ for item in list(set(includeLine)):
+ schematicInfo.insert(0,item)
+
+ return schematicInfo
+
def getRefrenceName(self,libname,libpath):
libname = libname.replace('.lib','.xml')
library = os.path.join(libpath,libname)
diff --git a/src/kicadtoNgspice/DeviceModel.py b/src/kicadtoNgspice/DeviceModel.py
index a6d11ee7..7dc740d2 100644
--- a/src/kicadtoNgspice/DeviceModel.py
+++ b/src/kicadtoNgspice/DeviceModel.py
@@ -64,12 +64,17 @@ class DeviceModel(QtGui.QWidget):
transbox.setTitle("Add library for Transistor "+words[0]+" : "+words[4])
self.entry_var[self.count] = QtGui.QLineEdit()
self.entry_var[self.count].setText("")
+ global path_name
try:
for child in root:
if child.tag[0]==eachline[0] and child.tag[1]==eachline[1]:
#print "DEVICE MODEL MATCHING---",child.tag[0],child.tag[1],eachline[0],eachline[1]
try:
- self.entry_var[self.count].setText(child[0].text)
+ if os.path.exists(child[0].text):
+ self.entry_var[self.count].setText(child[0].text)
+ path_name=child[0].text
+ else:
+ self.entry_var[self.count].setText("")
except:
print "ERROR WHEN SET TEXT"
except:
@@ -78,6 +83,11 @@ class DeviceModel(QtGui.QWidget):
self.addbtn = QtGui.QPushButton("Add")
self.addbtn.setObjectName("%d" %self.count)
self.addbtn.clicked.connect(self.trackLibrary)
+ self.deviceDetail[self.count] = words[0]
+ if self.entry_var[self.count].text()=="":
+ pass
+ else:
+ self.trackLibraryWithourButton(self.count,path_name)
transgrid.addWidget(self.addbtn,self.row,2)
transbox.setLayout(transgrid)
@@ -90,7 +100,7 @@ class DeviceModel(QtGui.QWidget):
self.grid.addWidget(transbox)
#Adding Device Details
- self.deviceDetail[self.count] = words[0]
+
#Increment row and widget count
self.row = self.row+1
@@ -105,12 +115,17 @@ class DeviceModel(QtGui.QWidget):
diodebox.setTitle("Add library for Diode "+words[0]+" : "+words[3])
self.entry_var[self.count] = QtGui.QLineEdit()
self.entry_var[self.count].setText("")
+ global path_name
try:
for child in root:
if child.tag[0]==eachline[0] and child.tag[1]==eachline[1]:
print "DEVICE MODEL MATCHING---",child.tag[0],child.tag[1],eachline[0],eachline[1]
try:
- self.entry_var[self.count].setText(child[0].text)
+ if os.path.exists(child[0].text):
+ path_name=child[0].text
+ self.entry_var[self.count].setText(child[0].text)
+ else:
+ self.entry_var[self.count].setText("")
except:
print "ERROR WHEN SET TEXT"
except:
@@ -119,6 +134,11 @@ class DeviceModel(QtGui.QWidget):
self.addbtn = QtGui.QPushButton("Add")
self.addbtn.setObjectName("%d" %self.count)
self.addbtn.clicked.connect(self.trackLibrary)
+ self.deviceDetail[self.count] = words[0]
+ if self.entry_var[self.count].text()=="":
+ pass
+ else:
+ self.trackLibraryWithoutButton(self.count,path_name)
diodegrid.addWidget(self.addbtn,self.row,2)
diodebox.setLayout(diodegrid)
@@ -131,7 +151,7 @@ class DeviceModel(QtGui.QWidget):
self.grid.addWidget(diodebox)
#Adding Device Details
- self.deviceDetail[self.count] = words[0]
+
#Increment row and widget count
self.row = self.row+1
@@ -146,12 +166,17 @@ class DeviceModel(QtGui.QWidget):
jfetbox.setTitle("Add library for JFET "+words[0]+" : "+words[4])
self.entry_var[self.count] = QtGui.QLineEdit()
self.entry_var[self.count].setText("")
+ global path_name
try:
for child in root:
if child.tag[0]==eachline[0] and child.tag[1]==eachline[1]:
print "DEVICE MODEL MATCHING---",child.tag[0],child.tag[1],eachline[0],eachline[1]
try:
- self.entry_var[self.count].setText(child[0].text)
+ if os.path.exists(child[0].text):
+ self.entry_var[self.count].setText(child[0].text)
+ path_name=child[0].text
+ else:
+ self.entry_var[self.count].setText("")
except:
print "ERROR WHEN SET TEXT"
except:
@@ -160,6 +185,11 @@ class DeviceModel(QtGui.QWidget):
self.addbtn = QtGui.QPushButton("Add")
self.addbtn.setObjectName("%d" %self.count)
self.addbtn.clicked.connect(self.trackLibrary)
+ self.deviceDetail[self.count] = words[0]
+ if self.entry_var[self.count].text()=="":
+ pass
+ else:
+ self.trackLibraryWithoutButton(self.count,path_name)
jfetgrid.addWidget(self.addbtn,self.row,2)
jfetbox.setLayout(jfetgrid)
@@ -172,7 +202,7 @@ class DeviceModel(QtGui.QWidget):
self.grid.addWidget(jfetbox)
#Adding Device Details
- self.deviceDetail[self.count] = words[0]
+
#Increment row and widget count
self.row = self.row+1
@@ -234,12 +264,19 @@ class DeviceModel(QtGui.QWidget):
self.devicemodel_dict_end[words[0]]=self.count
self.count = self.count+1
mosfetbox.setLayout(mosfetgrid)
+ global path_name
try:
for child in root:
if child.tag[0]==eachline[0] and child.tag[1]==eachline[1]:
print "DEVICE MODEL MATCHING---",child.tag[0],child.tag[1],eachline[0],eachline[1]
while i<=end:
self.entry_var[i].setText(child[i-beg].text)
+ if (i-beg)==0:
+ if os.path.exists(child[0].text):
+ self.entry_var[i].setText(child[i-beg].text)
+ path_name=child[i-beg].text
+ else:
+ self.entry_var[i].setText("")
i=i+1
except:
pass
@@ -248,7 +285,10 @@ class DeviceModel(QtGui.QWidget):
QGroupBox { border: 1px solid gray; border-radius: 9px; margin-top: 0.5em; } \
QGroupBox::title { subcontrol-origin: margin; left: 10px; padding: 0 3px 0 3px; } \
")
-
+ if self.entry_var[beg].text()=="":
+ pass
+ else:
+ self.trackLibraryWithoutButton(beg,path_name)
self.grid.addWidget(mosfetbox)
@@ -286,6 +326,34 @@ class DeviceModel(QtGui.QWidget):
else:
self.obj_trac.deviceModelTrack[self.deviceName] = self.libfile
-
-
- \ No newline at end of file
+ def trackLibraryWithoutButton(self,iter_value,path_value):
+ """
+ This function is use to keep track of all Device Model widget
+ """
+ print "Calling Track Library funtion"
+ #print "Object Called is ",sending_btn.objectName()
+ self.widgetObjCount = iter_value
+ print "self.widgetObjCount-----",self.widgetObjCount
+ self.libfile = path_value
+ #print "Selected Library File :",self.libfile
+
+ #Setting Library to Text Edit Line
+ self.entry_var[self.widgetObjCount].setText(self.libfile)
+ self.deviceName = self.deviceDetail[self.widgetObjCount]
+
+ #Storing to track it during conversion
+
+
+ if self.deviceName[0] == 'm':
+ width = str(self.entry_var[self.widgetObjCount+1].text())
+ length = str(self.entry_var[self.widgetObjCount+2].text())
+ multifactor = str(self.entry_var[self.widgetObjCount+3].text())
+ if width == "" : width="100u"
+ if length == "": length="100u"
+ if multifactor == "": multifactor="1"
+
+ self.obj_trac.deviceModelTrack[self.deviceName] = self.libfile+":"+"W="+width+" L="+length+" M="+multifactor
+
+ else:
+ self.obj_trac.deviceModelTrack[self.deviceName] = self.libfile
+ \ No newline at end of file
diff --git a/src/kicadtoNgspice/KicadtoNgspice.py b/src/kicadtoNgspice/KicadtoNgspice.py
index cf70eab9..c9b5ac02 100644
--- a/src/kicadtoNgspice/KicadtoNgspice.py
+++ b/src/kicadtoNgspice/KicadtoNgspice.py
@@ -23,6 +23,7 @@ import Analysis
import Source
import Model
import DeviceModel
+import SubcircuitTab
import Convert
import TrackWidget
@@ -107,8 +108,11 @@ class MainWindow(QtGui.QWidget):
obj_devicemodel=DeviceModel.DeviceModel(schematicInfo)
self.deviceModelTab.setWidget(obj_devicemodel)
self.deviceModelTab.setWidgetResizable(True)
-
-
+ global obj_subcircuitTab
+ self.subcircuitTab = QtGui.QScrollArea()
+ obj_subcircuitTab = SubcircuitTab.SubcircuitTab(schematicInfo)
+ self.subcircuitTab.setWidget(obj_subcircuitTab)
+ self.subcircuitTab.setWidgetResizable(True)
self.tabWidget = QtGui.QTabWidget()
#self.tabWidget.TabShape(QtGui.QTabWidget.Rounded)
@@ -116,6 +120,7 @@ class MainWindow(QtGui.QWidget):
self.tabWidget.addTab(self.sourceTab,"Source Details")
self.tabWidget.addTab(self.modelTab,"NgSpice Model")
self.tabWidget.addTab(self.deviceModelTab,"Device Modeling")
+ self.tabWidget.addTab(self.subcircuitTab,"Subcircuits")
self.mainLayout = QtGui.QVBoxLayout()
self.mainLayout.addWidget(self.tabWidget)
#self.mainLayout.addStretch(1)
@@ -343,9 +348,10 @@ class MainWindow(QtGui.QWidget):
if check==1:
for child in attr_parent:
if child.tag=="devicemodel":
+ del child[:]
attr_devicemodel=child
- print "Device model dict",obj_devicemodel.devicemodel_dict_beg
- print "Device model dict end",obj_devicemodel.devicemodel_dict_end
+ #print "Device model dict",obj_devicemodel.devicemodel_dict_beg
+ #print "Device model dict end",obj_devicemodel.devicemodel_dict_end
##########################
for i in obj_devicemodel.devicemodel_dict_beg:
attr_var=ET.SubElement(attr_devicemodel,i)
@@ -369,6 +375,23 @@ class MainWindow(QtGui.QWidget):
###################################################################################################################
+ if check==0:
+ attr_subcircuit=ET.SubElement(attr_parent,"subcircuit")
+ if check==1:
+ for child in attr_parent:
+ if child.tag=="subcircuit":
+ del child[:]
+ attr_subcircuit=child
+ ##########################
+ for i in obj_subcircuitTab.subcircuit_dict_beg:
+ attr_var=ET.SubElement(attr_subcircuit,i)
+ it=obj_subcircuitTab.subcircuit_dict_beg[i]
+ end=obj_subcircuitTab.subcircuit_dict_end[i]
+
+ while it<=end:
+ ET.SubElement(attr_var,"field").text=str(obj_subcircuitTab.entry_var[it].text())
+ it=it+1
+
tree=ET.ElementTree(attr_parent)
tree.write(fw)
@@ -388,7 +411,9 @@ class MainWindow(QtGui.QWidget):
#Adding Device Library to SchematicInfo
schematicInfo = self.obj_convert.addDeviceLibrary(schematicInfo,kicadFile)
-
+ #Adding Subcircuit Library to SchematicInfo
+ schematicInfo = self.obj_convert.addSubcircuit(schematicInfo, kicadFile)
+
analysisoutput = self.obj_convert.analysisInsertor(self.obj_track.AC_entry_var["ITEMS"],
self.obj_track.DC_entry_var["ITEMS"],
self.obj_track.TRAN_entry_var["ITEMS"],
@@ -411,8 +436,12 @@ class MainWindow(QtGui.QWidget):
print "There was error while converting kicad to ngspice"
self.close()
-
-
+ # Generate .sub file from .cir.out file if it is a subcircuit
+ subPath = os.path.splitext(kicadFile)[0]
+
+ if len(sys.argv)>2:
+ if sys.argv[2] == "sub":
+ self.createSubFile(subPath)
def createNetlistFile(self,schematicInfo):
print "Creating Final netlist"
@@ -508,7 +537,63 @@ class MainWindow(QtGui.QWidget):
out.close()
-
+ def createSubFile(self,subPath):
+ self.project = subPath
+ self.projName = os.path.basename(self.project)
+ if os.path.exists(self.project+".cir.out"):
+ try:
+ f = open(self.project+".cir.out")
+ except :
+ print("Error in opening circuit file.")
+ else:
+ print self.projName + ".cir.out does not exist. Please create a spice netlist."
+
+ # Read the data from file
+ data=f.read()
+ # Close the file
+
+ f.close()
+ newNetlist=[]
+ netlist=iter(data.splitlines())
+ for eachline in netlist:
+ eachline=eachline.strip()
+ if len(eachline)<1:
+ continue
+ words=eachline.split()
+ if eachline[2] == 'u':
+ if words[len(words)-1] == "port":
+ subcktInfo = ".subckt "+self.projName+" "
+ for i in range(2,len(words)-1):
+ subcktInfo+=words[i]+" "
+ continue
+ if words[0] == ".end" or words[0] == ".ac" or words[0] == ".dc" or words[0] == ".tran" or words[0] == '.disto' or words[0] == '.noise' or words[0] == '.op' or words[0] == '.pz' or words[0] == '.sens' or words[0] == '.tf':
+ continue
+ elif words[0] == ".control":
+ while words[0] != ".endc":
+ eachline=netlist.next()
+ eachline=eachline.strip()
+ if len(eachline)<1:
+ continue
+ words=eachline.split()
+ else:
+ newNetlist.append(eachline)
+
+ outfile=self.project+".sub"
+ out=open(outfile,"w")
+ out.writelines("* Subcircuit " + self.projName)
+ out.writelines('\n')
+ out.writelines(subcktInfo)
+ out.writelines('\n')
+
+ for i in range(len(newNetlist),0,-1):
+ newNetlist.insert(i,'\n')
+
+ out.writelines(newNetlist)
+ out.writelines('\n')
+
+ out.writelines('.ends ' + self.projName)
+ print "The subcircuit has been written in "+self.projName+".sub"
+
#Main Function
diff --git a/src/kicadtoNgspice/Processing.py b/src/kicadtoNgspice/Processing.py
index 9295a058..fa75320f 100644
--- a/src/kicadtoNgspice/Processing.py
+++ b/src/kicadtoNgspice/Processing.py
@@ -174,116 +174,118 @@ class PrcocessNetlist:
print "Words",words
print "compName",compName
#Looking if model file is present
- xmlfile = compType+".xml" #XML Model File
- count = 0 #Check if model of same name is present
- modelPath = []
- all_dir = [x[0] for x in os.walk(PrcocessNetlist.modelxmlDIR)]
- for each_dir in all_dir:
- all_file = os.listdir(each_dir)
- if xmlfile in all_file:
- count += 1
- modelPath.append(os.path.join(each_dir,xmlfile))
-
- if count > 1:
- multipleModelList.append(modelPath)
- elif count == 0:
- unknownModelList.append(compType)
- elif count == 1:
- try:
- print "Start Parsing :",modelPath
- tree = ET.parse(modelPath[0])
-
- root = tree.getroot()
- #Getting number of nodes for model and title
- for child in tree.iter():
- if child.tag == 'node_number':
- num_of_nodes = int(child.text)
- elif child.tag == 'title':
- title = child.text+" "+compName
- elif child.tag == 'name':
- modelname = child.text
- elif child.tag == 'type':
- #Checking for Analog and Digital
- type = child.text
- elif child.tag == 'split':
- splitDetail = child.text
-
+ if compType != "port":
+ xmlfile = compType+".xml" #XML Model File
+ count = 0 #Check if model of same name is present
+ modelPath = []
+ all_dir = [x[0] for x in os.walk(PrcocessNetlist.modelxmlDIR)]
+ for each_dir in all_dir:
+ all_file = os.listdir(each_dir)
+ if xmlfile in all_file:
+ count += 1
+ modelPath.append(os.path.join(each_dir,xmlfile))
+
+ if count > 1:
+ multipleModelList.append(modelPath)
+ elif count == 0:
+ unknownModelList.append(compType)
+ elif count == 1:
+ try:
+ print "Start Parsing :",modelPath
+ tree = ET.parse(modelPath[0])
- for param in tree.findall('param'):
- for item in param:
- #print "Tags ",item.tag
- #print "Value",item.text
- if 'vector'in item.attrib:
- print "Tag having vector attribute",item.tag,item.attrib['vector']
- temp_count = 1
- temp_list = []
- for i in range(0,int(item.attrib['vector'])):
- temp_list.append(item.text+" "+str(temp_count))
- temp_count += 1
- if 'default' in item.attrib:
- paramDict[item.tag+":"+item.attrib['default']] = temp_list
- else:
- paramDict[item.tag] = item.text
-
- else:
- if 'default' in item.attrib:
- paramDict[item.tag+":"+item.attrib['default']] = item.text
+ root = tree.getroot()
+ #Getting number of nodes for model and title
+ for child in tree.iter():
+ if child.tag == 'node_number':
+ num_of_nodes = int(child.text)
+ elif child.tag == 'title':
+ title = child.text+" "+compName
+ elif child.tag == 'name':
+ modelname = child.text
+ elif child.tag == 'type':
+ #Checking for Analog and Digital
+ type = child.text
+ elif child.tag == 'split':
+ splitDetail = child.text
+
+
+ for param in tree.findall('param'):
+ for item in param:
+ #print "Tags ",item.tag
+ #print "Value",item.text
+ if 'vector'in item.attrib:
+ print "Tag having vector attribute",item.tag,item.attrib['vector']
+ temp_count = 1
+ temp_list = []
+ for i in range(0,int(item.attrib['vector'])):
+ temp_list.append(item.text+" "+str(temp_count))
+ temp_count += 1
+ if 'default' in item.attrib:
+ paramDict[item.tag+":"+item.attrib['default']] = temp_list
+ else:
+ paramDict[item.tag] = item.text
+
else:
- paramDict[item.tag] = item.text
+ if 'default' in item.attrib:
+ paramDict[item.tag+":"+item.attrib['default']] = item.text
+ else:
+ paramDict[item.tag] = item.text
+
-
- print "Number of Nodes : ",num_of_nodes
- print "Title : ",title
- print "Parameters",paramDict
- #Creating line for adding model line in schematic
- if splitDetail == 'None':
- modelLine = "a"+str(k)+" "
- for i in range(1,num_of_nodes+1):
- modelLine += words[i]+" "
- modelLine += compName
-
- else:
- print "Split Details :",splitDetail
- modelLine = "a"+str(k)+" "
- vectorDetail = splitDetail.split(':')
- print "Vector Details",vectorDetail
- pos = 1 #Node position
- for item in vectorDetail:
- try:
- if item.split("-")[1] == 'V':
- print "Vector"
- modelLine += "["
- for i in range(0,int(item.split("-")[0])):
- modelLine += words[pos]+" "
- pos += 1
- modelLine += "] "
- elif item.split("-")[1] == 'NV':
- print "Non Vector"
- for i in range(0,int(item.split("-")[0])):
- modelLine += words[pos]+" "
- pos += 1
+ print "Number of Nodes : ",num_of_nodes
+ print "Title : ",title
+ print "Parameters",paramDict
+ #Creating line for adding model line in schematic
+ if splitDetail == 'None':
+ modelLine = "a"+str(k)+" "
+ for i in range(1,num_of_nodes+1):
+ modelLine += words[i]+" "
+ modelLine += compName
- except:
- print "There is error while processing Vector Details"
- sys.exit(2)
- modelLine += compName
-
- print "Final Model Line :",modelLine
- try:
- schematicInfo.append(modelLine)
- k=k+1
- except Exception as e:
- print "Error while appending ModelLine ",modelLine
- print "Exception Message : ",str(e)
- #Insert comment at remove line
- schematicInfo.insert(index,"* "+compline)
- comment = "* Schematic Name: "+compType+", NgSpice Name: "+modelname
- #Here instead of adding compType(use for XML), added modelName(Unique Model Name)
- modelList.append([index,compline,modelname,compName,comment,title,type,paramDict])
- except:
- print "Unable to parse the model, Please check your your XML file"
- sys.exit(2)
-
+ else:
+ print "Split Details :",splitDetail
+ modelLine = "a"+str(k)+" "
+ vectorDetail = splitDetail.split(':')
+ print "Vector Details",vectorDetail
+ pos = 1 #Node position
+ for item in vectorDetail:
+ try:
+ if item.split("-")[1] == 'V':
+ print "Vector"
+ modelLine += "["
+ for i in range(0,int(item.split("-")[0])):
+ modelLine += words[pos]+" "
+ pos += 1
+ modelLine += "] "
+ elif item.split("-")[1] == 'NV':
+ print "Non Vector"
+ for i in range(0,int(item.split("-")[0])):
+ modelLine += words[pos]+" "
+ pos += 1
+
+ except:
+ print "There is error while processing Vector Details"
+ sys.exit(2)
+ modelLine += compName
+
+ print "Final Model Line :",modelLine
+ try:
+ schematicInfo.append(modelLine)
+ k=k+1
+ except Exception as e:
+ print "Error while appending ModelLine ",modelLine
+ print "Exception Message : ",str(e)
+ #Insert comment at remove line
+ schematicInfo.insert(index,"* "+compline)
+ comment = "* Schematic Name: "+compType+", NgSpice Name: "+modelname
+ #Here instead of adding compType(use for XML), added modelName(Unique Model Name)
+ modelList.append([index,compline,modelname,compName,comment,title,type,paramDict])
+ except:
+ print "Unable to parse the model, Please check your your XML file"
+ sys.exit(2)
+ else:
+ schematicInfo.insert(index,"* "+compline)
#print "Count",count
#print "UnknownModelList",unknownModelList
#print "MultipleModelList",multipleModelList
diff --git a/src/kicadtoNgspice/SubcircuitTab.py b/src/kicadtoNgspice/SubcircuitTab.py
new file mode 100644
index 00000000..bbac5592
--- /dev/null
+++ b/src/kicadtoNgspice/SubcircuitTab.py
@@ -0,0 +1,177 @@
+from PyQt4 import QtGui
+
+import TrackWidget
+from projManagement import Validation
+import os
+import sys
+from xml.etree import ElementTree as ET
+
+
+
+class SubcircuitTab(QtGui.QWidget):
+ """
+ This class creates Subcircuit Tab in KicadtoNgspice Window
+ It dynamically creates the widget for subcircuits.
+ """
+
+ def __init__(self,schematicInfo):
+
+ kicadFile = sys.argv[1]
+ (projpath,filename)=os.path.split(kicadFile)
+ project_name=os.path.basename(projpath)
+ print "PROJECT NAME---------",project_name
+ check=1
+ try:
+ f=open(os.path.join(projpath,project_name+"_Previous_Values.xml"),'r')
+ tree=ET.parse(f)
+ parent_root=tree.getroot()
+ for child in parent_root:
+ if child.tag=="subcircuit":
+ root=child
+ except:
+ check=0
+ print "Empty XML"
+
+ QtGui.QWidget.__init__(self)
+
+ #Creating track widget object
+ self.obj_trac = TrackWidget.TrackWidget()
+
+ #Creating validation object
+ self.obj_validation = Validation.Validation()
+ #Row and column count
+ self.row = 0
+ self.count = 1 #Entry count
+ self.entry_var = {}
+ self.subcircuit_dict_beg={}
+ self.subcircuit_dict_end={}
+ #List to hold information about subcircuit
+ self.subDetail = {}
+
+ #Stores the number of ports in each subcircuit
+ self.numPorts = []
+
+ #Set Layout
+ self.grid = QtGui.QGridLayout()
+ self.setLayout(self.grid)
+
+ for eachline in schematicInfo:
+ words = eachline.split()
+ if eachline[0] == 'x':
+ print "Words",words[0]
+ self.obj_trac.subcircuitList.append(words)
+ self.subcircuit_dict_beg[words[0]]=self.count
+ subbox=QtGui.QGroupBox()
+ subgrid=QtGui.QGridLayout()
+ subbox.setTitle("Add subcircuit for "+words[len(words)-1])
+ self.entry_var[self.count] = QtGui.QLineEdit()
+ self.entry_var[self.count].setText("")
+
+ global path_name
+ try:
+ print "ROOT ----===-=-",root
+ for child in root:
+ if child.tag[0]==eachline[0] and child.tag[1]==eachline[1]:
+ print "Subcircuit MATCHING---",child.tag[0],child.tag[1],eachline[0],eachline[1]
+ try:
+ if os.path.exists(child[0].text):
+ self.entry_var[self.count].setText(child[0].text)
+ path_name=child[0].text
+ else:
+ self.entry_var[self.count].setText("")
+ except:
+ print "ERROR WHEN SET TEXT"
+ except:
+ print "ERROR BEFORE Subcircuit"
+
+
+ subgrid.addWidget(self.entry_var[self.count],self.row,1)
+ self.addbtn = QtGui.QPushButton("Add")
+ self.addbtn.setObjectName("%d" %self.count)
+ #Send the number of ports specified with the given subcircuit for verification.
+ #eg. If the line is 'x1 4 0 3 ua741', there are 3 ports(4, 0 and 3).
+ self.numPorts.append(len(words)-2)
+ print "NUMPORTS",self.numPorts
+ self.addbtn.clicked.connect(self.trackSubcircuit)
+ subgrid.addWidget(self.addbtn,self.row,2)
+ subbox.setLayout(subgrid)
+
+ #CSS
+ subbox.setStyleSheet(" \
+ QGroupBox { border: 1px solid gray; border-radius: 9px; margin-top: 0.5em; } \
+ QGroupBox::title { subcontrol-origin: margin; left: 10px; padding: 0 3px 0 3px; } \
+ ")
+
+ self.grid.addWidget(subbox)
+
+ #Adding Subcircuit Details
+ self.subDetail[self.count] = words[0]
+
+ #Increment row and widget count
+
+ if self.entry_var[self.count].text()=="":
+ pass
+ else:
+ self.trackSubcircuitWithoutButton(self.count,path_name)
+
+ self.subcircuit_dict_end[words[0]]=self.count
+ self.row = self.row+1
+ self.count = self.count+1
+
+ self.show()
+
+
+ def trackSubcircuit(self):
+ """
+ This function is use to keep track of all Subcircuit widget
+ """
+ print "Calling Track Subcircuit function"
+ sending_btn = self.sender()
+ #print "Object Called is ",sending_btn.objectName()
+ self.widgetObjCount = int(sending_btn.objectName())
+
+ self.subfile = str(QtGui.QFileDialog.getExistingDirectory(self,"Open Subcircuit","../SubcircuitLibrary"))
+ self.reply = self.obj_validation.validateSub(self.subfile,self.numPorts[self.widgetObjCount - 1])
+ if self.reply == "True":
+ #Setting Library to Text Edit Line
+ self.entry_var[self.widgetObjCount].setText(self.subfile)
+ self.subName = self.subDetail[self.widgetObjCount]
+
+ #Storing to track it during conversion
+
+ self.obj_trac.subcircuitTrack[self.subName] = self.subfile
+ elif self.reply == "PORT":
+ self.msg = QtGui.QErrorMessage(self)
+ self.msg.showMessage("Please select a Subcircuit with correct number of ports.")
+ self.msg.setWindowTitle("Error Message")
+ self.msg.show()
+ elif self.reply == "DIREC":
+ self.msg = QtGui.QErrorMessage(self)
+ self.msg.showMessage("Please select a valid Subcircuit directory (Containing '.sub' file).")
+ self.msg.setWindowTitle("Error Message")
+ self.msg.show()
+
+ def trackSubcircuitWithoutButton(self,iter_value,path_value):
+
+ self.widgetObjCount = iter_value
+
+ self.subfile = path_value
+ self.reply = self.obj_validation.validateSub(self.subfile,self.numPorts[self.widgetObjCount - 1])
+ if self.reply == "True":
+ #Setting Library to Text Edit Line
+ self.entry_var[self.widgetObjCount].setText(self.subfile)
+ self.subName = self.subDetail[self.widgetObjCount]
+
+ #Storing to track it during conversion
+
+ self.obj_trac.subcircuitTrack[self.subName] = self.subfile
+ elif self.reply == "PORT":
+ self.msg = QtGui.QErrorMessage(self)
+ self.msg.showMessage("Please select a Subcircuit with correct number of ports.")
+ self.msg.setWindowTitle("Error Message")
+ self.msg.show()
+ elif self.reply == "DIREC":
+ self.msg = QtGui.QErrorMessage(self)
+ self.msg.showMessage("Please select a valid Subcircuit directory (Containing '.sub' file).")
+ self.msg.setWindowTitle("Error Message")
+ self.msg.show() \ No newline at end of file
diff --git a/src/kicadtoNgspice/TrackWidget.py b/src/kicadtoNgspice/TrackWidget.py
index 23991a37..e97b317d 100644
--- a/src/kicadtoNgspice/TrackWidget.py
+++ b/src/kicadtoNgspice/TrackWidget.py
@@ -21,4 +21,9 @@ class TrackWidget:
model_entry_var = {}
#Track Widget for Device Model detail
- deviceModelTrack = {} \ No newline at end of file
+ deviceModelTrack = {}
+
+ #Track Widget for Subcircuits where directory has been selected
+ subcircuitTrack = {}
+ #Track subcircuits which are specified in .cir file
+ subcircuitList = [] \ No newline at end of file