#!/usr/bin/env python
"""#!/usr/bin/python"""
#This file create the gui to install code model in the ngspice.
import os
import sys
import shutil
import subprocess
from PyQt4 import QtGui
from PyQt4 import QtCore
from ConfigParser import SafeConfigParser
class Mainwindow(QtGui.QWidget):
def __init__(self):
#super(Mainwindow, self).__init__()
QtGui.QMainWindow.__init__(self)
print "Initializing.........."
self.home = os.path.expanduser("~")
licensefile = os.path.join(self.home+'/.FreeEDA/', "LICENSE")
fileopen = open(licensefile, 'r')
print fileopen.read()
self.parser = SafeConfigParser()
self.parser.read(self.home+'/.FreeEDA/config.ini')
self.file_list = [] #to keep the supporting files
self.initUI()
def initUI(self):
self.uploadbtn = QtGui.QPushButton('Upload')
self.uploadbtn.clicked.connect(self.uploadModle)
self.exitbtn = QtGui.QPushButton('Exit')
self.exitbtn.clicked.connect(self.closeWindow)
self.browsebtn = QtGui.QPushButton('Browse')
self.browsebtn.clicked.connect(self.browseFile)
self.addbtn = QtGui.QPushButton('Add Files')
self.addbtn.clicked.connect(self.addFiles)
self.removebtn = QtGui.QPushButton('Remove Files')
self.removebtn.clicked.connect(self.removeFiles)
self.ledit = QtGui.QLineEdit(self)
self.sedit = QtGui.QTextEdit(self)
self.process = QtCore.QProcess(self)
self.terminal = QtGui.QWidget(self)
self.process.start('xterm',['-into', str(self.terminal.winId())])
#Creating gridlayout
grid = QtGui.QGridLayout()
grid.setSpacing(5)
grid.addWidget(self.ledit, 1, 0)
grid.addWidget(self.browsebtn, 1, 1)
grid.addWidget(self.sedit, 2, 0, 4, 1)
grid.addWidget(self.addbtn, 2, 1)
grid.addWidget(self.removebtn, 3, 1)
grid.addWidget(self.terminal, 6, 0,10,1)
grid.addWidget(self.uploadbtn, 17, 0)
grid.addWidget(self.exitbtn,17, 1)
self.setLayout(grid)
self.setGeometry(300, 300, 600,600)
self.setWindowTitle("Ngspice Digital Model Creator")
#self.setWindowIcon(QtGui.QIcon('logo.png'))
self.show()
def closeWindow(self):
try:
self.process.kill()
except:
pass
print "Close button clicked"
quit()
def browseFile(self):
print "Browse button clicked"
self.filename = QtGui.QFileDialog.getOpenFileName(self, 'Open File', '.')
print "Path file :", self.filename
self.ledit.setText(self.filename)
def addFiles(self):
print "Add Files button clicked"
title = self.addbtn.text()
for file in QtGui.QFileDialog.getOpenFileNames(self, title):
print "Supporting file :", file
self.sedit.append(str(file))
self.file_list.append(file)
def removeFiles(self):
self.fileRemover = FileRemover(self)
#check extensions of all supporting files
def checkSupportFiles(self):
nonvhdl_count = 0
for file in self.file_list:
extension = os.path.splitext(str(file))[1]
if extension != ".vhdl":
nonvhdl_count += 1
self.file_list.remove(file)
if nonvhdl_count > 0:
QtGui.QMessageBox.about(self,'Message','''Important Message.
This accepts only .vhdl file ''')
def createModelDirectory(self):
print "Create Model Directory Called"
self.digital_home=self.parser.get('NGSPICE','DIGITAL_MODEL')
print "Digital Home",self.digital_home
os.chdir(self.digital_home)
print "Current Working Directory Changed to",os.getcwd()
self.modelname = os.path.basename(str(self.filename)).split('.')[0]
print "Model name is :",self.modelname
# Looking if model directory is present or not
if os.path.isdir(self.modelname):
print "Model Already present"
ret = QtGui.QMessageBox.critical(self, "Critical",'''The Model already exist.Do you want to overwrite it?
If yes press ok else cancel it and change the name of you vhdl file''', QtGui.QMessageBox.Ok, QtGui.QMessageBox.Cancel)
if ret == QtGui.QMessageBox.Ok:
print "Overwriting existing model"
cmd="rm -rf "+self.modelname
#process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
subprocess.call(cmd, shell=True)
os.mkdir(self.modelname)
else:
print "Exiting application"
quit()
else:
print "Creating new model directory"
os.mkdir(self.modelname)
def addingModelInModpath(self):
print "Adding Model in Modpath file",self.modelname,self.digital_home
#Adding name of model in the modpath file
#Check if the string is already in the file
with open(self.digital_home+"/modpath.lst",'a+') as f:
flag = 0
for line in f:
if line.strip() == self.modelname:
print "Found model"
flag = 1
break
else:
pass
if flag == 0:
print "Adding model name into modpath.lst"
f.write(self.modelname+"\n")
else:
print "Model name is already into modpath.lst"
def createModelFiles(self):
print "Create Model Files Called"
os.chdir(self.cur_dir)
print "Current Working directory changed to ",self.cur_dir
cmd = "python ~/.FreeEDA/model_generation.py "+str(self.ledit.text())
stdouterr = os.popen4(cmd)[1].read()
print stdouterr
#Moving file to model directory
path=self.digital_home+"/"+self.modelname
shutil.move("cfunc.mod",path)
shutil.move("ifspec.ifs",path)
#Creating directory inside model directoy
os.mkdir(path+"/DUTghdl/")
shutil.move("connection_info.txt",path+"/DUTghdl/")
shutil.move("start_server.sh",path+"/DUTghdl/")
shutil.move("sock_pkg_create.sh",path+"/DUTghdl/")
shutil.move(self.modelname+"_tb.vhdl",path+"/DUTghdl/")
shutil.copy(str(self.filename),path+"/DUTghdl/")
shutil.copy(self.home+"/.FreeEDA/ghdlserver/compile.sh",path+"/DUTghdl/")
shutil.copy(self.home+"/.FreeEDA/ghdlserver/uthash.h",path+"/DUTghdl/")
shutil.copy(self.home+"/.FreeEDA/ghdlserver/ghdlserver.c",path+"/DUTghdl/")
shutil.copy(self.home+"/.FreeEDA/ghdlserver/ghdlserver.h",path+"/DUTghdl/")
shutil.copy(self.home+"/.FreeEDA/ghdlserver/Utility_Package.vhdl",path+"/DUTghdl/")
shutil.copy(self.home+"/.FreeEDA/ghdlserver/Vhpi_Package.vhdl",path+"/DUTghdl/")
for file in self.file_list:
shutil.copy(str(file), path+"/DUTghdl/")
os.chdir(path+"/DUTghdl")
subprocess.call("bash "+path+"/DUTghdl/compile.sh", shell=True)
subprocess.call("chmod a+x start_server.sh",shell=True)
subprocess.call("chmod a+x sock_pkg_create.sh",shell=True)
os.remove("compile.sh")
os.remove("ghdlserver.c")
#os.remove("ghdlserver.h")
#os.remove("Utility_Package.vhdl")
#os.remove("Vhpi_Package.vhdl")
def runMake(self):
print "run Make Called"
self.release_home=self.parser.get('NGSPICE','RELEASE')
os.chdir(self.release_home)
try:
cmd = " make"
print "Running Make"
path = os.getcwd()
#subprocess.call(cmd,shell=True)
command = "cd "+path +";"+cmd +";"+"make install"
self.args = ['-into', str(self.terminal.winId()),'-hold','+s','-e', command]
self.process.start('xterm', self.args)
print "pid ------ >",self.process.pid()
#stdouterr = os.popen4(cmd)[1].read()
#self.tedit.append(stdouterr)
except:
print "There is error in 'make' "
quit()
def runMakeInstall(self):
print "run Make Install Called"
try:
cmd = " make install"
print "Running Make Install"
path = os.getcwd()
print "cwd------------>", path
#subprocess.call(cmd,shell=True)
command = "cd "+path+ ";"+cmd
self.args = ['-into', str(self.terminal.winId()),'-hold','-e', command]
#self.process.start('xterm', self.args)
#self.process.waitForFinished(-1)
#stdouterr = os.popen4(cmd)[1].read()
#self.tedit.append(stdouterr)
except:
print "There is error during in 'make install' "
quit()
def uploadModle(self):
print "Upload button clicked"
try:
self.process.kill()
except:
pass
try:
self.file_extension = os.path.splitext(str(self.filename))[1]
print "File extension",self.file_extension
print "Parser Content:",self.parser.get('NGSPICE', 'NGSPICE_HOME')
self.cur_dir = os.getcwd()
print "My Current Working Directory",self.cur_dir
self.checkSupportFiles()
if self.file_extension == ".vhdl":
self.createModelDirectory()
self.addingModelInModpath()
self.createModelFiles()
self.runMake()
self.runMakeInstall()
else:
QtGui.QMessageBox.about(self,'Message','''Important Message.
This accepts only .vhdl file ''')
except:
QtGui.QMessageBox.about(self, 'Message','''Error
select a .vhdl file ''')
class FileRemover(QtGui.QWidget):
def __init__(self, main_obj):
super(FileRemover, self).__init__()
self.row = 0
self.col = 0
self.cb_dict = {}
self.marked_list = []
self.files = main_obj.file_list
self.sedit = main_obj.sedit
print self.files
self.grid = QtGui.QGridLayout()
removebtn = QtGui.QPushButton('Remove', self)
removebtn.clicked.connect(self.removeFiles)
self.grid.addWidget(self.createCheckBox(), 0, 0)
self.grid.addWidget(removebtn, 1, 1)
self.setLayout(self.grid)
self.show()
def createCheckBox(self):
self.checkbox = QtGui.QGroupBox()
self.checkbox.setTitle('Remove Files')
self.checkgrid = QtGui.QGridLayout()
self.checkgroupbtn = QtGui.QButtonGroup()
for path in self.files:
print path
self.cb_dict[path] = QtGui.QCheckBox(path)
self.checkgroupbtn.addButton(self.cb_dict[path])
self.checkgrid.addWidget(self.cb_dict[path], self.row, self.col)
self.row += 1
self.checkgroupbtn.setExclusive(False)
self.checkgroupbtn.buttonClicked.connect(self.mark_file)
self.checkbox.setLayout(self.checkgrid)
return self.checkbox
def mark_file(self):
for path in self.cb_dict:
if self.cb_dict[path].isChecked():
if path not in self.marked_list:
self.marked_list.append(path)
else:
if path in self.marked_list:
self.marked_list.remove(path)
def removeFiles(self):
for path in self.marked_list:
print path, "is removed"
self.sedit.append(path + " removed")
self.files.remove(path)
self.sedit.clear()
for path in self.files:
self.sedit.append(path)
self.marked_list[:] = []
self.files[:] = []
self.close()
def main():
app = QtGui.QApplication(sys.argv)
w = Mainwindow()
sys.exit(app.exec_())
if __name__=='__main__':
main()