diff options
author | Fahim | 2015-06-24 11:26:33 +0530 |
---|---|---|
committer | Fahim | 2015-06-24 11:26:33 +0530 |
commit | f7cf0e9a67627ed6ce73892a75445ba84e6b9b21 (patch) | |
tree | 3d4eb335a02347d289dad226d5b2ca202da9edad /src/kicadtoNgspice | |
parent | f47a744451fe634efb487023f073321ceed4664c (diff) | |
parent | 6af9f606a72d3c4399873840de3c683d423df5a6 (diff) | |
download | eSim-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.py | 66 | ||||
-rw-r--r-- | src/kicadtoNgspice/DeviceModel.py | 88 | ||||
-rw-r--r-- | src/kicadtoNgspice/KicadtoNgspice.py | 101 | ||||
-rw-r--r-- | src/kicadtoNgspice/Processing.py | 214 | ||||
-rw-r--r-- | src/kicadtoNgspice/SubcircuitTab.py | 177 | ||||
-rw-r--r-- | src/kicadtoNgspice/TrackWidget.py | 7 |
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 |