summaryrefslogtreecommitdiff
path: root/src/kicadtoNgspice
diff options
context:
space:
mode:
Diffstat (limited to 'src/kicadtoNgspice')
-rw-r--r--src/kicadtoNgspice/Analysis.py364
-rw-r--r--src/kicadtoNgspice/Convert.py616
-rw-r--r--src/kicadtoNgspice/DeviceModel.py295
-rw-r--r--src/kicadtoNgspice/KicadtoNgspice.py562
-rw-r--r--src/kicadtoNgspice/Model.py120
-rw-r--r--src/kicadtoNgspice/Processing.py487
-rw-r--r--src/kicadtoNgspice/Source.py201
-rw-r--r--src/kicadtoNgspice/SubcircuitTab.py137
-rw-r--r--src/kicadtoNgspice/TrackWidget.py40
9 files changed, 1581 insertions, 1241 deletions
diff --git a/src/kicadtoNgspice/Analysis.py b/src/kicadtoNgspice/Analysis.py
index 6aa167d6..fde9a3e3 100644
--- a/src/kicadtoNgspice/Analysis.py
+++ b/src/kicadtoNgspice/Analysis.py
@@ -5,11 +5,13 @@ import os
#from xml.etree import ElementTree as ET
import json
+
class Analysis(QtGui.QWidget):
"""
This class create Analysis Tab in KicadtoNgspice Window.
"""
- def __init__(self,clarg1):
+
+ def __init__(self, clarg1):
self.clarg1 = clarg1
QtGui.QWidget.__init__(self)
self.track_obj = TrackWidget.TrackWidget()
@@ -22,24 +24,24 @@ class Analysis(QtGui.QWidget):
self.dc_parameter = {}
self.tran_parameter = {}
self.createAnalysisWidget()
-
+
def createAnalysisWidget(self):
self.grid = QtGui.QGridLayout()
self.grid.addWidget(self.createCheckBox(), 0, 0)
self.grid.addWidget(self.createACgroup(), 1, 0)
self.grid.addWidget(self.createDCgroup(), 2, 0)
self.grid.addWidget(self.createTRANgroup(), 3, 0)
-
+
try:
kicadFile = self.clarg1
- (projpath,filename) = os.path.split(kicadFile)
+ (projpath, filename) = os.path.split(kicadFile)
if os.path.isfile(os.path.join(projpath, 'analysis')):
print("Analysis file is present")
-
- analysisfile = open(os.path.join(projpath,'analysis'))
+
+ analysisfile = open(os.path.join(projpath, 'analysis'))
content = analysisfile.readline()
print("Content of Analysis file :", content)
- contentlist= content.split()
+ contentlist = content.split()
if contentlist[0] == '.ac':
self.checkAC.setChecked(True)
@@ -56,21 +58,21 @@ class Analysis(QtGui.QWidget):
elif contentlist[1] == 'oct':
self.Oct.setChecked(True)
self.track_obj.AC_type["ITEMS"] = "oct"
-
+
elif contentlist[0] == '.dc':
self.checkDC.setChecked(True)
self.dcbox.setDisabled(False)
self.acbox.setDisabled(True)
self.trbox.setDisabled(True)
- self.track_obj.set_CheckBox["ITEMS"] ="DC"
-
+ self.track_obj.set_CheckBox["ITEMS"] = "DC"
+
elif contentlist[0] == '.tran':
self.checkTRAN.setChecked(True)
self.trbox.setDisabled(False)
self.acbox.setDisabled(True)
self.dcbox.setDisabled(True)
self.track_obj.set_CheckBox["ITEMS"] = "TRAN"
-
+
elif contentlist[0] == '.op':
self.checkDC.setChecked(True)
self.dcbox.setDisabled(False)
@@ -79,18 +81,18 @@ class Analysis(QtGui.QWidget):
self.check.setChecked(True)
self.track_obj.set_CheckBox["ITEMS"] = "DC"
- except:
+ except BaseException:
self.checkTRAN.setChecked(True)
- self.track_obj.set_CheckBox["ITEMS"]="TRAN"
-
+ self.track_obj.set_CheckBox["ITEMS"] = "TRAN"
+
self.setLayout(self.grid)
self.show()
-
+
def createCheckBox(self):
self.checkbox = QtGui.QGroupBox()
self.checkbox.setTitle("Select Analysis Type")
self.checkgrid = QtGui.QGridLayout()
-
+
self.checkgroupbtn = QtGui.QButtonGroup()
self.checkAC = QtGui.QCheckBox("AC")
self.checkDC = QtGui.QCheckBox("DC")
@@ -101,52 +103,57 @@ class Analysis(QtGui.QWidget):
self.checkgroupbtn.addButton(self.checkTRAN)
self.checkgroupbtn.setExclusive(True)
self.checkgroupbtn.buttonClicked.connect(self.enableBox)
-
+
self.checkgrid.addWidget(self.checkAC, 0, 0)
self.checkgrid.addWidget(self.checkDC, 0, 1)
self.checkgrid.addWidget(self.checkTRAN, 0, 2)
self.checkbox.setLayout(self.checkgrid)
-
+
return self.checkbox
-
+
def enableBox(self):
if self.checkAC.isChecked():
self.acbox.setDisabled(False)
self.dcbox.setDisabled(True)
self.trbox.setDisabled(True)
self.track_obj.set_CheckBox["ITEMS"] = "AC"
-
+
elif self.checkDC.isChecked():
self.dcbox.setDisabled(False)
self.acbox.setDisabled(True)
self.trbox.setDisabled(True)
self.track_obj.set_CheckBox["ITEMS"] = "DC"
-
+
elif self.checkTRAN.isChecked():
self.trbox.setDisabled(False)
self.acbox.setDisabled(True)
self.dcbox.setDisabled(True)
self.track_obj.set_CheckBox["ITEMS"] = "TRAN"
-
+
def createACgroup(self):
kicadFile = self.clarg1
- (projpath,filename) = os.path.split(kicadFile)
+ (projpath, filename) = os.path.split(kicadFile)
project_name = os.path.basename(projpath)
check = 1
try:
- f = open(os.path.join(projpath,project_name+"_Previous_Values.json"),'r')
+ f = open(
+ os.path.join(
+ projpath,
+ project_name +
+ "_Previous_Values.json"),
+ 'r')
data = f.read()
json_data = json.loads(data)
- except:
+ except BaseException:
check = 0
print("AC Previous Values JSON is Empty")
-
+
self.acbox = QtGui.QGroupBox()
self.acbox.setTitle("AC Analysis")
self.acbox.setDisabled(True)
self.acgrid = QtGui.QGridLayout()
- self.radiobuttongroup= QtGui.QButtonGroup()
+ self.radiobuttongroup = QtGui.QButtonGroup()
self.Lin = QtGui.QRadioButton("Lin")
self.Dec = QtGui.QRadioButton("Dec")
self.Oct = QtGui.QRadioButton("Oct")
@@ -155,13 +162,13 @@ class Analysis(QtGui.QWidget):
self.radiobuttongroup.addButton(self.Oct)
self.radiobuttongroup.setExclusive(True)
self.Lin.setChecked(True)
- self.track_obj.AC_type["ITEMS"]="lin"
+ self.track_obj.AC_type["ITEMS"] = "lin"
self.radiobuttongroup.buttonClicked.connect(self.set_ac_type)
self.acgrid.addWidget(self.Lin, 1, 1)
self.acgrid.addWidget(self.Dec, 1, 2)
self.acgrid.addWidget(self.Oct, 1, 3)
self.acbox.setLayout(self.acgrid)
-
+
self.scale = QtGui.QLabel("Scale")
self.start_fre_lable = QtGui.QLabel("Start Frequency")
self.stop_fre_lable = QtGui.QLabel("Stop Frequency")
@@ -170,20 +177,20 @@ class Analysis(QtGui.QWidget):
self.acgrid.addWidget(self.start_fre_lable, 2, 0)
self.acgrid.addWidget(self.stop_fre_lable, 3, 0)
self.acgrid.addWidget(self.no_of_points, 4, 0)
-
+
self.count = 0
- self.ac_entry_var[self.count] = QtGui.QLineEdit()#start
+ self.ac_entry_var[self.count] = QtGui.QLineEdit() # start
self.acgrid.addWidget(self.ac_entry_var[self.count], 2, 1)
self.ac_entry_var[self.count].setMaximumWidth(150)
- self.count = self.count+1
- self.ac_entry_var[self.count] = QtGui.QLineEdit()#stop
+ self.count = self.count + 1
+ self.ac_entry_var[self.count] = QtGui.QLineEdit() # stop
self.acgrid.addWidget(self.ac_entry_var[self.count], 3, 1)
self.ac_entry_var[self.count].setMaximumWidth(150)
- self.count = self.count+1
- self.ac_entry_var[self.count] = QtGui.QLineEdit()#no of pts
+ self.count = self.count + 1
+ self.ac_entry_var[self.count] = QtGui.QLineEdit() # no of pts
self.acgrid.addWidget(self.ac_entry_var[self.count], 4, 1)
self.ac_entry_var[self.count].setMaximumWidth(150)
-
+
self.parameter_cnt = 0
self.start_fre_combo = QtGui.QComboBox()
self.start_fre_combo.addItem("Hz",)
@@ -196,12 +203,13 @@ class Analysis(QtGui.QWidget):
self.ac_parameter[0] = "Hz"
try:
- self.ac_parameter[self.parameter_cnt] = str(json_data["analysis"]["ac"]["Start Fre Combo"])
- except:
+ self.ac_parameter[self.parameter_cnt] = str(
+ json_data["analysis"]["ac"]["Start Fre Combo"])
+ except BaseException:
self.ac_parameter[self.parameter_cnt] = "Hz"
self.start_fre_combo.activated[str].connect(self.start_combovalue)
-
+
self.parameter_cnt = self.parameter_cnt + 1
self.stop_fre_combo = QtGui.QComboBox()
self.stop_fre_combo.addItem("Hz")
@@ -214,16 +222,17 @@ class Analysis(QtGui.QWidget):
self.ac_parameter[1] = "Hz"
try:
- self.ac_parameter[self.parameter_cnt] = str(json_data["analysis"]["ac"]["Stop Fre Combo"])
- except:
+ self.ac_parameter[self.parameter_cnt] = str(
+ json_data["analysis"]["ac"]["Stop Fre Combo"])
+ except BaseException:
self.ac_parameter[self.parameter_cnt] = "Hz"
self.stop_fre_combo.activated[str].connect(self.stop_combovalue)
-
+
self.track_obj.AC_entry_var["ITEMS"] = self.ac_entry_var
self.track_obj.AC_Parameter["ITEMS"] = self.ac_parameter
-
- #CSS
+
+ # CSS
self.acbox.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; } \
@@ -245,48 +254,58 @@ class Analysis(QtGui.QWidget):
else:
pass
- self.ac_entry_var[0].setText(json_data["analysis"]["ac"]["Start Frequency"])
- self.ac_entry_var[1].setText(json_data["analysis"]["ac"]["Stop Frequency"])
- self.ac_entry_var[2].setText(json_data["analysis"]["ac"]["No. of points"])
- index = self.start_fre_combo.findText(json_data["analysis"]["ac"]["Start Fre Combo"])
+ self.ac_entry_var[0].setText(
+ json_data["analysis"]["ac"]["Start Frequency"])
+ self.ac_entry_var[1].setText(
+ json_data["analysis"]["ac"]["Stop Frequency"])
+ self.ac_entry_var[2].setText(
+ json_data["analysis"]["ac"]["No. of points"])
+ index = self.start_fre_combo.findText(
+ json_data["analysis"]["ac"]["Start Fre Combo"])
self.start_fre_combo.setCurrentIndex(index)
- index = self.stop_fre_combo.findText(json_data["analysis"]["ac"]["Stop Fre Combo"])
+ index = self.stop_fre_combo.findText(
+ json_data["analysis"]["ac"]["Stop Fre Combo"])
self.stop_fre_combo.setCurrentIndex(index)
- except:
+ except BaseException:
print("AC Analysis JSON Parse Error")
-
+
return self.acbox
-
+
def start_combovalue(self, text):
self.ac_parameter[0] = str(text)
-
+
def stop_combovalue(self, text):
self.ac_parameter[1] = str(text)
-
+
def set_ac_type(self):
self.parameter_cnt = 0
if self.Lin.isChecked():
self.track_obj.AC_type["ITEMS"] = "lin"
elif self.Dec.isChecked():
- self.track_obj.AC_type["ITEMS"] = "dec"
+ self.track_obj.AC_type["ITEMS"] = "dec"
elif self.Oct.isChecked():
self.track_obj.AC_type["ITEMS"] = "oct"
else:
- pass
-
+ pass
+
def createDCgroup(self):
kicadFile = self.clarg1
- (projpath,filename) = os.path.split(kicadFile)
+ (projpath, filename) = os.path.split(kicadFile)
project_name = os.path.basename(projpath)
check = 1
try:
- f = open(os.path.join(projpath,project_name+"_Previous_Values.json"),'r')
+ f = open(
+ os.path.join(
+ projpath,
+ project_name +
+ "_Previous_Values.json"),
+ 'r')
data = f.read()
json_data = json.loads(data)
- except:
+ except BaseException:
check = 0
print("DC Previous Values JSON is empty")
@@ -295,16 +314,16 @@ class Analysis(QtGui.QWidget):
self.dcbox.setDisabled(True)
self.dcgrid = QtGui.QGridLayout()
self.dcbox.setLayout(self.dcgrid)
-
+
self.source_name = QtGui.QLabel('Enter Source 1', self)
self.source_name.setMaximumWidth(150)
self.start = QtGui.QLabel('Start', self)
self.start.setMaximumWidth(150)
self.increment = QtGui.QLabel('Increment', self)
self.increment.setMaximumWidth(150)
- self.stop = QtGui.QLabel('Stop',self)
+ self.stop = QtGui.QLabel('Stop', self)
self.stop.setMaximumWidth(150)
-
+
self.source_name2 = QtGui.QLabel('Enter Source 2', self)
self.source_name2.setMaximumWidth(150)
self.start2 = QtGui.QLabel('Start', self)
@@ -313,55 +332,55 @@ class Analysis(QtGui.QWidget):
self.increment2.setMaximumWidth(150)
self.stop2 = QtGui.QLabel('Stop', self)
self.stop2.setMaximumWidth(150)
-
- self.dcgrid.addWidget(self.source_name, 1, 0)
+
+ self.dcgrid.addWidget(self.source_name, 1, 0)
self.dcgrid.addWidget(self.start, 2, 0)
self.dcgrid.addWidget(self.increment, 3, 0)
- self.dcgrid.addWidget(self.stop, 4, 0)
+ self.dcgrid.addWidget(self.stop, 4, 0)
- self.dcgrid.addWidget(self.source_name2, 5, 0)
+ self.dcgrid.addWidget(self.source_name2, 5, 0)
self.dcgrid.addWidget(self.start2, 6, 0)
self.dcgrid.addWidget(self.increment2, 7, 0)
self.dcgrid.addWidget(self.stop2, 8, 0)
-
+
self.count = 0
- self.dc_entry_var[self.count] = QtGui.QLineEdit()#source
+ self.dc_entry_var[self.count] = QtGui.QLineEdit() # source
self.dcgrid.addWidget(self.dc_entry_var[self.count], 1, 1)
self.dc_entry_var[self.count].setMaximumWidth(150)
self.count += 1
- self.dc_entry_var[self.count] = QtGui.QLineEdit()#start
+ self.dc_entry_var[self.count] = QtGui.QLineEdit() # start
self.dcgrid.addWidget(self.dc_entry_var[self.count], 2, 1)
self.dc_entry_var[self.count].setMaximumWidth(150)
self.count += 1
- self.dc_entry_var[self.count] = QtGui.QLineEdit()#increment
+ self.dc_entry_var[self.count] = QtGui.QLineEdit() # increment
self.dcgrid.addWidget(self.dc_entry_var[self.count], 3, 1)
self.dc_entry_var[self.count].setMaximumWidth(150)
self.count += 1
- self.dc_entry_var[self.count] = QtGui.QLineEdit()#stop
+ self.dc_entry_var[self.count] = QtGui.QLineEdit() # stop
self.dcgrid.addWidget(self.dc_entry_var[self.count], 4, 1)
self.dc_entry_var[self.count].setMaximumWidth(150)
self.count += 1
- self.dc_entry_var[self.count] = QtGui.QLineEdit()#source
+ self.dc_entry_var[self.count] = QtGui.QLineEdit() # source
self.dcgrid.addWidget(self.dc_entry_var[self.count], 5, 1)
self.dc_entry_var[self.count].setMaximumWidth(150)
self.count += 1
- self.dc_entry_var[self.count] = QtGui.QLineEdit()#start
+ self.dc_entry_var[self.count] = QtGui.QLineEdit() # start
self.dcgrid.addWidget(self.dc_entry_var[self.count], 6, 1)
self.dc_entry_var[self.count].setMaximumWidth(150)
self.count += 1
- self.dc_entry_var[self.count] = QtGui.QLineEdit()#increment
+ self.dc_entry_var[self.count] = QtGui.QLineEdit() # increment
self.dcgrid.addWidget(self.dc_entry_var[self.count], 7, 1)
self.dc_entry_var[self.count].setMaximumWidth(150)
self.count += 1
- self.dc_entry_var[self.count] = QtGui.QLineEdit()#stop
+ self.dc_entry_var[self.count] = QtGui.QLineEdit() # stop
self.dcgrid.addWidget(self.dc_entry_var[self.count], 8, 1)
self.dc_entry_var[self.count].setMaximumWidth(150)
@@ -376,14 +395,15 @@ class Analysis(QtGui.QWidget):
self.dcgrid.addWidget(self.start_combo, 2, 2)
try:
- self.dc_parameter[self.parameter_cnt] = str(json_data["analysis"]["dc"]["Start Combo"])
- except:
+ self.dc_parameter[self.parameter_cnt] = str(
+ json_data["analysis"]["dc"]["Start Combo"])
+ except BaseException:
self.dc_parameter[self.parameter_cnt] = "Volts or Amperes"
self.start_combo.activated[str].connect(self.start_changecombo)
self.parameter_cnt += 1
-
- self.increment_combo=QtGui.QComboBox(self)
+
+ self.increment_combo = QtGui.QComboBox(self)
self.increment_combo.setMaximumWidth(150)
self.increment_combo.addItem("Volts or Amperes")
self.increment_combo.addItem("mV or mA")
@@ -393,30 +413,32 @@ class Analysis(QtGui.QWidget):
self.dcgrid.addWidget(self.increment_combo, 3, 2)
try:
- self.dc_parameter[self.parameter_cnt] = str(json_data["analysis"]["dc"]["Increment Combo"])
- except:
+ self.dc_parameter[self.parameter_cnt] = str(
+ json_data["analysis"]["dc"]["Increment Combo"])
+ except BaseException:
self.dc_parameter[self.parameter_cnt] = "Volts or Amperes"
self.increment_combo.activated[str].connect(self.increment_changecombo)
self.parameter_cnt += 1
-
+
self.stop_combo = QtGui.QComboBox(self)
self.stop_combo.setMaximumWidth(150)
self.stop_combo.addItem("Volts or Amperes")
self.stop_combo.addItem("mV or mA")
self.stop_combo.addItem("uV or uA")
self.stop_combo.addItem("nV or nA")
- self.stop_combo.addItem("pV or pA")
+ self.stop_combo.addItem("pV or pA")
self.dcgrid.addWidget(self.stop_combo, 4, 2)
try:
- self.dc_parameter[self.parameter_cnt] = str(json_data["analysis"]["dc"]["Stop Combo"])
- except:
+ self.dc_parameter[self.parameter_cnt] = str(
+ json_data["analysis"]["dc"]["Stop Combo"])
+ except BaseException:
self.dc_parameter[self.parameter_cnt] = "Volts or Amperes"
self.stop_combo.activated[str].connect(self.stop_changecombo)
self.parameter_cnt += 1
-
+
self.start_combo2 = QtGui.QComboBox(self)
self.start_combo2.setMaximumWidth(150)
self.start_combo2.addItem('Volts or Amperes')
@@ -427,8 +449,9 @@ class Analysis(QtGui.QWidget):
self.dcgrid.addWidget(self.start_combo2, 6, 2)
try:
- self.dc_parameter[self.parameter_cnt] = str(json_data["analysis"]["dc"]["Start Combo2"])
- except:
+ self.dc_parameter[self.parameter_cnt] = str(
+ json_data["analysis"]["dc"]["Start Combo2"])
+ except BaseException:
self.dc_parameter[self.parameter_cnt] = "Volts or Amperes"
self.start_combo2.activated[str].connect(self.start_changecombo2)
@@ -444,11 +467,13 @@ class Analysis(QtGui.QWidget):
self.dcgrid.addWidget(self.increment_combo2, 7, 2)
try:
- self.dc_parameter[self.parameter_cnt] = str(json_data["analysis"]["dc"]["Increment Combo2"])
- except:
+ self.dc_parameter[self.parameter_cnt] = str(
+ json_data["analysis"]["dc"]["Increment Combo2"])
+ except BaseException:
self.dc_parameter[self.parameter_cnt] = "Volts or Amperes"
- self.increment_combo2.activated[str].connect(self.increment_changecombo2)
+ self.increment_combo2.activated[str].connect(
+ self.increment_changecombo2)
self.parameter_cnt += 1
self.stop_combo2 = QtGui.QComboBox(self)
@@ -461,73 +486,89 @@ class Analysis(QtGui.QWidget):
self.dcgrid.addWidget(self.stop_combo2, 8, 2)
try:
- self.dc_parameter[self.parameter_cnt] = str(json_data["analysis"]["dc"]["Stop Combo2"])
- except:
+ self.dc_parameter[self.parameter_cnt] = str(
+ json_data["analysis"]["dc"]["Stop Combo2"])
+ except BaseException:
self.dc_parameter[self.parameter_cnt] = "Volts or Amperes"
self.stop_combo2.activated[str].connect(self.stop_changecombo2)
self.parameter_cnt += 1
- self.check = QtGui.QCheckBox('Operating Point Analysis',self)
+ self.check = QtGui.QCheckBox('Operating Point Analysis', self)
try:
- self.track_obj.op_check.append(str(json_data["analysis"]["dc"]["Operating Point"]))
- except:
+ self.track_obj.op_check.append(
+ str(json_data["analysis"]["dc"]["Operating Point"]))
+ except BaseException:
self.track_obj.op_check.append('0')
-
- #QtCore.QObject.connect(check,SIGNAL("stateChanged()"),check,SLOT("checkedSlot"))
+
+ # QtCore.QObject.connect(check,SIGNAL("stateChanged()"),check,SLOT("checkedSlot"))
self.check.stateChanged.connect(self.setflag)
#self.flagcheck = 1
#self.flagcheck= 2
self.dcgrid.addWidget(self.check, 9, 1, 9, 2)
self.track_obj.DC_entry_var["ITEMS"] = self.dc_entry_var
self.track_obj.DC_Parameter["ITEMS"] = self.dc_parameter
-
- #CSS
+
+ # CSS
self.dcbox.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; } \
")
if check:
try:
- self.dc_entry_var[0].setText(json_data["analysis"]["dc"]["Source 1"])
- self.dc_entry_var[1].setText(json_data["analysis"]["dc"]["Start"])
- self.dc_entry_var[2].setText(json_data["analysis"]["dc"]["Increment"])
- self.dc_entry_var[3].setText(json_data["analysis"]["dc"]["Stop"])
- index = self.start_combo.findText(json_data["analysis"]["dc"]["Start Combo"])
+ self.dc_entry_var[0].setText(
+ json_data["analysis"]["dc"]["Source 1"])
+ self.dc_entry_var[1].setText(
+ json_data["analysis"]["dc"]["Start"])
+ self.dc_entry_var[2].setText(
+ json_data["analysis"]["dc"]["Increment"])
+ self.dc_entry_var[3].setText(
+ json_data["analysis"]["dc"]["Stop"])
+ index = self.start_combo.findText(
+ json_data["analysis"]["dc"]["Start Combo"])
self.start_combo.setCurrentIndex(index)
- index = self.increment_combo.findText(json_data["analysis"]["dc"]["Increment Combo"])
+ index = self.increment_combo.findText(
+ json_data["analysis"]["dc"]["Increment Combo"])
self.increment_combo.setCurrentIndex(index)
- index = self.stop_combo.findText(json_data["analysis"]["dc"]["Stop Combo"])
+ index = self.stop_combo.findText(
+ json_data["analysis"]["dc"]["Stop Combo"])
self.stop_combo.setCurrentIndex(index)
- self.dc_entry_var[4].setText(json_data["analysis"]["dc"]["Source 2"])
- self.dc_entry_var[5].setText(json_data["analysis"]["dc"]["Start2"])
- self.dc_entry_var[6].setText(json_data["analysis"]["dc"]["Increment2"])
- self.dc_entry_var[7].setText(json_data["analysis"]["dc"]["Stop2"])
- index = self.start_combo2.findText(json_data["analysis"]["dc"]["Start Combo2"])
+ self.dc_entry_var[4].setText(
+ json_data["analysis"]["dc"]["Source 2"])
+ self.dc_entry_var[5].setText(
+ json_data["analysis"]["dc"]["Start2"])
+ self.dc_entry_var[6].setText(
+ json_data["analysis"]["dc"]["Increment2"])
+ self.dc_entry_var[7].setText(
+ json_data["analysis"]["dc"]["Stop2"])
+ index = self.start_combo2.findText(
+ json_data["analysis"]["dc"]["Start Combo2"])
self.start_combo2.setCurrentIndex(index)
- index = self.increment_combo2.findText(json_data["analysis"]["dc"]["Increment Combo2"])
+ index = self.increment_combo2.findText(
+ json_data["analysis"]["dc"]["Increment Combo2"])
self.increment_combo2.setCurrentIndex(index)
- index = self.stop_combo2.findText(json_data["analysis"]["dc"]["Stop Combo2"])
+ index = self.stop_combo2.findText(
+ json_data["analysis"]["dc"]["Stop Combo2"])
self.stop_combo2.setCurrentIndex(index)
if json_data["analysis"]["dc"]["Operating Point"] == 1:
self.check.setChecked(True)
else:
self.check.setChecked(False)
- except:
+ except BaseException:
print("DC Analysis JSON Parse Error")
-
+
return self.dcbox
-
+
def start_changecombo(self, text):
self.dc_parameter[0] = str(text)
-
+
def increment_changecombo(self, text):
self.dc_parameter[1] = str(text)
-
+
def stop_changecombo(self, text):
self.dc_parameter[2] = str(text)
-
+
def start_changecombo2(self, text):
self.dc_parameter[3] = str(text)
@@ -535,34 +576,39 @@ class Analysis(QtGui.QWidget):
self.dc_parameter[4] = str(text)
def stop_changecombo2(self, text):
- self.dc_parameter[5] = str(text)
+ self.dc_parameter[5] = str(text)
def setflag(self):
if self.check.isChecked():
self.track_obj.op_check.append(1)
else:
- self.track_obj.op_check.append(0)
-
+ self.track_obj.op_check.append(0)
+
def createTRANgroup(self):
kicadFile = self.clarg1
- (projpath,filename) = os.path.split(kicadFile)
+ (projpath, filename) = os.path.split(kicadFile)
project_name = os.path .basename(projpath)
check = 1
try:
- f = open(os.path.join(projpath,project_name+"_Previous_Values.json"),'r')
+ f = open(
+ os.path.join(
+ projpath,
+ project_name +
+ "_Previous_Values.json"),
+ 'r')
data = f.read()
json_data = json.loads(data)
- except:
+ except BaseException:
check = 0
print("Transient Previous Values JSON is Empty")
-
+
self.trbox = QtGui.QGroupBox()
self.trbox.setTitle("Transient Analysis")
- #self.trbox.setDisabled(True)
- self.trgrid = QtGui.QGridLayout()
+ # self.trbox.setDisabled(True)
+ self.trgrid = QtGui.QGridLayout()
self.trbox.setLayout(self.trgrid)
-
+
self.start = QtGui.QLabel("Start Time")
self.step = QtGui.QLabel("Step Time")
self.stop = QtGui.QLabel("Stop Time")
@@ -570,7 +616,7 @@ class Analysis(QtGui.QWidget):
self.trgrid.addWidget(self.step, 2, 0)
self.trgrid.addWidget(self.stop, 3, 0)
self.count = 0
-
+
self.tran_entry_var[self.count] = QtGui.QLineEdit()
self.trgrid.addWidget(self.tran_entry_var[self.count], 1, 1)
self.tran_entry_var[self.count].setMaximumWidth(150)
@@ -585,7 +631,7 @@ class Analysis(QtGui.QWidget):
self.trgrid.addWidget(self.tran_entry_var[self.count], 3, 1)
self.tran_entry_var[self.count].setMaximumWidth(150)
self.count += 1
-
+
self.parameter_cnt = 0
self.start_combobox = QtGui.QComboBox()
self.start_combobox.addItem("Sec")
@@ -596,13 +642,14 @@ class Analysis(QtGui.QWidget):
self.trgrid.addWidget(self.start_combobox, 1, 3)
try:
- self.tran_parameter[self.parameter_cnt] = str(json_data["analysis"]["tran"]["Start Combo"])
- except:
+ self.tran_parameter[self.parameter_cnt] = str(
+ json_data["analysis"]["tran"]["Start Combo"])
+ except BaseException:
self.tran_parameter[self.parameter_cnt] = "Sec"
self.start_combobox.activated[str].connect(self.start_combo_change)
self.parameter_cnt += 1
-
+
self.step_combobox = QtGui.QComboBox()
self.step_combobox.addItem("Sec")
self.step_combobox.addItem("ms")
@@ -611,13 +658,14 @@ class Analysis(QtGui.QWidget):
self.step_combobox.addItem("ps")
self.trgrid.addWidget(self.step_combobox, 2, 3)
try:
- self.tran_parameter[self.parameter_cnt] = str(json_data["analysis"]["tran"]["Step Combo"])
- except:
+ self.tran_parameter[self.parameter_cnt] = str(
+ json_data["analysis"]["tran"]["Step Combo"])
+ except BaseException:
self.tran_parameter[self.parameter_cnt] = "Sec"
self.step_combobox.activated[str].connect(self.step_combo_change)
self.parameter_cnt += 1
-
+
self.stop_combobox = QtGui.QComboBox()
self.stop_combobox.addItem("Sec")
self.stop_combobox.addItem("ms")
@@ -626,43 +674,49 @@ class Analysis(QtGui.QWidget):
self.stop_combobox.addItem("ps")
self.trgrid.addWidget(self.stop_combobox, 3, 3)
try:
- self.tran_parameter[self.parameter_cnt] = str(json_data["analysis"]["tran"]["Stop Combo"])
- except:
+ self.tran_parameter[self.parameter_cnt] = str(
+ json_data["analysis"]["tran"]["Stop Combo"])
+ except BaseException:
self.tran_parameter[self.parameter_cnt] = "Sec"
self.stop_combobox.activated[str].connect(self.stop_combo_change)
self.parameter_cnt += 1
-
+
self.track_obj.TRAN_entry_var["ITEMS"] = self.tran_entry_var
self.track_obj.TRAN_Parameter["ITEMS"] = self.tran_parameter
-
- #CSS
+
+ # CSS
self.trbox.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; } \
")
if check:
try:
- self.tran_entry_var[0].setText(json_data["analysis"]["tran"]["Start Time"])
- self.tran_entry_var[1].setText(json_data["analysis"]["tran"]["Step Time"])
- self.tran_entry_var[2].setText(json_data["analysis"]["tran"]["Stop Time"])
- index = self.start_combobox.findText(json_data["analysis"]["tran"]["Start Combo"])
+ self.tran_entry_var[0].setText(
+ json_data["analysis"]["tran"]["Start Time"])
+ self.tran_entry_var[1].setText(
+ json_data["analysis"]["tran"]["Step Time"])
+ self.tran_entry_var[2].setText(
+ json_data["analysis"]["tran"]["Stop Time"])
+ index = self.start_combobox.findText(
+ json_data["analysis"]["tran"]["Start Combo"])
self.start_combobox.setCurrentIndex(index)
- index = self.step_combobox.findText(json_data["analysis"]["tran"]["Step Combo"])
+ index = self.step_combobox.findText(
+ json_data["analysis"]["tran"]["Step Combo"])
self.step_combobox.setCurrentIndex(index)
- index = self.stop_combobox.findText(json_data["analysis"]["tran"]["Stop Combo"])
+ index = self.stop_combobox.findText(
+ json_data["analysis"]["tran"]["Stop Combo"])
self.stop_combobox.setCurrentIndex(index)
- except:
+ except BaseException:
print("Transient Analysis JSON Parse Error")
+ return self.trbox
- return self.trbox
-
def start_combo_change(self, text):
self.tran_parameter[0] = str(text)
-
+
def step_combo_change(self, text):
self.tran_parameter[1] = str(text)
-
+
def stop_combo_change(self, text):
self.tran_parameter[2] = str(text)
diff --git a/src/kicadtoNgspice/Convert.py b/src/kicadtoNgspice/Convert.py
index baf479f7..924f94fa 100644
--- a/src/kicadtoNgspice/Convert.py
+++ b/src/kicadtoNgspice/Convert.py
@@ -5,26 +5,28 @@ import shutil
from . import TrackWidget
from xml.etree import ElementTree as ET
+
class Convert:
"""
This class has all the necessary function required to convert kicad netlist to ngspice netlist.
"""
- def __init__(self,sourcelisttrack,source_entry_var,schematicInfo,clarg1):
+
+ def __init__(self, sourcelisttrack, source_entry_var,
+ schematicInfo, clarg1):
self.sourcelisttrack = sourcelisttrack
self.schematicInfo = schematicInfo
self.entry_var = source_entry_var
self.sourcelistvalue = []
- self.clarg1=clarg1
-
-
+ self.clarg1 = clarg1
+
def addSourceParameter(self):
"""
This function add the source details to schematicInfo
"""
-
+
self.start = 0
self.end = 0
-
+
for compline in self.sourcelisttrack:
self.index = compline[0]
self.addline = self.schematicInfo[self.index]
@@ -32,91 +34,131 @@ class Convert:
try:
self.start = compline[2]
self.end = compline[3]
- vo_val = str(self.entry_var[self.start].text()) if len(str(self.entry_var[self.start].text())) > 0 else '0'
- va_val = str(self.entry_var[self.start+1].text()) if len(str(self.entry_var[self.start+1].text())) > 0 else '0'
- freq_val = str(self.entry_var[self.start+2].text()) if len(str(self.entry_var[self.start+2].text())) > 0 else '0'
- td_val = str(self.entry_var[self.start+3].text()) if len(str(self.entry_var[self.start+3].text())) > 0 else '0'
- theta_val = str(self.entry_var[self.end].text()) if len(str(self.entry_var[self.end].text())) > 0 else '0'
- self.addline = self.addline.partition('(')[0] + "("+vo_val+" "+va_val+" "+freq_val+" "+td_val+" "+theta_val+")"
- self.sourcelistvalue.append([self.index,self.addline])
- except:
- print("Caught an exception in sine voltage source ",self.addline)
-
+ vo_val = str(self.entry_var[self.start].text()) if len(
+ str(self.entry_var[self.start].text())) > 0 else '0'
+ va_val = str(self.entry_var[self.start + 1].text()) if len(
+ str(self.entry_var[self.start + 1].text())) > 0 else '0'
+ freq_val = str(self.entry_var[self.start + 2].text()) if len(
+ str(self.entry_var[self.start + 2].text())) > 0 else '0'
+ td_val = str(self.entry_var[self.start + 3].text()) if len(
+ str(self.entry_var[self.start + 3].text())) > 0 else '0'
+ theta_val = str(self.entry_var[self.end].text()) if len(
+ str(self.entry_var[self.end].text())) > 0 else '0'
+ self.addline = self.addline.partition(
+ '(')[0] + "(" + vo_val + " " + va_val + " " + freq_val + " " + td_val + " " + theta_val + ")"
+ self.sourcelistvalue.append([self.index, self.addline])
+ except BaseException:
+ print(
+ "Caught an exception in sine voltage source ",
+ self.addline)
+
elif compline[1] == 'pulse':
try:
self.start = compline[2]
self.end = compline[3]
- v1_val = str(self.entry_var[self.start].text()) if len(str(self.entry_var[self.start].text())) > 0 else '0'
- v2_val = str(self.entry_var[self.start+1].text()) if len(str(self.entry_var[self.start+1].text())) > 0 else '0'
- td_val = str(self.entry_var[self.start+2].text()) if len(str(self.entry_var[self.start+2].text())) > 0 else '0'
- tr_val = str(self.entry_var[self.start+3].text()) if len(str(self.entry_var[self.start+3].text())) > 0 else '0'
- tf_val = str(self.entry_var[self.start+4].text()) if len(str(self.entry_var[self.start+4].text())) > 0 else '0'
- pw_val = str(self.entry_var[self.start+5].text()) if len(str(self.entry_var[self.start+5].text())) > 0 else '0'
- tp_val = str(self.entry_var[self.end].text()) if len(str(self.entry_var[self.end].text())) > 0 else '0'
-
- self.addline = self.addline.partition('(')[0] + "("+v1_val+" "+v2_val+" "+td_val+" "+tr_val+" "+tf_val+" "+pw_val+" "+tp_val+")"
- self.sourcelistvalue.append([self.index,self.addline])
- except:
- print("Caught an exception in pulse voltage source ",self.addline)
-
+ v1_val = str(self.entry_var[self.start].text()) if len(
+ str(self.entry_var[self.start].text())) > 0 else '0'
+ v2_val = str(self.entry_var[self.start + 1].text()) if len(
+ str(self.entry_var[self.start + 1].text())) > 0 else '0'
+ td_val = str(self.entry_var[self.start + 2].text()) if len(
+ str(self.entry_var[self.start + 2].text())) > 0 else '0'
+ tr_val = str(self.entry_var[self.start + 3].text()) if len(
+ str(self.entry_var[self.start + 3].text())) > 0 else '0'
+ tf_val = str(self.entry_var[self.start + 4].text()) if len(
+ str(self.entry_var[self.start + 4].text())) > 0 else '0'
+ pw_val = str(self.entry_var[self.start + 5].text()) if len(
+ str(self.entry_var[self.start + 5].text())) > 0 else '0'
+ tp_val = str(self.entry_var[self.end].text()) if len(
+ str(self.entry_var[self.end].text())) > 0 else '0'
+
+ self.addline = self.addline.partition(
+ '(')[0] + "(" + v1_val + " " + v2_val + " " + td_val + " " + tr_val + " " + tf_val + " " + pw_val + " " + tp_val + ")"
+ self.sourcelistvalue.append([self.index, self.addline])
+ except BaseException:
+ print(
+ "Caught an exception in pulse voltage source ",
+ self.addline)
+
elif compline[1] == 'pwl':
try:
self.start = compline[2]
self.end = compline[3]
- t_v_val = str(self.entry_var[self.start].text()) if len(str(self.entry_var[self.start].text())) > 0 else '0 0'
- self.addline = self.addline.partition('(')[0] + "("+t_v_val+")"
- self.sourcelistvalue.append([self.index,self.addline])
- except:
- print("Caught an exception in pwl voltage source ",self.addline)
-
+ t_v_val = str(self.entry_var[self.start].text()) if len(
+ str(self.entry_var[self.start].text())) > 0 else '0 0'
+ self.addline = self.addline.partition(
+ '(')[0] + "(" + t_v_val + ")"
+ self.sourcelistvalue.append([self.index, self.addline])
+ except BaseException:
+ print(
+ "Caught an exception in pwl voltage source ",
+ self.addline)
+
elif compline[1] == 'ac':
try:
self.start = compline[2]
self.end = compline[3]
- va_val=str(self.entry_var[self.start].text()) if len(str(self.entry_var[self.start].text())) > 0 else '0'
- ph_val=str(self.entry_var[self.start+1].text()) if len(str(self.entry_var[self.start+1].text())) > 0 else '0'
+ va_val = str(self.entry_var[self.start].text()) if len(
+ str(self.entry_var[self.start].text())) > 0 else '0'
+ ph_val = str(self.entry_var[self.start + 1].text()) if len(
+ str(self.entry_var[self.start + 1].text())) > 0 else '0'
self.addline = ' '.join(self.addline.split())
- self.addline = self.addline.partition('ac')[0] +" "+'ac'+" "+ va_val+" "+ph_val
- self.sourcelistvalue.append([self.index,self.addline])
- except:
- print("Caught an exception in ac voltage source ",self.addline)
-
+ self.addline = self.addline.partition(
+ 'ac')[0] + " " + 'ac' + " " + va_val + " " + ph_val
+ self.sourcelistvalue.append([self.index, self.addline])
+ except BaseException:
+ print(
+ "Caught an exception in ac voltage source ",
+ self.addline)
+
elif compline[1] == 'dc':
try:
self.start = compline[2]
self.end = compline[3]
- v1_val = str(self.entry_var[self.start].text()) if len(str(self.entry_var[self.start].text())) > 0 else '0'
- self.addline = ' '.join(self.addline.split())
- self.addline = self.addline.partition('dc')[0] + " " +'dc'+ " "+v1_val
- self.sourcelistvalue.append([self.index,self.addline])
- except:
- print("Caught an exception in dc voltage source",self.addline)
-
+ v1_val = str(self.entry_var[self.start].text()) if len(
+ str(self.entry_var[self.start].text())) > 0 else '0'
+ self.addline = ' '.join(self.addline.split())
+ self.addline = self.addline.partition(
+ 'dc')[0] + " " + 'dc' + " " + v1_val
+ self.sourcelistvalue.append([self.index, self.addline])
+ except BaseException:
+ print(
+ "Caught an exception in dc voltage source",
+ self.addline)
+
elif compline[1] == 'exp':
try:
self.start = compline[2]
self.end = compline[3]
- v1_val = str(self.entry_var[self.start].text()) if len(str(self.entry_var[self.start].text())) > 0 else '0'
- v2_val = str(self.entry_var[self.start+1].text()) if len(str(self.entry_var[self.start+1].text())) > 0 else '0'
- td1_val = str(self.entry_var[self.start+2].text()) if len(str(self.entry_var[self.start+2].text())) > 0 else '0'
- tau1_val = str(self.entry_var[self.start+3].text()) if len(str(self.entry_var[self.start+3].text())) > 0 else '0'
- td2_val = str(self.entry_var[self.start+4].text()) if len(str(self.entry_var[self.start+4].text())) > 0 else '0'
- tau2_val = str(self.entry_var[self.end].text()) if len(str(self.entry_var[self.end].text())) > 0 else '0'
-
- self.addline = self.addline.partition('(')[0] + "("+v1_val+" "+v2_val+" "+td1_val+" "+tau1_val+" "+td2_val+" "+tau2_val+")"
- self.sourcelistvalue.append([self.index,self.addline])
- except:
- print("Caught an exception in exp voltage source ",self.addline)
-
- #Updating Schematic with source value
+ v1_val = str(self.entry_var[self.start].text()) if len(
+ str(self.entry_var[self.start].text())) > 0 else '0'
+ v2_val = str(self.entry_var[self.start + 1].text()) if len(
+ str(self.entry_var[self.start + 1].text())) > 0 else '0'
+ td1_val = str(self.entry_var[self.start + 2].text()) if len(
+ str(self.entry_var[self.start + 2].text())) > 0 else '0'
+ tau1_val = str(self.entry_var[self.start + 3].text()) if len(
+ str(self.entry_var[self.start + 3].text())) > 0 else '0'
+ td2_val = str(self.entry_var[self.start + 4].text()) if len(
+ str(self.entry_var[self.start + 4].text())) > 0 else '0'
+ tau2_val = str(self.entry_var[self.end].text()) if len(
+ str(self.entry_var[self.end].text())) > 0 else '0'
+
+ self.addline = self.addline.partition(
+ '(')[0] + "(" + v1_val + " " + v2_val + " " + td1_val + " " + tau1_val + " " + td2_val + " " + tau2_val + ")"
+ self.sourcelistvalue.append([self.index, self.addline])
+ except BaseException:
+ print(
+ "Caught an exception in exp voltage source ",
+ self.addline)
+
+ # Updating Schematic with source value
for item in self.sourcelistvalue:
del self.schematicInfo[item[0]]
- self.schematicInfo.insert(item[0],item[1])
-
+ self.schematicInfo.insert(item[0], item[1])
+
return self.schematicInfo
-
-
- def analysisInsertor(self,ac_entry_var,dc_entry_var, tran_entry_var,set_checkbox,ac_parameter,dc_parameter,tran_parameter,ac_type,op_check):
+
+ def analysisInsertor(self, ac_entry_var, dc_entry_var, tran_entry_var,
+ set_checkbox, ac_parameter, dc_parameter, tran_parameter, ac_type, op_check):
"""
This function creates an analysis file in current project
"""
@@ -124,41 +166,100 @@ class Convert:
self.dc_entry_var = dc_entry_var
self.tran_entry_var = tran_entry_var
self.set_checkbox = set_checkbox
- self.ac_parameter= ac_parameter
- self.dc_parameter= dc_parameter
+ self.ac_parameter = ac_parameter
+ self.dc_parameter = dc_parameter
self.trans_parameter = tran_parameter
- self.ac_type= ac_type
+ self.ac_type = ac_type
self.op_check = op_check
- self.no=0
-
- self.variable=self.set_checkbox
- self.direct= self.clarg1
- (filepath, filemname)= os.path.split(self.direct)
- self.Fileopen = os.path.join(filepath, "analysis")
- self.writefile= open(self.Fileopen,"w")
- if self.variable== 'AC':
- self.no=0
- self.writefile.write(".ac"+' ' + self.ac_type + ' '+ str(self.defaultvalue(self.ac_entry_var[self.no+2].text()))+' ' + str(self.defaultvalue(self.ac_entry_var[self.no].text())) + self.ac_parameter[self.no]+ ' ' + str(self.defaultvalue(self.ac_entry_var[self.no+1].text())) + self.ac_parameter[self.no+1] )
-
- elif self.variable=='DC':
+ self.no = 0
+
+ self.variable = self.set_checkbox
+ self.direct = self.clarg1
+ (filepath, filemname) = os.path.split(self.direct)
+ self.Fileopen = os.path.join(filepath, "analysis")
+ self.writefile = open(self.Fileopen, "w")
+ if self.variable == 'AC':
+ self.no = 0
+ self.writefile.write(".ac" +
+ ' ' +
+ self.ac_type +
+ ' ' +
+ str(self.defaultvalue(self.ac_entry_var[self.no +
+ 2].text())) +
+ ' ' +
+ str(self.defaultvalue(self.ac_entry_var[self.no].text())) +
+ self.ac_parameter[self.no] +
+ ' ' +
+ str(self.defaultvalue(self.ac_entry_var[self.no +
+ 1].text())) +
+ self.ac_parameter[self.no +
+ 1])
+
+ elif self.variable == 'DC':
if self.op_check[-1] == 1:
- self.no=0
+ self.no = 0
self.writefile.write(".op")
elif self.op_check[-1] == 0 or self.op_check[-1] == '0':
- self.no=0
- self.writefile.write(".dc" +' '+ str(self.dc_entry_var[self.no].text())+ ' '+ str(self.defaultvalue(self.dc_entry_var[self.no+1].text())) + self.converttosciform(self.dc_parameter[self.no]) + ' '+ str(self.defaultvalue(self.dc_entry_var[self.no+3].text()))+ self.converttosciform(self.dc_parameter[self.no+2]) + ' '+ str(self.defaultvalue(self.dc_entry_var[self.no+2].text())) + self.converttosciform(self.dc_parameter[self.no+1]))
-
- if self.dc_entry_var[self.no+4].text():
- self.writefile.write(' '+ str(self.defaultvalue(self.dc_entry_var[self.no+4].text()))+ ' '+ str(self.defaultvalue(self.dc_entry_var[self.no+5].text())) + self.converttosciform(self.dc_parameter[self.no+3])+ ' '+ str(self.defaultvalue(self.dc_entry_var[self.no+7].text()))+ self.converttosciform(self.dc_parameter[self.no+5])+ ' ' + str(self.defaultvalue(self.dc_entry_var[self.no+6].text()))+ self.converttosciform(self.dc_parameter[self.no+4]))
+ self.no = 0
+ self.writefile.write(".dc" +
+ ' ' +
+ str(self.dc_entry_var[self.no].text()) +
+ ' ' +
+ str(self.defaultvalue(self.dc_entry_var[self.no +
+ 1].text())) +
+ self.converttosciform(self.dc_parameter[self.no]) +
+ ' ' +
+ str(self.defaultvalue(self.dc_entry_var[self.no +
+ 3].text())) +
+ self.converttosciform(self.dc_parameter[self.no +
+ 2]) +
+ ' ' +
+ str(self.defaultvalue(self.dc_entry_var[self.no +
+ 2].text())) +
+ self.converttosciform(self.dc_parameter[self.no +
+ 1]))
+
+ if self.dc_entry_var[self.no + 4].text():
+ self.writefile.write(' ' +
+ str(self.defaultvalue(self.dc_entry_var[self.no +
+ 4].text())) +
+ ' ' +
+ str(self.defaultvalue(self.dc_entry_var[self.no +
+ 5].text())) +
+ self.converttosciform(self.dc_parameter[self.no +
+ 3]) +
+ ' ' +
+ str(self.defaultvalue(self.dc_entry_var[self.no +
+ 7].text())) +
+ self.converttosciform(self.dc_parameter[self.no +
+ 5]) +
+ ' ' +
+ str(self.defaultvalue(self.dc_entry_var[self.no +
+ 6].text())) +
+ self.converttosciform(self.dc_parameter[self.no +
+ 4]))
elif self.variable == 'TRAN':
- self.no= 0
- self.writefile.write(".tran" + ' '+ str(self.defaultvalue(self.tran_entry_var[self.no+1].text())) + self.converttosciform(self.trans_parameter[self.no+1]) + ' ' + str(self.defaultvalue(self.tran_entry_var[self.no+2].text())) + self.converttosciform(self.trans_parameter[self.no+2])+' '+ str(self.defaultvalue(self.tran_entry_var[self.no].text()))+ self.converttosciform(self.trans_parameter[self.no]))
+ self.no = 0
+ self.writefile.write(".tran" +
+ ' ' +
+ str(self.defaultvalue(self.tran_entry_var[self.no +
+ 1].text())) +
+ self.converttosciform(self.trans_parameter[self.no +
+ 1]) +
+ ' ' +
+ str(self.defaultvalue(self.tran_entry_var[self.no +
+ 2].text())) +
+ self.converttosciform(self.trans_parameter[self.no +
+ 2]) +
+ ' ' +
+ str(self.defaultvalue(self.tran_entry_var[self.no].text())) +
+ self.converttosciform(self.trans_parameter[self.no]))
else:
pass
self.writefile.close()
-
+
def converttosciform(self, string_obj):
"""
This function is used for scientific conversion.
@@ -174,90 +275,110 @@ class Convert:
return "e-12"
else:
return "e-00"
-
+
def defaultvalue(self, value):
"""
This function select default value as 0 if Analysis widget do not hold any value.
"""
- self.value= value
+ self.value = value
if self.value == '':
return 0
else:
return self.value
-
-
- def addModelParameter(self,schematicInfo):
+
+ def addModelParameter(self, schematicInfo):
"""
This function add the Ngspice Model details to schematicInfo
"""
-
- #Create object of TrackWidget
+
+ # Create object of TrackWidget
self.obj_track = TrackWidget.TrackWidget()
-
- #List to store model line
+
+ # List to store model line
addmodelLine = []
modelParamValue = []
-
+
for line in self.obj_track.modelTrack:
#print "Model Track :",line
if line[2] == 'transfo':
try:
- start=line[7]
- end=line[8]
- num_turns=str(self.obj_track.model_entry_var[start+1].text())
-
- if num_turns=="": num_turns="310"
- h_array= "H_array = [ "
+ start = line[7]
+ end = line[8]
+ num_turns = str(
+ self.obj_track.model_entry_var[start + 1].text())
+
+ if num_turns == "":
+ num_turns = "310"
+ h_array = "H_array = [ "
b_array = "B_array = [ "
- h1=str(self.obj_track.model_entry_var[start].text())
- b1=str(self.obj_track.model_entry_var[start+5].text())
-
- if len(h1)!=0 and len(b1)!=0:
- h_array=h_array+h1+" "
- b_array=b_array+b1+" "
- bh_array = h_array+" ] " + b_array+" ]"
+ h1 = str(self.obj_track.model_entry_var[start].text())
+ b1 = str(self.obj_track.model_entry_var[start + 5].text())
+
+ if len(h1) != 0 and len(b1) != 0:
+ h_array = h_array + h1 + " "
+ b_array = b_array + b1 + " "
+ bh_array = h_array + " ] " + b_array + " ]"
else:
bh_array = "H_array = [-1000 -500 -375 -250 -188 -125 -63 0 63 125 188 250 375 500 1000] B_array = [-3.13e-3 -2.63e-3 -2.33e-3 -1.93e-3 -1.5e-3 -6.25e-4 -2.5e-4 0 2.5e-4 6.25e-4 1.5e-3 1.93e-3 2.33e-3 2.63e-3 3.13e-3]"
- area=str(self.obj_track.model_entry_var[start+2].text())
- length=str(self.obj_track.model_entry_var[start+3].text())
- if area=="": area="1"
- if length=="":length="0.01"
- num_turns2=str(self.obj_track.model_entry_var[start+4].text())
- if num_turns2=="": num_turns2="620"
- addmodelLine=".model "+line[3]+"_primary lcouple (num_turns= "+num_turns+")"
- modelParamValue.append([line[0],addmodelLine,"*primary lcouple"])
- addmodelLine=".model "+line[3]+"_iron_core core ("+bh_array+" area = "+area+" length ="+length +")"
- modelParamValue.append([line[0],addmodelLine,"*iron core"])
- addmodelLine=".model "+line[3]+"_secondary lcouple (num_turns ="+num_turns2+ ")"
- modelParamValue.append([line[0],addmodelLine,"*secondary lcouple"])
+ area = str(
+ self.obj_track.model_entry_var[start + 2].text())
+ length = str(
+ self.obj_track.model_entry_var[start + 3].text())
+ if area == "":
+ area = "1"
+ if length == "":
+ length = "0.01"
+ num_turns2 = str(
+ self.obj_track.model_entry_var[start + 4].text())
+ if num_turns2 == "":
+ num_turns2 = "620"
+ addmodelLine = ".model " + \
+ line[3] + \
+ "_primary lcouple (num_turns= " + num_turns + ")"
+ modelParamValue.append(
+ [line[0], addmodelLine, "*primary lcouple"])
+ addmodelLine = ".model " + \
+ line[3] + "_iron_core core (" + bh_array + \
+ " area = " + area + " length =" + length + ")"
+ modelParamValue.append(
+ [line[0], addmodelLine, "*iron core"])
+ addmodelLine = ".model " + \
+ line[3] + \
+ "_secondary lcouple (num_turns =" + num_turns2 + ")"
+ modelParamValue.append(
+ [line[0], addmodelLine, "*secondary lcouple"])
except Exception as e:
- print("Caught an exception in transfo model ",line[1])
- print("Exception Message : ",str(e))
-
+ print("Caught an exception in transfo model ", line[1])
+ print("Exception Message : ", str(e))
+
elif line[2] == 'ic':
try:
- start=line[7]
- end=line[8]
- for key,value in line[9].items():
- initVal = str(self.obj_track.model_entry_var[value].text())
- if initVal=="":initVal="0"
- node = line[1].split()[1] #Extracting node from model line
- addmodelLine = ".ic v("+node+")="+initVal
- modelParamValue.append([line[0],addmodelLine,line[4]])
+ start = line[7]
+ end = line[8]
+ for key, value in line[9].items():
+ initVal = str(
+ self.obj_track.model_entry_var[value].text())
+ if initVal == "":
+ initVal = "0"
+ # Extracting node from model line
+ node = line[1].split()[1]
+ addmodelLine = ".ic v(" + node + ")=" + initVal
+ modelParamValue.append(
+ [line[0], addmodelLine, line[4]])
except Exception as e:
- print("Caught an exception in initial condition ",line[1])
- print("Exception Message : ",str(e))
-
-
+ print("Caught an exception in initial condition ", line[1])
+ print("Exception Message : ", str(e))
+
else:
try:
start = line[7]
end = line[8]
- addmodelLine=".model "+ line[3]+" "+line[2]+"("
- for key,value in line[9].items():
+ addmodelLine = ".model " + line[3] + " " + line[2] + "("
+ for key, value in line[9].items():
#print "Tags: ",key
#print "Value: ",value
- #Checking for default value and accordingly assign param and default.
+ # Checking for default value and accordingly assign
+ # param and default.
if ':' in key:
key = key.split(':')
param = key[0]
@@ -265,55 +386,56 @@ class Convert:
else:
param = key
default = 0
- #Cheking if value is iterable.its for vector
+ # Cheking if value is iterable.its for vector
if hasattr(value, '__iter__'):
- addmodelLine += param+"=["
+ addmodelLine += param + "=["
for lineVar in value:
- if str(self.obj_track.model_entry_var[lineVar].text()) == "":
+ if str(
+ self.obj_track.model_entry_var[lineVar].text()) == "":
paramVal = default
else:
- paramVal = str(self.obj_track.model_entry_var[lineVar].text())
- addmodelLine += paramVal+" "
+ paramVal = str(
+ self.obj_track.model_entry_var[lineVar].text())
+ addmodelLine += paramVal + " "
addmodelLine += "] "
else:
- if str(self.obj_track.model_entry_var[value].text()) == "":
+ if str(
+ self.obj_track.model_entry_var[value].text()) == "":
paramVal = default
else:
- paramVal = str(self.obj_track.model_entry_var[value].text())
-
- addmodelLine += param+"="+paramVal+" "
-
-
+ paramVal = str(
+ self.obj_track.model_entry_var[value].text())
+
+ addmodelLine += param + "=" + paramVal + " "
+
addmodelLine += ") "
- modelParamValue.append([line[0],addmodelLine,line[4]])
+ modelParamValue.append([line[0], addmodelLine, line[4]])
except Exception as e:
- print("Caught an exception in model ",line[1])
- print("Exception Message : ",str(e))
-
-
- #Adding it to schematic
+ print("Caught an exception in model ", line[1])
+ print("Exception Message : ", str(e))
+
+ # Adding it to schematic
for item in modelParamValue:
if ".ic" in item[1]:
- schematicInfo.insert(0,item[1])
- schematicInfo.insert(0,item[2])
+ schematicInfo.insert(0, item[1])
+ schematicInfo.insert(0, item[2])
else:
- schematicInfo.append(item[2]) #Adding Comment
- schematicInfo.append(item[1]) #Adding model line
-
+ schematicInfo.append(item[2]) # Adding Comment
+ schematicInfo.append(item[1]) # Adding model line
+
return schematicInfo
-
- def addDeviceLibrary(self,schematicInfo,kicadFile):
+
+ def addDeviceLibrary(self, schematicInfo, kicadFile):
"""
This function add the library details to schematicInfo
"""
-
- (projpath,filename) = os.path.split(kicadFile)
-
-
+
+ (projpath, filename) = os.path.split(kicadFile)
+
deviceLibList = self.obj_track.deviceModelTrack
- deviceLine = {} #Key:Index, Value:with its updated line in the form of list
- includeLine = [] #All .include line list
-
+ deviceLine = {} # Key:Index, Value:with its updated line in the form of list
+ includeLine = [] # All .include line list
+
if not deviceLibList:
print("No Library Added in the schematic")
pass
@@ -324,73 +446,75 @@ class Convert:
print("Found Library line")
index = schematicInfo.index(eachline)
completeLibPath = deviceLibList[words[0]]
- (libpath,libname) = os.path.split(completeLibPath)
- print("Library Path :",libpath)
- #Copying library from devicemodelLibrary to Project Path
- #Special case for MOSFET
+ (libpath, libname) = os.path.split(completeLibPath)
+ print("Library Path :", libpath)
+ # Copying library from devicemodelLibrary to Project Path
+ # Special case for MOSFET
if eachline[0] == 'm':
- #For mosfet library name come along with MOSFET dimension information
+ # For mosfet library name come along with MOSFET
+ # dimension information
tempStr = libname.split(':')
libname = tempStr[0]
dimension = tempStr[1]
- #Replace last word with library name
+ # Replace last word with library name
#words[-1] = libname.split('.')[0]
- words[-1] = self.getRefrenceName(libname,libpath)
- #Appending Dimension of MOSFET
+ words[-1] = self.getRefrenceName(libname, libpath)
+ # Appending Dimension of MOSFET
words.append(dimension)
- deviceLine[index] = words
- includeLine.append(".include "+libname)
-
- #src = completeLibPath.split(':')[0] # <----- Not working in Windows
-
- (src_path,src_lib) = os.path.split(completeLibPath)
+ deviceLine[index] = words
+ includeLine.append(".include " + libname)
+
+ # src = completeLibPath.split(':')[0] # <----- Not
+ # working in Windows
+
+ (src_path, src_lib) = os.path.split(completeLibPath)
src_lib = src_lib.split(':')[0]
- src = os.path.join(src_path,src_lib)
+ src = os.path.join(src_path, src_lib)
dst = projpath
shutil.copy2(src, dst)
else:
- #Replace last word with library name
+ # Replace last word with library name
#words[-1] = libname.split('.')[0]
- words[-1] = self.getRefrenceName(libname,libpath)
- deviceLine[index] = words
- includeLine.append(".include "+libname)
-
+ words[-1] = self.getRefrenceName(libname, libpath)
+ deviceLine[index] = words
+ includeLine.append(".include " + libname)
+
src = completeLibPath
dst = projpath
- shutil.copy2(src,dst)
-
+ shutil.copy2(src, dst)
+
else:
pass
-
-
- #Adding device line to schematicInfo
- for index,value in deviceLine.items():
- #Update the device line
+
+ # Adding device line to schematicInfo
+ for index, value in deviceLine.items():
+ # Update the device line
strLine = " ".join(str(item) for item in value)
schematicInfo[index] = strLine
-
- #This has to be second i.e after deviceLine details
- #Adding .include line to Schematic Info at the start of line
+
+ # This has to be second i.e after deviceLine details
+ # Adding .include line to Schematic Info at the start of line
for item in list(set(includeLine)):
- schematicInfo.insert(0,item)
-
-
+ schematicInfo.insert(0, item)
+
return schematicInfo
-
- def addSubcircuit(self,schematicInfo,kicadFile):
+
+ def addSubcircuit(self, schematicInfo, kicadFile):
"""
This function add the subcircuit to schematicInfo
"""
-
- (projpath,filename) = os.path.split(kicadFile)
-
+
+ (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):
+ 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.showMessage(
+ "Conversion failed. Please add all Subcircuits.")
self.msg.setWindowTitle("Error Message")
self.msg.show()
raise Exception('All subcircuit directories need to be specified.')
@@ -404,44 +528,43 @@ class Convert:
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
+ (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")
-
+ 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 os.path.isfile(os.path.join(src, files)):
if files != "analysis":
- shutil.copy2(os.path.join(src,files),dst)
+ shutil.copy2(os.path.join(src, files), dst)
else:
pass
-
-
- #Adding subcircuit line to schematicInfo
- for index,value in subLine.items():
- #Update the subcircuit line
+
+ # Adding subcircuit line to schematicInfo
+ for index, value in subLine.items():
+ # 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
+
+ # 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)
-
- #Extracting Value from XML
+ schematicInfo.insert(0, item)
+
+ return schematicInfo
+
+ def getRefrenceName(self, libname, libpath):
+ libname = libname.replace('.lib', '.xml')
+ library = os.path.join(libpath, libname)
+
+ # Extracting Value from XML
libtree = ET.parse(library)
for child in libtree.iter():
if child.tag == 'ref_model':
@@ -449,6 +572,3 @@ class Convert:
else:
pass
return retVal
-
-
-
diff --git a/src/kicadtoNgspice/DeviceModel.py b/src/kicadtoNgspice/DeviceModel.py
index ccc4c602..e94ee561 100644
--- a/src/kicadtoNgspice/DeviceModel.py
+++ b/src/kicadtoNgspice/DeviceModel.py
@@ -10,54 +10,62 @@ class DeviceModel(QtGui.QWidget):
This class creates Device Library Tab in KicadtoNgspice Window
It dynamically creates the widget for device like diode,mosfet,transistor and jfet.
"""
-
+
def __init__(self, schematicInfo, clarg1):
-
+
self.clarg1 = clarg1
kicadFile = self.clarg1
- (projpath,filename) = os.path.split(kicadFile)
+ (projpath, filename) = os.path.split(kicadFile)
project_name = os.path.basename(projpath)
try:
- f = open(os.path.join(projpath,project_name+"_Previous_Values.json"),'r')
+ f = open(
+ os.path.join(
+ projpath,
+ project_name +
+ "_Previous_Values.json"),
+ 'r')
data = f.read()
json_data = json.loads(data)
- except:
+ except BaseException:
print("Device Model Previous JSON is Empty")
-
-
+
QtGui.QWidget.__init__(self)
-
- #Creating track widget object
+
+ # Creating track widget object
self.obj_trac = TrackWidget.TrackWidget()
-
- #Row and column count
+
+ # Row and column count
self.row = 0
- self.count = 1 #Entry count
+ self.count = 1 # Entry count
self.entry_var = {}
-
- #For MOSFET
+
+ # For MOSFET
self.widthLabel = {}
self.lengthLabel = {}
self.multifactorLable = {}
- self.devicemodel_dict_beg = {}
- self.devicemodel_dict_end = {}
- #List to hold information about device
+ self.devicemodel_dict_beg = {}
+ self.devicemodel_dict_end = {}
+ # List to hold information about device
self.deviceDetail = {}
-
- #Set Layout
+
+ # Set Layout
self.grid = QtGui.QGridLayout()
self.setLayout(self.grid)
print("Reading Device model details from Schematic")
-
+
for eachline in schematicInfo:
words = eachline.split()
if eachline[0] == 'q':
- print("Device Model Transistor: ",words[0])
+ print("Device Model Transistor: ", words[0])
self.devicemodel_dict_beg[words[0]] = self.count
- transbox=QtGui.QGroupBox()
- transgrid=QtGui.QGridLayout()
- transbox.setTitle("Add library for Transistor "+words[0]+" : "+words[4])
+ transbox = QtGui.QGroupBox()
+ transgrid = QtGui.QGridLayout()
+ 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
@@ -67,19 +75,22 @@ class DeviceModel(QtGui.QWidget):
if key[0] == eachline[0] and key[1] == eachline[1]:
#print "DEVICE MODEL MATCHING---",child.tag[0],child.tag[1],eachline[0],eachline[1]
try:
- if os.path.exists(json_data["deviceModel"][key][0]):
- self.entry_var[self.count].setText(json_data["deviceModel"][key][0])
+ if os.path.exists(
+ json_data["deviceModel"][key][0]):
+ self.entry_var[self.count].setText(
+ json_data["deviceModel"][key][0])
path_name = json_data["deviceModel"][key][0]
else:
self.entry_var[self.count].setText("")
- except:
- print("Error when set text of device model transistor")
- except:
+ except BaseException:
+ print(
+ "Error when set text of device model transistor")
+ except BaseException:
pass
transgrid.addWidget(self.entry_var[self.count], self.row, 1)
self.addbtn = QtGui.QPushButton("Add")
- self.addbtn.setObjectName("%d" %self.count)
+ self.addbtn.setObjectName("%d" % self.count)
self.addbtn.clicked.connect(self.trackLibrary)
self.deviceDetail[self.count] = words[0]
@@ -87,32 +98,35 @@ class DeviceModel(QtGui.QWidget):
pass
else:
self.trackLibraryWithoutButton(self.count, path_name)
-
+
transgrid.addWidget(self.addbtn, self.row, 2)
transbox.setLayout(transgrid)
-
- #CSS
+
+ # CSS
transbox.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(transbox)
-
- #Adding Device Details
-
-
- #Increment row and widget count
+
+ # Adding Device Details
+
+ # Increment row and widget count
self.row = self.row + 1
self.devicemodel_dict_end[words[0]] = self.count
self.count = self.count + 1
-
+
elif eachline[0] == 'd':
- print("Device Model Diode:",words[0])
+ print("Device Model Diode:", words[0])
self.devicemodel_dict_beg[words[0]] = self.count
diodebox = QtGui.QGroupBox()
diodegrid = QtGui.QGridLayout()
- diodebox.setTitle("Add library for Diode "+words[0]+" : "+words[3])
+ 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
@@ -121,19 +135,21 @@ class DeviceModel(QtGui.QWidget):
if key[0] == eachline[0] and key[1] == eachline[1]:
#print "DEVICE MODEL MATCHING---",child.tag[0],child.tag[1],eachline[0],eachline[1]
try:
- if os.path.exists(json_data["deviceModel"][key][0]):
+ if os.path.exists(
+ json_data["deviceModel"][key][0]):
path_name = json_data["deviceModel"][key][0]
- self.entry_var[self.count].setText(json_data["deviceModel"][key][0])
+ self.entry_var[self.count].setText(
+ json_data["deviceModel"][key][0])
else:
self.entry_var[self.count].setText("")
- except:
+ except BaseException:
print("Error when set text of device model diode")
- except:
+ except BaseException:
pass
diodegrid.addWidget(self.entry_var[self.count], self.row, 1)
self.addbtn = QtGui.QPushButton("Add")
- self.addbtn.setObjectName("%d" %self.count)
+ self.addbtn.setObjectName("%d" % self.count)
self.addbtn.clicked.connect(self.trackLibrary)
self.deviceDetail[self.count] = words[0]
@@ -144,29 +160,32 @@ class DeviceModel(QtGui.QWidget):
diodegrid.addWidget(self.addbtn, self.row, 2)
diodebox.setLayout(diodegrid)
-
- #CSS
+
+ # CSS
diodebox.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(diodebox)
-
- #Adding Device Details
-
-
- #Increment row and widget count
+
+ # Adding Device Details
+
+ # Increment row and widget count
self.row = self.row + 1
self.devicemodel_dict_end[words[0]] = self.count
self.count = self.count + 1
-
+
elif eachline[0] == 'j':
- print("Device Model JFET:",words[0])
+ print("Device Model JFET:", words[0])
self.devicemodel_dict_beg[words[0]] = self.count
jfetbox = QtGui.QGroupBox()
jfetgrid = QtGui.QGridLayout()
- jfetbox.setTitle("Add library for JFET "+words[0]+" : "+words[4])
+ 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
@@ -175,19 +194,21 @@ class DeviceModel(QtGui.QWidget):
if key[0] == eachline[0] and key[1] == eachline[1]:
#print "DEVICE MODEL MATCHING---",child.tag[0],child.tag[1],eachline[0],eachline[1]
try:
- if os.path.exists(json_data["deviceModel"][key][0]):
- self.entry_var[self.count].setText(json_data["deviceModel"][key][0])
+ if os.path.exists(
+ json_data["deviceModel"][key][0]):
+ self.entry_var[self.count].setText(
+ json_data["deviceModel"][key][0])
path_name = json_data["deviceModel"][key][0]
else:
self.entry_var[self.count].setText("")
- except:
+ except BaseException:
print("Error when set text of Device Model JFET ")
- except:
+ except BaseException:
pass
jfetgrid.addWidget(self.entry_var[self.count], self.row, 1)
self.addbtn = QtGui.QPushButton("Add")
- self.addbtn.setObjectName("%d" %self.count)
+ self.addbtn.setObjectName("%d" % self.count)
self.addbtn.clicked.connect(self.trackLibrary)
self.deviceDetail[self.count] = words[0]
@@ -198,65 +219,72 @@ class DeviceModel(QtGui.QWidget):
jfetgrid.addWidget(self.addbtn, self.row, 2)
jfetbox.setLayout(jfetgrid)
-
- #CSS
+
+ # CSS
jfetbox.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(jfetbox)
-
- #Adding Device Details
- #Increment row and widget count
+
+ # Adding Device Details
+ # Increment row and widget count
self.row = self.row + 1
self.devicemodel_dict_end[words[0]] = self.count
self.count = self.count + 1
-
+
elif eachline[0] == 'm':
self.devicemodel_dict_beg[words[0]] = self.count
mosfetbox = QtGui.QGroupBox()
mosfetgrid = QtGui.QGridLayout()
i = self.count
beg = self.count
- mosfetbox.setTitle("Add library for MOSFET "+words[0]+" : "+words[5])
+ mosfetbox.setTitle(
+ "Add library for MOSFET " +
+ words[0] +
+ " : " +
+ words[5])
self.entry_var[self.count] = QtGui.QLineEdit()
self.entry_var[self.count].setText("")
mosfetgrid.addWidget(self.entry_var[self.count], self.row, 1)
self.addbtn = QtGui.QPushButton("Add")
- self.addbtn.setObjectName("%d" %self.count)
+ self.addbtn.setObjectName("%d" % self.count)
self.addbtn.clicked.connect(self.trackLibrary)
mosfetgrid.addWidget(self.addbtn, self.row, 2)
-
- #Adding Device Details
+
+ # Adding Device Details
self.deviceDetail[self.count] = words[0]
-
- #Increment row and widget count
+
+ # Increment row and widget count
self.row = self.row + 1
self.count = self.count + 1
-
- #Adding to get MOSFET dimension
- self.widthLabel[self.count] = QtGui.QLabel("Enter width of MOSFET "+words[0]+"(default=100u):")
+
+ # Adding to get MOSFET dimension
+ self.widthLabel[self.count] = QtGui.QLabel(
+ "Enter width of MOSFET " + words[0] + "(default=100u):")
mosfetgrid.addWidget(self.widthLabel[self.count], self.row, 0)
self.entry_var[self.count] = QtGui.QLineEdit()
self.entry_var[self.count].setText("")
self.entry_var[self.count].setMaximumWidth(150)
mosfetgrid.addWidget(self.entry_var[self.count], self.row, 1)
self.row = self.row + 1
- self.count = self.count+1
-
- self.lengthLabel[self.count] = QtGui.QLabel("Enter length of MOSFET "+words[0]+"(default=100u):")
+ self.count = self.count + 1
+
+ self.lengthLabel[self.count] = QtGui.QLabel(
+ "Enter length of MOSFET " + words[0] + "(default=100u):")
mosfetgrid.addWidget(self.lengthLabel[self.count], self.row, 0)
self.entry_var[self.count] = QtGui.QLineEdit()
self.entry_var[self.count].setText("")
self.entry_var[self.count].setMaximumWidth(150)
mosfetgrid.addWidget(self.entry_var[self.count], self.row, 1)
self.row = self.row + 1
- self.count = self.count+1
-
-
- self.multifactorLable[self.count] = QtGui.QLabel("Enter multiplicative factor of MOSFET "+words[0]+"(default=1):")
- mosfetgrid.addWidget(self.multifactorLable[self.count], self.row, 0)
+ self.count = self.count + 1
+
+ self.multifactorLable[self.count] = QtGui.QLabel(
+ "Enter multiplicative factor of MOSFET " + words[0] + "(default=1):")
+ mosfetgrid.addWidget(
+ self.multifactorLable[self.count], self.row, 0)
self.entry_var[self.count] = QtGui.QLineEdit()
self.entry_var[self.count].setText("")
end = self.count
@@ -264,7 +292,7 @@ class DeviceModel(QtGui.QWidget):
mosfetgrid.addWidget(self.entry_var[self.count], self.row, 1)
self.row = self.row + 1
self.devicemodel_dict_end[words[0]] = self.count
- self.count = self.count+1
+ self.count = self.count + 1
mosfetbox.setLayout(mosfetgrid)
#global path_name
try:
@@ -272,16 +300,18 @@ class DeviceModel(QtGui.QWidget):
if key[0] == eachline[0] and key[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(json_data["deviceModel"][key][i-beg])
- if (i-beg) == 0:
- if os.path.exists(json_data["deviceModel"][key][0]):
+ self.entry_var[i].setText(
+ json_data["deviceModel"][key][i - beg])
+ if (i - beg) == 0:
+ if os.path.exists(
+ json_data["deviceModel"][key][0]):
path_name = json_data["deviceModel"][key][0]
else:
self.entry_var[i].setText("")
i = i + 1
- except:
+ except BaseException:
pass
- #CSS
+ # CSS
mosfetbox.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; } \
@@ -290,13 +320,11 @@ class DeviceModel(QtGui.QWidget):
pass
else:
self.trackLibraryWithoutButton(beg, path_name)
-
+
self.grid.addWidget(mosfetbox)
-
-
+
self.show()
-
-
+
def trackLibrary(self):
"""
This function is use to keep track of all Device Model widget
@@ -305,55 +333,66 @@ class DeviceModel(QtGui.QWidget):
sending_btn = self.sender()
#print "Object Called is ",sending_btn.objectName()
self.widgetObjCount = int(sending_btn.objectName())
-
- self.libfile = str(QtGui.QFileDialog.getOpenFileName(self,"Open Library Directory","../deviceModelLibrary","*.lib"))
+
+ self.libfile = str(
+ QtGui.QFileDialog.getOpenFileName(
+ self,
+ "Open Library Directory",
+ "../deviceModelLibrary",
+ "*.lib"))
#print "Selected Library File :",self.libfile
-
- #Setting Library to Text Edit Line
+
+ # 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
-
-
+
+ # 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
-
+ 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
- def trackLibraryWithoutButton(self,iter_value,path_value):
+
+ def trackLibraryWithoutButton(self, iter_value, path_value):
"""
This function is use to keep track of all Device Model widget
"""
print("Calling Track Library function Without Button")
#print "Object Called is ",sending_btn.objectName()
self.widgetObjCount = iter_value
- print("self.widgetObjCount-----",self.widgetObjCount)
+ print("self.widgetObjCount-----", self.widgetObjCount)
self.libfile = path_value
#print "Selected Library File :",self.libfile
- #Setting Library to Text Edit Line
+ # 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
-
+ # 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
+ 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
-
diff --git a/src/kicadtoNgspice/KicadtoNgspice.py b/src/kicadtoNgspice/KicadtoNgspice.py
index 637d971c..9001830f 100644
--- a/src/kicadtoNgspice/KicadtoNgspice.py
+++ b/src/kicadtoNgspice/KicadtoNgspice.py
@@ -1,20 +1,20 @@
-#===============================================================================
+#=========================================================================
#
# FILE: kicadtoNgspice.py
-#
-# USAGE: ---
-#
-# DESCRIPTION: This define all configuration used in Application.
-#
+#
+# USAGE: ---
+#
+# DESCRIPTION: This define all configuration used in Application.
+#
# OPTIONS: ---
# REQUIREMENTS: ---
# BUGS: ---
# NOTES: ---
# AUTHOR: Fahim Khan, fahim.elex@gmail.com
# ORGANIZATION: eSim team at FOSSEE, IIT Bombay.
-# CREATED: Wednesday 04 March 2015
+# CREATED: Wednesday 04 March 2015
# REVISION: ---
-#===============================================================================
+#=========================================================================
import sys
import os
from PyQt4 import QtGui
@@ -31,161 +31,164 @@ import json
#from xml.etree import ElementTree as ET
-
class MainWindow(QtGui.QWidget):
"""
- This class create KicadtoNgspice window.
+ This class create KicadtoNgspice window.
And Call Convert function if convert button is pressed.
The convert function takes all the value entered by user and create a final netlist "*.cir.out".
- This final netlist is compatible with NgSpice.
+ This final netlist is compatible with NgSpice.
"""
- def __init__(self,clarg1,clarg2=None):
+
+ def __init__(self, clarg1, clarg2=None):
QtGui.QWidget.__init__(self)
-
+
print("==================================")
print("Kicad to Ngspice netlist converter ")
print("==================================")
- global kicadNetlist,schematicInfo
- global infoline,optionInfo
+ global kicadNetlist, schematicInfo
+ global infoline, optionInfo
self.kicadFile = clarg1
- self.clarg1=clarg1
- self.clarg2=clarg2
-
- #Create object of track widget
+ self.clarg1 = clarg1
+ self.clarg2 = clarg2
+
+ # Create object of track widget
self.obj_track = TrackWidget.TrackWidget()
-
- #Clear Dictionary/List item of sub circuit and ngspice model
- #Dictionary
+
+ # Clear Dictionary/List item of sub circuit and ngspice model
+ # Dictionary
self.obj_track.subcircuitList.clear()
self.obj_track.subcircuitTrack.clear()
self.obj_track.model_entry_var.clear()
- #List
- self.obj_track.modelTrack[:]=[]
-
- #Object of Processing
+ # List
+ self.obj_track.modelTrack[:] = []
+
+ # Object of Processing
obj_proc = PrcocessNetlist()
-
+
# Read the netlist
kicadNetlist = obj_proc.readNetlist(self.kicadFile)
-
- print("Given Kicad Schematic Netlist Info :",kicadNetlist)
-
+
+ print("Given Kicad Schematic Netlist Info :", kicadNetlist)
+
# Construct parameter information
param = obj_proc.readParamInfo(kicadNetlist)
-
+
# Replace parameter with values
- netlist,infoline = obj_proc.preprocessNetlist(kicadNetlist,param)
-
- print("Schematic Info after processing Kicad Netlist: ",netlist)
+ netlist, infoline = obj_proc.preprocessNetlist(kicadNetlist, param)
+
+ print("Schematic Info after processing Kicad Netlist: ", netlist)
#print "INFOLINE",infoline
-
+
# Separate option and schematic information
optionInfo, schematicInfo = obj_proc.separateNetlistInfo(netlist)
-
- print("OPTIONINFO in the Netlist",optionInfo)
-
- #List for storing source and its value
+
+ print("OPTIONINFO in the Netlist", optionInfo)
+
+ # List for storing source and its value
global sourcelist, sourcelisttrack
- sourcelist=[]
- sourcelisttrack=[]
- schematicInfo,sourcelist = obj_proc.insertSpecialSourceParam(schematicInfo,sourcelist)
-
- #List storing model detail
- global modelList,outputOption,unknownModelList,multipleModelList,plotText
-
- modelList = []
+ sourcelist = []
+ sourcelisttrack = []
+ schematicInfo, sourcelist = obj_proc.insertSpecialSourceParam(
+ schematicInfo, sourcelist)
+
+ # List storing model detail
+ global modelList, outputOption, unknownModelList, multipleModelList, plotText
+
+ modelList = []
outputOption = []
plotText = []
- schematicInfo,outputOption,modelList,unknownModelList,multipleModelList,plotText = obj_proc.convertICintoBasicBlocks(schematicInfo,outputOption,modelList,plotText)
-
- print("Model available in the Schematic :",modelList)
+ schematicInfo, outputOption, modelList, unknownModelList, multipleModelList, plotText = obj_proc.convertICintoBasicBlocks(
+ schematicInfo, outputOption, modelList, plotText)
+
+ print("Model available in the Schematic :", modelList)
-
"""
Checking if any unknown model is used in schematic which is not recognized by NgSpice.
Also if the two model of same name is present under modelParamXML directory
- """
+ """
if unknownModelList:
- print("Unknown Model List is : ",unknownModelList)
+ print("Unknown Model List is : ", unknownModelList)
self.msg = QtGui.QErrorMessage()
- self.content = "Your schematic contain unknown model "+', '.join(unknownModelList)
+ self.content = "Your schematic contain unknown model " + \
+ ', '.join(unknownModelList)
self.msg.showMessage(self.content)
self.msg.setWindowTitle("Unknown Models")
-
+
elif multipleModelList:
self.msg = QtGui.QErrorMessage()
- self.mcontent = "Look like you have duplicate model in modelParamXML directory "+', '.join(multipleModelList[0])
+ self.mcontent = "Look like you have duplicate model in modelParamXML directory " + \
+ ', '.join(multipleModelList[0])
self.msg.showMessage(self.mcontent)
self.msg.setWindowTitle("Multiple Models")
-
+
else:
self.createMainWindow()
-
-
+
def createMainWindow(self):
"""
This function create main window of Kicad to Ngspice converter
"""
-
+
self.vbox = QtGui.QVBoxLayout(self)
- self.hbox=QtGui.QHBoxLayout(self)
+ self.hbox = QtGui.QHBoxLayout(self)
self.hbox.addStretch(1)
self.convertbtn = QtGui.QPushButton("Convert")
self.convertbtn.clicked.connect(self.callConvert)
self.hbox.addWidget(self.convertbtn)
self.vbox.addWidget(self.createcreateConvertWidget())
self.vbox.addLayout(self.hbox)
-
+
self.setLayout(self.vbox)
self.setWindowTitle("Kicad To NgSpice Converter")
self.show()
-
+
def createcreateConvertWidget(self):
global obj_analysis
self.convertWindow = QtGui.QWidget()
self.analysisTab = QtGui.QScrollArea()
- obj_analysis=Analysis.Analysis(self.clarg1)
+ obj_analysis = Analysis.Analysis(self.clarg1)
self.analysisTab.setWidget(obj_analysis)
#self.analysisTabLayout = QtGui.QVBoxLayout(self.analysisTab.widget())
self.analysisTab.setWidgetResizable(True)
global obj_source
self.sourceTab = QtGui.QScrollArea()
- obj_source=Source.Source(sourcelist,sourcelisttrack,self.clarg1)
+ obj_source = Source.Source(sourcelist, sourcelisttrack, self.clarg1)
self.sourceTab.setWidget(obj_source)
#self.sourceTabLayout = QtGui.QVBoxLayout(self.sourceTab.widget())
self.sourceTab.setWidgetResizable(True)
global obj_model
self.modelTab = QtGui.QScrollArea()
- obj_model=Model.Model(schematicInfo,modelList,self.clarg1)
+ obj_model = Model.Model(schematicInfo, modelList, self.clarg1)
self.modelTab.setWidget(obj_model)
#self.modelTabLayout = QtGui.QVBoxLayout(self.modelTab.widget())
self.modelTab.setWidgetResizable(True)
global obj_devicemodel
self.deviceModelTab = QtGui.QScrollArea()
- obj_devicemodel=DeviceModel.DeviceModel(schematicInfo,self.clarg1)
+ obj_devicemodel = DeviceModel.DeviceModel(schematicInfo, self.clarg1)
self.deviceModelTab.setWidget(obj_devicemodel)
self.deviceModelTab.setWidgetResizable(True)
global obj_subcircuitTab
self.subcircuitTab = QtGui.QScrollArea()
- obj_subcircuitTab = SubcircuitTab.SubcircuitTab(schematicInfo,self.clarg1)
+ obj_subcircuitTab = SubcircuitTab.SubcircuitTab(
+ schematicInfo, self.clarg1)
self.subcircuitTab.setWidget(obj_subcircuitTab)
self.subcircuitTab.setWidgetResizable(True)
self.tabWidget = QtGui.QTabWidget()
- #self.tabWidget.TabShape(QtGui.QTabWidget.Rounded)
- self.tabWidget.addTab(self.analysisTab,"Analysis")
- 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.tabWidget.TabShape(QtGui.QTabWidget.Rounded)
+ self.tabWidget.addTab(self.analysisTab, "Analysis")
+ 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)
+ # self.mainLayout.addStretch(1)
self.convertWindow.setLayout(self.mainLayout)
self.convertWindow.show()
-
- return self.convertWindow
-
+
+ return self.convertWindow
+
def callConvert(self):
"""
Calling Convert Class Constructor
@@ -194,20 +197,23 @@ class MainWindow(QtGui.QWidget):
global analysisoutput
global kicad
store_schematicInfo = list(schematicInfo)
- (projpath,filename) = os.path.split(self.kicadFile)
+ (projpath, filename) = os.path.split(self.kicadFile)
project_name = os.path.basename(projpath)
-
-
- fw = open(os.path.join(projpath,project_name+"_Previous_Values.json"),'w')
- json_data = {}
+ fw = open(
+ os.path.join(
+ projpath,
+ project_name +
+ "_Previous_Values.json"),
+ 'w')
+ json_data = {}
"""
Writing Analysis values
"""
json_data["analysis"] = {}
-
+
json_data["analysis"]["ac"] = {}
if obj_analysis.Lin.isChecked():
json_data["analysis"]["ac"]["Lin"] = "true"
@@ -223,44 +229,58 @@ class MainWindow(QtGui.QWidget):
json_data["analysis"]["ac"]["Oct"] = "true"
else:
pass
-
- json_data["analysis"]["ac"]["Start Frequency"] = str(obj_analysis.ac_entry_var[0].text())
- json_data["analysis"]["ac"]["Stop Frequency"] = str(obj_analysis.ac_entry_var[1].text())
- json_data["analysis"]["ac"]["No. of points"] = str(obj_analysis.ac_entry_var[2].text())
+
+ json_data["analysis"]["ac"]["Start Frequency"] = str(
+ obj_analysis.ac_entry_var[0].text())
+ json_data["analysis"]["ac"]["Stop Frequency"] = str(
+ obj_analysis.ac_entry_var[1].text())
+ json_data["analysis"]["ac"]["No. of points"] = str(
+ obj_analysis.ac_entry_var[2].text())
json_data["analysis"]["ac"]["Start Fre Combo"] = obj_analysis.ac_parameter[0]
json_data["analysis"]["ac"]["Stop Fre Combo"] = obj_analysis.ac_parameter[1]
json_data["analysis"]["dc"] = {}
- json_data["analysis"]["dc"]["Source 1"] = str(obj_analysis.dc_entry_var[0].text())
- json_data["analysis"]["dc"]["Start"] = str(obj_analysis.dc_entry_var[1].text())
- json_data["analysis"]["dc"]["Increment"] = str(obj_analysis.dc_entry_var[2].text())
- json_data["analysis"]["dc"]["Stop"] = str(obj_analysis.dc_entry_var[3].text())
- json_data["analysis"]["dc"]["Operating Point"] = str(self.obj_track.op_check[-1])
+ json_data["analysis"]["dc"]["Source 1"] = str(
+ obj_analysis.dc_entry_var[0].text())
+ json_data["analysis"]["dc"]["Start"] = str(
+ obj_analysis.dc_entry_var[1].text())
+ json_data["analysis"]["dc"]["Increment"] = str(
+ obj_analysis.dc_entry_var[2].text())
+ json_data["analysis"]["dc"]["Stop"] = str(
+ obj_analysis.dc_entry_var[3].text())
+ json_data["analysis"]["dc"]["Operating Point"] = str(
+ self.obj_track.op_check[-1])
json_data["analysis"]["dc"]["Start Combo"] = obj_analysis.dc_parameter[0]
json_data["analysis"]["dc"]["Increment Combo"] = obj_analysis.dc_parameter[1]
json_data["analysis"]["dc"]["Stop Combo"] = obj_analysis.dc_parameter[2]
- json_data["analysis"]["dc"]["Source 2"] = str(obj_analysis.dc_entry_var[4].text())
- json_data["analysis"]["dc"]["Start2"] = str(obj_analysis.dc_entry_var[5].text())
- json_data["analysis"]["dc"]["Increment2"] = str(obj_analysis.dc_entry_var[6].text())
- json_data["analysis"]["dc"]["Stop2"] = str(obj_analysis.dc_entry_var[7].text())
+ json_data["analysis"]["dc"]["Source 2"] = str(
+ obj_analysis.dc_entry_var[4].text())
+ json_data["analysis"]["dc"]["Start2"] = str(
+ obj_analysis.dc_entry_var[5].text())
+ json_data["analysis"]["dc"]["Increment2"] = str(
+ obj_analysis.dc_entry_var[6].text())
+ json_data["analysis"]["dc"]["Stop2"] = str(
+ obj_analysis.dc_entry_var[7].text())
json_data["analysis"]["dc"]["Start Combo2"] = obj_analysis.dc_parameter[3]
json_data["analysis"]["dc"]["Increment Combo2"] = obj_analysis.dc_parameter[4]
json_data["analysis"]["dc"]["Stop Combo2"] = obj_analysis.dc_parameter[5]
json_data["analysis"]["tran"] = {}
- json_data["analysis"]["tran"]["Start Time"] = str(obj_analysis.tran_entry_var[0].text())
- json_data["analysis"]["tran"]["Step Time"] = str(obj_analysis.tran_entry_var[1].text())
- json_data["analysis"]["tran"]["Stop Time"] = str(obj_analysis.tran_entry_var[2].text())
+ json_data["analysis"]["tran"]["Start Time"] = str(
+ obj_analysis.tran_entry_var[0].text())
+ json_data["analysis"]["tran"]["Step Time"] = str(
+ obj_analysis.tran_entry_var[1].text())
+ json_data["analysis"]["tran"]["Stop Time"] = str(
+ obj_analysis.tran_entry_var[2].text())
json_data["analysis"]["tran"]["Start Combo"] = obj_analysis.tran_parameter[0]
json_data["analysis"]["tran"]["Step Combo"] = obj_analysis.tran_parameter[1]
json_data["analysis"]["tran"]["Stop Combo"] = obj_analysis.tran_parameter[2]
-
"""
Writing Source values
"""
- json_data["source"] = {}
+ json_data["source"] = {}
count = 1
for line in store_schematicInfo:
@@ -269,10 +289,10 @@ class MainWindow(QtGui.QWidget):
if wordv[0] == "v" or wordv[0] == "i":
json_data["source"][wordv] = {}
- json_data["source"][wordv]["type"] = words[len(words)-1]
+ json_data["source"][wordv]["type"] = words[len(words) - 1]
json_data["source"][wordv]["values"] = []
- if words[len(words)-1] == "ac":
+ if words[len(words) - 1] == "ac":
amp = {"Amplitude": str(obj_source.entry_var[count].text())}
count += 1
json_data["source"][wordv]["values"].append(amp)
@@ -281,13 +301,15 @@ class MainWindow(QtGui.QWidget):
count += 1
json_data["source"][wordv]["values"].append(phase)
- elif words[len(words)-1] == "dc":
+ elif words[len(words) - 1] == "dc":
value = {"Value": str(obj_source.entry_var[count].text())}
count += 1
json_data["source"][wordv]["values"].append(value)
- elif words[len(words)-1] == "sine":
- offset = {"Offset Value": str(obj_source.entry_var[count].text())}
+ elif words[len(words) - 1] == "sine":
+ offset = {
+ "Offset Value": str(
+ obj_source.entry_var[count].text())}
count += 1
json_data["source"][wordv]["values"].append(offset)
@@ -303,16 +325,22 @@ class MainWindow(QtGui.QWidget):
count += 1
json_data["source"][wordv]["values"].append(delay)
- damp = {"Damping Factor": str(obj_source.entry_var[count].text())}
+ damp = {
+ "Damping Factor": str(
+ obj_source.entry_var[count].text())}
count += 1
json_data["source"][wordv]["values"].append(damp)
- elif words[len(words)-1] == "pulse":
- initial = {"Initial Value": str(obj_source.entry_var[count].text())}
+ elif words[len(words) - 1] == "pulse":
+ initial = {
+ "Initial Value": str(
+ obj_source.entry_var[count].text())}
count += 1
json_data["source"][wordv]["values"].append(initial)
- pulse = {"Pulse Value": str(obj_source.entry_var[count].text())}
+ pulse = {
+ "Pulse Value": str(
+ obj_source.entry_var[count].text())}
count += 1
json_data["source"][wordv]["values"].append(pulse)
@@ -328,7 +356,9 @@ class MainWindow(QtGui.QWidget):
count += 1
json_data["source"][wordv]["values"].append(fall)
- width = {"Pulse width": str(obj_source.entry_var[count].text())}
+ width = {
+ "Pulse width": str(
+ obj_source.entry_var[count].text())}
count += 1
json_data["source"][wordv]["values"].append(width)
@@ -336,21 +366,29 @@ class MainWindow(QtGui.QWidget):
count += 1
json_data["source"][wordv]["values"].append(period)
- elif words[len(words)-1]=="pwl":
- pwl = {"Enter in pwl format": str(obj_source.entry_var[count].text())}
+ elif words[len(words) - 1] == "pwl":
+ pwl = {
+ "Enter in pwl format": str(
+ obj_source.entry_var[count].text())}
count += 1
json_data["source"][wordv]["values"].append(pwl)
- elif words[len(words)-1]=="exp":
- initial = {"Initial Value": str(obj_source.entry_var[count].text())}
+ elif words[len(words) - 1] == "exp":
+ initial = {
+ "Initial Value": str(
+ obj_source.entry_var[count].text())}
count += 1
json_data["source"][wordv]["values"].append(initial)
- pulsed = {"Pulsed Value": str(obj_source.entry_var[count].text())}
+ pulsed = {
+ "Pulsed Value": str(
+ obj_source.entry_var[count].text())}
count += 1
json_data["source"][wordv]["values"].append(pulsed)
- rise = {"Rise Delay Time": str(obj_source.entry_var[count].text())}
+ rise = {
+ "Rise Delay Time": str(
+ obj_source.entry_var[count].text())}
count += 1
json_data["source"][wordv]["values"].append(rise)
@@ -358,19 +396,20 @@ class MainWindow(QtGui.QWidget):
count += 1
json_data["source"][wordv]["values"].append(fall)
- fallConstant = {"Fall Time Constant": str(obj_source.entry_var[count].text())}
+ fallConstant = {
+ "Fall Time Constant": str(
+ obj_source.entry_var[count].text())}
count += 1
json_data["source"][wordv]["values"].append(fallConstant)
else:
pass
-
"""
Writing Model values
"""
- i = 0
+ i = 0
json_data["model"] = {}
for line in modelList:
@@ -378,80 +417,88 @@ class MainWindow(QtGui.QWidget):
if rand_itr[2] == line[2] and rand_itr[3] == line[3]:
start = rand_itr[7]
end = rand_itr[8]
- i = start
-
+ i = start
+
json_data["model"][line[3]] = {}
json_data["model"][line[3]]["type"] = line[2]
- json_data["model"][line[3]]["values"] = []
-
+ json_data["model"][line[3]]["values"] = []
+
for key, value in line[7].items():
if hasattr(value, '__iter__') and i <= end:
for item in value:
- fields = {item: str(obj_model.obj_trac.model_entry_var[i].text())}
+ fields = {
+ item: str(
+ obj_model.obj_trac.model_entry_var[i].text())}
json_data["model"][line[3]]["values"].append(fields)
i = i + 1
-
+
else:
- fields = {value: str(obj_model.obj_trac.model_entry_var[i].text())}
+ fields = {
+ value: str(
+ obj_model.obj_trac.model_entry_var[i].text())}
json_data["model"][line[3]]["values"].append(fields)
i = i + 1
-
"""
Writing Device Model values
"""
- json_data["deviceModel"] = {}
-
+ json_data["deviceModel"] = {}
+
for device in obj_devicemodel.devicemodel_dict_beg:
json_data["deviceModel"][device] = []
it = obj_devicemodel.devicemodel_dict_beg[device]
end = obj_devicemodel.devicemodel_dict_end[device]
while it <= end:
- json_data["deviceModel"][device].append(str(obj_devicemodel.entry_var[it].text()))
+ json_data["deviceModel"][device].append(
+ str(obj_devicemodel.entry_var[it].text()))
it = it + 1
-
"""
Writing Subcircuit values
"""
- json_data["subcircuit"] = {}
+ json_data["subcircuit"] = {}
for subckt in obj_subcircuitTab.subcircuit_dict_beg:
json_data["subcircuit"][subckt] = []
it = obj_subcircuitTab.subcircuit_dict_beg[subckt]
end = obj_subcircuitTab.subcircuit_dict_end[subckt]
while it <= end:
- json_data["subcircuit"][subckt].append(str(obj_subcircuitTab.entry_var[it].text()))
+ json_data["subcircuit"][subckt].append(
+ str(obj_subcircuitTab.entry_var[it].text()))
it = it + 1
write_data = json.dumps(json_data)
fw.write(write_data)
-
-
+
self.obj_convert = Convert.Convert(self.obj_track.sourcelisttrack["ITEMS"],
self.obj_track.source_entry_var["ITEMS"],
- store_schematicInfo,self.clarg1)
-
+ store_schematicInfo, self.clarg1)
+
try:
- #Adding Source Value to Schematic Info
+ # Adding Source Value to Schematic Info
store_schematicInfo = self.obj_convert.addSourceParameter()
- print("Netlist After Adding Source details :",store_schematicInfo)
-
- #Adding Model Value to store_schematicInfo
- store_schematicInfo = self.obj_convert.addModelParameter(store_schematicInfo)
- print("Netlist After Adding Ngspice Model :",store_schematicInfo)
-
- #Adding Device Library to SchematicInfo
- store_schematicInfo = self.obj_convert.addDeviceLibrary(store_schematicInfo,self.kicadFile)
- print("Netlist After Adding Device Model Library :",store_schematicInfo)
-
- #Adding Subcircuit Library to SchematicInfo
- store_schematicInfo = self.obj_convert.addSubcircuit(store_schematicInfo, self.kicadFile)
- print("Netlist After Adding subcircuits :",store_schematicInfo)
-
+ print("Netlist After Adding Source details :", store_schematicInfo)
+
+ # Adding Model Value to store_schematicInfo
+ store_schematicInfo = self.obj_convert.addModelParameter(
+ store_schematicInfo)
+ print("Netlist After Adding Ngspice Model :", store_schematicInfo)
+
+ # Adding Device Library to SchematicInfo
+ store_schematicInfo = self.obj_convert.addDeviceLibrary(
+ store_schematicInfo, self.kicadFile)
+ print(
+ "Netlist After Adding Device Model Library :",
+ store_schematicInfo)
+
+ # Adding Subcircuit Library to SchematicInfo
+ store_schematicInfo = self.obj_convert.addSubcircuit(
+ store_schematicInfo, self.kicadFile)
+ print("Netlist After Adding subcircuits :", store_schematicInfo)
+
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"],
@@ -461,27 +508,28 @@ class MainWindow(QtGui.QWidget):
self.obj_track.TRAN_Parameter["ITEMS"],
self.obj_track.AC_type["ITEMS"],
self.obj_track.op_check)
-
- print("Analysis OutPut ",analysisoutput)
-
- #Calling netlist file generation function
- self.createNetlistFile(store_schematicInfo,plotText)
-
+
+ print("Analysis OutPut ", analysisoutput)
+
+ # Calling netlist file generation function
+ self.createNetlistFile(store_schematicInfo, plotText)
+
self.msg = "The Kicad to Ngspice Conversion completed successfully!"
- QtGui.QMessageBox.information(self, "Information", self.msg, QtGui.QMessageBox.Ok)
-
+ QtGui.QMessageBox.information(
+ self, "Information", self.msg, QtGui.QMessageBox.Ok)
+
except Exception as e:
- print("Exception Message: ",e)
+ print("Exception Message: ", e)
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(self.kicadFile)[0]
-
+
if self.clarg2 == "sub":
self.createSubFile(subPath)
-
- def createNetlistFile(self,store_schematicInfo,plotText):
+
+ def createNetlistFile(self, store_schematicInfo, plotText):
print("Creating Final netlist")
#print "INFOLINE",infoline
#print "OPTIONINFO",optionInfo
@@ -489,158 +537,154 @@ class MainWindow(QtGui.QWidget):
#print "SUBCKT ",subcktList
#print "OUTPUTOPTION",outputOption
#print "KicadfIle",kicadFile
- store_optionInfo = list(optionInfo) #To avoid writing optionInfo twice in final netlist
-
- #checking if analysis files is present
- (projpath,filename) = os.path.split(self.kicadFile)
- analysisFileLoc = os.path.join(projpath,"analysis")
+ # To avoid writing optionInfo twice in final netlist
+ store_optionInfo = list(optionInfo)
+
+ # checking if analysis files is present
+ (projpath, filename) = os.path.split(self.kicadFile)
+ analysisFileLoc = os.path.join(projpath, "analysis")
#print "Analysis File Location",analysisFileLoc
if os.path.exists(analysisFileLoc):
try:
f = open(analysisFileLoc)
- #Read data
+ # Read data
data = f.read()
# Close the file
f.close()
- except :
+ except BaseException:
print("Error While opening Project Analysis file. Please check it")
sys.exit()
else:
print(analysisFileLoc + " does not exist")
sys.exit()
-
- #Adding analysis file info to optionInfo
- analysisData=data.splitlines()
+
+ # Adding analysis file info to optionInfo
+ analysisData = data.splitlines()
for eachline in analysisData:
- eachline=eachline.strip()
- if len(eachline)>1:
- if eachline[0]=='.':
+ eachline = eachline.strip()
+ if len(eachline) > 1:
+ if eachline[0] == '.':
store_optionInfo.append(eachline)
else:
pass
-
+
#print "Option Info",optionInfo
analysisOption = []
- initialCondOption=[]
- simulatorOption =[]
- #includeOption=[] #Don't know why to use it
- #model = [] #Don't know why to use it
-
+ initialCondOption = []
+ simulatorOption = []
+ # includeOption=[] #Don't know why to use it
+ # model = [] #Don't know why to use it
+
for eachline in store_optionInfo:
- words=eachline.split()
- option=words[0]
- if (option=='.ac' or option=='.dc' or option=='.disto' or option=='.noise' or
- option=='.op' or option=='.pz' or option=='.sens' or option=='.tf' or
- option=='.tran'):
- analysisOption.append(eachline+'\n')
-
- elif (option=='.save' or option=='.print' or option=='.plot' or option=='.four'):
- eachline=eachline.strip('.')
- outputOption.append(eachline+'\n')
- elif (option=='.nodeset' or option=='.ic'):
- initialCondOption.append(eachline+'\n')
- elif option=='.option':
- simulatorOption.append(eachline+'\n')
- #elif (option=='.include' or option=='.lib'):
+ words = eachline.split()
+ option = words[0]
+ if (option == '.ac' or option == '.dc' or option == '.disto' or option == '.noise' or
+ option == '.op' or option == '.pz' or option == '.sens' or option == '.tf' or
+ option == '.tran'):
+ analysisOption.append(eachline + '\n')
+
+ elif (option == '.save' or option == '.print' or option == '.plot' or option == '.four'):
+ eachline = eachline.strip('.')
+ outputOption.append(eachline + '\n')
+ elif (option == '.nodeset' or option == '.ic'):
+ initialCondOption.append(eachline + '\n')
+ elif option == '.option':
+ simulatorOption.append(eachline + '\n')
+ # elif (option=='.include' or option=='.lib'):
# includeOption.append(eachline+'\n')
- #elif (option=='.model'):
+ # elif (option=='.model'):
# model.append(eachline+'\n')
- elif option=='.end':
- continue;
-
-
- #Start creating final netlist cir.out file
- outfile = self.kicadFile+".out"
- out=open(outfile,"w")
+ elif option == '.end':
+ continue
+
+ # Start creating final netlist cir.out file
+ outfile = self.kicadFile + ".out"
+ out = open(outfile, "w")
out.writelines(infoline)
out.writelines('\n')
- sections=[simulatorOption, initialCondOption, store_schematicInfo, analysisOption]
-
+ sections = [
+ simulatorOption,
+ initialCondOption,
+ store_schematicInfo,
+ analysisOption]
+
for section in sections:
if len(section) == 0:
continue
else:
for line in section:
- out.writelines('\n')
+ out.writelines('\n')
out.writelines(line)
-
+
out.writelines('\n* Control Statements \n')
out.writelines('.control\n')
out.writelines('run\n')
- #out.writelines(outputOption)
+ # out.writelines(outputOption)
out.writelines('print allv > plot_data_v.txt\n')
out.writelines('print alli > plot_data_i.txt\n')
for item in plotText:
- out.writelines(item+'\n')
+ out.writelines(item + '\n')
out.writelines('.endc\n')
out.writelines('.end\n')
out.close()
-
-
-
- def createSubFile(self,subPath):
+
+ def createSubFile(self, subPath):
self.project = subPath
self.projName = os.path.basename(self.project)
- if os.path.exists(self.project+".cir.out"):
+ if os.path.exists(self.project + ".cir.out"):
try:
- f = open(self.project+".cir.out")
- except :
+ f = open(self.project + ".cir.out")
+ except BaseException:
print("Error in opening .cir.out file.")
else:
- print(self.projName + ".cir.out does not exist. Please create a spice netlist.")
-
+ print(
+ self.projName +
+ ".cir.out does not exist. Please create a spice netlist.")
+
# Read the data from file
- data=f.read()
+ data = f.read()
# Close the file
-
+
f.close()
- newNetlist=[]
- netlist=iter(data.splitlines())
+ newNetlist = []
+ netlist = iter(data.splitlines())
for eachline in netlist:
- eachline=eachline.strip()
- if len(eachline)<1:
+ eachline = eachline.strip()
+ if len(eachline) < 1:
continue
- words=eachline.split()
+ 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]+" "
+ 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':
+ 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=next(netlist)
- eachline=eachline.strip()
- if len(eachline)<1:
+ eachline = next(netlist)
+ eachline = eachline.strip()
+ if len(eachline) < 1:
continue
- words=eachline.split()
+ words = eachline.split()
else:
newNetlist.append(eachline)
-
- outfile=self.project+".sub"
- out=open(outfile,"w")
+
+ 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')
-
+
+ for i in range(len(newNetlist), 0, -1):
+ newNetlist.insert(i, '\n')
+
out.writelines(newNetlist)
- out.writelines('\n')
-
+ out.writelines('\n')
+
out.writelines('.ends ' + self.projName)
- print("The subcircuit has been written in "+self.projName+".sub")
-
-
-
-
-
-
-
-
-
+ print("The subcircuit has been written in " + self.projName + ".sub")
diff --git a/src/kicadtoNgspice/Model.py b/src/kicadtoNgspice/Model.py
index 3f83b0d0..7366a593 100644
--- a/src/kicadtoNgspice/Model.py
+++ b/src/kicadtoNgspice/Model.py
@@ -7,73 +7,79 @@ import os
class Model(QtGui.QWidget):
"""
- This class creates Model Tab of KicadtoNgspice window.
+ This class creates Model Tab of KicadtoNgspice window.
The widgets are created dynamically in the Model Tab.
"""
-
- def __init__(self,schematicInfo,modelList,clarg1):
-
+
+ def __init__(self, schematicInfo, modelList, clarg1):
+
QtGui.QWidget.__init__(self)
-
- #Processing for getting previous values
+
+ # Processing for getting previous values
kicadFile = clarg1
- (projpath,filename) = os.path.split(kicadFile)
+ (projpath, filename) = os.path.split(kicadFile)
project_name = os.path.basename(projpath)
try:
- f = open(os.path.join(projpath,project_name+"_Previous_Values.json"),'r')
+ f = open(
+ os.path.join(
+ projpath,
+ project_name +
+ "_Previous_Values.json"),
+ 'r')
data = f.read()
json_data = json.loads(data)
- except:
+ except BaseException:
print("Model Previous Values JSON is Empty")
-
-
-
- #Creating track widget object
+
+ # Creating track widget object
self.obj_trac = TrackWidget.TrackWidget()
-
- #for increasing row and counting/tracking line edit widget
+
+ # for increasing row and counting/tracking line edit widget
self.nextrow = 0
self.nextcount = 0
-
- #for storing line edit details position details
+
+ # for storing line edit details position details
self.start = 0
self.end = 0
-
- #Creating GUI dynamically for Model tab
+
+ # Creating GUI dynamically for Model tab
self.grid = QtGui.QGridLayout()
self.setLayout(self.grid)
-
+
for line in modelList:
#print "ModelList Item:",line
- #Adding title label for model
- #Key: Tag name,Value:Entry widget number
- tag_dict = {}
+ # Adding title label for model
+ # Key: Tag name,Value:Entry widget number
+ tag_dict = {}
modelbox = QtGui.QGroupBox()
modelgrid = QtGui.QGridLayout()
modelbox.setTitle(line[5])
self.start = self.nextcount
- #line[7] is parameter dictionary holding parameter tags.
+ # line[7] is parameter dictionary holding parameter tags.
i = 0
- for key,value in line[7].items():
+ for key, value in line[7].items():
#print "Key : ",key
#print "Value : ",value
- #Check if value is iterable
+ # Check if value is iterable
if hasattr(value, '__iter__'):
- #For tag having vector value
+ # For tag having vector value
temp_tag = []
for item in value:
paramLabel = QtGui.QLabel(item)
modelgrid.addWidget(paramLabel, self.nextrow, 0)
- self.obj_trac.model_entry_var[self.nextcount] = QtGui.QLineEdit()
- modelgrid.addWidget(self.obj_trac.model_entry_var[self.nextcount], self.nextrow, 1)
+ self.obj_trac.model_entry_var[self.nextcount] = QtGui.QLineEdit(
+ )
+ modelgrid.addWidget(
+ self.obj_trac.model_entry_var[self.nextcount], self.nextrow, 1)
try:
for mod in json_data["model"]:
if json_data["model"][mod]["type"] == line[2] and mod == line[3]:
- self.obj_trac.model_entry_var[self.nextcount].setText(str(list(json_data["model"][mod]["values"][i].values())[0]))
+ self.obj_trac.model_entry_var[self.nextcount].setText(
+ str(list(json_data["model"][mod]["values"][i].values())[0]))
i = i + 1
- except:
+ except BaseException:
pass
temp_tag.append(self.nextcount)
@@ -84,16 +90,19 @@ class Model(QtGui.QWidget):
else:
paramLabel = QtGui.QLabel(value)
modelgrid.addWidget(paramLabel, self.nextrow, 0)
- self.obj_trac.model_entry_var[self.nextcount] = QtGui.QLineEdit()
- modelgrid.addWidget(self.obj_trac.model_entry_var[self.nextcount], self.nextrow, 1)
+ self.obj_trac.model_entry_var[self.nextcount] = QtGui.QLineEdit(
+ )
+ modelgrid.addWidget(
+ self.obj_trac.model_entry_var[self.nextcount], self.nextrow, 1)
try:
for mod in json_data["model"]:
if json_data["model"][mod]["type"] == line[2] and mod == line[3]:
- self.obj_trac.model_entry_var[self.nextcount].setText(str(list(json_data["model"][mod]["values"][i].values())[0]))
+ self.obj_trac.model_entry_var[self.nextcount].setText(
+ str(list(json_data["model"][mod]["values"][i].values())[0]))
i = i + 1
- except:
- pass
+ except BaseException:
+ pass
tag_dict[key] = self.nextcount
self.nextcount = self.nextcount + 1
@@ -102,17 +111,17 @@ class Model(QtGui.QWidget):
self.end = self.nextcount - 1
#print "End",self.end
modelbox.setLayout(modelgrid)
-
- #CSS
+
+ # CSS
modelbox.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(modelbox)
-
+
'''
- Listing all
+ Listing all
line[0] = index
line[1] = compLine
line[2] = modelname #Change from compType to modelname
@@ -122,20 +131,27 @@ class Model(QtGui.QWidget):
line[6] = type i.e analog or digital
Now adding start,end and tag_dict which will be line[7],line[8] and line[9] respectively
'''
-
- #This keeps the track of Model Tab Widget
- lst = [line[0], line[1], line[2], line[3], line[4], line[5], line[6], self.start, self.end, tag_dict]
+
+ # This keeps the track of Model Tab Widget
+ lst = [
+ line[0],
+ line[1],
+ line[2],
+ line[3],
+ line[4],
+ line[5],
+ line[6],
+ self.start,
+ self.end,
+ tag_dict]
check = 0
for itr in self.obj_trac.modelTrack:
if itr == lst:
- check = 1
-
- if check == 0:
+ check = 1
+
+ if check == 0:
self.obj_trac.modelTrack.append(lst)
-
+
#print "The tag dictionary : ",tag_dict
-
-
-
+
self.show()
-
diff --git a/src/kicadtoNgspice/Processing.py b/src/kicadtoNgspice/Processing.py
index f9d1b4a8..a175ac8b 100644
--- a/src/kicadtoNgspice/Processing.py
+++ b/src/kicadtoNgspice/Processing.py
@@ -3,221 +3,244 @@ import os
from xml.etree import ElementTree as ET
-
class PrcocessNetlist:
"""
- This class include all the function required for pre-proccessing of netlist
+ This class include all the function required for pre-proccessing of netlist
before converting to Ngspice Netlist.
"""
modelxmlDIR = '../modelParamXML'
+
def __init__(self):
pass
-
- def readNetlist(self,filename):
+
+ def readNetlist(self, filename):
f = open(filename)
- data=f.read()
+ data = f.read()
f.close()
return data.splitlines()
- def readParamInfo(self,kicadNetlis):
+ def readParamInfo(self, kicadNetlis):
"""Read Parameter information and store it into dictionary"""
- param={}
+ param = {}
for eachline in kicadNetlis:
print(eachline)
- eachline=eachline.strip()
- if len(eachline)>1:
- words=eachline.split()
- option=words[0].lower()
- if option=='.param':
+ eachline = eachline.strip()
+ if len(eachline) > 1:
+ words = eachline.split()
+ option = words[0].lower()
+ if option == '.param':
for i in range(1, len(words), 1):
- paramList=words[i].split('=')
- param[paramList[0]]=paramList[1]
+ paramList = words[i].split('=')
+ param[paramList[0]] = paramList[1]
return param
-
- def preprocessNetlist(self,kicadNetlis,param):
+
+ def preprocessNetlist(self, kicadNetlis, param):
"""Preprocess netlist (replace parameters)"""
- netlist=[]
+ netlist = []
for eachline in kicadNetlis:
- # Remove leading and trailing blanks spaces from line
- eachline=eachline.strip()
+ # Remove leading and trailing blanks spaces from line
+ eachline = eachline.strip()
# Remove special character $
- eachline=eachline.replace('$','')
+ eachline = eachline.replace('$', '')
# Replace parameter with values
for subParam in eachline.split():
if '}' in subParam:
- key=subParam.split()[0]
- key=key.strip('{')
- key=key.strip('}')
+ key = subParam.split()[0]
+ key = key.strip('{')
+ key = key.strip('}')
if key in param:
- eachline=eachline.replace('{'+key+'}',param[key])
+ eachline = eachline.replace(
+ '{' + key + '}', param[key])
else:
- print("Parameter " + key +" does not exists")
- value=input('Enter parameter value: ')
- eachline=eachline.replace('{'+key+'}',value)
- #Convert netlist into lower case letter
- eachline=eachline.lower()
+ print("Parameter " + key + " does not exists")
+ value = input('Enter parameter value: ')
+ eachline = eachline.replace('{' + key + '}', value)
+ # Convert netlist into lower case letter
+ eachline = eachline.lower()
# Construct netlist
- if len(eachline)>1:
- if eachline[0]=='+':
- netlist.append(netlist.pop()+eachline.replace('+',' '))
+ if len(eachline) > 1:
+ if eachline[0] == '+':
+ netlist.append(netlist.pop() + eachline.replace('+', ' '))
else:
netlist.append(eachline)
- #Copy information line
- infoline=netlist[0]
+ # Copy information line
+ infoline = netlist[0]
netlist.remove(netlist[0])
- return netlist,infoline
-
- def separateNetlistInfo(self,netlist):
- optionInfo=[]
- schematicInfo=[]
+ return netlist, infoline
+
+ def separateNetlistInfo(self, netlist):
+ optionInfo = []
+ schematicInfo = []
for eachline in netlist:
- if eachline[0]=='*':
+ if eachline[0] == '*':
continue
- elif eachline[0]=='.':
+ elif eachline[0] == '.':
optionInfo.append(eachline)
else:
schematicInfo.append(eachline)
- return optionInfo,schematicInfo
-
-
- def insertSpecialSourceParam(self,schematicInfo,sourcelist):
- #Inser Special source parameter
- schematicInfo1=[]
-
+ return optionInfo, schematicInfo
+
+ def insertSpecialSourceParam(self, schematicInfo, sourcelist):
+ # Inser Special source parameter
+ schematicInfo1 = []
+
print("Reading schematic info for source details")
-
+
for compline in schematicInfo:
- words=compline.split()
- compName=words[0]
+ words = compline.split()
+ compName = words[0]
# Ask for parameters of source
- if compName[0]=='v' or compName[0]=='i':
+ if compName[0] == 'v' or compName[0] == 'i':
# Find the index component from circuit
- index=schematicInfo.index(compline)
- if words[3]=="pulse":
- Title="Add parameters for pulse source "+compName
- v1=' Enter initial value(Volts/Amps): '
- v2=' Enter pulsed value(Volts/Amps): '
- td=' Enter delay time (seconds): '
- tr=' Enter rise time (seconds): '
- tf=' Enter fall time (seconds): '
- pw=' Enter pulse width (seconds): '
- tp=' Enter period (seconds): '
- sourcelist.append([index,compline,words[3],Title,v1,v2,td,tr,tf,pw,tp])
-
- elif words[3]=="sine":
- Title="Add parameters for sine source "+compName
- vo=' Enter offset value (Volts/Amps): '
- va=' Enter amplitude (Volts/Amps): '
- freq=' Enter frequency (Hz): '
- td=' Enter delay time (seconds): '
- theta=' Enter damping factor (1/seconds): '
- sourcelist.append([index,compline,words[3],Title,vo,va,freq,td,theta])
-
- elif words[3]=="pwl":
- Title="Add parameters for pwl source "+compName
- t_v=' Enter in pwl format without bracket i.e t1 v1 t2 v2.... '
- sourcelist.append([index,compline,words[3],Title,t_v])
-
- elif words[3]=="ac":
- Title="Add parameters for ac source "+compName
- v_a=' Enter amplitude (Volts/Amps): '
- p_a =' Enter Phase Shift: '
- sourcelist.append([index,compline,words[3],Title,v_a,p_a])
-
- elif words[3]=="exp":
- Title="Add parameters for exponential source "+compName
- v1=' Enter initial value(Volts/Amps): '
- v2=' Enter pulsed value(Volts/Amps): '
- td1=' Enter rise delay time (seconds): '
- tau1=' Enter rise time constant (seconds): '
- td2=' Enter fall time (seconds): '
- tau2=' Enter fall time constant (seconds): '
- sourcelist.append([index,compline,words[3],Title,v1,v2,td1,tau1,td2,tau2])
-
- elif words[3]=="dc":
- Title="Add parameters for DC source "+compName
- v1=' Enter value(Volts/Amps): '
- v2=' Enter zero frequency: '
- sourcelist.append([index,compline,words[3],Title,v1,v2])
-
- elif compName[0]=='h' or compName[0]=='f':
+ index = schematicInfo.index(compline)
+ if words[3] == "pulse":
+ Title = "Add parameters for pulse source " + compName
+ v1 = ' Enter initial value(Volts/Amps): '
+ v2 = ' Enter pulsed value(Volts/Amps): '
+ td = ' Enter delay time (seconds): '
+ tr = ' Enter rise time (seconds): '
+ tf = ' Enter fall time (seconds): '
+ pw = ' Enter pulse width (seconds): '
+ tp = ' Enter period (seconds): '
+ sourcelist.append(
+ [index, compline, words[3], Title, v1, v2, td, tr, tf, pw, tp])
+
+ elif words[3] == "sine":
+ Title = "Add parameters for sine source " + compName
+ vo = ' Enter offset value (Volts/Amps): '
+ va = ' Enter amplitude (Volts/Amps): '
+ freq = ' Enter frequency (Hz): '
+ td = ' Enter delay time (seconds): '
+ theta = ' Enter damping factor (1/seconds): '
+ sourcelist.append(
+ [index, compline, words[3], Title, vo, va, freq, td, theta])
+
+ elif words[3] == "pwl":
+ Title = "Add parameters for pwl source " + compName
+ t_v = ' Enter in pwl format without bracket i.e t1 v1 t2 v2.... '
+ sourcelist.append([index, compline, words[3], Title, t_v])
+
+ elif words[3] == "ac":
+ Title = "Add parameters for ac source " + compName
+ v_a = ' Enter amplitude (Volts/Amps): '
+ p_a = ' Enter Phase Shift: '
+ sourcelist.append(
+ [index, compline, words[3], Title, v_a, p_a])
+
+ elif words[3] == "exp":
+ Title = "Add parameters for exponential source " + compName
+ v1 = ' Enter initial value(Volts/Amps): '
+ v2 = ' Enter pulsed value(Volts/Amps): '
+ td1 = ' Enter rise delay time (seconds): '
+ tau1 = ' Enter rise time constant (seconds): '
+ td2 = ' Enter fall time (seconds): '
+ tau2 = ' Enter fall time constant (seconds): '
+ sourcelist.append(
+ [index, compline, words[3], Title, v1, v2, td1, tau1, td2, tau2])
+
+ elif words[3] == "dc":
+ Title = "Add parameters for DC source " + compName
+ v1 = ' Enter value(Volts/Amps): '
+ v2 = ' Enter zero frequency: '
+ sourcelist.append(
+ [index, compline, words[3], Title, v1, v2])
+
+ elif compName[0] == 'h' or compName[0] == 'f':
# Find the index component from the circuit
- index=schematicInfo.index(compline)
+ index = schematicInfo.index(compline)
schematicInfo.remove(compline)
- schematicInfo.insert(index,"* "+compName)
- schematicInfo1.append("V"+compName+" "+words[3]+" "+words[4]+" 0")
- schematicInfo1.append(compName+" "+words[1]+" "+words[2]+" "+"V"+compName+" "+words[5])
-
- schematicInfo=schematicInfo+schematicInfo1
- print("Source List : ",sourcelist)
+ schematicInfo.insert(index, "* " + compName)
+ schematicInfo1.append(
+ "V" + compName + " " + words[3] + " " + words[4] + " 0")
+ schematicInfo1.append(
+ compName +
+ " " +
+ words[1] +
+ " " +
+ words[2] +
+ " " +
+ "V" +
+ compName +
+ " " +
+ words[5])
+
+ schematicInfo = schematicInfo + schematicInfo1
+ print("Source List : ", sourcelist)
#print schematicInfo
- return schematicInfo,sourcelist
-
-
- def convertICintoBasicBlocks(self,schematicInfo,outputOption,modelList,plotText):
+ return schematicInfo, sourcelist
+
+ def convertICintoBasicBlocks(
+ self, schematicInfo, outputOption, modelList, plotText):
print("Reading Schematic info for Model")
- #Insert details of Ngspice model
+ # Insert details of Ngspice model
unknownModelList = []
multipleModelList = []
- plotList = ['plot_v1','plot_v2','plot_i2','plot_log','plot_db','plot_phase']
- interMediateNodeCount=1
+ plotList = [
+ 'plot_v1',
+ 'plot_v2',
+ 'plot_i2',
+ 'plot_log',
+ 'plot_db',
+ 'plot_phase']
+ interMediateNodeCount = 1
k = 1
for compline in schematicInfo:
words = compline.split()
compName = words[0]
#print "Compline----------------->",compline
#print "compName-------------->",compName
- # Find the IC from schematic
- if compName[0]=='u' or compName[0] == 'U':
+ # Find the IC from schematic
+ if compName[0] == 'u' or compName[0] == 'U':
# Find the component from the circuit
- index=schematicInfo.index(compline)
- compType=words[len(words)-1];
+ index = schematicInfo.index(compline)
+ compType = words[len(words) - 1]
schematicInfo.remove(compline)
paramDict = {}
- #e.g compLine : u1 1 2 gain
- #compType : gain
- #compName : u1
- #print "Compline",compline
+ # e.g compLine : u1 1 2 gain
+ # compType : gain
+ # compName : u1
+ #print "Compline",compline
#print "CompType",compType
#print "Words",words
#print "compName",compName
- #Looking if model file is present
+ # Looking if model file is present
if compType != "port" and compType != "ic" and compType not in plotList and compType != 'transfo':
- xmlfile = compType+".xml" #XML Model File
- count = 0 #Check if model of same name 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)]
+ 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))
-
+ 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 Previous Values XML for ngspice model :",modelPath)
+ print(
+ "Start Parsing Previous Values XML for ngspice model :", modelPath)
tree = ET.parse(modelPath[0])
-
+
root = tree.getroot()
- #Getting number of nodes for model and title
+ # 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
+ title = child.text + " " + compName
elif child.tag == 'name':
modelname = child.text
elif child.tag == 'type':
- #Checking for Analog and Digital
+ # 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
@@ -226,155 +249,173 @@ class PrcocessNetlist:
#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))
+ 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
+ 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
+ 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
+ # 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 = "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)+" "
+ print("Split Details :", splitDetail)
+ modelLine = "a" + str(k) + " "
vectorDetail = splitDetail.split(':')
#print "Vector Details",vectorDetail
- pos = 1 #Node position
+ pos = 1 # Node position
for item in vectorDetail:
try:
if item.split("-")[1] == 'V':
#print "Vector"
if compType == "aswitch":
modelLine += "("
- for i in range(0,int(item.split("-")[0])):
- modelLine += words[pos]+" "
+ for i in range(0, int(
+ item.split("-")[0])):
+ modelLine += words[pos] + " "
pos += 1
modelLine += ") "
else:
modelLine += "["
- for i in range(0,int(item.split("-")[0])):
- modelLine += words[pos]+" "
+ for i in range(0, int(
+ item.split("-")[0])):
+ modelLine += words[pos] + " "
pos += 1
- modelLine += "] "
+ modelLine += "] "
elif item.split("-")[1] == 'NV':
- #print "Non Vector"
- for i in range(0,int(item.split("-")[0])):
- modelLine += words[pos]+" "
+ #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")
+
+ except BaseException:
+ print(
+ "There is error while processing Vector Details")
sys.exit(2)
- modelLine += compName
-
+ modelLine += compName
+
#print "Final Model Line :",modelLine
try:
schematicInfo.append(modelLine)
- k=k+1
+ 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])
+ 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 Exception as e:
- print("Unable to parse the model, Please check your your XML file")
- print("Exception Message : ",str(e))
+ print(
+ "Unable to parse the model, Please check your your XML file")
+ print("Exception Message : ", str(e))
sys.exit(2)
elif compType == "ic":
- schematicInfo.insert(index,"* "+compline)
+ schematicInfo.insert(index, "* " + compline)
modelname = "ic"
- comment = "* "+compline
- title = "Initial Condition for "+compName
- type = "NA" #Its is not model
- text = "Enter initial voltage at node for "+compline
+ comment = "* " + compline
+ title = "Initial Condition for " + compName
+ type = "NA" # Its is not model
+ text = "Enter initial voltage at node for " + compline
paramDict[title] = text
- modelList.append([index,compline,modelname,compName,comment,title,type,paramDict])
-
+ modelList.append(
+ [index, compline, modelname, compName, comment, title, type, paramDict])
+
elif compType in plotList:
- schematicInfo.insert(index,"* "+compline)
+ schematicInfo.insert(index, "* " + compline)
if compType == 'plot_v1':
words = compline.split()
- plotText.append("plot v("+words[1]+")")
+ plotText.append("plot v(" + words[1] + ")")
elif compType == 'plot_v2':
words = compline.split()
- plotText.append("plot v("+words[1]+","+words[2]+")")
+ plotText.append(
+ "plot v(" + words[1] + "," + words[2] + ")")
elif compType == 'plot_i2':
words = compline.split()
- #Adding zero voltage source to netlist
- schematicInfo.append("v_"+words[0]+" "+words[1]+" "+words[2]+" "+"0")
- plotText.append("plot i(v_"+words[0]+")")
+ # Adding zero voltage source to netlist
+ schematicInfo.append(
+ "v_" + words[0] + " " + words[1] + " " + words[2] + " " + "0")
+ plotText.append("plot i(v_" + words[0] + ")")
elif compType == 'plot_log':
words = compline.split()
- plotText.append("plot log("+words[1]+")")
+ plotText.append("plot log(" + words[1] + ")")
elif compType == 'plot_db':
words = compline.split()
- plotText.append("plot db("+words[1]+")")
+ plotText.append("plot db(" + words[1] + ")")
elif compType == 'plot_phase':
words = compline.split()
- plotText.append("plot phase("+words[1]+")")
-
+ plotText.append("plot phase(" + words[1] + ")")
+
elif compType == 'transfo':
- schematicInfo.insert(index,"* "+compline)
-
- #For Primary Couple
- modelLine = "a"+str(k)+" ("+words[1]+" "+words[2]+") (interNode_"+str(interMediateNodeCount)+" "+words[3]+") "
- modelLine += compName+"_primary"
+ schematicInfo.insert(index, "* " + compline)
+
+ # For Primary Couple
+ modelLine = "a" + str(k) + " (" + words[1] + " " + words[2] + ") (interNode_" + str(
+ interMediateNodeCount) + " " + words[3] + ") "
+ modelLine += compName + "_primary"
schematicInfo.append(modelLine)
- k=k+1
- #For iron core
- modelLine = "a"+str(k)+" ("+words[4]+" "+words[2]+") (interNode_"+str(interMediateNodeCount+1)+" "+words[3]+") "
- modelLine += compName+"_secondary"
+ k = k + 1
+ # For iron core
+ modelLine = "a" + str(k) + " (" + words[4] + " " + words[2] + ") (interNode_" + str(
+ interMediateNodeCount + 1) + " " + words[3] + ") "
+ modelLine += compName + "_secondary"
schematicInfo.append(modelLine)
- k=k+1
- #For Secondary Couple
- modelLine = "a"+str(k)+" (interNode_"+str(interMediateNodeCount)+" interNode_"+str(interMediateNodeCount+1)+") "
- modelLine += compName+"_iron_core"
+ k = k + 1
+ # For Secondary Couple
+ modelLine = "a" + str(k) + " (interNode_" + str(
+ interMediateNodeCount) + " interNode_" + str(interMediateNodeCount + 1) + ") "
+ modelLine += compName + "_iron_core"
schematicInfo.append(modelLine)
- k=k+1
+ k = k + 1
interMediateNodeCount += 2
-
+
modelname = "transfo"
- comment = "* "+compline
- title = "Transformer details for model "+compName
- type = "NA" #It is model but do not load from xml and lib file
+ comment = "* " + compline
+ title = "Transformer details for model " + compName
+ type = "NA" # It is model but do not load from xml and lib file
paramDict['h1_array'] = "Enter the H1 array "
paramDict['primary_turns'] = "Enter the primary number of turns (default=310) "
paramDict['area'] = "Enter iron core area (default=1)"
paramDict['secondar_turns'] = "Enter the secondary number of turns (default=620)"
paramDict['length'] = "Enter iron core length (default=0.01)"
paramDict['b1_array'] = "Enter the B1 array "
-
-
- modelList.append([index,compline,modelname,compName,comment,title,type,paramDict])
-
+
+ modelList.append(
+ [index, compline, modelname, compName, comment, title, type, paramDict])
+
else:
- schematicInfo.insert(index,"* "+compline)
-
- print("UnknownModelList Used in the Schematic",unknownModelList)
- print("Multiple Model XML file with same name ",multipleModelList)
- print("Model List Details : ",modelList)
-
- return schematicInfo,outputOption,modelList,unknownModelList,multipleModelList,plotText
-
-
-
+ schematicInfo.insert(index, "* " + compline)
+
+ print(
+ "UnknownModelList Used in the Schematic",
+ unknownModelList)
+ print(
+ "Multiple Model XML file with same name ",
+ multipleModelList)
+ print("Model List Details : ", modelList)
+
+ return schematicInfo, outputOption, modelList, unknownModelList, multipleModelList, plotText
diff --git a/src/kicadtoNgspice/Source.py b/src/kicadtoNgspice/Source.py
index 91ee8d43..613b7b36 100644
--- a/src/kicadtoNgspice/Source.py
+++ b/src/kicadtoNgspice/Source.py
@@ -4,52 +4,56 @@ from . import TrackWidget
#from xml.etree import ElementTree as ET
import json
+
class Source(QtGui.QWidget):
"""
This class create Source Tab of KicadtoNgSpice Window.
"""
-
- def __init__(self,sourcelist,sourcelisttrack,clarg1):
+
+ def __init__(self, sourcelist, sourcelisttrack, clarg1):
QtGui.QWidget.__init__(self)
- self.obj_track = TrackWidget.TrackWidget()
- #Variable
+ self.obj_track = TrackWidget.TrackWidget()
+ # Variable
self.count = 1
- self.clarg1=clarg1
+ self.clarg1 = clarg1
self.start = 0
self.end = 0
self.row = 0
self.entry_var = {}
#self.font = QtGui.QFont("Times",20,QtGui.QFont.Bold,True)
-
- #Creating Source Widget
- self.createSourceWidget(sourcelist,sourcelisttrack)
-
-
-
- def createSourceWidget(self,sourcelist,sourcelisttrack):
+
+ # Creating Source Widget
+ self.createSourceWidget(sourcelist, sourcelisttrack)
+
+ def createSourceWidget(self, sourcelist, sourcelisttrack):
"""
This function dynamically create source widget in the Source tab of KicadtoNgSpice window
"""
kicadFile = self.clarg1
- (projpath,filename) = os.path.split(kicadFile)
+ (projpath, filename) = os.path.split(kicadFile)
project_name = os.path.basename(projpath)
try:
- f = open(os.path.join(projpath,project_name+"_Previous_Values.json"),'r')
+ f = open(
+ os.path.join(
+ projpath,
+ project_name +
+ "_Previous_Values.json"),
+ 'r')
data = f.read()
json_data = json.loads(data)
- except:
+ except BaseException:
print("Source Previous Values JSON is Empty")
-
+
self.grid = QtGui.QGridLayout()
self.setLayout(self.grid)
-
+
if sourcelist:
for line in sourcelist:
#print "Voltage source line index: ",line[0]
- print("SourceList line: ",line)
- track_id=line[0]
+ print("SourceList line: ", line)
+ track_id = line[0]
#print "track_id is ",track_id
if line[2] == 'ac':
acbox = QtGui.QGroupBox()
@@ -69,7 +73,8 @@ class Source(QtGui.QWidget):
self.entry_var[self.count] = QtGui.QLineEdit()
self.entry_var[self.count].setMaximumWidth(150)
- acgrid.addWidget(self.entry_var[self.count], self.row + 1, 1)
+ acgrid.addWidget(
+ self.entry_var[self.count], self.row + 1, 1)
self.entry_var[self.count].setText("")
self.count += 1
@@ -77,30 +82,32 @@ class Source(QtGui.QWidget):
for key in json_data["source"]:
templist1 = line[1]
templist2 = templist1.split(' ')
-
- if key==templist2[0] and json_data["source"][key]["type"]==line[2]:
- self.entry_var[self.count-2].setText(str(json_data["source"][key]["values"][0]["Amplitude"]))
- self.entry_var[self.count-1].setText(str(json_data["source"][key]["values"][1]["Phase"]))
- except:
+ if key == templist2[0] and json_data["source"][key]["type"] == line[2]:
+ self.entry_var[self.count - 2].setText(
+ str(json_data["source"][key]["values"][0]["Amplitude"]))
+ self.entry_var[self.count - 1].setText(
+ str(json_data["source"][key]["values"][1]["Phase"]))
+
+ except BaseException:
pass
- #Value Need to check previuouse value
- #self.entry_var[self.count].setText("")
+ # Value Need to check previuouse value
+ # self.entry_var[self.count].setText("")
self.row = self.row + 1
self.end = self.count + 1
self.count = self.count + 1
acbox.setLayout(acgrid)
-
- #CSS
+
+ # CSS
acbox.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(acbox)
- sourcelisttrack.append([track_id, 'ac', self.start, self.end])
-
-
+ sourcelisttrack.append(
+ [track_id, 'ac', self.start, self.end])
+
elif line[2] == 'dc':
dcbox = QtGui.QGroupBox()
dcbox.setTitle(line[3])
@@ -120,38 +127,41 @@ class Source(QtGui.QWidget):
templist2 = templist1.split(' ')
if key == templist2[0] and json_data["source"][key]["type"] == line[2]:
- self.entry_var[self.count].setText(str(json_data["source"][key]["values"][0]["Value"]))
+ self.entry_var[self.count].setText(
+ str(json_data["source"][key]["values"][0]["Value"]))
- except:
+ except BaseException:
pass
-
+
self.row = self.row + 1
self.end = self.count
self.count = self.count + 1
dcbox.setLayout(dcgrid)
-
- #CSS
+
+ # CSS
dcbox.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(dcbox)
- sourcelisttrack.append([track_id, 'dc', self.start, self.end])
-
+ sourcelisttrack.append(
+ [track_id, 'dc', self.start, self.end])
+
elif line[2] == 'sine':
sinebox = QtGui.QGroupBox()
sinebox.setTitle(line[3])
sinegrid = QtGui.QGridLayout()
- self.row = self.row+1
+ self.row = self.row + 1
self.start = self.count
-
+
for it in range(4, 9):
label = QtGui.QLabel(line[it])
sinegrid.addWidget(label, self.row, 0)
self.entry_var[self.count] = QtGui.QLineEdit()
self.entry_var[self.count].setMaximumWidth(150)
- sinegrid.addWidget(self.entry_var[self.count], self.row, 1)
+ sinegrid.addWidget(
+ self.entry_var[self.count], self.row, 1)
self.entry_var[self.count].setText("")
try:
@@ -159,25 +169,26 @@ class Source(QtGui.QWidget):
templist1 = line[1]
templist2 = templist1.split(' ')
if key == templist2[0] and json_data["source"][key]["type"] == line[2]:
- self.entry_var[self.count].setText(str(list(json_data["source"][key]["values"][it-4].values())[0]))
- except:
+ self.entry_var[self.count].setText(
+ str(list(json_data["source"][key]["values"][it - 4].values())[0]))
+ except BaseException:
pass
-
-
+
self.row = self.row + 1
- self.count = self.count + 1
+ self.count = self.count + 1
self.end = self.count - 1
sinebox.setLayout(sinegrid)
-
- #CSS
+
+ # CSS
sinebox.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(sinebox)
- sourcelisttrack.append([track_id, 'sine', self.start, self.end])
-
+ sourcelisttrack.append(
+ [track_id, 'sine', self.start, self.end])
+
elif line[2] == 'pulse':
pulsebox = QtGui.QGroupBox()
pulsebox.setTitle(line[3])
@@ -189,33 +200,36 @@ class Source(QtGui.QWidget):
pulsegrid.addWidget(label, self.row, 0)
self.entry_var[self.count] = QtGui.QLineEdit()
self.entry_var[self.count].setMaximumWidth(150)
- pulsegrid.addWidget(self.entry_var[self.count], self.row, 1)
+ pulsegrid.addWidget(
+ self.entry_var[self.count], self.row, 1)
self.entry_var[self.count].setText("")
-
+
try:
for key in json_data["source"]:
templist1 = line[1]
templist2 = templist1.split(' ')
if key == templist2[0] and json_data["source"][key]["type"] == line[2]:
- self.entry_var[self.count].setText(str(list(json_data["source"][key]["values"][it-4].values())[0]))
- except:
+ self.entry_var[self.count].setText(
+ str(list(json_data["source"][key]["values"][it - 4].values())[0]))
+ except BaseException:
pass
-
+
self.row = self.row + 1
self.count = self.count + 1
self.end = self.count - 1
pulsebox.setLayout(pulsegrid)
-
- #CSS
+
+ # CSS
pulsebox.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(pulsebox)
- sourcelisttrack.append([track_id, 'pulse', self.start, self.end])
-
+ sourcelisttrack.append(
+ [track_id, 'pulse', self.start, self.end])
+
elif line[2] == 'pwl':
pwlbox = QtGui.QGroupBox()
pwlbox.setTitle(line[3])
@@ -227,81 +241,76 @@ class Source(QtGui.QWidget):
self.entry_var[self.count].setMaximumWidth(150)
pwlgrid.addWidget(self.entry_var[self.count], self.row, 1)
self.entry_var[self.count].setText("")
-
+
try:
for key in json_data["source"]:
templist1 = line[1]
templist2 = templist1.split(' ')
if key == templist2[0] and json_data["source"][key]["type"] == line[2]:
- self.entry_var[self.count].setText(str(json_data["source"][key]["values"][0]["Enter in pwl format"]))
- except:
+ self.entry_var[self.count].setText(
+ str(json_data["source"][key]["values"][0]["Enter in pwl format"]))
+ except BaseException:
pass
-
-
+
self.row = self.row + 1
self.end = self.count
self.count = self.count + 1
pwlbox.setLayout(pwlgrid)
-
- #CSS
+
+ # CSS
pwlbox.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(pwlbox)
- sourcelisttrack.append([track_id, 'pwl', self.start, self.end])
-
+ sourcelisttrack.append(
+ [track_id, 'pwl', self.start, self.end])
+
elif line[2] == 'exp':
expbox = QtGui.QGroupBox()
expbox.setTitle(line[3])
expgrid = QtGui.QGridLayout()
self.start = self.count
- for it in range(4,10):
+ for it in range(4, 10):
label = QtGui.QLabel(line[it])
expgrid.addWidget(label, self.row, 0)
self.entry_var[self.count] = QtGui.QLineEdit()
self.entry_var[self.count].setMaximumWidth(150)
- expgrid.addWidget(self.entry_var[self.count], self.row, 1)
+ expgrid.addWidget(
+ self.entry_var[self.count], self.row, 1)
self.entry_var[self.count].setText("")
-
+
try:
for key in json_data["source"]:
templist1 = line[1]
templist2 = templist1.split(' ')
if key == templist2[0] and json_data["source"][key]["type"] == line[2]:
- self.entry_var[self.count].setText(str(list(json_data["source"][key]["values"][it-4].values())[0]))
- except:
+ self.entry_var[self.count].setText(
+ str(list(json_data["source"][key]["values"][it - 4].values())[0]))
+ except BaseException:
pass
-
-
+
self.row = self.row + 1
self.count = self.count + 1
self.end = self.count - 1
expbox.setLayout(expgrid)
-
- #CSS
+
+ # CSS
expbox.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(expbox)
- sourcelisttrack.append([track_id, 'exp', self.start, self.end])
-
+ sourcelisttrack.append(
+ [track_id, 'exp', self.start, self.end])
+
else:
print("No source is present in your circuit")
-
-
- #This is used to keep the track of dynamically created widget
+
+ # This is used to keep the track of dynamically created widget
self.obj_track.sourcelisttrack["ITEMS"] = sourcelisttrack
self.obj_track.source_entry_var["ITEMS"] = self.entry_var
self.show()
-
-
-
-
-
-
-
diff --git a/src/kicadtoNgspice/SubcircuitTab.py b/src/kicadtoNgspice/SubcircuitTab.py
index 7a4469df..249b636b 100644
--- a/src/kicadtoNgspice/SubcircuitTab.py
+++ b/src/kicadtoNgspice/SubcircuitTab.py
@@ -5,56 +5,62 @@ from projManagement import Validation
import os
#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, clarg1):
kicadFile = clarg1
- (projpath,filename) = os.path.split(kicadFile)
+ (projpath, filename) = os.path.split(kicadFile)
project_name = os.path.basename(projpath)
try:
- f = open(os.path.join(projpath,project_name+"_Previous_Values.json"),'r')
+ f = open(
+ os.path.join(
+ projpath,
+ project_name +
+ "_Previous_Values.json"),
+ 'r')
data = f.read()
json_data = json.loads(data)
- except:
+ except BaseException:
print("Subcircuit Previous values JSON is Empty")
QtGui.QWidget.__init__(self)
-
- #Creating track widget object
+
+ # Creating track widget object
self.obj_trac = TrackWidget.TrackWidget()
-
- #Creating validation object
+
+ # Creating validation object
self.obj_validation = Validation.Validation()
- #Row and column count
+ # Row and column count
self.row = 0
- self.count = 1 #Entry count
+ self.count = 1 # Entry count
self.entry_var = {}
- self.subcircuit_dict_beg = {}
- self.subcircuit_dict_end = {}
- #List to hold information about subcircuit
+ self.subcircuit_dict_beg = {}
+ self.subcircuit_dict_end = {}
+ # List to hold information about subcircuit
self.subDetail = {}
-
- #Stores the number of ports in each subcircuit
+
+ # Stores the number of ports in each subcircuit
self.numPorts = []
-
- #Set Layout
+
+ # Set Layout
self.grid = QtGui.QGridLayout()
self.setLayout(self.grid)
-
+
for eachline in schematicInfo:
words = eachline.split()
if eachline[0] == 'x':
- print("Subcircuit : Words",words[0])
- self.obj_trac.subcircuitList[project_name+words[0]] = words
+ print(("Subcircuit : Words", words[0]))
+ self.obj_trac.subcircuitList[project_name + words[0]] = words
self.subcircuit_dict_beg[words[0]] = self.count
subbox = QtGui.QGroupBox()
subgrid = QtGui.QGridLayout()
- subbox.setTitle("Add subcircuit for "+words[len(words)-1])
+ subbox.setTitle("Add subcircuit for " + words[len(words) - 1])
self.entry_var[self.count] = QtGui.QLineEdit()
self.entry_var[self.count].setText("")
@@ -64,40 +70,42 @@ class SubcircuitTab(QtGui.QWidget):
if key[0] == eachline[0] and key[1] == eachline[1]:
#print "Subcircuit MATCHING---",child.tag[0], child.tag[1], eachline[0], eachline[1]
try:
- if os.path.exists(json_data["subcircuit"][key][0]):
- self.entry_var[self.count].setText(json_data["subcircuit"][key][0])
+ if os.path.exists(
+ json_data["subcircuit"][key][0]):
+ self.entry_var[self.count].setText(
+ json_data["subcircuit"][key][0])
path_name = json_data["subcircuit"][key][0]
else:
self.entry_var[self.count].setText("")
- except:
+ except BaseException:
print("Error when set text of subcircuit")
- except:
+ except BaseException:
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("Number of ports of sub circuit : ",self.numPorts)
+ 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(("Number of ports of sub circuit : ", self.numPorts))
self.addbtn.clicked.connect(self.trackSubcircuit)
subgrid.addWidget(self.addbtn, self.row, 2)
subbox.setLayout(subgrid)
-
- #CSS
+
+ # 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
+
+ # Adding Subcircuit Details
self.subDetail[self.count] = words[0]
-
- #Increment row and widget count
+
+ # Increment row and widget count
if self.entry_var[self.count].text() == "":
pass
@@ -107,10 +115,9 @@ class SubcircuitTab(QtGui.QWidget):
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
@@ -118,49 +125,59 @@ class SubcircuitTab(QtGui.QWidget):
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])
+
+ 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
+ # 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
-
+
+ # 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.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.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):
-
+ 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])
+ self.reply = self.obj_validation.validateSub(
+ self.subfile, self.numPorts[self.widgetObjCount - 1])
if self.reply == "True":
- #Setting Library to Text Edit Line
+ # 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
-
+
+ # 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.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.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 56e84ce3..dcf85dca 100644
--- a/src/kicadtoNgspice/TrackWidget.py
+++ b/src/kicadtoNgspice/TrackWidget.py
@@ -2,28 +2,28 @@ class TrackWidget:
"""
This Class track the dynamically created widget of KicadtoNgSpice Window.
"""
- #Track widget list for Source details
- sourcelisttrack = {"ITEMS":"None"}
- source_entry_var = {"ITEMS":"None"}
-
- #Track widget for analysis inserter details
- AC_entry_var = {"ITEMS":"None"}
- AC_Parameter = {"ITEMS":"None"}
- DC_entry_var = {"ITEMS":"None"}
- DC_Parameter = {"ITEMS":"None"}
- TRAN_entry_var = {"ITEMS":"None"}
- TRAN_Parameter = {"ITEMS":"None"}
- set_CheckBox = {"ITEMS":"None"}
- AC_type = {"ITEMS":"None"}
+ # Track widget list for Source details
+ sourcelisttrack = {"ITEMS": "None"}
+ source_entry_var = {"ITEMS": "None"}
+
+ # Track widget for analysis inserter details
+ AC_entry_var = {"ITEMS": "None"}
+ AC_Parameter = {"ITEMS": "None"}
+ DC_entry_var = {"ITEMS": "None"}
+ DC_Parameter = {"ITEMS": "None"}
+ TRAN_entry_var = {"ITEMS": "None"}
+ TRAN_Parameter = {"ITEMS": "None"}
+ set_CheckBox = {"ITEMS": "None"}
+ AC_type = {"ITEMS": "None"}
op_check = []
- #Track widget for Model detail
+ # Track widget for Model detail
modelTrack = []
model_entry_var = {}
-
- #Track Widget for Device Model detail
+
+ # Track Widget for Device Model detail
deviceModelTrack = {}
-
- #Track Widget for Subcircuits where directory has been selected
+
+ # 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
+ # Track subcircuits which are specified in .cir file
+ subcircuitList = {}