Example #1
0
 def createSchematicLib(self):
     if Appconfig.esimFlag == 1:
         if not self.errorFlag:
             print('Creating library files................................')
             schematicLib = AutoSchematic(self.modelname)
             schematicLib.createKicadLibrary()
         else:
             QtGui.QMessageBox.critical(
                 self, 'Error', '''Cannot create Schematic Library of ''' +
                 '''your model. Resolve the <b>errors</b> shown on ''' +
                 '''console of NGHDL window. '''
             )
     else:
         QtGui.QMessageBox.information(
             self, 'Message', '''<b>Important Message</b><br/><br/>''' +
             '''To create Schematic Library of your model, ''' +
             '''use NGHDL through <b>eSim</b> '''
         )
Example #2
0
    def createSchematicLib(self):
        if os.name == "nt":
            shutil.copy("ghdl/ghdl.cm", "../../../../lib/ngspice/")

        os.chdir(self.cur_dir)
        if Appconfig.esimFlag == 1:
            if not self.errorFlag:
                print('Creating library files................................')
                schematicLib = AutoSchematic(self, self.modelname)
                schematicLib.createKicadLibrary()
            else:
                QtWidgets.QMessageBox.critical(
                    self, 'Error', '''Cannot create Schematic Library of ''' +
                    '''your model. Resolve the <b>errors</b> shown on ''' +
                    '''console of NGHDL window. ''')
        else:
            QtWidgets.QMessageBox.information(
                self, 'Message', '''<b>Important Message</b><br/><br/>''' +
                '''To create Schematic Library of your model, ''' +
                '''use NGHDL through <b>eSim</b> ''')
Example #3
0
 def createSchematicLib(self):
     if Appconfig.esimFlag == 1:
         print('Creating library files.................................')
         schematicLib = AutoSchematic(self.modelname)
         schematicLib.createKicadLibrary()
