summaryrefslogtreecommitdiff
path: root/src/createKicadLibrary.py
diff options
context:
space:
mode:
authorathulappadan2015-10-15 16:14:52 +0530
committerathulappadan2015-10-15 16:14:52 +0530
commite2e6389e26e6c188926ca8d5c87e42d53d658365 (patch)
tree9025186e008f99a53e2be900c20947e67c1f75aa /src/createKicadLibrary.py
parent84a705792ece30cedac560e1cf688f3bcd5913cd (diff)
downloadnghdl-e2e6389e26e6c188926ca8d5c87e42d53d658365.tar.gz
nghdl-e2e6389e26e6c188926ca8d5c87e42d53d658365.tar.bz2
nghdl-e2e6389e26e6c188926ca8d5c87e42d53d658365.zip
eSim-nghdl integration
Diffstat (limited to 'src/createKicadLibrary.py')
-rw-r--r--src/createKicadLibrary.py231
1 files changed, 231 insertions, 0 deletions
diff --git a/src/createKicadLibrary.py b/src/createKicadLibrary.py
new file mode 100644
index 0000000..19559ce
--- /dev/null
+++ b/src/createKicadLibrary.py
@@ -0,0 +1,231 @@
+from Appconfig import Appconfig
+import re
+import os
+import xml.etree.cElementTree as ET
+from PyQt4 import QtGui, QtCore
+from ConfigParser import SafeConfigParser
+
+
+class AutoSchematic(QtGui.QWidget):
+
+ def __init__(self, modelname):
+ QtGui.QWidget.__init__(self)
+ self.home = os.path.expanduser("~")
+ self.modelname = modelname.split('.')[0]
+ self.template = Appconfig.kicad_lib_template
+ self.xml_loc = Appconfig.xml_loc
+ self.lib_loc = Appconfig.lib_loc
+ self.kicad_nghdl_lib = 'eSim_kicad.lib'
+ self.parser = SafeConfigParser()
+ self.parser.read(os.path.join(self.home, Appconfig.nghdl_src_loc+'/config.ini'))
+
+ def createKicadLibrary(self):
+ xmlFound = None
+ for root, dirs, files in os.walk(self.xml_loc):
+ if (str(self.modelname) + '.xml') in files:
+ xmlFound = root
+ if (xmlFound == None):
+ self.getPortInformation()
+ self.createXML()
+ self.createLib()
+ elif (xmlFound == self.xml_loc + 'Nghdl'):
+ print 'Library already exists...'
+ ret = QtGui.QMessageBox.critical(self, "Critical",'''<b>The Libraries of this model already exist.Do you want to overwrite it?</b><br/>
+ <b>If yes press ok else cancel it and change the name of your vhdl file</b>''', QtGui.QMessageBox.Ok, QtGui.QMessageBox.Cancel)
+ if ret == QtGui.QMessageBox.Ok:
+ print "Overwriting existing libraries"
+ self.getPortInformation()
+ self.createXML()
+ self.removeOldLibrary() #Removes the exisitng library
+ self.createLib()
+ else:
+ print "Exiting Nghdl"
+ quit()
+ else:
+ print 'Pre existing library...'
+ ret = QtGui.QMessageBox.critical(self, "Error",'''<b>A standard library already exists in this name.</b><br/>
+ <b>Please change the name of your vhdl file and upload it again</b>''', QtGui.QMessageBox.Ok)
+
+ quit()
+
+ def getPortInformation(self):
+ portInformation = PortInfo(self)
+ portInformation.getPortInfo()
+ self.portInfo = portInformation.bit_list
+ self.input_length = portInformation.input_len
+
+ def createXML(self):
+ cwd = os.getcwd()
+ xmlDestination = os.path.join(self.xml_loc, 'Nghdl')
+ self.splitText = ""
+ for bit in self.portInfo[:-1]:
+ self.splitText += bit + "-V:"
+ self.splitText += self.portInfo[-1] + "-V"
+
+ print "changing directory to ", (xmlDestination)
+ os.chdir(xmlDestination)
+
+ root = ET.Element("model")
+ ET.SubElement(root, "name").text = self.modelname
+ ET.SubElement(root, "type").text = "Nghdl"
+ ET.SubElement(root, "node_number").text = str(len(self.portInfo))
+ ET.SubElement(root, "title").text = "Add parameters for " + str(self.modelname)
+ ET.SubElement(root, "split").text = self.splitText
+ param = ET.SubElement(root, "param")
+ ET.SubElement(param, "rise_delay", default = "1.0e-9").text = "Enter Rise Delay (default=1.0e-9)"
+ ET.SubElement(param ,"fall_delay", default ="1.0e-9").text = "Enter Fall Delay (default=1.0e-9)"
+ ET.SubElement(param ,"input_load", default ="1.0e-12").text = "Enter Input Load (default=1.0e-12)"
+ ET.SubElement(param ,"instance_id", default ="1").text = "Enter Instance ID (Between 0-99)"
+ tree = ET.ElementTree(root)
+ tree.write(str(self.modelname) + '.xml')
+ print "Leaving the directory ", (xmlDestination)
+ os.chdir(cwd)
+
+ #Calculates the maximum between input and output ports
+ def findBlockSize(self):
+ ind = self.input_length
+ return max(self.char_sum(self.portInfo[:ind]), self.char_sum(self.portInfo[ind:]))
+
+ def char_sum(self, ls):
+ return sum([int(x) for x in ls])
+
+ def removeOldLibrary(self):
+ cwd = os.getcwd()
+ os.chdir(self.lib_loc)
+ print "Changing directory to ", self.lib_loc
+ f = open(self.kicad_nghdl_lib)
+ lines = f.readlines()
+ f.close()
+
+ output = []
+ line_reading_flag = False
+
+ for line in lines:
+ if line.startswith("DEF"):
+ if line.split()[1] == self.modelname:
+ line_reading_flag = True
+ if not line_reading_flag:
+ output.append(line)
+ if line.startswith("ENDDEF"):
+ line_reading_flag = False
+
+ f = open(self.kicad_nghdl_lib, 'w')
+ for line in output:
+ f.write(line)
+
+ os.chdir(cwd)
+ print "Leaving directory, ", self.lib_loc
+
+ def createLib(self):
+ self.dist_port = 100 #distance between two ports
+ self.inc_size = 100 #Increment size of a block
+ cwd = os.getcwd()
+ os.chdir(self.lib_loc)
+ print "Changing directory to ", self.lib_loc
+
+ lib_file = open(self.kicad_nghdl_lib,"a")
+ line1 = self.template["start_def"]
+ line1 = line1.split()
+ line1 = [w.replace('comp_name', self.modelname) for w in line1]
+ self.template["start_def"] = ' '.join(line1)
+ if os.stat(self.kicad_nghdl_lib).st_size == 0:
+ lib_file.write("EESchema-LIBRARY Version 2.3"+ "\n\n")
+ #lib_file.write("#encoding utf-8"+ "\n"+ "#"+ "\n" + "#test_compo" + "\n"+ "#"+ "\n")
+ lib_file.write(self.template["start_def"]+ "\n"+self.template["U_field"]+"\n")
+
+ line3 = self.template["comp_name_field"]
+ line3 = line3.split()
+ line3 = [w.replace('comp_name', self.modelname) for w in line3]
+ self.template["comp_name_field"] = ' '.join(line3)
+
+ lib_file.write(self.template["comp_name_field"]+ "\n")
+
+ line4 = self.template["blank_field"]
+ line4_1 = line4[0]
+ line4_2 = line4[1]
+ line4_1 = line4_1.split()
+ line4_1 = [w.replace('blank_quotes','""') for w in line4_1]
+ line4_2 = line4_2.split()
+ line4_2 = [w.replace('blank_quotes','""') for w in line4_2]
+ line4[0] = ' '.join(line4_1)
+ line4[1] = ' '.join(line4_2)
+ self.template["blank_qoutes"] = line4
+
+ lib_file.write(line4[0]+"\n" + line4[1]+"\n"+ self.template["start_draw"]+ "\n")
+
+ draw_pos = self.template["draw_pos"]
+ draw_pos = draw_pos.split()
+ draw_pos[4] = str(int(draw_pos[4])- self.findBlockSize() * self.inc_size)
+ self.template["draw_pos"] = ' '.join(draw_pos)
+
+ lib_file.write(self.template["draw_pos"]+"\n")
+
+ input_port = self.template["input_port"]
+ input_port = input_port.split()
+ output_port = self.template["output_port"]
+ output_port = output_port.split()
+ inputs = self.portInfo[0: self.input_length]
+ outputs = self.portInfo[self.input_length:]
+ inputs = self.char_sum(inputs)
+ outputs= self.char_sum(outputs)
+ total = inputs+outputs
+
+ port_list = []
+
+ for i in xrange(total):
+ if (i < inputs):
+ input_port[1] = "in"+str(i+1)
+ input_port[2] = str(i+1)
+ input_port[4] = str(int(input_port[4])-self.dist_port)
+ input_list = ' '.join(input_port)
+ port_list.append(input_list)
+
+ else:
+ output_port[1] = "out"+str(i- inputs+1)
+ output_port[2] = str(i+1)
+ output_port[4] = str(int(output_port[4])-self.dist_port)
+ output_list = ' '.join(output_port)
+ port_list.append(output_list)
+
+ for ports in port_list:
+ lib_file.write(ports+"\n")
+ lib_file.write(self.template["end_draw"]+"\n"+ self.template["end_def"] + "\n\n\n")
+
+ os.chdir(cwd)
+ print 'Leaving directory, ', self.lib_loc
+ QtGui.QMessageBox.information(self, "Library added", '''Library details for this model is added to the <b>eSim-kicad.lib</b> in the home directory''', QtGui.QMessageBox.Ok)
+
+
+class PortInfo:
+ def __init__(self, model):
+ self.modelname = model.modelname
+ self.model_loc = model.parser.get('NGSPICE', 'DIGITAL_MODEL')
+ self.bit_list = []
+ self.input_len = 0
+
+ def getPortInfo(self):
+ info_loc = os.path.join(self.model_loc, self.modelname+'/DUTghdl/')
+ input_list = []
+ output_list = []
+ read_file=open(info_loc + 'connection_info.txt','r')
+ data=read_file.readlines()
+ read_file.close()
+
+ for line in data:
+ if re.match(r'^\s*$', line):
+ pass
+ else:
+ in_items=re.findall("IN",line,re.MULTILINE|re.IGNORECASE)
+ out_items=re.findall("OUT",line,re.MULTILINE|re.IGNORECASE)
+ if in_items:
+ input_list.append(line.split())
+ if out_items:
+ output_list.append(line.split())
+
+ for in_list in input_list:
+ self.bit_list.append(in_list[2])
+ self.input_len = len(self.bit_list)
+ for out_list in output_list:
+ self.bit_list.append(out_list[2])
+
+