diff options
author | Fahim | 2016-02-17 17:00:35 +0530 |
---|---|---|
committer | Fahim | 2016-02-17 17:00:35 +0530 |
commit | d634304de8022c499b1a4a23c85aa5f124539d93 (patch) | |
tree | 9ec07da28a569b4ebc54c69eba778809457f451d /src | |
parent | 9b6b022edb89e14fa83c3c1d6ebf0a9f96500b1a (diff) | |
parent | 8a6f29decb7793e678aa8492f4f8d899087f2f68 (diff) | |
download | eSim-d634304de8022c499b1a4a23c85aa5f124539d93.tar.gz eSim-d634304de8022c499b1a4a23c85aa5f124539d93.tar.bz2 eSim-d634304de8022c499b1a4a23c85aa5f124539d93.zip |
Merge branch 'develop'
Conflicts:
kicadSchematicLibrary/kicad.pro
src/ngspicetoModelica/__init__.py
Diffstat (limited to 'src')
-rw-r--r-- | src/browser/pages/welcome.html | 4 | ||||
-rw-r--r-- | src/configuration/Appconfig.py | 1 | ||||
-rwxr-xr-x | src/deviceModelLibrary/Diode/D.lib | 22 | ||||
-rw-r--r-- | src/deviceModelLibrary/Diode/D.xml | 15 | ||||
-rwxr-xr-x | src/deviceModelLibrary/Templates/D.lib | 5 | ||||
-rw-r--r-- | src/deviceModelLibrary/Templates/D.xml | 29 | ||||
-rwxr-xr-x | src/frontEnd/Application.py | 211 | ||||
-rwxr-xr-x | src/frontEnd/Application.py.bkp | 363 | ||||
-rw-r--r-- | src/frontEnd/Workspace.py | 2 | ||||
-rw-r--r-- | src/kicadtoNgspice/DeviceModel.py | 6 | ||||
-rw-r--r-- | src/kicadtoNgspice/KicadtoNgspice.py | 11 | ||||
-rw-r--r-- | src/kicadtoNgspice/KicadtoNgspice.py.bkp | 671 | ||||
-rw-r--r-- | src/kicadtoNgspice/Processing.py | 37 | ||||
-rw-r--r-- | src/modelParamXML/Nghdl/inverter.xml | 1 | ||||
-rw-r--r-- | src/modelParamXML/Nghdl/myxor.xml | 1 | ||||
-rw-r--r-- | src/ngspiceSimulation/NgspiceWidget.py | 5 | ||||
-rw-r--r-- | src/ngspiceSimulation/pythonPlotting.py | 4 | ||||
-rw-r--r-- | src/ngspicetoModelica/NgspicetoModelica.py | 786 | ||||
-rw-r--r-- | src/ngspicetoModelica/__init__.py | 0 | ||||
-rw-r--r-- | src/projManagement/Kicad.py | 7 | ||||
-rw-r--r-- | src/projManagement/Validation.py | 22 |
21 files changed, 1070 insertions, 1133 deletions
diff --git a/src/browser/pages/welcome.html b/src/browser/pages/welcome.html index f525d5c1..9343b8b0 100644 --- a/src/browser/pages/welcome.html +++ b/src/browser/pages/welcome.html @@ -40,7 +40,7 @@ pre{ <p> <b>eSim</b> is an open source EDA tool for circuit design, simulation, analysis and PCB design. It is an integrated tool built using open source software such as KiCad (<a href=http://www.kicad-pcb.org>http://www.kicad-pcb.org</a>) and Ngspice(<a href=http://ngspice.sourceforge.net>http://ngspice.sourceforge.net</a>). <br/> -eSim source is released under <b>GNU General Public License.</b> +eSim source is released under <b>GNU General Public License V3.</b> </p> <br/> <p> @@ -48,7 +48,7 @@ eSim is developed by the <b>FOSSEE team at IIT Bombay</b>. To know more about eS </p> <br /> <p> -To discuss more about eSim please visits at <a href=http://freeeda.in>http://freeeda.in</a> +To discuss more about eSim please visits at <a href=http://esim.fossee.in>http://esim.fossee.in</a> </p> <br /> diff --git a/src/configuration/Appconfig.py b/src/configuration/Appconfig.py index 16e440ab..0d3e0346 100644 --- a/src/configuration/Appconfig.py +++ b/src/configuration/Appconfig.py @@ -44,6 +44,7 @@ class Appconfig(QtGui.QWidget): project_explorer = json.load(open(dictPath)) except: project_explorer= {} + process_obj = [] def __init__(self): super(Appconfig, self).__init__() diff --git a/src/deviceModelLibrary/Diode/D.lib b/src/deviceModelLibrary/Diode/D.lib index ef18bb50..8a7fb4da 100755 --- a/src/deviceModelLibrary/Diode/D.lib +++ b/src/deviceModelLibrary/Diode/D.lib @@ -1,20 +1,2 @@ -.MODEL D1N750 D( -+ Vj=.75 -+ Nbvl=14.976 -+ Cjo=175p -+ Rs=.25 -+ Isr=1.859n -+ Eg=1.11 -+ M=.5516 -+ Nbv=1.6989 -+ N=1 -+ Tbv1=-21.277u -+ Bv=8.1 -+ Fc=.5 -+ Ikf=0 -+ Nr=2 -+ Ibv=20.245m -+ Is=880.5E-18 -+ Xti=3 -+ Ibvl=1.9556m -)
\ No newline at end of file +.model 1n4148 D(is=2.495E-09 rs=4.755E-01 n=1.679E+00 tt=3.030E-09 cjo=1.700E-12 vj=1 m=1.959E-01 bv=1.000E+02 ibv=1.000E-04) + diff --git a/src/deviceModelLibrary/Diode/D.xml b/src/deviceModelLibrary/Diode/D.xml index 8b806d17..8b6b14c8 100644 --- a/src/deviceModelLibrary/Diode/D.xml +++ b/src/deviceModelLibrary/Diode/D.xml @@ -1,4 +1,15 @@ <library> <model_name>D</model_name> -<ref_model>D1N750</ref_model> -<param><Vj>.75</Vj><Nbvl>14.976</Nbvl><Cjo>175p</Cjo><Rs>.25</Rs><Isr>1.859n</Isr><Eg>1.11</Eg><M>.5516</M><Nbv>1.6989</Nbv><N>1</N><Tbv1>-21.277u</Tbv1><Bv>8.1</Bv><Fc>.5</Fc><Ikf>0</Ikf><Nr>2</Nr><Ibv>20.245m</Ibv><Is>880.5E-18</Is><Xti>3</Xti><Ibvl>1.9556m</Ibvl></param></library>
\ No newline at end of file +<ref_model>1N4148</ref_model> +<param> + <Is>2.495E-09</Is> + <Rs>4.755E-01</Rs> + <N>1.679E+00</N> + <tt>3.030E-09</tt> + <Cjo>1.700E-12</Cjo> + <M>1.959E-01</M> + <Vj>1</Vj> + <Bv>1.000E+02</Bv> + <Ibv>1.000E-04</Ibv> +</param> +</library> diff --git a/src/deviceModelLibrary/Templates/D.lib b/src/deviceModelLibrary/Templates/D.lib index 890c37fe..8a7fb4da 100755 --- a/src/deviceModelLibrary/Templates/D.lib +++ b/src/deviceModelLibrary/Templates/D.lib @@ -1,3 +1,2 @@ -.model D1N750 D( Is=880.5E-18 Rs=.25 Ikf=0 N=1 Xti=3 Eg=1.11 Cjo=175p M=.5516 -+ Vj=.75 Fc=.5 Isr=1.859n Nr=2 Bv=8.1 Ibv=20.245m Nbv=1.6989 Ibvl=1.9556m -+ Nbvl=14.976 Tbv1=-21.277u) +.model 1n4148 D(is=2.495E-09 rs=4.755E-01 n=1.679E+00 tt=3.030E-09 cjo=1.700E-12 vj=1 m=1.959E-01 bv=1.000E+02 ibv=1.000E-04) + diff --git a/src/deviceModelLibrary/Templates/D.xml b/src/deviceModelLibrary/Templates/D.xml index 546d1156..8b6b14c8 100644 --- a/src/deviceModelLibrary/Templates/D.xml +++ b/src/deviceModelLibrary/Templates/D.xml @@ -1,24 +1,15 @@ <library> <model_name>D</model_name> -<ref_model>D1N750</ref_model> +<ref_model>1N4148</ref_model> <param> - <Is>880.5E-18</Is> - <Rs>.25</Rs> - <Ikf>0</Ikf> - <N>1</N> - <Xti>3</Xti> - <Eg>1.11</Eg> - <Cjo>175p</Cjo> - <M>.5516</M> - <Vj>.75</Vj> - <Fc>.5</Fc> - <Isr>1.859n</Isr> - <Nr>2</Nr> - <Bv>8.1</Bv> - <Ibv>20.245m</Ibv> - <Nbv>1.6989</Nbv> - <Ibvl>1.9556m</Ibvl> - <Nbvl>14.976</Nbvl> - <Tbv1>-21.277u</Tbv1> + <Is>2.495E-09</Is> + <Rs>4.755E-01</Rs> + <N>1.679E+00</N> + <tt>3.030E-09</tt> + <Cjo>1.700E-12</Cjo> + <M>1.959E-01</M> + <Vj>1</Vj> + <Bv>1.000E+02</Bv> + <Ibv>1.000E-04</Ibv> </param> </library> diff --git a/src/frontEnd/Application.py b/src/frontEnd/Application.py index 2aa7c649..6e94cbd7 100755 --- a/src/frontEnd/Application.py +++ b/src/frontEnd/Application.py @@ -28,9 +28,12 @@ from configuration.Appconfig import Appconfig from projManagement.openProject import OpenProjectInfo from projManagement.newProject import NewProjectInfo from projManagement.Kicad import Kicad +from projManagement.Validation import Validation +from projManagement import Worker from frontEnd import ProjectExplorer from frontEnd import Workspace from frontEnd import DockArea +#from pspicetoKicad.ImportPspice import ImportPspiceLibrary,ConvertPspiceKicad import time from PyQt4.Qt import QSize @@ -52,7 +55,7 @@ class Application(QtGui.QMainWindow): self.obj_Mainview = MainView() self.obj_kicad = Kicad(self.obj_Mainview.obj_dockarea) self.obj_appconfig = Appconfig() - + self.obj_validation = Validation() #Initialize all widget self.setCentralWidget(self.obj_Mainview) self.initToolBar() @@ -80,7 +83,16 @@ class Application(QtGui.QMainWindow): self.openproj = QtGui.QAction(QtGui.QIcon('../../images/openProject.png'),'<b>Open Project</b>',self) self.openproj.setShortcut('Ctrl+O') self.openproj.triggered.connect(self.open_project) - + ''' + #Removing as it no longer required + self.importPspiceLib = QtGui.QAction(QtGui.QIcon('../../images/import_icon.png'),'<b>Import PSPICE Library</b>',self) + self.importPspiceLib.setShortcut('Ctrl+X') + self.importPspiceLib.triggered.connect(self.import_pspice_lib) + + self.convertPspiceKicad = QtGui.QAction(QtGui.QIcon('../../images/Ps2Ki.png'),'<b>Convert PSPICE to KICAD</b>',self) + self.convertPspiceKicad.setShortcut('Ctrl+X') + self.convertPspiceKicad.triggered.connect(self.convert_pspice_kicad) + ''' self.exitproj = QtGui.QAction(QtGui.QIcon('../../images/closeProject.png'),'<b>Exit</b>',self) self.exitproj.setShortcut('Ctrl+X') self.exitproj.triggered.connect(self.exit_project) @@ -92,6 +104,11 @@ class Application(QtGui.QMainWindow): self.topToolbar = self.addToolBar('Top Tool Bar') self.topToolbar.addAction(self.newproj) self.topToolbar.addAction(self.openproj) + ''' + #Removing as it is no longer require + self.topToolbar.addAction(self.importPspiceLib) + self.topToolbar.addAction(self.convertPspiceKicad) + ''' self.topToolbar.addAction(self.exitproj) self.topToolbar.addAction(self.helpfile) @@ -115,17 +132,29 @@ class Application(QtGui.QMainWindow): self.ngspice = QtGui.QAction(QtGui.QIcon('../../images/ngspice.png'), '<b>Simulation</b>', self) self.ngspice.triggered.connect(self.open_ngspice) + """ + #Removing PCB and Footprint Editor as it will start from eeschema self.footprint = QtGui.QAction(QtGui.QIcon('../../images/footprint.png'),'<b>Footprint Editor</b>',self) self.footprint.triggered.connect(self.obj_kicad.openFootprint) self.pcb = QtGui.QAction(QtGui.QIcon('../../images/pcb.png'),'<b>PCB Layout</b>',self) self.pcb.triggered.connect(self.obj_kicad.openLayout) + """ self.model = QtGui.QAction(QtGui.QIcon('../../images/model.png'),'<b>Model Editor</b>',self) self.model.triggered.connect(self.open_modelEditor) self.subcircuit=QtGui.QAction(QtGui.QIcon('../../images/subckt.png'),'<b>Subcircuit</b>',self) self.subcircuit.triggered.connect(self.open_subcircuit) + + self.nghdl = QtGui.QAction(QtGui.QIcon('../../images/nghdl.png'), '<b>Nghdl</b>', self) + self.nghdl.triggered.connect(self.open_nghdl) + + self.omedit = QtGui.QAction(QtGui.QIcon('../../images/omedit.png'),'<b>Modelica Converter</b>',self) + self.omedit.triggered.connect(self.open_OMedit) + + self.omoptim=QtGui.QAction(QtGui.QIcon('../../images/omoptim.png'),'<b>OM Optimisation</b>',self) + self.omoptim.triggered.connect(self.open_OMoptim) #Adding Action Widget to tool bar self.lefttoolbar = QtGui.QToolBar('Left ToolBar') @@ -133,10 +162,15 @@ class Application(QtGui.QMainWindow): self.lefttoolbar.addAction(self.kicad) self.lefttoolbar.addAction(self.conversion) self.lefttoolbar.addAction(self.ngspice) + """ self.lefttoolbar.addAction(self.footprint) self.lefttoolbar.addAction(self.pcb) + """ self.lefttoolbar.addAction(self.model) self.lefttoolbar.addAction(self.subcircuit) + self.lefttoolbar.addAction(self.nghdl) + self.lefttoolbar.addAction(self.omedit) + self.lefttoolbar.addAction(self.omoptim) self.lefttoolbar.setOrientation(QtCore.Qt.Vertical) self.lefttoolbar.setIconSize(QSize(40,40)) @@ -160,6 +194,7 @@ class Application(QtGui.QMainWindow): self.obj_appconfig.print_info('Current project is : ' + self.obj_appconfig.current_project["ProjectName"]) except: pass + def open_project(self): """ This project call Open Project Info class @@ -173,6 +208,55 @@ class Application(QtGui.QMainWindow): except: pass + def exit_project(self): + print "Exit Project called" + for proc in self.obj_appconfig.procThread_list: + try: + proc.terminate() + except: + pass + + try : + for process_object in self.obj_appconfig.process_obj: + try: + process_object.close() + except: + pass + except: + pass + ##Just checking if open and New window is open. If yes just close it when application is closed + try: + self.project.close() + except: + pass + + self.close() + + ''' + + def import_pspice_lib(self): + print "Import Pspice Library is called" + self.obj_appconfig.print_info('Import Pspice Library is called') + + self.obj_import_pspice = ImportPspiceLibrary() + + self.obj_import_pspice.imortLib() + + def convert_pspice_kicad(self): + print "PSPICE to KICAD converter is called" + self.obj_appconfig.print_info('PSPICE to KICAD converter is called') + + self.obj_run_converter = ConvertPspiceKicad() + + self.obj_run_converter.runConverter() + ''' + def help_project(self): + print "Help is called" + self.obj_appconfig.print_info('Help is called') + print "Current Project : ",self.obj_appconfig.current_project + self.obj_Mainview.obj_dockarea.usermanual() + + def open_ngspice(self): """ This Function execute ngspice on current project @@ -203,45 +287,102 @@ class Application(QtGui.QMainWindow): print "Subcircuit editor is called" self.obj_appconfig.print_info('Subcircuit editor is called') self.obj_Mainview.obj_dockarea.subcircuiteditor() - - - def exit_project(self): - print "Exit Project called" - for proc in self.obj_appconfig.procThread_list: - try: - proc.terminate() - except: - pass - ##Just checking if open and New window is open. If yes just close it when application is closed - try: - self.project.close() - except: - pass - - self.close() - - def help_project(self): - print "Help is called" - self.obj_appconfig.print_info('Help is called') - print "Current Project : ",self.obj_appconfig.current_project - self.obj_Mainview.obj_dockarea.usermanual() - - + + def open_nghdl(self): + print "Nghdl is called" + self.obj_appconfig.print_info('Nghdl is called') + + if self.obj_validation.validateTool('nghdl'): + self.cmd = 'nghdl -e' + self.obj_workThread = Worker.WorkerThread(self.cmd) + self.obj_workThread.start() + + else: + self.msg = QtGui.QErrorMessage(None) + self.msg.showMessage('Error while opening nghdl. Please make sure nghdl is installed') + self.obj_appconfig.print_error('Error while opening nghdl. Please make sure nghdl is installed') + self.msg.setWindowTitle('nghdl Error Message') + + def open_modelEditor(self): print "model editor is called" self.obj_appconfig.print_info('model editor is called') self.obj_Mainview.obj_dockarea.modelEditor() - """ - def open_kicadToNgspice(self): - print "kicadToNgspice is called" - self.obj_appconfig.print_info('kicadToNgspice is called') - self.obj_Mainview.obj_dockarea.kicadToNgspiceEditor()""" - - + + + def open_OMedit(self): + """ + This function call ngspice to OM edit converter and then launch OM edit. + """ + self.obj_appconfig.print_info('OM edit is called') + self.projDir = self.obj_appconfig.current_project["ProjectName"] - def testing(self): - print "Success hit kicad button" + if self.projDir != None: + if self.obj_validation.validateCirOut(self.projDir): + self.projName = os.path.basename(self.projDir) + self.ngspiceNetlist = os.path.join(self.projDir,self.projName+".cir.out") + self.modelicaNetlist = os.path.join(self.projDir,self.projName+".mo") + + try: + #Creating a command for Ngspice to Modelica converter + self.cmd1 = "python ../ngspicetoModelica/NgspicetoModelica.py "+self.ngspiceNetlist + self.obj_workThread1 = Worker.WorkerThread(self.cmd1) + self.obj_workThread1.start() + + + if self.obj_validation.validateTool("OMEdit"): + #Creating command to run OMEdit + self.cmd2 = "OMEdit "+self.modelicaNetlist + self.obj_workThread2 = Worker.WorkerThread(self.cmd2) + self.obj_workThread2.start() + else: + self.msg = QtGui.QMessageBox() + self.msgContent = "There was an error while opening OMEdit.<br/>\ + Please make sure OpenModelica is installed in your system. <br/>\ + To install it on Linux : Go to <a href=https://www.openmodelica.org/download/download-linux>OpenModelica Linux</a> and install nigthly build release.<br/>\ + To install it on Windows : Go to <a href=https://www.openmodelica.org/download/download-windows>OpenModelica Windows</a> and install latest version.<br/>" + self.msg.setTextFormat(QtCore.Qt.RichText) + self.msg.setText(self.msgContent) + self.msg.setWindowTitle("Missing OpenModelica") + self.obj_appconfig.print_info(self.msgContent) + self.msg.exec_() + + except Exception as e: + self.msg = QtGui.QErrorMessage() + self.msg.showMessage('Unable to convert NgSpice netlist to Modelica netlist :'+str(e)) + self.msg.setWindowTitle("Ngspice to Modelica conversion error") + self.obj_appconfig.print_error(str(e)) + + else: + self.msg = QtGui.QErrorMessage() + self.msg.showMessage('Current project does not contain any ngspice file. Please create ngspice file with extension .cir.out') + self.msg.setWindowTitle("Missing Ngspice netlist") + else: + self.msg = QtGui.QErrorMessage() + self.msg.showMessage('Please select the project first. You can either create new project or open existing project') + self.msg.setWindowTitle("Error Message") + + def open_OMoptim(self): + print "OM Optim is called" + self.obj_appconfig.print_info('OM Optim is called') + #Check if OMOptim is installed + if self.obj_validation.validateTool("OMOptim"): + #Creating a command to run + self.cmd = "OMOptim" + self.obj_workThread = Worker.WorkerThread(self.cmd) + self.obj_workThread.start() + else: + self.msg = QtGui.QMessageBox() + self.msgContent = "There was an error while opening OMOptim.<br/>\ + Please make sure OpenModelica is installed in your system. <br/>\ + To install it on Linux : Go to <a href=https://www.openmodelica.org/download/download-linux>OpenModelica Linux</a> and install nigthly build release.<br/>\ + To install it on Windows : Go to <a href=https://www.openmodelica.org/download/download-windows>OpenModelica Windows</a> and install latest version.<br/>" + self.msg.setTextFormat(QtCore.Qt.RichText) + self.msg.setText(self.msgContent) + self.msg.setWindowTitle("Error Message") + self.obj_appconfig.print_info(self.msgContent) + self.msg.exec_() class MainView(QtGui.QWidget): """ diff --git a/src/frontEnd/Application.py.bkp b/src/frontEnd/Application.py.bkp deleted file mode 100755 index 408cd967..00000000 --- a/src/frontEnd/Application.py.bkp +++ /dev/null @@ -1,363 +0,0 @@ -#=============================================================================== -# -# FILE: Application.py -# -# USAGE: --- -# -# DESCRIPTION: This main file use to start the Application -# -# OPTIONS: --- -# REQUIREMENTS: --- -# BUGS: --- -# NOTES: --- -# AUTHOR: Fahim Khan, fahim.elex@gmail.com -# ORGANIZATION: eSim team at FOSSEE, IIT Bombay. -# CREATED: Wednesday 21 January 2015 -# REVISION: --- -#=============================================================================== -import os -import sys -#Setting PYTHONPATH -cwd = os.getcwd() -(setPath,fronEnd) = os.path.split(cwd) -sys.path.append(setPath) - -from PyQt4 import QtGui, QtCore -from configuration.Appconfig import Appconfig -from projManagement.openProject import OpenProjectInfo -from projManagement.newProject import NewProjectInfo -from projManagement.Kicad import Kicad -from frontEnd import ProjectExplorer -from frontEnd import Workspace -from frontEnd import DockArea -import time -from PyQt4.Qt import QSize - - -class Application(QtGui.QMainWindow): - global project_name - """ - Its our main window of application - """ - def __init__(self,*args): - """ - Initialize main Application window - """ - #Calling __init__ of super class - QtGui.QMainWindow.__init__(self,*args) - - #Creating require Object - self.obj_workspace = Workspace.Workspace() - self.obj_kicad = Kicad() - self.obj_Mainview = MainView() - self.obj_appconfig = Appconfig() - - #Initialize all widget - self.setCentralWidget(self.obj_Mainview) - self.initToolBar() - - self.setGeometry(self.obj_appconfig._app_xpos, - self.obj_appconfig._app_ypos, - self.obj_appconfig._app_width, - self.obj_appconfig._app_heigth) - self.setWindowTitle(self.obj_appconfig._APPLICATION) - self.showMaximized() - self.setWindowIcon(QtGui.QIcon('../../images/logo.png')) - #self.show() - - - def initToolBar(self): - """ - This function initialize Tool Bar - """ - #Top Tool bar - self.newproj = QtGui.QAction(QtGui.QIcon('../../images/newProject.png'),'<b>New Project</b>',self) - self.newproj.setShortcut('Ctrl+N') - self.newproj.triggered.connect(self.new_project) - #self.newproj.connect(self.newproj,QtCore.SIGNAL('triggered()'),self,QtCore.SLOT(self.new_project())) - - self.openproj = QtGui.QAction(QtGui.QIcon('../../images/openProject.png'),'<b>Open Project</b>',self) - self.openproj.setShortcut('Ctrl+O') - self.openproj.triggered.connect(self.open_project) - - self.exitproj = QtGui.QAction(QtGui.QIcon('../../images/closeProject.png'),'<b>Exit</b>',self) - self.exitproj.setShortcut('Ctrl+X') - self.exitproj.triggered.connect(self.exit_project) - - self.helpfile = QtGui.QAction(QtGui.QIcon('../../images/helpProject.png'),'<b>Help</b>',self) - self.helpfile.setShortcut('Ctrl+H') - self.helpfile.triggered.connect(self.help_project) - - self.topToolbar = self.addToolBar('Top Tool Bar') - self.topToolbar.addAction(self.newproj) - self.topToolbar.addAction(self.openproj) - self.topToolbar.addAction(self.exitproj) - self.topToolbar.addAction(self.helpfile) - - self.spacer = QtGui.QWidget() - self.spacer.setSizePolicy(QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Expanding) - self.topToolbar.addWidget(self.spacer) - self.logo = QtGui.QLabel() - self.logopic = QtGui.QPixmap(os.path.join(os.path.abspath('../..'),'images','fosseeLogo.png')) - self.logopic = self.logopic.scaled(QSize(150,150),QtCore.Qt.KeepAspectRatio) - self.logo.setPixmap(self.logopic) - self.logo.setStyleSheet("padding:0 15px 0 0;") - self.topToolbar.addWidget(self.logo) - - #Left Tool bar Action Widget - self.kicad = QtGui.QAction(QtGui.QIcon('../../images/kicad.png'),'<b>Open Schematic</b>',self) - self.kicad.triggered.connect(self.obj_kicad.openSchematic) - - self.conversion = QtGui.QAction(QtGui.QIcon('../../images/ki-ng.png'),'<b>Convert Kicad to Ngspice</b>',self) - self.conversion.triggered.connect(self.obj_kicad.openKicadToNgspice) - - self.ngspice = QtGui.QAction(QtGui.QIcon('../../images/ngspice.png'), '<b>Simulation</b>', self) - self.ngspice.triggered.connect(self.open_ngspice) - - self.footprint = QtGui.QAction(QtGui.QIcon('../../images/footprint.png'),'<b>Footprint Editor</b>',self) - self.footprint.triggered.connect(self.obj_kicad.openFootprint) - - self.pcb = QtGui.QAction(QtGui.QIcon('../../images/pcb.png'),'<b>PCB Layout</b>',self) - self.pcb.triggered.connect(self.obj_kicad.openLayout) - - self.model = QtGui.QAction(QtGui.QIcon('../../images/model.png'),'<b>Model Editor</b>',self) - self.model.triggered.connect(self.open_modelEditor) - - self.subcircuit=QtGui.QAction(QtGui.QIcon('../../images/subckt.png'),'<b>Subcircuit</b>',self) - self.subcircuit.triggered.connect(self.open_subcircuit) - - #Adding Action Widget to tool bar - self.lefttoolbar = QtGui.QToolBar('Left ToolBar') - self.addToolBar(QtCore.Qt.LeftToolBarArea, self.lefttoolbar) - self.lefttoolbar.addAction(self.kicad) - self.lefttoolbar.addAction(self.conversion) - self.lefttoolbar.addAction(self.ngspice) - self.lefttoolbar.addAction(self.footprint) - self.lefttoolbar.addAction(self.pcb) - self.lefttoolbar.addAction(self.model) - self.lefttoolbar.addAction(self.subcircuit) - self.lefttoolbar.setOrientation(QtCore.Qt.Vertical) - self.lefttoolbar.setIconSize(QSize(40,40)) - - - def new_project(self): - """ - This function call New Project Info class. - """ - text, ok = QtGui.QInputDialog.getText(self, 'New Project Info','Enter Project Name:') - if ok: - self.projname = (str(text)) - self.project = NewProjectInfo() - directory, filelist =self.project.createProject(self.projname) - - self.obj_Mainview.obj_projectExplorer.addTreeNode(directory, filelist) - - else: - print "No project created" - self.obj_appconfig.print_info('No new project created') - try: - self.obj_appconfig.print_info('Current project is : ' + self.obj_appconfig.current_project["ProjectName"]) - except: - pass - def open_project(self): - """ - This project call Open Project Info class - """ - print "Open Project called" - self.project = OpenProjectInfo() - - try: - directory, filelist = self.project.body() - self.obj_Mainview.obj_projectExplorer.addTreeNode(directory, filelist) - except: - pass - - def open_ngspice(self): - """ - This Function execute ngspice on current project - """ - - self.projDir = self.obj_appconfig.current_project["ProjectName"] - - if self.projDir != None: - self.obj_Mainview.obj_dockarea.ngspiceEditor(self.projDir) - time.sleep(2) #Need permanent solution - #Calling Python Plotting - - try: - self.obj_Mainview.obj_dockarea.plottingEditor() - except Exception as e: - self.msg = QtGui.QErrorMessage(None) - self.msg.showMessage('Error while opening python plotting Editor.') - print "Exception:",str(e) - self.obj_appconfig.print_error('Exception generated : ' + str(e)) - self.msg.setWindowTitle("Error Message") - - else: - self.msg = QtGui.QErrorMessage() - self.msg.showMessage('Please select the project first. You can either create new project or open existing project') - self.msg.setWindowTitle("Error Message") - - def open_subcircuit(self): - print "Subcircuit editor is called" - self.obj_appconfig.print_info('Subcircuit editor is called') - self.obj_Mainview.obj_dockarea.subcircuiteditor() - - - def exit_project(self): - print "Exit Project called" - for proc in self.obj_appconfig.procThread_list: - try: - proc.terminate() - except: - pass - ##Just checking if open and New window is open. If yes just close it when application is closed - try: - self.project.close() - except: - pass - - self.close() - - def help_project(self): - print "Help is called" - self.obj_appconfig.print_info('Help is called') - print "Current Project : ",self.obj_appconfig.current_project - #self.obj_appconfig.print_info('Current Project : ' + self.obj_appconfig.current_project['ProjectName']) - #self.obj_Mainview.obj_dockarea.plottingEditor() - - - def open_modelEditor(self): - print "model editor is called" - self.obj_appconfig.print_info('model editor is called') - self.obj_Mainview.obj_dockarea.modelEditor() - - def testing(self): - print "Success hit kicad button" - - -class MainView(QtGui.QWidget): - """ - This class initialize the Main View of Application - """ - def __init__(self, *args): - # call init method of superclass - QtGui.QWidget.__init__(self, *args) - - self.obj_appconfig = Appconfig() - - self.leftSplit = QtGui.QSplitter() - self.middleSplit = QtGui.QSplitter() - - self.mainLayout = QtGui.QVBoxLayout() - #Intermediate Widget - self.middleContainer = QtGui.QWidget() - self.middleContainerLayout = QtGui.QVBoxLayout() - - #Area to be included in MainView - self.noteArea = QtGui.QTextEdit() - self.obj_appconfig.noteArea['Note'] = self.noteArea - self.obj_appconfig.noteArea['Note'].append(' eSim Started......') - self.obj_appconfig.noteArea['Note'].append('Project Selected : None') - self.obj_appconfig.noteArea['Note'].append('\n') - - #CSS - self.noteArea.setStyleSheet(" \ - QWidget { border-radius: 15px; border: 1px solid gray; padding: 5px; } \ - ") - - self.obj_dockarea = DockArea.DockArea() - self.obj_projectExplorer = ProjectExplorer.ProjectExplorer() - - #Adding content to vertical middle Split. - self.middleSplit.setOrientation(QtCore.Qt.Vertical) - self.middleSplit.addWidget(self.obj_dockarea) - self.middleSplit.addWidget(self.noteArea) - - #Adding middle split to Middle Container Widget - self.middleContainerLayout.addWidget(self.middleSplit) - self.middleContainer.setLayout(self.middleContainerLayout) - - #Adding content of left split - self.leftSplit.addWidget(self.obj_projectExplorer) - self.leftSplit.addWidget(self.middleContainer) - - - #Adding to main Layout - self.mainLayout.addWidget(self.leftSplit) - self.leftSplit.setSizes([self.width()/4.5,self.height()]) - self.middleSplit.setSizes([self.width(),self.height()/2]) - self.setLayout(self.mainLayout) - - -def main(args): - """ - It is main function of the module.It starts the application - """ - print "Starting eSim......" - app = QtGui.QApplication(args) - - splash_pix = QtGui.QPixmap('../../images/splash_screen_esim.png') - splash = QtGui.QSplashScreen(splash_pix,QtCore.Qt.WindowStaysOnTopHint) - splash.setMask(splash_pix.mask()) - splash.show() - #QtGui.QApplication.setStyle(QtGui.QStyleFactory.create("Cleanlooks")) - appView = Application() - appView.splash=splash - appView.obj_workspace.returnWhetherClickedOrNot(appView) - appView.hide() - appView.obj_workspace.show() - sys.exit(app.exec_()) - #appView.hide() - ######################################################################################################################################## - - """splash_pix = QtGui.QPixmap('../images/splash_screen_esim.png') - splash = QtGui.QSplashScreen(splash_pix,QtCore.Qt.WindowStaysOnTopHint) - progressBar = QtGui.QProgressBar(splash) - progressBar.setGeometry(0,470,1004,20) - splash.setMask(splash_pix.mask()) - splash.show() - - for i in range(0, 100): - progressBar.setValue(i) - #cond=threading.Condition() - if i==50: - - appView = Application() - appView.hide() - #appView.obj_workspace.returnWhetherClickedOrNot(appView) - appView.obj_workspace.show() - #appView.obj_workspace.show() - appView.obj_workspace.calledFromApplicationToAssignSysAndApp(sys,app)#`11 ,cond) - #with cond: - #cond.wait() - - t = time.time() - while time.time() < t + 0.1: - app.processEvents() - - #time.sleep(2) - - #appView = Application() - #appView.hide() - splash.finish(appView) - #sys.exit(app.exec_()) - - #QtGui.QApplication.setStyle(QtGui.QStyleFactory.create("Cleanlooks")) - #appView.obj_workspace.returnWhetherClickedOrNot(appView) - #appView.obj_workspace.show() - #appView.hide() - - appView.show() - sys.exit(app.exec_())""" -###################################################################################################################################################### - - - -# Call main function -if __name__ == '__main__': - # Create and display the splash screen - main(sys.argv) - - - diff --git a/src/frontEnd/Workspace.py b/src/frontEnd/Workspace.py index cd44dd71..3e3cf0de 100644 --- a/src/frontEnd/Workspace.py +++ b/src/frontEnd/Workspace.py @@ -90,7 +90,7 @@ class Workspace(QtGui.QWidget): self.window_open_close=1 self.close_var=1 #with var_cond: - # var_cond.notify() + # var_cond.notify() return QtGui.QWidget.close(self, *args, **kwargs) diff --git a/src/kicadtoNgspice/DeviceModel.py b/src/kicadtoNgspice/DeviceModel.py index 90443d31..aaf02f45 100644 --- a/src/kicadtoNgspice/DeviceModel.py +++ b/src/kicadtoNgspice/DeviceModel.py @@ -65,7 +65,7 @@ class DeviceModel(QtGui.QWidget): transbox.setTitle("Add library for Transistor "+words[0]+" : "+words[4]) self.entry_var[self.count] = QtGui.QLineEdit() self.entry_var[self.count].setText("") - #global path_name + global path_name try: for child in root: if child.tag[0]==eachline[0] and child.tag[1]==eachline[1]: @@ -116,7 +116,7 @@ class DeviceModel(QtGui.QWidget): diodebox.setTitle("Add library for Diode "+words[0]+" : "+words[3]) self.entry_var[self.count] = QtGui.QLineEdit() self.entry_var[self.count].setText("") - global path_name + #global path_name try: for child in root: if child.tag[0]==eachline[0] and child.tag[1]==eachline[1]: @@ -167,7 +167,7 @@ class DeviceModel(QtGui.QWidget): jfetbox.setTitle("Add library for JFET "+words[0]+" : "+words[4]) self.entry_var[self.count] = QtGui.QLineEdit() self.entry_var[self.count].setText("") - global path_name + #global path_name try: for child in root: if child.tag[0]==eachline[0] and child.tag[1]==eachline[1]: diff --git a/src/kicadtoNgspice/KicadtoNgspice.py b/src/kicadtoNgspice/KicadtoNgspice.py index a3e41a5f..df776e7e 100644 --- a/src/kicadtoNgspice/KicadtoNgspice.py +++ b/src/kicadtoNgspice/KicadtoNgspice.py @@ -92,11 +92,12 @@ class MainWindow(QtGui.QWidget): print "SCHEMATICINFO",schematicInfo #List storing model detail - global modelList,outputOption,unknownModelList,multipleModelList + global modelList,outputOption,unknownModelList,multipleModelList,plotText modelList = [] outputOption = [] - schematicInfo,outputOption,modelList,unknownModelList,multipleModelList = obj_proc.convertICintoBasicBlocks(schematicInfo,outputOption,modelList) + plotText = [] + schematicInfo,outputOption,modelList,unknownModelList,multipleModelList,plotText = obj_proc.convertICintoBasicBlocks(schematicInfo,outputOption,modelList,plotText) print "Unknown Model List",unknownModelList print "Multiple Model List",multipleModelList print "Model List",modelList @@ -495,7 +496,7 @@ class MainWindow(QtGui.QWidget): print "Analysis OutPut------>",analysisoutput #Calling netlist file generation function - self.createNetlistFile(store_schematicInfo) + self.createNetlistFile(store_schematicInfo,plotText) self.msg = "The Kicad to Ngspice Conversion completed successfully!!!!!!" QtGui.QMessageBox.information(self, "Information", self.msg, QtGui.QMessageBox.Ok) @@ -513,7 +514,7 @@ class MainWindow(QtGui.QWidget): if self.clarg2 == "sub": self.createSubFile(subPath) - def createNetlistFile(self,store_schematicInfo): + def createNetlistFile(self,store_schematicInfo,plotText): print "Creating Final netlist" #print "INFOLINE",infoline #print "OPTIONINFO",optionInfo @@ -603,6 +604,8 @@ class MainWindow(QtGui.QWidget): #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('.endc\n') out.writelines('.end\n') out.close() diff --git a/src/kicadtoNgspice/KicadtoNgspice.py.bkp b/src/kicadtoNgspice/KicadtoNgspice.py.bkp deleted file mode 100644 index c262f564..00000000 --- a/src/kicadtoNgspice/KicadtoNgspice.py.bkp +++ /dev/null @@ -1,671 +0,0 @@ -#=============================================================================== -# -# FILE: kicadtoNgspice.py -# -# 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 -# REVISION: --- -#=============================================================================== -import sys -import os -#Setting PYTHONPATH -cwd = os.getcwd() -(setPath,fronEnd) = os.path.split(cwd) -sys.path.append(setPath) - -from PyQt4 import QtGui,QtCore -from Processing import PrcocessNetlist -import Analysis -import Source -import Model -import DeviceModel -import SubcircuitTab -import Convert -import TrackWidget - -from xml.etree import ElementTree as ET - - - -class MainWindow(QtGui.QWidget): - """ - 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. - """ - def __init__(self): - QtGui.QWidget.__init__(self) - #Create object of track widget - self.obj_track = TrackWidget.TrackWidget() - """ - 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 - self.msg = QtGui.QErrorMessage() - self.content = "Your schematic contain unknown model "+', '.join(unknownModelList) - self.msg.showMessage(self.content) - self.msg.setWindowTitle("Unknown Models") - - elif multipleModelList: - print "Multiple Model List is : ",multipleModelList - self.msg = QtGui.QErrorMessage() - 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.grid = QtGui.QGridLayout(self) - self.convertbtn = QtGui.QPushButton("Convert") - self.convertbtn.clicked.connect(self.callConvert) - self.cancelbtn = QtGui.QPushButton("Cancel") - self.cancelbtn.clicked.connect(self.close) - self.grid.addWidget(self.createcreateConvertWidget(),0,0) - self.grid.addWidget(self.convertbtn,1,1) - self.grid.addWidget(self.cancelbtn,1,2) - self.setWindowState(QtCore.Qt.WindowMaximized) - self.setLayout(self.grid) - 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.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.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.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.deviceModelTab.setWidget(obj_devicemodel) - self.deviceModelTab.setWidgetResizable(True) - global obj_subcircuitTab - self.subcircuitTab = QtGui.QScrollArea() - obj_subcircuitTab = SubcircuitTab.SubcircuitTab(schematicInfo) - self.subcircuitTab.setWidget(obj_subcircuitTab) - self.subcircuitTab.setWidgetResizable(True) - - self.tabWidget = QtGui.QTabWidget() - #self.tabWidget.TabShape(QtGui.QTabWidget.Rounded) - 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.convertWindow.setLayout(self.mainLayout) - self.convertWindow.show() - - - return self.convertWindow - - def callConvert(self): - """ - Calling Convert Class Constructor - """ - global schematicInfo - global analysisoutput - kicadFile = sys.argv[1] - (projpath,filename)=os.path.split(kicadFile) - project_name=os.path.basename(projpath) - print "PROJ PATH---",projpath - - - check=1 - try: - fr=open(os.path.join(projpath,project_name+"_Previous_Values.xml"),'r') - temp_tree=ET.parse(fr) - temp_root=temp_tree.getroot() - except: - check=0 - - - - fw=open(os.path.join(projpath,project_name+"_Previous_Values.xml"),'w') - if check==0: - attr_parent=ET.Element("KicadtoNgspice") - if check==1: - attr_parent=temp_root - - for child in attr_parent: - if child.tag=="analysis": - attr_parent.remove(child) - - attr_analysis=ET.SubElement(attr_parent,"analysis") - attr_ac=ET.SubElement(attr_analysis,"ac") - if obj_analysis.Lin.isChecked(): - ET.SubElement(attr_ac,"field1",name="Lin").text="true" - ET.SubElement(attr_ac,"field2",name="Dec").text="false" - ET.SubElement(attr_ac,"field3",name="Oct").text="false" - elif obj_analysis.Dec.isChecked(): - ET.SubElement(attr_ac,"field1",name="Lin").text="false" - ET.SubElement(attr_ac,"field2",name="Dec").text="true" - ET.SubElement(attr_ac,"field3",name="Oct").text="false" - if obj_analysis.Oct.isChecked(): - ET.SubElement(attr_ac,"field1",name="Lin").text="false" - ET.SubElement(attr_ac,"field2",name="Dec").text="false" - ET.SubElement(attr_ac,"field3",name="Oct").text="true" - else: - pass - ET.SubElement(attr_ac,"field4",name="Start Frequency").text= str(obj_analysis.ac_entry_var[0].text()) - ET.SubElement(attr_ac,"field5",name="Stop Frequency").text= str(obj_analysis.ac_entry_var[1].text()) - ET.SubElement(attr_ac,"field6",name="No. of points").text= str(obj_analysis.ac_entry_var[2].text()) - ET.SubElement(attr_ac,"field7",name="Start Fre Combo").text= obj_analysis.ac_parameter[0] - ET.SubElement(attr_ac,"field8",name="Stop Fre Combo").text= obj_analysis.ac_parameter[1] - attr_dc=ET.SubElement(attr_analysis,"dc") - ET.SubElement(attr_dc,"field1",name="Source Name").text= str(obj_analysis.dc_entry_var[0].text()) - ET.SubElement(attr_dc,"field2",name="Start").text= str(obj_analysis.dc_entry_var[1].text()) - ET.SubElement(attr_dc,"field3",name="Increment").text= str(obj_analysis.dc_entry_var[2].text()) - ET.SubElement(attr_dc,"field4",name="Stop").text= str(obj_analysis.dc_entry_var[3].text()) - ET.SubElement(attr_dc,"field5",name="Operating Point").text=str(obj_analysis.check.isChecked()) - print "OBJ_ANALYSIS.CHECK -----",obj_analysis.check.isChecked() - ET.SubElement(attr_dc,"field6",name="Start Combo").text= obj_analysis.dc_parameter[0] - ET.SubElement(attr_dc,"field7",name="Increment Combo").text=obj_analysis.dc_parameter[1] - ET.SubElement(attr_dc,"field8",name="Stop Combo").text= obj_analysis.dc_parameter[2] - attr_tran=ET.SubElement(attr_analysis,"tran") - ET.SubElement(attr_tran,"field1",name="Start Time").text= str(obj_analysis.tran_entry_var[0].text()) - ET.SubElement(attr_tran,"field2",name="Step Time").text= str(obj_analysis.tran_entry_var[1].text()) - ET.SubElement(attr_tran,"field3",name="Stop Time").text= str(obj_analysis.tran_entry_var[2].text()) - ET.SubElement(attr_tran,"field4",name="Start Combo").text= obj_analysis.tran_parameter[0] - ET.SubElement(attr_tran,"field5",name="Step Combo").text= obj_analysis.tran_parameter[1] - ET.SubElement(attr_tran,"field6",name="Stop Combo").text= obj_analysis.tran_parameter[2] - print "TRAN PARAMETER 2-----",obj_analysis.tran_parameter[2] - - #tree=ET.ElementTree(attr_analysis) - #tree.write(f) - - - if check==0: - attr_source=ET.SubElement(attr_parent,"source") - if check==1: - for child in attr_parent: - if child.tag=="source": - attr_source=child - count=1 - grand_child_count=1 - #global tmp_check - #tmp_check=0 - for i in schematicInfo: - tmp_check=0 - words=i.split(' ') - wordv=words[0] - for child in attr_source: - if child.tag==wordv and child.text==words[len(words)-1]: - tmp_check=1 - for grand_child in child: - grand_child.text=str(obj_source.entry_var[grand_child_count].text()) - grand_child_count=grand_child_count+1 - grand_child_count=grand_child_count+1 - if tmp_check==0: - words=i.split(' ') - wordv=words[0] - if wordv[0]=="v": - attr_var=ET.SubElement(attr_source,words[0],name="Source type") - attr_var.text=words[len(words)-1] - #ET.SubElement(attr_ac,"field1",name="Lin").text="true" - if words[len(words)-1]=="ac": - #attr_ac=ET.SubElement(attr_var,"ac") - ET.SubElement(attr_var,"field1",name="Amplitude").text=str(obj_source.entry_var[count].text()) - count=count+2 - elif words[len(words)-1]=="dc": - #attr_dc=ET.SubElement(attr_var,"dc") - ET.SubElement(attr_var,"field1",name="Value").text=str(obj_source.entry_var[count].text()) - count=count+2 - elif words[len(words)-1]=="sine": - #attr_sine=ET.SubElement(attr_var,"sine") - ET.SubElement(attr_var,"field1",name="Offset Value").text=str(obj_source.entry_var[count].text()) - count=count+1 - ET.SubElement(attr_var,"field2",name="Amplitude").text=str(obj_source.entry_var[count].text()) - count=count+1 - ET.SubElement(attr_var,"field3",name="Frequency").text=str(obj_source.entry_var[count].text()) - count=count+1 - ET.SubElement(attr_var,"field4",name="Delay Time").text=str(obj_source.entry_var[count].text()) - count=count+1 - ET.SubElement(attr_var,"field5",name="Damping Factor").text=str(obj_source.entry_var[count].text()) - count=count+2 - elif words[len(words)-1]=="pulse": - #attr_pulse=ET.SubElement(attr_var,"pulse") - ET.SubElement(attr_var,"field1",name="Initial Value").text=str(obj_source.entry_var[count].text()) - count=count+1 - ET.SubElement(attr_var,"field2",name="Pulse Value").text=str(obj_source.entry_var[count].text()) - count=count+1 - ET.SubElement(attr_var,"field3",name="Delay Time").text=str(obj_source.entry_var[count].text()) - count=count+1 - ET.SubElement(attr_var,"field4",name="Rise Time").text=str(obj_source.entry_var[count].text()) - count=count+1 - ET.SubElement(attr_var,"field5",name="Fall Time").text=str(obj_source.entry_var[count].text()) - count=count+1 - ET.SubElement(attr_var,"field5",name="Pulse width").text=str(obj_source.entry_var[count].text()) - count=count+1 - ET.SubElement(attr_var,"field5",name="Period").text=str(obj_source.entry_var[count].text()) - count=count+2 - elif words[len(words)-1]=="pwl": - #attr_pwl=ET.SubElement(attr_var,"pwl") - ET.SubElement(attr_var,"field1",name="Enter in pwl format").text=str(obj_source.entry_var[count].text()) - count=count+2 - elif words[len(words)-1]=="exp": - #attr_exp=ET.SubElement(attr_var,"exp") - ET.SubElement(attr_var,"field1",name="Initial Value").text=str(obj_source.entry_var[count].text()) - count=count+1 - ET.SubElement(attr_var,"field2",name="Pulsed Value").text=str(obj_source.entry_var[count].text()) - count=count+1 - ET.SubElement(attr_var,"field3",name="Rise Delay Time").text=str(obj_source.entry_var[count].text()) - count=count+1 - ET.SubElement(attr_var,"field4",name="Rise Time Constant").text=str(obj_source.entry_var[count].text()) - count=count+1 - ET.SubElement(attr_var,"field5",name="Fall TIme").text=str(obj_source.entry_var[count].text()) - count=count+1 - ET.SubElement(attr_var,"field6",name="Fall Time Constant").text=str(obj_source.entry_var[count].text()) - count=count+2 - else: - pass - - #tree=ET.ElementTree(attr_source) - #tree.write(f1) - - - - if check==0: - attr_model=ET.SubElement(attr_parent,"model") - if check==1: - for child in attr_parent: - if child.tag=="model": - attr_model=child - i=0 - #tmp_check is a variable to check for duplicates in the xml file - tmp_check=0 - #tmp_i is the iterator in case duplicates are there; then in that case we need to replace only the child node and not create a new parent node - - for line in modelList: - print "i for each line in model List------",i - tmp_check=0 - for rand_itr in obj_model.obj_trac.modelTrack: - if rand_itr[2]==line[2] and rand_itr[3]==line[3]: - start=rand_itr[7] - end=rand_itr[8] - i=start - for child in attr_model: - if child.text==line[2] and child.tag==line[3]: - for grand_child in child: - if i<=end: - grand_child.text=str(obj_model.obj_trac.model_entry_var[i].text()) - print "STR OF MODEL----",str(obj_model.obj_trac.model_entry_var[i].text()) - i=i+1 - print "i incremented to ",i - else: - pass - tmp_check=1 - - if tmp_check==0: - attr_ui=ET.SubElement(attr_model,line[3],name="type") - attr_ui.text=line[2] - for key,value in line[7].iteritems(): - if hasattr(value, '__iter__') and i<=end: - for item in value: - ET.SubElement(attr_ui,"field"+str(i+1),name=item).text=str(obj_model.obj_trac.model_entry_var[i].text()) - print "STR OF MODEL----",str(obj_model.obj_trac.model_entry_var[i].text()) - i=i+1 - print "i incremented to ",i - else: - ET.SubElement(attr_ui,"field"+str(i+1),name=value).text=str(obj_model.obj_trac.model_entry_var[i].text()) - print "STR OF MODEL----",str(obj_model.obj_trac.model_entry_var[i].text()) - i=i+1 - print "i incremented to ",i - ################################################################################################################# - if check==0: - attr_devicemodel=ET.SubElement(attr_parent,"devicemodel") - if check==1: - for child in attr_parent: - if child.tag=="devicemodel": - del child[:] - attr_devicemodel=child - #print "Device model dict",obj_devicemodel.devicemodel_dict_beg - #print "Device model dict end",obj_devicemodel.devicemodel_dict_end - ########################## - for i in obj_devicemodel.devicemodel_dict_beg: - attr_var=ET.SubElement(attr_devicemodel,i) - it=obj_devicemodel.devicemodel_dict_beg[i] - end=obj_devicemodel.devicemodel_dict_end[i] - while it<=end: - ET.SubElement(attr_var,"field").text=str(obj_devicemodel.entry_var[it].text()) - it=it+1 - ##################################### - - """keys=obj_devicemodel.devicemodel_dict.keys() - n=len(keys) - for i in range(n): - thisKey=keys[i] - nextKey=keys[(i+1)%n] - nextValue=obj_devicemodel.devicemodel_dict[nextKey] - attr_var=ET.SubElement(attr_devicemodel,thisKey) - it=obj_devicemodel.devicemodel_dict[thisKey] - while it<=nextValue: - ET.SubElement(attr_var,"field").text=obj_devicemodel.entry_var[it]""" - - ################################################################################################################### - - if check==0: - attr_subcircuit=ET.SubElement(attr_parent,"subcircuit") - if check==1: - for child in attr_parent: - if child.tag=="subcircuit": - del child[:] - attr_subcircuit=child - ########################## - for i in obj_subcircuitTab.subcircuit_dict_beg: - attr_var=ET.SubElement(attr_subcircuit,i) - it=obj_subcircuitTab.subcircuit_dict_beg[i] - end=obj_subcircuitTab.subcircuit_dict_end[i] - - while it<=end: - ET.SubElement(attr_var,"field").text=str(obj_subcircuitTab.entry_var[it].text()) - it=it+1 - - - tree=ET.ElementTree(attr_parent) - tree.write(fw) - - - self.obj_convert = Convert.Convert(self.obj_track.sourcelisttrack["ITEMS"], - self.obj_track.source_entry_var["ITEMS"], - schematicInfo) - - try: - #Adding Source Value to Schematic Info - schematicInfo = self.obj_convert.addSourceParameter() - - #Adding Model Value to schematicInfo - schematicInfo = self.obj_convert.addModelParameter(schematicInfo) - - #Adding Device Library to SchematicInfo - schematicInfo = self.obj_convert.addDeviceLibrary(schematicInfo,kicadFile) - - #Adding Subcircuit Library to SchematicInfo - schematicInfo = self.obj_convert.addSubcircuit(schematicInfo, kicadFile) - - analysisoutput = self.obj_convert.analysisInsertor(self.obj_track.AC_entry_var["ITEMS"], - self.obj_track.DC_entry_var["ITEMS"], - self.obj_track.TRAN_entry_var["ITEMS"], - self.obj_track.set_CheckBox["ITEMS"], - self.obj_track.AC_Parameter["ITEMS"], - self.obj_track.DC_Parameter["ITEMS"], - self.obj_track.TRAN_Parameter["ITEMS"], - self.obj_track.AC_type["ITEMS"], - self.obj_track.op_check) - #print "SchematicInfo after adding Model Details",schematicInfo - - #Calling netlist file generation function - self.createNetlistFile(schematicInfo) - - self.msg = "The Kicad to Ngspice Conversion completed successfully!!!!!!" - QtGui.QMessageBox.information(self, "Information", self.msg, QtGui.QMessageBox.Ok) - self.close() - except Exception as 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(kicadFile)[0] - - if len(sys.argv)>2: - if sys.argv[2] == "sub": - self.createSubFile(subPath) - - def createNetlistFile(self,schematicInfo): - print "Creating Final netlist" - #print "INFOLINE",infoline - #print "OPTIONINFO",optionInfo - #print "Device MODEL LIST ",devicemodelList - #print "SUBCKT ",subcktList - #print "OUTPUTOPTION",outputOption - #print "KicadfIle",kicadFile - - #checking if analysis files is present - (projpath,filename) = os.path.split(kicadFile) - analysisFileLoc = os.path.join(projpath,"analysis") - #print "Analysis File Location",analysisFileLoc - if os.path.exists(analysisFileLoc): - try: - f = open(analysisFileLoc) - #Read data - data = f.read() - # Close the file - f.close() - - except : - 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() - for eachline in analysisData: - eachline=eachline.strip() - if len(eachline)>1: - if eachline[0]=='.': - 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 - - for eachline in optionInfo: - words=eachline.split() - option=words[0] - if (option=='.ac' or option=='.dc' or option=='.disto' or option=='.noise' or - option=='.op' or option=='.pz' or option=='.sens' or option=='.tf' or - option=='.tran'): - analysisOption.append(eachline+'\n') - - elif (option=='.save' or option=='.print' or option=='.plot' or option=='.four'): - eachline=eachline.strip('.') - outputOption.append(eachline+'\n') - elif (option=='.nodeset' or option=='.ic'): - initialCondOption.append(eachline+'\n') - elif option=='.option': - simulatorOption.append(eachline+'\n') - #elif (option=='.include' or option=='.lib'): - # includeOption.append(eachline+'\n') - #elif (option=='.model'): - # model.append(eachline+'\n') - elif option=='.end': - continue; - - - #Start creating final netlist cir.out file - outfile = kicadFile+".out" - out=open(outfile,"w") - out.writelines(infoline) - out.writelines('\n') - sections=[simulatorOption, initialCondOption, schematicInfo, analysisOption] - print "SECTIONS",sections - for section in sections: - if len(section) == 0: - continue - else: - for line in section: - 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('print allv > plot_data_v.txt\n') - out.writelines('print alli > plot_data_i.txt\n') - out.writelines('.endc\n') - out.writelines('.end\n') - - out.close() - - def createSubFile(self,subPath): - self.project = subPath - self.projName = os.path.basename(self.project) - if os.path.exists(self.project+".cir.out"): - try: - f = open(self.project+".cir.out") - except : - print("Error in opening .cir.out file.") - else: - print self.projName + ".cir.out does not exist. Please create a spice netlist." - - # Read the data from file - data=f.read() - # Close the file - - f.close() - newNetlist=[] - netlist=iter(data.splitlines()) - for eachline in netlist: - eachline=eachline.strip() - if len(eachline)<1: - continue - words=eachline.split() - if eachline[2] == 'u': - if words[len(words)-1] == "port": - subcktInfo = ".subckt "+self.projName+" " - for i in range(2,len(words)-1): - subcktInfo+=words[i]+" " - continue - if words[0] == ".end" or words[0] == ".ac" or words[0] == ".dc" or words[0] == ".tran" or words[0] == '.disto' or words[0] == '.noise' or words[0] == '.op' or words[0] == '.pz' or words[0] == '.sens' or words[0] == '.tf': - continue - elif words[0] == ".control": - while words[0] != ".endc": - eachline=netlist.next() - eachline=eachline.strip() - if len(eachline)<1: - continue - words=eachline.split() - else: - newNetlist.append(eachline) - - outfile=self.project+".sub" - out=open(outfile,"w") - out.writelines("* Subcircuit " + self.projName) - out.writelines('\n') - out.writelines(subcktInfo) - out.writelines('\n') - - for i in range(len(newNetlist),0,-1): - newNetlist.insert(i,'\n') - - out.writelines(newNetlist) - out.writelines('\n') - - out.writelines('.ends ' + self.projName) - print "The subcircuit has been written in "+self.projName+".sub" - - - -#Main Function - -def main(args): - print "==================================" - print "Kicad to Ngspice netlist converter " - print "==================================" - global kicadFile,kicadNetlist,schematicInfo - global infoline,optionInfo - kicadFile = sys.argv[1] - - #Object of Processing - obj_proc = PrcocessNetlist() - - # Read the netlist - kicadNetlist = obj_proc.readNetlist(kicadFile) - - # Construct parameter information - param = obj_proc.readParamInfo(kicadNetlist) - - # Replace parameter with values - netlist,infoline = obj_proc.preprocessNetlist(kicadNetlist,param) - - print "NETLIST ",netlist - print "INFOLINE",infoline - - # Separate option and schematic information - optionInfo, schematicInfo = obj_proc.separateNetlistInfo(netlist) - - print "OPTIONINFO",optionInfo - print "SCHEMATICINFO",schematicInfo - - - #List for storing source and its value - global sourcelist, sourcelisttrack - sourcelist=[] - sourcelisttrack=[] - schematicInfo,sourcelist = obj_proc.insertSpecialSourceParam(schematicInfo,sourcelist) - - print "SOURCELIST",sourcelist - print "SCHEMATICINFO",schematicInfo - - #List storing model detail - global modelList,outputOption,unknownModelList,multipleModelList - - modelList = [] - outputOption = [] - schematicInfo,outputOption,modelList,unknownModelList,multipleModelList = obj_proc.convertICintoBasicBlocks(schematicInfo,outputOption,modelList) - print "Unknown Model List",unknownModelList - print "Multiple Model List",multipleModelList - print "Model List",modelList - - - app = QtGui.QApplication(args) - kingWindow = MainWindow() - #kingWindow.show() #No need to call show as we are doing it in createMainWindow - sys.exit(app.exec_()) - - - -if __name__ == '__main__': - main(sys.argv) - - - - - - -
\ No newline at end of file diff --git a/src/kicadtoNgspice/Processing.py b/src/kicadtoNgspice/Processing.py index b0f60826..0eaf6d2f 100644 --- a/src/kicadtoNgspice/Processing.py +++ b/src/kicadtoNgspice/Processing.py @@ -152,10 +152,12 @@ class PrcocessNetlist: return schematicInfo,sourcelist - def convertICintoBasicBlocks(self,schematicInfo,outputOption,modelList): + def convertICintoBasicBlocks(self,schematicInfo,outputOption,modelList,plotText): #Insert details of Ngspice model unknownModelList = [] multipleModelList = [] + plotList = ['plot_v1','plot_v2','plot_i2','plot_log','plot_db','plot_phase'] + k = 1 for compline in schematicInfo: words = compline.split() @@ -177,7 +179,7 @@ class PrcocessNetlist: print "Words",words print "compName",compName #Looking if model file is present - if compType != "port" and compType != "ic": + if compType != "port" and compType != "ic" and compType not in plotList: xmlfile = compType+".xml" #XML Model File count = 0 #Check if model of same name is present modelPath = [] @@ -304,14 +306,41 @@ class PrcocessNetlist: text = "Enter initial voltage at node for "+compline paramDict[title] = text modelList.append([index,compline,modelname,compName,comment,title,type,paramDict]) + + elif compType in plotList: + print "Plot Data---------->" + schematicInfo.insert(index,"* "+compline) + if compType == 'plot_v1': + words = compline.split() + plotText.append("plot v("+words[1]+")") + elif compType == 'plot_v2': + words = compline.split() + 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]+")") + elif compType == 'plot_log': + words = compline.split() + plotText.append("plot log("+words[1]+")") + elif compType == 'plot_db': + words = compline.split() + plotText.append("plot db("+words[1]+")") + elif compType == 'plot_phase': + words = compline.split() + plotText.append("plot phase("+words[1]+")") + else: schematicInfo.insert(index,"* "+compline) + + #print "Count",count #print "UnknownModelList",unknownModelList #print "MultipleModelList",multipleModelList - return schematicInfo,outputOption,modelList,unknownModelList,multipleModelList + return schematicInfo,outputOption,modelList,unknownModelList,multipleModelList,plotText -
\ No newline at end of file + diff --git a/src/modelParamXML/Nghdl/inverter.xml b/src/modelParamXML/Nghdl/inverter.xml new file mode 100644 index 00000000..894389e0 --- /dev/null +++ b/src/modelParamXML/Nghdl/inverter.xml @@ -0,0 +1 @@ +<model><name>inverter</name><type>Nghdl</type><node_number>2</node_number><title>Add parameters for inverter</title><split>2-V:2-V</split><param><rise_delay default="1.0e-9">Enter Rise Delay (default=1.0e-9)</rise_delay><fall_delay default="1.0e-9">Enter Fall Delay (default=1.0e-9)</fall_delay><input_load default="1.0e-12">Enter Input Load (default=1.0e-12)</input_load><instance_id default="1">Enter Instance ID (Between 0-99)</instance_id></param></model>
\ No newline at end of file diff --git a/src/modelParamXML/Nghdl/myxor.xml b/src/modelParamXML/Nghdl/myxor.xml new file mode 100644 index 00000000..c245879e --- /dev/null +++ b/src/modelParamXML/Nghdl/myxor.xml @@ -0,0 +1 @@ +<model><name>myxor</name><type>Nghdl</type><node_number>3</node_number><title>Add parameters for myxor</title><split>1-V:1-V:1-V</split><param><rise_delay default="1.0e-9">Enter Rise Delay (default=1.0e-9)</rise_delay><fall_delay default="1.0e-9">Enter Fall Delay (default=1.0e-9)</fall_delay><input_load default="1.0e-12">Enter Input Load (default=1.0e-12)</input_load><instance_id default="1">Enter Instance ID (Between 0-99)</instance_id></param></model>
\ No newline at end of file diff --git a/src/ngspiceSimulation/NgspiceWidget.py b/src/ngspiceSimulation/NgspiceWidget.py index f2ad973f..402c20e3 100644 --- a/src/ngspiceSimulation/NgspiceWidget.py +++ b/src/ngspiceSimulation/NgspiceWidget.py @@ -15,11 +15,14 @@ class NgspiceWidget(QtGui.QWidget): self.layout = QtGui.QVBoxLayout(self) self.layout.addWidget(self.terminal) print"command-------->", command + if platform.system() == 'Linux': self.command = "cd "+projPath+";ngspice "+command #Creating argument for process - self.args = ['-into', str(self.terminal.winId()),'-hold','-e', self.command] + #self.args = ['-into', str(self.terminal.winId()),'-hold','-e', self.command] + self.args = ['-hold','-e', self.command] self.process.start('xterm', self.args) + self.obj_appconfig.process_obj.append(self.process) elif platform.system() == 'Windows': tempdir= os.getcwd() diff --git a/src/ngspiceSimulation/pythonPlotting.py b/src/ngspiceSimulation/pythonPlotting.py index 7d37623d..d93ba235 100644 --- a/src/ngspiceSimulation/pythonPlotting.py +++ b/src/ngspiceSimulation/pythonPlotting.py @@ -3,7 +3,7 @@ import os from PyQt4 import QtGui, QtCore from decimal import Decimal from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas -from matplotlib.backends.backend_qt4agg import NavigationToolbar2QTAgg as NavigationToolbar +from matplotlib.backends.backend_qt4agg import NavigationToolbar2QT as NavigationToolbar from matplotlib.figure import Figure from configuration.Appconfig import Appconfig @@ -687,4 +687,4 @@ class DataExtraction: -
\ No newline at end of file + diff --git a/src/ngspicetoModelica/NgspicetoModelica.py b/src/ngspicetoModelica/NgspicetoModelica.py new file mode 100644 index 00000000..95f991bd --- /dev/null +++ b/src/ngspicetoModelica/NgspicetoModelica.py @@ -0,0 +1,786 @@ +import sys +import os +import re +from string import maketrans + +class NgMoConverter: + def __init__(self): + pass + + def readNetlist(self,filename): + """ + Read Ngspice Netlist + """ + if os.path.exists(filename): + try: + f = open(filename) + except Exception as e: + print("Error in opening file") + print(str(e)) + sys.exit() + else: + print filename + " does not exist" + sys.exit() + + data = f.read() + #data = data.translate(maketrans('\n+', ' ')) + f.close() + return data.splitlines() + + def separateNetlistInfo(self,data): + """ + Separate schematic data and option data + """ + optionInfo = [] + schematicInfo = [] + for eachline in data: + if len(eachline) > 1: + #if eachline[0] == '+': + # eachline=eachline.translate(maketrans('\n+',' ')) + if eachline[0]=='*': + continue + elif eachline[0]=='.': + optionInfo.append(eachline.lower()) + else: + schematicInfo.append(eachline.lower()) + return optionInfo,schematicInfo + + def addModel(self,optionInfo): + """ + Add model parameters in the modelica file and create dictionary of model parameters + This function extract model and subckt information along with their parameters with the help of optionInfo + """ + modelName = [] + modelInfo = {} + subcktName = [] + paramInfo = [] + inbuiltmodelName = [] + inbuiltmodelInfo = {} + #modelInfo['paramInfo'] = {} + for eachline in optionInfo: + words = eachline.split() + if words[0] == '.include': + name = words[1].split('.') + if name[1] == 'lib': + modelName.append(name[0]) + if name[1] == 'sub': + subcktName.append(name[0]) + elif words[0] == '.param': + paramInfo.append(eachline) + elif words[0] == '.model': + name = words[1]+':'+words[2].split('(')[0] #model_ref_name:actual_model_name + inbuiltmodelName.append(name) + inbuiltmodelInfo[name] = {} + #Get all the data with () of .model line + paramData = re.compile("\((.*)\)" ).search(eachline).group(1) + info = paramData.split() + for eachitem in info: + eachitem = eachitem.split('=') + inbuiltmodelInfo[name][eachitem[0]] = eachitem[1] + + + #Adding details of model(external) and subckt into modelInfo and subcktInfo + for eachmodel in modelName: + filename = eachmodel + '.lib' + if os.path.exists(filename): + try: + f = open(filename) + except: + print("Error in opening file") + sys.exit() + else: + print filename + " does not exist" + sys.exit() + data = f.read() + data = data.lower() + newdata = data.split('(') + newdata = newdata[1].split() + modelInfo[eachmodel] = {} + + for eachline in newdata: + if len(eachline) > 1: + info = eachline.split('=') + # modelInfo[eachmodel][info[0]] = {} + for eachitem in info: + modelInfo[eachmodel][info[0]] = info[1] #dic within a dic + #modelInfo[eachmodel] = modelInfo[eachmodel].split() + # modelInfo[eachmodel] = modelInfo[eachmodel].lower() + f.close() + + + return modelName, modelInfo, subcktName, paramInfo,inbuiltmodelName,inbuiltmodelInfo + + def processParam(self,paramInfo): + """ + Process parameter info and update in Modelica syntax + """ + modelicaParam = [] + for eachline in paramInfo: + eachline = eachline.split('.param') + #Include ',' in between parameter + #Removing leading and trailing space + line = eachline[1].strip() + line = line.split() + final_line = ','.join(line) + stat = 'parameter Real ' + final_line + ';' + stat = stat.translate(maketrans('{}', ' ')) + modelicaParam.append(stat) + print "Modelica Parameter----------->",modelicaParam + return modelicaParam + + + def separatePlot(self,schematicInfo): + """ + separate print plot and component statements + """ + compInfo = [] + plotInfo = [] + for eachline in schematicInfo: + words = eachline.split() + if words[0] == 'run': + continue + elif words[0] == 'plot' or words[0] == 'print': + plotInfo.append(eachline) + else: + compInfo.append(eachline) + return compInfo, plotInfo + + def separateSource(self,compInfo): + """ + Find if dependent sources are present in the schematic and if so make a dictionary with source details + """ + sourceInfo = {} + source = [] + for eachline in compInfo: + words = eachline.split() ##This line need to be confirmed with Manas + if eachline[0] in ['f', 'h']: + source.append(words[3]) + if len(source) > 0: + for eachline in compInfo: + words_s = eachline.split() + if words_s[0] in source: + sourceInfo[words_s[0]] = words_s[1:3] + return sourceInfo + + def splitIntoVal(self,val): + """ + Split the number k,u,p,t,g etc into powers e3,e-6 etc + """ + print "Val------------->",val + for i in range(0,len(val),1): + print "Val[i]----------------->",val[i] + if val[i] in ['k','u','p','t','g','m','n','f']: + newval = val.split(val[i]) + print "new Value------------>",newval + if val[i] == 'k': + value = newval[0] + 'e3' + if val[i] == 'u': + value = newval[0] + 'e-6' + if val[i] == 'p': + value = newval[0] + 'e-12' + if val[i] == 't': + value = newval[0] + 'e12' + if val[i] == 'g': + value = newval[0] + 'e9' + if val[i] == 'm': + if i != len(val)-1: + if val[i+1] == 'e': + value = newval[0] + 'e6' + else: + value = newval[0] +'e-3' + if val[i] == 'n': + value = newval[0] + 'e-9' + if val[i] == 'f': + value = newval[0] +'e-15' + + else: + value = val + return value + + def compInit(self,compInfo, node, modelInfo, subcktName): + """ + For each component in the netlist initialise it acc to Modelica format + """ + print "CompInfo inside compInit function : compInit",compInfo + #### initial processing to check if MOs is present. If so, library to be used is BondLib + modelicaCompInit = [] + numNodesSub = {} + IfMOS = '0' + for eachline in compInfo: + #words = eachline.split() + if eachline[0] == 'm': + IfMOS = '1' + break + if len(subcktName) > 0: + subOptionInfo = [] + subSchemInfo = [] + for eachsub in subcktName: + filename_tem = eachsub + '.sub' + data = self.readNetlist(filename_tem) + subOptionInfo, subSchemInfo = self.separateNetlistInfo(data) + for eachline in subSchemInfo: + #words = eachline.split() + if eachline[0] == 'm': + IfMOS = '1' + break + for eachline in compInfo: + words = eachline.split() + val = words[3] + value = self.splitIntoVal(val) + if eachline[0] == 'r': + stat = 'Analog.Basic.Resistor ' + words[0] + '(R = ' + value + ');' + modelicaCompInit.append(stat) + elif eachline[0] == 'c': + stat = 'Analog.Basic.Capacitor ' + words[0] + '(C = ' + value + ');' + modelicaCompInit.append(stat) + elif eachline[0] == 'l': + stat = 'Analog.Basic.Inductor ' + words[0] + '(L = ' + value + ');' + modelicaCompInit.append(stat) + elif eachline[0] == 'e': + stat = 'Analog.Basic.VCV ' + words[0] + '(gain = ' + self.splitIntoVal(words[5]) + ');' + modelicaCompInit.append(stat) + elif eachline[0] == 'g': + stat = 'Analog.Basic.VCC ' + words[0] + '(transConductance = ' + self.splitIntoVal(words[5]) + ');' + modelicaCompInit.append(stat) + elif eachline[0] == 'f': + stat = 'Analog.Basic.CCC ' + words[0] + '(gain = ' + self.splitIntoVal(words[4]) + ');' + modelicaCompInit.append(stat) + elif eachline[0] == 'h': + stat = 'Analog.Basic.CCV ' + words[0] + '(transResistance = ' + self.splitIntoVal(words[4]) + ');' + modelicaCompInit.append(stat) + elif eachline[0] == 'd': + if len(words) > 3: + n = float(modelInfo[words[3]]['n']) + vt_temp = 0.025*n + vt = str(vt_temp) + stat = 'Analog.Semiconductors.Diode ' + words[0] + '(Ids = ' + modelInfo[words[3]]['is'] + ', Vt = ' + vt + ', R = 1e12' +');' + else: + stat = 'Analog.Semiconductors.Diode ' + words[0] +';' + modelicaCompInit.append(stat) + elif eachline[0] == 'm': + line_l = words[7].split('=') + line_w = words[8].split('=') + line_pd = words[9].split('=') + line_ps = words[10].split('=') + line_ad = words[11].split('=') + line_as = words[12].split('=') + if words[5] == "mos_n" or words[5] == "mosfet_n": + start = 'BondLib.Electrical.Analog.Spice.Mn ' + if words[5] == "mos_p" or words[5] == "mosfet_p": + start = 'BondLib.Electrical.Analog.Spice.Mp ' + stat = start + words[0] + '(Tnom = 300, VT0 = ' + modelInfo[\ + words[5]]['vto'] + ', GAMMA = ' + modelInfo[words[5]]['gamma'] +\ + ', PHI = ' + modelInfo[words[5]]['phi'] + ', LD = ' + self.splitIntoVal(modelInfo[words[5]]['ld'])\ + + ', U0 = ' + str(float(self.splitIntoVal(modelInfo[words[5]]['uo']))*0.0001) + ', LAMBDA = ' \ + + modelInfo[words[5]]['lambda'] + ', TOX = ' + self.splitIntoVal(modelInfo[words[5]]['tox']) \ + + ', PB = ' + modelInfo[words[5]]['pb'] + ', CJ = ' + self.splitIntoVal(modelInfo[words[5]]['cj']) \ + + ', CJSW = ' + self.splitIntoVal(modelInfo[words[5]]['cjsw']) + ', MJ = ' + modelInfo[words[5]]['mj'] \ + + ', MJSW = ' + modelInfo[words[5]]['mjsw'] + ', CGD0 = ' + self.splitIntoVal(modelInfo[words[5]]['cgdo']) \ + + ', JS = ' + self.splitIntoVal(modelInfo[words[5]]['js']) + ', CGB0 = ' + self.splitIntoVal(modelInfo[words[5]]['cgbo']) \ + + ', CGS0 = ' + self.splitIntoVal(modelInfo[words[5]]['cgso']) + ', L = ' + self.splitIntoVal(line_l[1]) + ', W = ' \ + + line_w[1] + ', Level = 1' + ', AD = ' + line_ad[1] + ', AS = ' + line_as[1] + ', PD = ' \ + + line_pd[1] + ', PS = ' + line_pd[1] + ');' + stat = stat.translate(maketrans('{}', ' ')) + modelicaCompInit.append(stat) + elif eachline[0] == 'v': + typ = words[3].split('(') + if typ[0] == "pulse": + per = words[9].split(')') + #if IfMOS == '0': + #stat = 'Spice3.Sources.V_pulse '+words[0]+'(TR = '+words[6]+', V2 = '+words[4]+', PW = '+words[8]+', PER = '+per[0]+', V1 = '+typ[1]+', TD = '+words[5]+', TF = '+words[7]+');' + #elif IfMOS == '1': + stat = 'Analog.Sources.TrapezoidVoltage '+words[0]+'(rising = '+words[6]+', V = '+words[4]\ + +', width = '+words[8]+', period = '+per[0]+', offset = '+typ[1]+', startTime = '+words[5]+', falling = '+words[7]+');' + modelicaCompInit.append(stat) + if typ[0] == "sine": + theta = words[7].split(')') + #if IfMOS == '0': + #stat = 'Spice3.Sources.V_sin '+words[0]+'(VO = '+typ[1]+', VA = '+words[4]+', FREQ = '+words[5]+', TD = '+words[6]+', THETA = '+theta[0]+');' + #elif IfMOS == '1': + stat = 'Analog.Sources.SineVoltage '+words[0]+'(offset = '+typ[1]+', V = '+words[4]+', freqHz = '+words[5]+', startTime = '+words[6]+', phase = '+theta[0]+');' + modelicaCompInit.append(stat) + if typ[0] == "pwl": + #if IfMOS == '0': + #keyw = 'Spice3.Sources.V_pwl ' + #elif IfMOS == '1': + keyw = 'Analog.Sources.TableVoltage ' + stat = keyw + words[0] + '(table = [' + typ[1] + ',' + words[4] + ';' + length = len(words); + for i in range(6,length,2): + if i == length-2: + w = words[i].split(')') + stat = stat + words[i-1] + ',' + w[0] + else: + stat = stat + words[i-1] + ',' + words[i] + ';' + stat = stat + ']);' + modelicaCompInit.append(stat) + if typ[0] == words[3] and typ[0] != "dc": + val_temp = typ[0].split('v') + #if IfMOS == '0': + stat = 'Analog.Sources.ConstantVoltage ' + words[0] + '(V = ' + val_temp[0] + ');' + #elif IfMOS == '1': + #stat = 'Analog.Sources.ConstantVoltage ' + words[0] + '(V = ' + val_temp[0] + ');' + modelicaCompInit.append(stat) + elif typ[0] == words[3] and typ[0] == "dc": + #if IfMOS == '0': + #stat = 'Spice3.Sources.V_constant ' + words[0] + '(V = ' + words[4] + ');' ### check this + #elif IfMOS == '1': + stat = 'Analog.Sources.ConstantVoltage ' + words[0] + '(V = ' + words[4] + ');' ### check this + modelicaCompInit.append(stat) + + elif eachline[0] == 'x': + temp_line = eachline.split() + temp = temp_line[0].split('x') + index = temp[1] + for i in range(0,len(temp_line),1): + if temp_line[i] in subcktName: + subname = temp_line[i] + numNodesSub[subname] = i - 1 + point = i + if len(temp_line) > point + 1: + rem = temp_line[point+1:len(temp_line)] + rem_new = ','.join(rem) + stat = subname + ' ' + subname +'_instance' + index + '(' + rem_new + ');' + else: + stat = subname + ' ' + subname +'_instance' + index + ';' + modelicaCompInit.append(stat) + else: + continue + + if '0' in node: + modelicaCompInit.append('Analog.Basic.Ground g;') + return modelicaCompInit, numNodesSub + + def getSubInterface(self,subname,numNodesSub): + """ + Get the list of nodes for subcircuit in .subckt line + """ + subOptionInfo_p = [] + subSchemInfo_p = [] + filename_t = subname + '.sub' + data_p = self.readNetlist(filename_t) + subOptionInfo_p, subSchemInfo_p = self.separateNetlistInfo(data_p) + if len(subOptionInfo_p) > 0: + newline = subOptionInfo_p[0] + newline = newline.split('.subckt '+ subname) + intLine = newline[1].split() + newindex = numNodesSub[subname] + nodesInfoLine = intLine[0:newindex] + return nodesInfoLine + + def getSubParamLine(self,subname, numNodesSub, subParamInfo): + """ + Take subcircuit name and give the info related to parameters in the first line and initislise it in + """ + #nodeSubInterface = [] + subOptionInfo_p = [] + subSchemInfo_p = [] + filename_t = subname + '.sub' + data_p = self.readNetlist(filename_t) + subOptionInfo_p, subSchemInfo_p = self.separateNetlistInfo(data_p) + print "subOptionInfo_p------------------------->",subOptionInfo_p + print "subSchemInfo_p----------------------------->",subSchemInfo_p + if len(subOptionInfo_p) > 0: + newline = subOptionInfo_p[0] + newline = newline.split('.subckt '+ subname) + intLine = newline[1].split() + print "numNodesSub Index---------->",numNodesSub + newindex = numNodesSub[subname] + appen_line = intLine[newindex:len(intLine)] + appen_param = ','.join(appen_line) + paramLine = 'parameter Real ' + appen_param + ';' + paramLine = paramLine.translate(maketrans('{}', ' ')) + subParamInfo.append(paramLine) + return subParamInfo + + def nodeSeparate(self,compInfo, ifSub, subname, subcktName,numNodesSub): + """ + separate the node numbers and create nodes in modelica file; + the nodes in the subckt line should not be inside protected keyword. pinInit is the one that goes under protected keyword. + """ + node = [] + nodeTemp = [] + nodeDic = {} + pinInit = 'Modelica.Electrical.Analog.Interfaces.Pin ' + pinProtectedInit = 'Modelica.Electrical.Analog.Interfaces.Pin ' + protectedNode = [] + print "CompInfo coming to nodeSeparate function: compInfo",compInfo + + #Removing '[' and ']' from compInfo for Digital node + for i in range(0,len(compInfo),1): + compInfo[i] = compInfo[i].replace("[","").replace("]","") + + + + for eachline in compInfo: + words = eachline.split() + if eachline[0] in ['m', 'e', 'g', 't']: + nodeTemp.append(words[1]) + nodeTemp.append(words[2]) + nodeTemp.append(words[3]) + nodeTemp.append(words[4]) + elif eachline[0] in ['q', 'j']: + nodeTemp.append(words[1]) + nodeTemp.append(words[2]) + nodeTemp.append(words[3]) + elif eachline[0] == 'x': + templine = eachline.split() + for i in range(0,len(templine),1): + if templine[i] in subcktName: + point = i + nodeTemp.extend(words[1:point]) + else: + nodeTemp.append(words[1]) + nodeTemp.append(words[2]) + for i in nodeTemp: + if i not in node: + node.append(i) + + for i in range(0, len(node),1): + nodeDic[node[i]] = 'n' + node[i] + if ifSub == '0': + if i != len(node)-1: + pinInit = pinInit + nodeDic[node[i]] + ', ' + else: + pinInit = pinInit + nodeDic[node[i]] + else: + nonprotectedNode = self.getSubInterface(subname, numNodesSub) + if node[i] in nonprotectedNode: + continue + else: + protectedNode.append(node[i]) + if ifSub == '1': + if len(nonprotectedNode) > 0: + for i in range(0, len(nonprotectedNode),1): + if i != len(nonprotectedNode)-1: + pinProtectedInit = pinProtectedInit + nodeDic[nonprotectedNode[i]] + ',' + else: + pinProtectedInit = pinProtectedInit + nodeDic[nonprotectedNode[i]] + if len(protectedNode) > 0: + for i in range(0, len(protectedNode),1): + if i != len(protectedNode)-1: + pinInit = pinInit + nodeDic[protectedNode[i]] + ',' + else: + pinInit = pinInit + nodeDic[protectedNode[i]] + pinInit = pinInit + ';' + pinProtectedInit = pinProtectedInit + ';' + return node, nodeDic, pinInit, pinProtectedInit + + + def connectInfo(self,compInfo, node, nodeDic, numNodesSub,subcktName): + """ + Make node connections in the modelica netlist + """ + connInfo = [] + sourcesInfo = self.separateSource(compInfo) + for eachline in compInfo: + words = eachline.split() + if eachline[0] == 'r' or eachline[0] == 'c' or eachline[0] == 'd' or eachline[0] == 'l' or eachline[0] == 'v': + conn = 'connect(' + words[0] + '.p,' + nodeDic[words[1]] + ');' + connInfo.append(conn) + conn = 'connect(' + words[0] + '.n,' + nodeDic[words[2]] + ');' + connInfo.append(conn) + elif eachline[0] == 'm': + conn = 'connect(' + words[0] + '.D,' + nodeDic[words[1]] + ');' + connInfo.append(conn) + conn = 'connect(' + words[0] + '.G,' + nodeDic[words[2]] + ');' + connInfo.append(conn) + conn = 'connect(' + words[0] + '.S,' + nodeDic[words[3]] + ');' + connInfo.append(conn) + conn = 'connect(' + words[0] + '.B,' + nodeDic[words[4]] + ');' + connInfo.append(conn) + elif eachline[0] in ['f','h']: + vsource = words[3] + sourceNodes = sourcesInfo[vsource] + sourceNodes = sourceNodes.split() + conn = 'connect(' + words[0] + '.p1,'+ nodeDic[sourceNodes[0]] + ');' + connInfo.append(conn) + conn = 'connect(' + words[0] + '.n1,'+ nodeDic[sourceNodes[1]] + ');' + connInfo.append(conn) + conn = 'connect(' + words[0] + '.p2,'+ nodeDic[words[1]] + ');' + connInfo.append(conn) + conn = 'connect(' + words[0] + '.n2,'+ nodeDic[words[2]] + ');' + connInfo.append(conn) + elif eachline[0] in ['g','e']: + conn = 'connect(' + words[0] + '.p1,'+ nodeDic[words[3]] + ');' + connInfo.append(conn) + conn = 'connect(' + words[0] + '.n1,'+ nodeDic[words[4]] + ');' + connInfo.append(conn) + conn = 'connect(' + words[0] + '.p2,'+ nodeDic[words[1]] + ');' + connInfo.append(conn) + conn = 'connect(' + words[0] + '.n2,'+ nodeDic[words[2]] + ');' + connInfo.append(conn) + elif eachline[0] == 'x': + templine = eachline.split() + temp = templine[0].split('x') + index = temp[1] + for i in range(0,len(templine),1): + print "Test------------------>" + if templine[i] in subcktName: #Ask Manas Added subcktName in function Call + subname = templine[i] + nodeNumInfo = self.getSubInterface(subname, numNodesSub) + for i in range(0, numNodesSub[subname], 1): + #conn = 'connect(' + subname + '_instance' + index + '.' + nodeDic[nodeNumInfo[i]] + ',' + nodeDic[words[i+1]] + ');' + conn = 'connect(' + subname + '_instance' + index + '.' + 'n'+ nodeNumInfo[i] + ',' + nodeDic[words[i+1]] + ');' + connInfo.append(conn) + else: + continue + if '0' in node: + conn = 'connect(g.p,n0);' + connInfo.append(conn) + + return connInfo + + + def procesSubckt(self,subcktName,numNodesSub): + + #Process the subcircuit file .sub in the project folder + + #subcktDic = {} + subOptionInfo = [] + subSchemInfo = [] + subModel = [] + subModelInfo = {} + subsubName = [] + subParamInfo = [] + subinbuiltmodelName = [] + subinbuiltmodelInfo = {} + nodeSubInterface = [] + nodeSub = [] + nodeDicSub = {} + pinInitsub = [] + connSubInfo = [] + print "subcktName------------------>",subcktName + if len(subcktName) > 0: + for eachsub in subcktName: + filename = eachsub + '.sub' + data = self.readNetlist(filename) + print "Data-------------------->",data + subOptionInfo, subSchemInfo = self.separateNetlistInfo(data) + print "SubOptionInfo------------------->",subOptionInfo + print "SubSchemInfo-------------------->",subSchemInfo + if len(subOptionInfo) > 0: + newline = subOptionInfo[0] + subInitLine = newline + newline = newline.split('.subckt') + intLine = newline[1].split() + for i in range(0,len(intLine),1): + nodeSubInterface.append(intLine[i]) + + subModel, subModelInfo, subsubName, subParamInfo,subinbuiltmodelName, subinbuiltmodelInfo = self.addModel(subOptionInfo) + print "Sub Model------------------------------------>",subModel + print "SubModelInfo---------------------------------->",subModelInfo + print "subsubName------------------------------------->",subsubName + print "subParamInfo----------------------------------->",subParamInfo + IfMOSsub = '0' + for eachline in subSchemInfo: + #words = eachline.split() + if eachline[0] == 'm': + IfMOSsub = '1' + break + subsubOptionInfo = [] + subsubSchemInfo = [] + if len(subsubName) > 0: + #subsubOptionInfo = [] + #subsubSchemInfo = [] + for eachsub in subsubName: + filename_stemp = eachsub + '.sub' + data = self.readNetlist(filename_stemp) + subsubOptionInfo, subsubSchemInfo = self.separateNetlistInfo(data) + for eachline in subsubSchemInfo: + #words = eachline.split() + if eachline[0] == 'm': + IfMOSsub = '1' + break + print "subsubOptionInfo-------------------------->",subsubOptionInfo + print "subsubSchemInfo-------------------------->",subsubSchemInfo + + modelicaSubParam = self.processParam(subParamInfo) + print "modelicaSubParam------------------->",modelicaSubParam + nodeSub, nodeDicSub, pinInitSub, pinProtectedInitSub = self.nodeSeparate(subSchemInfo, '1', eachsub, subsubName,numNodesSub) + print "NodeSub------------------------->",nodeSub + print "NodeDicSub-------------------------->",nodeDicSub + print "PinInitSub-------------------------->",pinInitSub + print "PinProtectedInitSub------------------->",pinProtectedInitSub + modelicaSubCompInit, numNodesSubsub = self.compInit(subSchemInfo, nodeSub, subModelInfo, subsubName) + print "modelicaSubCompInit--------------------->",modelicaSubCompInit + print "numNodesSubsub-------------------------->",numNodesSubsub + modelicaSubParamNew = self.getSubParamLine(eachsub, numNodesSub, modelicaSubParam) ###Ask Manas + print "modelicaSubParamNew----------------->",modelicaSubParamNew + connSubInfo = self.connectInfo(subSchemInfo, nodeSub, nodeDicSub, numNodesSubsub,subcktName) + newname = filename.split('.') + newfilename = newname[0] + outfilename = newfilename+ ".mo" + out = open(outfilename,"w") + out.writelines('model ' + os.path.basename(newfilename)) + out.writelines('\n') + if IfMOSsub == '0': + out.writelines('import Modelica.Electrical.*;') + elif IfMOSsub == '1': + out.writelines('import BondLib.Electrical.*;') + out.writelines('\n') + for eachline in modelicaSubParamNew: + if len(subParamInfo) == 0: + continue + else: + out.writelines(eachline) + out.writelines('\n') + for eachline in modelicaSubCompInit: + if len(subSchemInfo) == 0: + continue + else: + out.writelines(eachline) + out.writelines('\n') + + out.writelines(pinProtectedInitSub) + out.writelines('\n') + if pinInitSub != 'Modelica.Electrical.Analog.Interfaces.Pin ;': + out.writelines('protected') + out.writelines('\n') + out.writelines(pinInitSub) + out.writelines('\n') + out.writelines('equation') + out.writelines('\n') + for eachline in connSubInfo: + if len(connSubInfo) == 0: + continue + else: + out.writelines(eachline) + out.writelines('\n') + out.writelines('end '+ os.path.basename(newfilename) + ';') + out.writelines('\n') + out.close() + + return data, subOptionInfo, subSchemInfo, subModel, subModelInfo, subsubName, \ + subParamInfo, modelicaSubCompInit, modelicaSubParam, nodeSubInterface, nodeSub, nodeDicSub, pinInitSub, connSubInfo + + + +def main(args): + """ + It is main function of module Ngspice to Modelica converter + """ + if len(sys.argv) == 2: + filename = sys.argv[1] + else: + print "USAGE:" + print "python NgspicetoModelica.py <filename>" + sys.exit() + + obj_NgMoConverter = NgMoConverter() + + #Getting all the require information + lines = obj_NgMoConverter.readNetlist(filename) + #print "Complete Lines of Ngspice netlist :lines ---------------->",lines + optionInfo, schematicInfo=obj_NgMoConverter.separateNetlistInfo(lines) + #print "All option details like analysis,subckt,.ic,.model : OptionInfo------------------->",optionInfo + #print "Schematic connection info :schematicInfo",schematicInfo + modelName, modelInfo, subcktName, paramInfo, inbuiltmodelName, inbuiltmodelInfo = obj_NgMoConverter.addModel(optionInfo) + print "Name of Model : modelName-------------------->",modelName + print "Model Information :modelInfo--------------------->",modelInfo + print "Subcircuit Name :subcktName------------------------>",subcktName + print "Parameter Information :paramInfo---------------------->",paramInfo + print "Ngspice inbuiltmodelName :inbuiltmodelName---------------------->",inbuiltmodelName + print "Ngspice inbuiltmodelInfo :inbuiltmodelInfo----------------------->",inbuiltmodelInfo + + + modelicaParamInit = obj_NgMoConverter.processParam(paramInfo) + #print "Make modelicaParamInit from paramInfo :processParamInit------------->",modelicaParamInit + compInfo, plotInfo = obj_NgMoConverter.separatePlot(schematicInfo) + #print "Info like run etc : CompInfo----------------->",compInfo + #print "Plot info like plot,print etc :plotInfo",plotInfo + IfMOS = '0' + + for eachline in compInfo: + words = eachline.split() + if eachline[0] == 'm': + IfMOS = '1' + break + subOptionInfo = [] + subSchemInfo = [] + if len(subcktName) > 0: + #subOptionInfo = [] + #subSchemInfo = [] + for eachsub in subcktName: + filename_temp = eachsub + '.sub' + data = obj_NgMoConverter.readNetlist(filename_temp) + subOptionInfo, subSchemInfo = obj_NgMoConverter.separateNetlistInfo(data) + for eachline in subSchemInfo: + words = eachline.split() + if eachline[0] == 'm': + IfMOS = '1' + break + #print "Subcircuit OptionInfo : subOptionInfo------------------->",subOptionInfo + #print "Subcircuit Schematic Info :subSchemInfo-------------------->",subSchemInfo + + node, nodeDic, pinInit, pinProtectedInit = obj_NgMoConverter.nodeSeparate(compInfo, '0', [], subcktName,[]) + print "All nodes in the netlist :node---------------->",node + print "NodeDic which will be used for modelica : nodeDic------------->",nodeDic + print "PinInit-------------->",pinInit + print "pinProtectedInit----------->",pinProtectedInit + + modelicaCompInit, numNodesSub = obj_NgMoConverter.compInit(compInfo,node, modelInfo, subcktName) + print "ModelicaComponents : modelicaCompInit----------->",modelicaCompInit + print "SubcktNumNodes : numNodesSub---------------->",numNodesSub + + connInfo = obj_NgMoConverter.connectInfo(compInfo, node, nodeDic, numNodesSub,subcktName) + + print "ConnInfo------------------>",connInfo + + + ###After Sub Ckt Func + if len(subcktName) > 0: + data, subOptionInfo, subSchemInfo, subModel, subModelInfo, subsubName,subParamInfo, modelicaSubCompInit, modelicaSubParam,\ + nodeSubInterface,nodeSub, nodeDicSub, pinInitSub, connSubInfo = obj_NgMoConverter.procesSubckt(subcktName,numNodesSub) #Adding 'numNodesSub' by Fahim + + #Creating Final Output file + newfile = filename.split('.') + newfilename = newfile[0] + outfile = newfilename + ".mo" + out = open(outfile,"w") + out.writelines('model ' + os.path.basename(newfilename)) + out.writelines('\n') + if IfMOS == '0': + out.writelines('import Modelica.Electrical.*;') + elif IfMOS == '1': + out.writelines('import BondLib.Electrical.*;') + #out.writelines('import Modelica.Electrical.*;') + out.writelines('\n') + + for eachline in modelicaParamInit: + if len(paramInfo) == 0: + continue + else: + out.writelines(eachline) + out.writelines('\n') + for eachline in modelicaCompInit: + if len(compInfo) == 0: + continue + else: + out.writelines(eachline) + out.writelines('\n') + + out.writelines('protected') + out.writelines('\n') + out.writelines(pinInit) + out.writelines('\n') + out.writelines('equation') + out.writelines('\n') + + for eachline in connInfo: + if len(connInfo) == 0: + continue + else: + out.writelines(eachline) + out.writelines('\n') + + out.writelines('end '+ os.path.basename(newfilename) + ';') + out.writelines('\n') + + + out.close() + + +# Call main function +if __name__ == '__main__': + main(sys.argv)
\ No newline at end of file diff --git a/src/ngspicetoModelica/__init__.py b/src/ngspicetoModelica/__init__.py new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/src/ngspicetoModelica/__init__.py diff --git a/src/projManagement/Kicad.py b/src/projManagement/Kicad.py index c2a0c948..41fb8d79 100644 --- a/src/projManagement/Kicad.py +++ b/src/projManagement/Kicad.py @@ -29,7 +29,7 @@ class Kicad: def __init__(self,dockarea): self.obj_validation = Validation.Validation() self.obj_appconfig = Appconfig() - self.obj_dockarea=dockarea + self.obj_dockarea= dockarea def openSchematic(self): """ @@ -60,7 +60,8 @@ class Kicad: self.msg.setWindowTitle("Error Message") - + ''' + #Commenting as it is no longer needed as PBC and Layout will open from eeschema def openFootprint(self): """ This function create command to open Footprint editor @@ -115,6 +116,8 @@ class Kicad: self.msg.showMessage('Please select the project first. You can either create new project or open existing project') self.obj_appconfig.print_warning('Please select the project first. You can either create new project or open existing project') self.msg.setWindowTitle("Error Message") + + ''' def openKicadToNgspice(self): """ diff --git a/src/projManagement/Validation.py b/src/projManagement/Validation.py index ac0473af..bafcbe08 100644 --- a/src/projManagement/Validation.py +++ b/src/projManagement/Validation.py @@ -18,6 +18,7 @@ #=============================================================================== import os import re +import distutils.spawn class Validation: @@ -110,4 +111,23 @@ class Validation: else: return "True" else: - return "DIREC"
\ No newline at end of file + return "DIREC" + + def validateCirOut(self,projDir): + """ + This function checks if ".cir.out" file is present. + """ + projName = os.path.basename(str(projDir)) + lookCirOut = os.path.join(str(projDir),projName+".cir.out") + #Check existence of project + if os.path.exists(lookCirOut): + return True + else: + return False + + def validateTool(self,toolName): + """ + This function check if tool is present in the system + """ + return distutils.spawn.find_executable(toolName) is not None +
\ No newline at end of file |