Example #4
0
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(
            os.path.join(self.home, Appconfig.nghdl_src_loc), "LICENSE")
        fileopen = open(licensefile, 'r')
        print fileopen.read()
        self.parser = SafeConfigParser()
        self.parser.read(
            os.path.join(self.home, Appconfig.nghdl_src_loc + '/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.termedit = QtGui.QTextEdit(self)
        self.termedit.setReadOnly(1)
        pal = QtGui.QPalette()
        bgc = QtGui.QColor(0, 0, 0)
        pal.setColor(QtGui.QPalette.Base, bgc)
        self.termedit.setPalette(pal)
        self.termedit.setStyleSheet("QTextEdit {color:white}")

        #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.termedit, 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.close()
        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',
                '''<b>Important Message.</b><br/><br/>This accepts only <b>.vhdl</b> 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",
                '''<b>The Model already exist.Do you want to overwrite it?</b><br/>
                    <b>If yes press ok else cancel it and change the name of you vhdl file</b>''',
                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 ~/" + Appconfig.nghdl_src_loc + "/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(
            os.path.join(self.home, Appconfig.nghdl_src_loc) +
            "/ghdlserver/compile.sh", path + "/DUTghdl/")
        shutil.copy(
            os.path.join(self.home, Appconfig.nghdl_src_loc) +
            "/ghdlserver/uthash.h", path + "/DUTghdl/")
        shutil.copy(
            os.path.join(self.home, Appconfig.nghdl_src_loc) +
            "/ghdlserver/ghdlserver.c", path + "/DUTghdl/")
        shutil.copy(
            os.path.join(self.home, Appconfig.nghdl_src_loc) +
            "/ghdlserver/ghdlserver.h", path + "/DUTghdl/")
        shutil.copy(
            os.path.join(self.home, Appconfig.nghdl_src_loc) +
            "/ghdlserver/Utility_Package.vhdl", path + "/DUTghdl/")
        shutil.copy(
            os.path.join(self.home, Appconfig.nghdl_src_loc) +
            "/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")

    #slot to redirect stdout to window console
    @QtCore.pyqtSlot()
    def readStdOutput(self):
        self.termedit.append(
            QtCore.QString(self.process.readAllStandardOutput()))

    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"
            #command = "cd "+path +";"+cmd
            #self.args = ['-into', str(self.terminal.winId()),'-hold','+s','-e', command]
            #self.process.start('xterm', self.args)

            self.process.start(cmd)
            self.process.setProcessChannelMode(QtCore.QProcess.MergedChannels)
            QtCore.QObject.connect(self.process,
                                   QtCore.SIGNAL("readyReadStandardOutput()"),
                                   self, QtCore.SLOT("readStdOutput()"))

            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)

            try:
                self.process.close()
            except:
                pass
            self.process.finished.connect(self.createSchematicLib)
            self.process.start(cmd)
            self.process.setProcessChannelMode(QtCore.QProcess.MergedChannels)
            QtCore.QObject.connect(self.process,
                                   QtCore.SIGNAL("readyReadStandardOutput()"),
                                   self, QtCore.SLOT("readStdOutput()"))
            os.chdir(self.cur_dir)

        except:
            print "There is error during in 'make install' "
            quit()

    def createSchematicLib(self):
        if Appconfig.esimFlag == 1:
            print 'Creating library files.................................'
            self.schematicLib = AutoSchematic(self.modelname)
            self.schematicLib.createKicadLibrary()

    def uploadModle(self):
        print "Upload button clicked"
        try:
            self.process.close()
        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',
                    '''<b>Important Message.</b><br/><br/>This accepts only <b>.vhdl</b> file '''
                )
        except:
            QtGui.QMessageBox.about(
                self, 'Message',
                '''<b>Error</b><br/><br/> select a <b>.vhdl</b> file ''')
Example #5
0
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(os.path.join(self.home, Appconfig.nghdl_src_loc), "LICENSE")
        fileopen = open(licensefile, 'r')
        print fileopen.read()
        self.parser = SafeConfigParser()
        self.parser.read(os.path.join(self.home, Appconfig.nghdl_src_loc+'/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.termedit = QtGui.QTextEdit(self)
        self.termedit.setReadOnly(1)
        pal = QtGui.QPalette()
        bgc = QtGui.QColor(0, 0, 0)
        pal.setColor(QtGui.QPalette.Base, bgc)
        self.termedit.setPalette(pal)
        self.termedit.setStyleSheet("QTextEdit {color:white}")

        #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.termedit, 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.close()
        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','''<b>Important Message.</b><br/><br/>This accepts only <b>.vhdl</b> 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",'''<b>The Model already exist.Do you want to overwrite it?</b><br/>
                    <b>If yes press ok else cancel it and change the name of you vhdl file</b>''', 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 ~/"+Appconfig.nghdl_src_loc+"/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(os.path.join(self.home, Appconfig.nghdl_src_loc)+"/ghdlserver/compile.sh",path+"/DUTghdl/")
        shutil.copy(os.path.join(self.home, Appconfig.nghdl_src_loc)+"/ghdlserver/uthash.h",path+"/DUTghdl/")
        shutil.copy(os.path.join(self.home, Appconfig.nghdl_src_loc)+"/ghdlserver/ghdlserver.c",path+"/DUTghdl/")
        shutil.copy(os.path.join(self.home, Appconfig.nghdl_src_loc)+"/ghdlserver/ghdlserver.h",path+"/DUTghdl/")
        shutil.copy(os.path.join(self.home, Appconfig.nghdl_src_loc)+"/ghdlserver/Utility_Package.vhdl",path+"/DUTghdl/")
        shutil.copy(os.path.join(self.home, Appconfig.nghdl_src_loc)+"/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")
        
    
    #slot to redirect stdout to window console
    @QtCore.pyqtSlot()
    def readStdOutput(self):
        self.termedit.append(QtCore.QString(self.process.readAllStandardOutput()))
        
        

        


    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"
            #command = "cd "+path +";"+cmd 
            #self.args = ['-into', str(self.terminal.winId()),'-hold','+s','-e', command]
            #self.process.start('xterm', self.args)

            self.process.start(cmd)
            self.process.setProcessChannelMode(QtCore.QProcess.MergedChannels)
            QtCore.QObject.connect(self.process, QtCore.SIGNAL("readyReadStandardOutput()"), self, QtCore.SLOT("readStdOutput()"))

            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)

            try:
                self.process.close()
            except:
                pass
            self.process.finished.connect(self.createSchematicLib)
            self.process.start(cmd)
            self.process.setProcessChannelMode(QtCore.QProcess.MergedChannels)
            QtCore.QObject.connect(self.process, QtCore.SIGNAL("readyReadStandardOutput()"), self, QtCore.SLOT("readStdOutput()"))
            os.chdir(self.cur_dir)

        except:
            print "There is error during in 'make install' "
            quit()

    def createSchematicLib(self):
        if Appconfig.esimFlag == 1:
            print 'Creating library files.................................'
            self.schematicLib = AutoSchematic(self.modelname)
            self.schematicLib.createKicadLibrary()

    def uploadModle(self):
        print "Upload button clicked"
        try:
            self.process.close()
        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','''<b>Important Message.</b><br/><br/>This accepts only <b>.vhdl</b> file ''')
        except:
            QtGui.QMessageBox.about(self, 'Message','''<b>Error</b><br/><br/> select a <b>.vhdl</b> file ''')