summaryrefslogtreecommitdiff
path: root/src/maker/ModelGeneration.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/maker/ModelGeneration.py')
-rwxr-xr-xsrc/maker/ModelGeneration.py204
1 files changed, 122 insertions, 82 deletions
diff --git a/src/maker/ModelGeneration.py b/src/maker/ModelGeneration.py
index 49d5da0b..42ebd285 100755
--- a/src/maker/ModelGeneration.py
+++ b/src/maker/ModelGeneration.py
@@ -27,20 +27,20 @@
# =========================================================================
-# importing the files and libraries
import re
import os
from PyQt5 import QtCore, QtWidgets
from configparser import ConfigParser
from configuration import Appconfig
+
from . import createkicad
import hdlparse.verilog_parser as vlog
-# Class is used to generate the Ngspice Model
class ModelGeneration(QtWidgets.QWidget):
-
- # initialising the variables
+ '''
+ Class is used to generate the Ngspice Model
+ '''
def __init__(self, file, termedit):
QtWidgets.QWidget.__init__(self)
super().__init__()
@@ -72,11 +72,12 @@ class ModelGeneration(QtWidgets.QWidget):
self.licensefile = self.parser.get('SRC', 'LICENSE')
self.digital_home = self.parser.get(
'NGHDL', 'DIGITAL_MODEL') + "/Ngveri"
- # # #### Creating connection_info.txt file from verilog file #### #
- # Reading the file and performing operations and
- # copying it in the Ngspice folder
def verilogfile(self):
+ '''
+ Reading the file and performing operations and
+ copying it in the Ngspice folder
+ '''
Text = "<span style=\" font-size:25pt;\
font-weight:1000; color:#008000;\" >"
Text += ".................Running NgVeri..................."
@@ -107,8 +108,10 @@ class ModelGeneration(QtWidgets.QWidget):
f.write("\n")
f.close()
- # This function calls the sandpiper to convert .tlv file to .sv file
def sandpiper(self):
+ '''
+ This function calls the sandpiper to convert .tlv file to .sv file
+ '''
init_path = '../../'
if os.name == 'nt':
init_path = ''
@@ -153,12 +156,12 @@ class ModelGeneration(QtWidgets.QWidget):
os.chdir(self.cur_dir)
self.fname = self.fname.split('.')[0] + ".sv"
- # This function parses the module name and \
- # input/output ports of verilog code using HDL parse
- # and writes to the connection_info.txt
-
def verilogParse(self):
-
+ '''
+ This function parses the module name and
+ input/output ports of verilog code using HDL parse
+ and writes to the "connection_info.txt".
+ '''
with open(self.modelpath + self.fname, 'rt') as fh:
code = fh.read()
@@ -218,9 +221,11 @@ class ModelGeneration(QtWidgets.QWidget):
return "Error"
return "No Error"
- # This function is used to get the Port Information from
- # connection_info.txt
def getPortInfo(self):
+ '''
+ This function is used to get the port information
+ from "connection_info.txt"
+ '''
readfile = open(self.modelpath + 'connection_info.txt', 'r')
data = readfile.readlines()
self.input_list = []
@@ -254,10 +259,11 @@ class ModelGeneration(QtWidgets.QWidget):
for output in self.output_list:
self.output_port.append(output[0] + ":" + output[2])
- # This function is used to create the cfunc.mod file in Ngspice folder
- # automatically
-
def cfuncmod(self):
+ '''
+ This function is used to create the "cfunc.mod" file
+ in Ngspice folder automatically.
+ '''
# ############# Creating content for cfunc.mod file ############## #
@@ -397,12 +403,17 @@ and set the load for input ports */
}\n\n\
if(ANALYSIS == DC)\n\
{\n\
- OUTPUT_STATE(" + item.split(':')[0] + "[Ii]) = _op_" + item.split(':')[0] + "[Ii];\n\
+ OUTPUT_STATE(" + item.split(':')[0] +
+ "[Ii]) = _op_" + item.split(':')[0] + "[Ii];\n\
}\n\
- else if(_op_" + item.split(':')[0] + "[Ii] != _op_" + item.split(':')[0] + "_old[Ii])\n\
+ else if(_op_" + item.split(':')[0] +
+ "[Ii] != _op_" + item.split(':')[0] + "_old[Ii])\n\
{\n\
- OUTPUT_STATE(" + item.split(':')[0] + "[Ii]) = _op_" + item.split(':')[0] + "[Ii];\n\
- OUTPUT_DELAY(" + item.split(':')[0] + "[Ii]) = ((_op_" + item.split(':')[0] + "[Ii] == ZERO) ? PARAM(fall_delay) : PARAM(rise_delay));\n\
+ OUTPUT_STATE(" + item.split(':')[0] + "[Ii]) = _op_" +
+ item.split(':')[0] + "[Ii];\n\
+ OUTPUT_DELAY(" + item.split(':')[0] + "[Ii]) = ((_op_" +
+ item.split(':')[0] +
+ "[Ii] == ZERO) ? PARAM(fall_delay) : PARAM(rise_delay));\n\
}\n\
else\n\
{\n\
@@ -497,9 +508,11 @@ and set the load for input ports */
cfunc.write("\n}")
cfunc.close()
- # This function creates the ifspec file automatically in Ngspice folder
-
def ifspecwrite(self):
+ '''
+ This function creates the ifspec file
+ automatically in Ngspice folder.
+ '''
print("Starting with ifspec.ifs file")
ifspec = open(self.modelpath + 'ifspec.ifs', 'w')
@@ -607,10 +620,11 @@ and set the load for input ports */
ifspec.write("\n")
ifspec.close()
- # This function creates the header file of sim_main file automatically in
- # Ngspice folder
-
def sim_main_header(self):
+ '''
+ This function creates the header file of
+ "sim_main" file automatically in Ngspice folder.
+ '''
print("Starting With sim_main_" + self.fname.split('.')[0] + ".h file")
simh = open(
self.modelpath +
@@ -632,9 +646,11 @@ and set the load for input ports */
simh.write(item)
simh.close()
- # This function creates the sim_main file needed by verilator
- # automatically in Ngspice folder
def sim_main(self):
+ '''
+ This function creates the "sim_main" file needed by verilator
+ automatically in Ngspice folder.
+ '''
print(
"Starting With sim_main_" +
self.fname.split('.')[0] +
@@ -650,7 +666,8 @@ and set the load for input ports */
self.fname.split('.')[0] +
".cpp file")
- comment = '''/* This is cfunc.mod file auto generated by gen_con_info.py
+ comment = \
+ '''/* This is cfunc.mod file auto generated by gen_con_info.py
Developed by Sumanto Kar at IIT Bombay */\n
'''
@@ -680,7 +697,8 @@ and set the load for input ports */
extern "C" int foo_''' + self.fname.split('.')[0] + '''(int,int);
''')
convert_func = '''
- void int2arr''' + self.fname.split('.')[0] + '''(int num, int array[], int n)
+ void int2arr''' + self.fname.split('.')[0] + \
+ '''(int num, int array[], int n)
{
for (int i = 0; i < n && num>=0; i++)
{
@@ -700,17 +718,20 @@ and set the load for input ports */
int foo_''' + self.fname.split('.')[0] + '''(int init,int count)
{
static VerilatedContext* contextp = new VerilatedContext;
- static V''' + self.fname.split('.')[0] + "* " + self.fname.split('.')[0] + '''[1024];
+ static V''' + self.fname.split('.')[0] + "* " + \
+ self.fname.split('.')[0] + '''[1024];
count--;
if (init==0)
{
- ''' + self.fname.split('.')[0] + '''[count]=new V''' + self.fname.split('.')[0] + '''{contextp};
+ ''' + self.fname.split('.')[0] + '''[count]=new V''' + \
+ self.fname.split('.')[0] + '''{contextp};
contextp->traceEverOn(true);
}
else
{
contextp->timeInc(1);
- printf("=============''' + self.fname.split('.')[0] + ''' : New Iteration===========");
+ printf("=============''' + self.fname.split('.')[0] + \
+ ''' : New Iteration===========");
printf("\\nInstance : %d\\n",count);
printf("\\nInside foo before eval.....\\n");
'''
@@ -788,8 +809,10 @@ and set the load for input ports */
csim.write(item)
csim.close()
- # This function creates modpathlst in Ngspice folder
def modpathlst(self):
+ '''
+ This function creates modpathlst in Ngspice folder.
+ '''
print("Editing modpath.lst file")
mod = open(self.digital_home + '/modpath.lst', 'r')
text = mod.read()
@@ -799,8 +822,11 @@ and set the load for input ports */
mod.write(self.fname.split('.')[0] + "\n")
mod.close()
- # This function is used to run the Verilator using the verilator commands
def run_verilator(self):
+ '''
+ This function is used to run the Verilator
+ using the verilator commands.
+ '''
init_path = '../../'
if os.name == 'nt':
init_path = ''
@@ -841,8 +867,10 @@ and set the load for input ports */
print("Verilator Executed")
os.chdir(self.cur_dir)
- # Running make verilator using this function
def make_verilator(self):
+ '''
+ Running make verilator using this function
+ '''
self.cur_dir = os.getcwd()
print("Make Verilator.............")
os.chdir(self.modelpath)
@@ -876,9 +904,11 @@ and set the load for input ports */
print("Make Verilator Executed")
os.chdir(self.cur_dir)
- # This function copies the verilator files/object files from
- # src/xspice/icm/Ngveri/ to release/src/xspice/icm/Ngveri/
def copy_verilator(self):
+ '''
+ This function copies the verilator files/object files from
+ "src/xspice/icm/Ngveri/ to release/src/xspice/icm/Ngveri/"
+ '''
self.cur_dir = os.getcwd()
print("Copying the required files to Release Folder.............")
os.chdir(self.modelpath)
@@ -934,8 +964,10 @@ and set the load for input ports */
except BaseException:
print("There is error in Copying Files ")
- # Running the make command for Ngspice
def runMake(self):
+ '''
+ Running the make command for Ngspice
+ '''
print("run Make Called")
self.release_home = self.parser.get('NGHDL', 'RELEASE')
path_icm = os.path.join(self.release_home, "src/xspice/icm")
@@ -965,10 +997,11 @@ and set the load for input ports */
os.chdir(self.cur_dir)
except BaseException:
print("There is error in 'make' ")
- # sys.exit()
- # Running the make install command for Ngspice
def runMakeInstall(self):
+ '''
+ Running the make install command for Ngspice
+ '''
self.cur_dir = os.getcwd()
print("run Make Install Called")
self.release_home = self.parser.get('NGHDL', 'RELEASE')
@@ -1005,11 +1038,12 @@ and set the load for input ports */
except BaseException as e:
print(e)
print("There is error in 'make install' ")
- # sys.exit()
- # This function is used to add additional files required by the verilog
- # top module
def addfile(self):
+ '''
+ This function is used to add additional files
+ required by the verilog top module.
+ '''
print("Adding the files required by the top level module file")
init_path = '../../'
@@ -1120,9 +1154,11 @@ and set the load for input ports */
print("Added the folder")
# os.chdir(self.cur_dir)
- # This function is used to print the titles in the terminal of Ngveri tab
def termtitle(self, textin):
-
+ '''
+ This function is used to print the titles
+ in the terminal of Ngveri tab.
+ '''
Text = "<span style=\" font-size:20pt; \
font-weight:1000; color:#0000FF;\" >"
Text += "<br>================================<br>"
@@ -1131,20 +1167,23 @@ and set the load for input ports */
Text += "</span>"
self.termedit.append(Text)
- # This function is used to print the text/commands in the terminal of
- # Ngveri tab
def termtext(self, textin):
-
+ '''
+ This function is used to print the text/commands
+ in the terminal of Ngveri tab.
+ '''
Text = "<span style=\" font-size:12pt;\
font-weight:500; color:#000000;\" >"
Text += textin
Text += "</span>"
self.termedit.append(Text)
- # This function reads all the Standard output data and the errors from the
- # process that aree being run
@QtCore.pyqtSlot()
def readAllStandard(self):
+ '''
+ This function reads all the standard output data and
+ the errors from the process that are being run.
+ '''
# self.termedit = termedit
# self.termedit.append(str(self.process.readAll().data(),\
# encoding='utf-8'))
@@ -1166,11 +1205,12 @@ and set the load for input ports */
TextErr += "<br>" + line
TextErr += "</span>"
self.termedit.append(TextErr)
+
# @QtCore.pyqtSlot()
# def readAllStandard(self):
# #self.termedit = termedit
# self.termedit.append(str(self.process.\
- # readAll().data(), encoding='utf-8'))
+ # readAll().data(), encoding='utf-8'))
# print(str(self.process.readAll().data(), encoding='utf-8'))
# stderror = self.process.readAllStandardError()
@@ -1183,32 +1223,32 @@ and set the load for input ports */
# Text += "</span>"
# self.termedit.append(Text+"\n")
- # init_path = '../../'
- # if os.name == 'nt':
- # init_path = ''
- # includefile = QtCore.QDir.toNativeSeparators(\
- # QtWidgets.QFileDialog.getOpenFileName(
- # self, "Open adding other necessary files to be included",
- # init_path + "home"
- # )[0]
- # )
- # if includefile=="":
- # reply=QtWidgets.QMessageBox.critical(
- # None, "Error Message",
- # "<b>Error: No File Chosen. Please chose a file</b>",
- # QtWidgets.QMessageBox.Ok | QtWidgets.QMessageBox.Cancel
- # )
- # if reply == QtWidgets.QMessageBox.Ok:
- # self.addfile()
- # self.obj_Appconfig.print_info('Add Other Files Called')
-
- # elif reply == QtWidgets.QMessageBox.Cancel:
- # self.obj_Appconfig.print_info('No File Chosen')
- # filename = os.path.basename(includefile)
- # self.modelpath=self.digital_home+"/"+self.fname.split('.')[0]+"/"
-
- # if not os.path.isdir(self.modelpath):
- # os.mkdir(self.modelpath)
- # text = open(includefile).read()
- # open(self.modelpath+filename,'w').write(text)
- # includefile.close()
+ # init_path = '../../'
+ # if os.name == 'nt':
+ # init_path = ''
+ # includefile = QtCore.QDir.toNativeSeparators(\
+ # QtWidgets.QFileDialog.getOpenFileName(
+ # self, "Open adding other necessary files to be included",
+ # init_path + "home"
+ # )[0]
+ # )
+ # if includefile=="":
+ # reply=QtWidgets.QMessageBox.critical(
+ # None, "Error Message",
+ # "<b>Error: No File Chosen. Please chose a file</b>",
+ # QtWidgets.QMessageBox.Ok | QtWidgets.QMessageBox.Cancel
+ # )
+ # if reply == QtWidgets.QMessageBox.Ok:
+ # self.addfile()
+ # self.obj_Appconfig.print_info('Add Other Files Called')
+
+ # elif reply == QtWidgets.QMessageBox.Cancel:
+ # self.obj_Appconfig.print_info('No File Chosen')
+ # filename = os.path.basename(includefile)
+ # self.modelpath=self.digital_home+"/"+self.fname.split('.')[0]+"/"
+
+ # if not os.path.isdir(self.modelpath):
+ # os.mkdir(self.modelpath)
+ # text = open(includefile).read()
+ # open(self.modelpath+filename,'w').write(text)
+ # includefile.close()