URL
https://opencores.org/ocsvn/ezidebug/ezidebug/trunk
Subversion Repositories ezidebug
[/] [ezidebug/] [trunk/] [EziDebug_src/] [ezidebugprj.cpp] - Rev 4
Compare with Previous | Blame | View Log
#include <QString> #include <QDir> #include <QMap> #include <QStringList> #include <QXmlStreamReader> #include <QtXml> #include <QFileInfo> #include <string.h> #include <QMessageBox> #include <QDebug> #include "UpdateDetectThread.h" #include "ezidebugprj.h" #include "ezidebugmodule.h" #include "ezidebugvlgfile.h" #include "ezidebugvhdlfile.h" #include "ezidebugscanchain.h" #include "ezidebuginstancetreeitem.h" #include <algorithm> char *month[13] = {"", "Jan" ,"Feb" , "Mar" , "Apr" , "May" , "Jun" , "Jul" , "Aug" , "Sep" \ "Oct" , "Nov" , "Dec" } ; char *day[8] = {"", "Mon" , "Tue" , "Wed" , "Thu" , "Fri" , "Sat" , "Sun"} ; EziDebugPrj::EziDebugPrj(int maxregnum , QString projectdir , TOOL tool , QObject * parent)\ : QObject(parent) ,m_iprjPath(QDir(projectdir)),m_nmaxRegNumInChain(maxregnum),m_eusedTool(tool) { m_pthread = new UpdateDetectThread(this,NULL); m_headItem = NULL ; m_pLastOperateChain = NULL ; m_pLastOperteTreeItem = NULL ; m_elastOperation = OperateTypeNone ; m_isLogFileExist = false ; m_ipermettedMaxRegNum = 0 ; m_imaxRegWidth = 0 ; m_isUpdated = false ; m_isLogFileDestroyed = false ; } EziDebugPrj::~EziDebugPrj() { // 注::工程指针 析构时 其他对象不能使用 qDebug() << "Attention : Begin to destruct EziDebugPrj object!"; if(m_pthread->isRunning()) { m_pthread->quit(); m_pthread->wait(); } delete m_pthread ; if(EziDebugScanChain::getUserDir().toLower() != "no dir") { QDir idir(m_iprjPath.absolutePath() + EziDebugScanChain::getUserDir()); idir.setFilter(QDir::Files); QFileInfoList iinfolist = idir.entryInfoList(); for(int i = 0; i < iinfolist.size(); ++i) { QFileInfo fileInfo = iinfolist.at(i); QString ifileName = fileInfo.fileName() ; if(!(fileInfo.fileName().endsWith(".v")||fileInfo.fileName().endsWith(".vhd"))) { idir.remove(ifileName); } } } // verilog file 指针析构 QMap<QString,EziDebugVlgFile*>::iterator i = m_ivlgFileMap.begin() ; while(i != m_ivlgFileMap.end()) { EziDebugVlgFile* pfile = m_ivlgFileMap.value(i.key()); if(pfile) { delete pfile ; } ++i ; } m_ivlgFileMap.clear() ; // vhdl file 指针析构 QMap<QString,EziDebugVhdlFile*>::iterator j = m_ivhdlFileMap.begin() ; while(j != m_ivhdlFileMap.end()) { EziDebugVhdlFile* pfile = m_ivhdlFileMap.value(j.key()); if(pfile) { delete pfile ; } ++j ; } m_ivhdlFileMap.clear() ; // module 析构 QMap<QString,EziDebugModule*>::iterator k = m_imoduleMap.begin() ; while(k != m_imoduleMap.end()) { EziDebugModule* pmodule = m_imoduleMap.value(k.key()); if(pmodule) { delete pmodule ; } ++k ; } m_imoduleMap.clear() ; // treeitemmap 析构 // QMap<QString,EziDebugInstanceTreeItem*>::iterator itreeItemIterator = m_ichainTreeItemMap.begin() ; // while(itreeItemIterator != m_ichainTreeItemMap.end()) // { // EziDebugInstanceTreeItem* pitem = m_ichainTreeItemMap.value(itreeItemIterator.key()); // if(!pitem) // { // delete pitem ; // } // ++itreeItemIterator ; // } m_ichainTreeItemMap.clear() ; // backup TreeItemMap 析构 // QMap<QString,EziDebugInstanceTreeItem*>::iterator ibakTreeItemIterator = m_ibackupChainTreeItemMap.begin() ; // while(ibakTreeItemIterator != m_ibackupChainTreeItemMap.end()) // { // EziDebugInstanceTreeItem* pitem = m_ibackupChainTreeItemMap.value(ibakTreeItemIterator.key()); // if(!pitem) // { // delete pitem ; // } // ++ibakTreeItemIterator ; // } m_ibackupChainTreeItemMap.clear() ; // m_ichainInfoMap 析构 QMap<QString,EziDebugScanChain*>::iterator ichainIterator = m_ichainInfoMap.begin() ; while(ichainIterator != m_ichainInfoMap.end()) { // LastOperateChain 析构 EziDebugScanChain* pitem = m_ichainInfoMap.value(ichainIterator.key()); if(pitem) { if(pitem == m_pLastOperateChain) { m_pLastOperateChain = NULL ; } delete pitem ; } ++ichainIterator ; } m_ichainInfoMap.clear() ; // backupchaininfo 析构 QMap<QString,EziDebugScanChain*>::iterator ibakChainIterator = m_ibackupChainInfoMap.begin() ; while(ibakChainIterator != m_ibackupChainInfoMap.end()) { EziDebugScanChain* pitem = m_ibackupChainInfoMap.value(ibakChainIterator.key()); if(pitem) { delete pitem ; } ++ibakChainIterator ; } m_ibackupChainInfoMap.clear() ; m_iqueryTreeItemMap.clear(); m_ibackupQueryTreeItemMap.clear(); if(m_pLastOperateChain) delete m_pLastOperateChain ; // LastOperteTreeItem 析构 // if(!m_pLastOperteTreeItem) m_pLastOperteTreeItem = NULL ; } const EziDebugPrj::TOOL &EziDebugPrj::getToolType(void) const { return m_eusedTool ; } const QDir &EziDebugPrj::getCurrentDir(void) const { return m_iprjPath ; } bool EziDebugPrj::getSoftwareXilinxErrCheckedFlag(void) { return m_isDisXilinxErrChecked ; } QString EziDebugPrj::getTopModule(void) { return m_itopModule ; } UpdateDetectThread *EziDebugPrj::getThread(void) const { return m_pthread ; } bool EziDebugPrj::getLogFileExistFlag(void) { return m_isLogFileExist ; } const QMap<QString,EziDebugScanChain*> &EziDebugPrj::getScanChainInfo(void) const { return m_ichainInfoMap ; } const QMap<QString,EziDebugInstanceTreeItem*> &EziDebugPrj::getChainTreeItemMap(void) const { return m_ichainTreeItemMap ; } const QMap<QString,EziDebugInstanceTreeItem*> &EziDebugPrj::getBackupChainTreeItemMap(void) const { return m_ibackupChainTreeItemMap ; } const QMap<QString,EziDebugScanChain*> &EziDebugPrj::getBackupChainMap(void) const { return m_ibackupChainInfoMap ; } const QStringList &EziDebugPrj::getPrjCodeFileNameList(void) const { return m_iCodefileNameList ; } const QStringList &EziDebugPrj::getUpdateFileList(FILE_UPDATE_TYPE fileupdatetype) const { if(fileupdatetype == addedUpdateFileType) { return m_iupdateAddedFileList ; } else if(fileupdatetype == deletedUpdateFileType) { return m_iupdateDeletedFileList ; } else { return m_iupdateChangedFileList ; } } const QStringList &EziDebugPrj::getFileNameList(void) const { return m_iCodefileNameList ; } const QString &EziDebugPrj::getPrjName(void) const { return m_iprjName ; } EziDebugPrj::OPERATE_TYPE EziDebugPrj::getLastOperation(void) { return m_elastOperation ; } int EziDebugPrj::getPermittedRegNum(void) { return m_ipermettedMaxRegNum ; } EziDebugScanChain* EziDebugPrj::getLastOperateChain(void) { return m_pLastOperateChain ; } int EziDebugPrj::eliminateLastOperation(void) { QString ieziDebugFileSuffix ; /*对上一步操作进行善后*/ if(m_elastOperation == OperateTypeAddScanChain) { if(!m_pLastOperateChain) { qDebug() << "Error:Last Operation chain is NULL Pointer!"; return 1 ; } ieziDebugFileSuffix = QObject::tr(".add.%1").arg(m_pLastOperateChain->getChainName()); QStringList iscanFileList = m_pLastOperateChain->getScanedFileList() ; for(int i = 0 ; i < iscanFileList.count();i++) { // 获取备份的文件名全称 QFileInfo ifileInfo(iscanFileList.at(i)); QString ibackupFileName = m_iprjPath.absolutePath() \ + EziDebugScanChain::getUserDir() + QObject::tr("/") + ifileInfo.fileName() \ + ieziDebugFileSuffix; QFile ibackupFile(ibackupFileName) ; // 删除上一步操作备份的文件 ibackupFile.remove(); } // 清空所有上次备份 m_elastOperation = OperateTypeNone ; m_pLastOperateChain = NULL ; m_pLastOperteTreeItem = NULL ; } else if(m_elastOperation == OperateTypeDelSingleScanChain) { // 释放 if(!m_pLastOperateChain) { qDebug() << "Error:Last Operation chain is NULL Pointer!"; return 1 ; } ieziDebugFileSuffix = QObject::tr(".delete.%1").arg(m_pLastOperateChain->getChainName()); QStringList iscanFileList = m_pLastOperateChain->getScanedFileList() ; for(int i = 0 ; i < iscanFileList.count();i++) { // 获取备份的文件名全称 QFileInfo ifileInfo(iscanFileList.at(i)); QString ibackupFileName = m_iprjPath.absolutePath() \ + EziDebugScanChain::getUserDir() + QObject::tr("/") + ifileInfo.fileName() \ + ieziDebugFileSuffix ; QFile ibackupFile(ibackupFileName) ; // 删除上一步操作备份的文件 ibackupFile.remove(); } delete m_pLastOperateChain ; // 清空所有上次备份 //updateOperation(OperateTypeNone , NULL , NULL); m_elastOperation = OperateTypeNone ; m_pLastOperateChain = NULL ; m_pLastOperteTreeItem = NULL ; } else if(m_elastOperation == OperateTypeDelAllScanChain) { ieziDebugFileSuffix = QObject::tr(".deleteall"); // 将所有 扫描立链指针内存 释放 QMap<QString,EziDebugScanChain*>::const_iterator i = m_ibackupChainInfoMap.constBegin() ; while(i != m_ibackupChainInfoMap.constEnd()) { EziDebugScanChain* pchain = i.value(); if(!pchain) { qDebug() << "Error: The chain Pointer is NULL !"; ++i ; continue ; } QStringList iscanFileList = pchain->getScanedFileList() ; for(int j = 0 ; j < iscanFileList.count();j++) { // 获取备份的文件名全称 QFileInfo ifileInfo(iscanFileList.at(j)); QString ibackupFileName = m_iprjPath.absolutePath() \ + EziDebugScanChain::getUserDir()+ QObject::tr("/") +ifileInfo.fileName() \ + ieziDebugFileSuffix ; QFile ibackupFile(ibackupFileName) ; // 删除上一步操作备份的文件 ibackupFile.remove(); } delete pchain ; pchain = NULL ; ++i ; } // 清空所有上次备份 updateOperation(OperateTypeNone , NULL , NULL); } else if(m_elastOperation == OperateTypeNone) { return 0 ; } else { qDebug() << "Error:Last Operation Type is Wrong!"; return 1 ; } return 0 ; } EziDebugInstanceTreeItem* EziDebugPrj::getLastOperateTreeItem(void) { return m_pLastOperteTreeItem ; } const QMap<QString,EziDebugModule*> &EziDebugPrj::getPrjModuleMap(void) const { return m_imoduleMap ; } const QMap<QString,EziDebugVlgFile*> &EziDebugPrj::getPrjVlgFileMap(void) const { return m_ivlgFileMap ; } const QMap<QString,EziDebugVhdlFile*> &EziDebugPrj::getPrjVhdlFileMap(void) const { return m_ivhdlFileMap ; } int EziDebugPrj::eliminateFile(const QString &filename,QList<LOG_FILE_INFO*> &infolist) { if(filename.endsWith(".v")) { EziDebugVlgFile* pfile = m_ivlgFileMap.value(filename); if(pfile) { struct LOG_FILE_INFO* pinfo = new LOG_FILE_INFO ; pinfo->etype = infoTypeFileInfo ; pinfo->pinfo = NULL ; memcpy(pinfo->ainfoName,pfile->fileName().toAscii().data(),pfile->fileName().size()+1); infolist.append(pinfo); QStringList imoduleList = pfile->getModuleList(); for(int i = 0 ; i < imoduleList.count();i++) { EziDebugModule *pmodule = m_imoduleMap.value(imoduleList.at(i),NULL) ; if(!pmodule) { struct LOG_FILE_INFO* pinfo = new LOG_FILE_INFO ; pinfo->etype = infoTypeModuleStructure ; pinfo->pinfo = NULL ; memcpy(pinfo->ainfoName,pmodule->getModuleName().toAscii().data(),pmodule->getModuleName().size()+1); infolist.append(pinfo); } m_imoduleMap.remove(imoduleList.at(i)); delete pmodule ; } } m_ivlgFileMap.remove(filename); delete pfile ; } else if(filename.endsWith(".vhd")) { EziDebugVhdlFile* pfile = m_ivhdlFileMap.value(filename); if(!pfile) delete pfile ; m_ivhdlFileMap.remove(filename); } else { return 1 ; } return 0 ; } int EziDebugPrj::addFile(const QString &filename ,SCAN_TYPE type,QList<LOG_FILE_INFO*> &infolist) { QList<LOG_FILE_INFO*> ideletedinfoList ; if(filename.endsWith(".v")) { QFileInfo ifileInfo(m_iprjPath,filename); EziDebugVlgFile* pfile = new EziDebugVlgFile(ifileInfo.absoluteDir().absolutePath() + QObject::tr("'/") + ifileInfo.fileName()) ; if(!pfile->scanFile(this,type,infolist,ideletedinfoList)) { m_ivlgFileMap.insert(filename,pfile) ; } else { // 删除所有 list 节点 return 1 ; } } else if(filename.endsWith(".vhd")) { // EziDebugVhdlFile* pfile = new EziDebugVhdlFile(filename) ; // if(!pfile->scanFile(this,type)) // { // m_ivhdlFileMap.insert(filename,pfile); // } // else // { // } } else { return 1 ; } return 0 ; } void EziDebugPrj::addToModuleMap(const QString &modoule,EziDebugModule *pmodule) { EziDebugModule *poriginModule = m_imoduleMap.value(modoule,NULL) ; if(!poriginModule) { m_imoduleMap.insert(modoule,pmodule); } else { qDebug() << "Info: There is already existing this module:" << modoule \ << "Ready to delete it!"; m_imoduleMap.remove(modoule) ; delete poriginModule ; m_imoduleMap.insert(modoule,pmodule); } return ; } void EziDebugPrj::addToDestroyedChainList(const QString& chainname) { if(!m_idestroyedChain.contains(chainname)) { m_idestroyedChain.append(chainname); } } void EziDebugPrj::addToCheckedChainList(const QString& chainname) { if(!m_icheckedChain.contains(chainname)) { m_icheckedChain.append(chainname); } } void EziDebugPrj::clearupDestroyedChainList(void) { m_idestroyedChain.clear(); } void EziDebugPrj::clearupCheckedChainList(void) { m_icheckedChain.clear(); } QStringList EziDebugPrj::checkChainExist(void) { QStringList iunexistChain ; QMap<QString,EziDebugScanChain*>::const_iterator ichainIter = m_ichainInfoMap.constBegin() ; while(ichainIter != m_ichainInfoMap.constEnd()) { QString ichainName = ichainIter.key() ; m_idestroyedChain.append(ichainName); ++ichainIter ; } m_icheckedChain.clear(); return iunexistChain ; } const QStringList &EziDebugPrj::getDestroyedChainList(void) const { return m_idestroyedChain ; } const QStringList &EziDebugPrj::getCheckedChainList(void) const { return m_icheckedChain ; } QStringList EziDebugPrj::deleteDestroyedChain(QList<LOG_FILE_INFO*> &addedinfoList,QList<LOG_FILE_INFO*> &deletedinfoList) { QString ieziDebugFileSuffix ; QStringList iundelChainList ; for(int i = 0 ; i < m_idestroyedChain.count() ; i++) { QString ichainName = m_idestroyedChain.at(i) ; EziDebugScanChain* pchain = m_ichainInfoMap.value(ichainName , NULL); if(!pchain) { continue ; } ieziDebugFileSuffix = QObject::tr(".delete.%1").arg(ichainName); EziDebugInstanceTreeItem* pitem = m_ichainTreeItemMap.value(ichainName , NULL); if(pitem) { if(pitem->deleteScanChain(OperateTypeDelSingleScanChain)) { // 恢复文件 /*读取删除链 已经扫描过的文件,从已经备份的文件进行恢复*/ for(int i = 0 ; i < pchain->getScanedFileList().count();i++) { // 获取备份的文件名全称 QString ifileName = pchain->getScanedFileList().at(i) ; QFileInfo ifileInfo(pchain->getScanedFileList().at(i)); QString ibackupFileName = this->getCurrentDir().absolutePath() \ + EziDebugScanChain::getUserDir() + tr("/") + ifileInfo.fileName() \ + ieziDebugFileSuffix; QFile ibackupFile(ibackupFileName) ; QFileInfo ibakfileInfo(ibackupFileName); QDateTime idateTime = ibakfileInfo.lastModified(); QString irelativeName = m_iprjPath.relativeFilePath(ifileName) ; // 恢复 源文件 if(ibakfileInfo.exists()) { if(ifileName.endsWith(".v")) { m_ivlgFileMap.value(irelativeName)->remove(); ibackupFile.copy(ifileName); m_ivlgFileMap.value(irelativeName)->modifyStoredTime(idateTime); } else if(ifileName.endsWith(".vhd")) { m_ivhdlFileMap.value(irelativeName)->remove(); ibackupFile.copy(ifileName); m_ivhdlFileMap.value(irelativeName)->modifyStoredTime(idateTime); } else { // do nothing } // 删除备份文件 ibackupFile.remove(); } } // 错误 这条链没有被删除 ,检查文件是否编译通过 iundelChainList << ichainName ; continue ; } m_ichainInfoMap.remove(ichainName) ; m_ichainTreeItemMap.remove(ichainName) ; m_iqueryTreeItemMap.remove(pitem->getNameData()); if(m_pLastOperateChain) { if(m_pLastOperateChain->getChainName() == ichainName) { m_pLastOperateChain = NULL ; m_pLastOperteTreeItem = NULL ; m_elastOperation = OperateTypeNone ; } } pitem->setScanChainInfo(NULL); // 删除备份文件 QStringList iscanFileList = pchain->getScanedFileList(); for(int i = 0 ; i < iscanFileList.count(); i++) { QString ifileName = iscanFileList.at(i) ; QString irelativeName = m_iprjPath.relativeFilePath(ifileName) ; QFileInfo ifileInfo(ifileName); QDateTime idateTime = ifileInfo.lastModified(); QFile ibakFile(ifileName + ieziDebugFileSuffix) ; if(ibakFile.exists()) { ibakFile.remove(); } // 更改文件时间 if(ifileName.endsWith(".v")) { m_ivlgFileMap.value(irelativeName)->modifyStoredTime(idateTime); EziDebugVlgFile* pfile = m_ivlgFileMap.value(irelativeName) ; EziDebugPrj::LOG_FILE_INFO* pdelFileInfo = new EziDebugPrj::LOG_FILE_INFO ; pdelFileInfo->etype = EziDebugPrj::infoTypeFileInfo ; pdelFileInfo->pinfo = NULL ; memcpy(pdelFileInfo->ainfoName , irelativeName.toAscii().data() , irelativeName.size()+1); deletedinfoList.append(pdelFileInfo); struct EziDebugPrj::LOG_FILE_INFO* paddFileInfo = new EziDebugPrj::LOG_FILE_INFO ; paddFileInfo->etype = EziDebugPrj::infoTypeFileInfo ; paddFileInfo->pinfo = pfile ; memcpy(paddFileInfo->ainfoName , irelativeName.toAscii().data(), irelativeName.size()+1); addedinfoList.append(paddFileInfo); } else if(ifileName.endsWith(".vhd")) { m_ivhdlFileMap.value(irelativeName)->modifyStoredTime(idateTime); EziDebugVhdlFile* pfile = m_ivhdlFileMap.value(irelativeName) ; EziDebugPrj::LOG_FILE_INFO* pdelFileInfo = new EziDebugPrj::LOG_FILE_INFO ; pdelFileInfo->etype = EziDebugPrj::infoTypeFileInfo ; pdelFileInfo->pinfo = NULL ; memcpy(pdelFileInfo->ainfoName , irelativeName.toAscii().data() , irelativeName.size()+1); deletedinfoList.append(pdelFileInfo); struct EziDebugPrj::LOG_FILE_INFO* paddFileInfo = new EziDebugPrj::LOG_FILE_INFO ; paddFileInfo->etype = EziDebugPrj::infoTypeFileInfo ; paddFileInfo->pinfo = pfile ; memcpy(paddFileInfo->ainfoName , irelativeName.toAscii().data(), irelativeName.size()+1); addedinfoList.append(paddFileInfo); } else { // do nothing continue ; } } // 删除链指针 delete pchain ; } } // 删除破坏掉的链,下次接着扫描链是否被破坏 m_idestroyedChain.clear() ; return iundelChainList ; } bool EziDebugPrj::isPrjFileExist(void) { QStringList inameFilter ; QStringList ifileList ; if(ToolQuartus == m_eusedTool) { inameFilter.append("*.qsf"); } else if(ToolIse == m_eusedTool) { // 版本 10.1 inameFilter.append("*.restore"); // 版本 14.4 inameFilter.append("*.xise"); } else { /*do nothing*/ qDebug() << "Is there other tool in the world ?" ; return 0 ; } ifileList = m_iprjPath.entryList(inameFilter,QDir::Files) ; if(!ifileList.count()) { //qDebug() << "Please Check the path \""<< m_iprjPath.absolutePath() <<"\" to verify the " << inameFilter.at(0) << "file exist !"; QMessageBox::warning(NULL, QObject::tr("EziDebug"),QObject::tr("Please Check the path \n \"%1\" \n to verify the %2 file exist!").arg(m_iprjPath.absolutePath()) \ .arg(inameFilter.at(0))) ; // .arg(inameFilter.at(0)))); return 0 ; } else if(ifileList.count() > 1) { qDebug() << "Please Delete the unnecessary file " << inameFilter.at(0) ; QMessageBox::warning(NULL, QObject::tr("EziDebug"),QObject::tr("Please delete the unnecessary \"%1\"file!").arg(inameFilter.at(0))); return 0 ; } else { m_iprjName = const_cast<QString&>(ifileList.at(0)); m_iprjName = m_iprjPath.absoluteFilePath(m_iprjName); qDebug() << "isPrjFileExist" << m_iprjName ; return 1 ; } } void EziDebugPrj::preModifyPrjFile(void) { QString itrueStr = "true" ; QString ifalseStr = "false" ; if((ToolIse == m_eusedTool)&&(m_itoolSoftwareVersion == "10.x")) { // m_isXilinxErrChecked 如果为true 才进行修改 否则保持不变 QFile iprjFile(m_iprjName); QString iline; if(!iprjFile.open(QIODevice::ReadOnly|QIODevice::Text)) { qDebug() << "Cannot Open file for reading:" << qPrintable(iprjFile.errorString()); return ; } QTextStream iinStream(&iprjFile) ; iline = iinStream.readAll() ; int nKeyWordsPos = iline.indexOf("PROP_xstEquivRegRemoval") ; int ntrueBoolValue = iline.indexOf(itrueStr,nKeyWordsPos) ; int nfalseBoolValue = iline.indexOf(ifalseStr,nKeyWordsPos); if(ntrueBoolValue < nfalseBoolValue) { if(m_isDisXilinxErrChecked) { // 改为 false iline.replace(ntrueBoolValue,itrueStr.size(),ifalseStr); } else { // 改为 true iprjFile.close(); return ; } } else { if(m_isDisXilinxErrChecked) { // 改为 false iprjFile.close(); return ; } else { // 改为 true iline.replace(nfalseBoolValue,ifalseStr.size(),itrueStr); } } iprjFile.close(); if(!iprjFile.open(QIODevice::WriteOnly|QIODevice::Text)) { qDebug() << "Cannot Open file for reading:" << qPrintable(iprjFile.errorString()); return ; } QTextStream ioutStream(&iprjFile) ; ioutStream << iline ; iprjFile.close(); } } int EziDebugPrj::parseQuartusPrjFile(QMap<QString,EziDebugVlgFile*> &vlgFileMap ,QMap<QString,EziDebugVhdlFile*> &vhdlFileMap) { QFile iprjFile(m_iprjName); if(!iprjFile.open(QIODevice::ReadOnly|QIODevice::Text)) { qDebug() << "Cannot Open file for reading:" << qPrintable(iprjFile.errorString()); return 1 ; } QTextStream iinStream(&iprjFile) ; while(!iinStream.atEnd()) { QString iline = iinStream.readLine(); if(iline.contains(QRegExp("\\bLAST_QUARTUS_VERSION\\b"))) { QStringList ifileds = iline.split(QRegExp("\\s+")); if(ifileds.size()!=4) { qDebug()<< "the project file has problem!" ; break; } else { if(ifileds.at(2) == "LAST_QUARTUS_VERSION") { m_itoolSoftwareVersion = ifileds.at(3) ; } else { qDebug()<< "the project file has problem!" ; break; } } } if(iline.contains(QRegExp("\\bVERILOG_FILE\\b"))) { QStringList ifileds = iline.split(QRegExp("\\s+")); if(ifileds.size()!=4) { qDebug()<< "the project file has problem!" ; break; } else { if(ifileds.at(2) == "VERILOG_FILE") { QString ifileName = ifileds.at(3) ; // 转换成绝对路径 if(!(ifileName.endsWith("_EziDebug_ScanChainReg.v")||ifileName.endsWith("_EziDebug_TOUT_m.v"))) { QFileInfo ifileinfo(m_iprjPath,ifileName); if(ifileinfo.exists()) { EziDebugVlgFile *ifileObj = new EziDebugVlgFile(ifileinfo.absoluteDir().absolutePath()+ QObject::tr("/") + ifileinfo.fileName()); vlgFileMap.insert(ifileName,ifileObj); m_iCodefileNameList.append(ifileName); } } // vlgfilemap.insert(ifileName,ifileObj); } else { qDebug()<< "the project file has problem!" ; break; } } } if(iline.contains(QRegExp("\\bVHDL_FILE\\b"))) { QStringList ifileds = iline.split(QRegExp("\\s+")); if(ifileds.size()!=4) { qDebug()<< "the project file has problem!" ; break; } else { if(ifileds.at(2) == "VHDL_FILE") { QString ifileName = ifileds.at(3) ; // 转换成绝对路径 QFileInfo ifileinfo(m_iprjPath,ifileName); if(ifileinfo.exists()) { EziDebugVhdlFile *ifileObj = new EziDebugVhdlFile(ifileinfo.absoluteDir().absolutePath()+ QObject::tr("/") + ifileinfo.fileName()); vhdlFileMap.insert(ifileName,ifileObj); m_iCodefileNameList.append(ifileName); } // vhdlfilemap.insert(ifileName,ifileObj); } else { qDebug()<< "the project file has problem!" ; break; } } } if(iline.contains(QRegExp("\\bTOP_LEVEL_ENTITY\\b"))) { QStringList ifileds = iline.split(QRegExp("\\s+")); if(ifileds.size()!=4) { qDebug()<< "the project file has problem!" ; break; } else { if(ifileds.at(2) == "TOP_LEVEL_ENTITY") { m_itopModule = ifileds.at(3) ; } else { qDebug()<< "the project file has problem!" ; break; } } } if(iline.contains(QRegExp("\\bSIGNALTAP_FILE\\b"))) { QStringList ifileds = iline.split(QRegExp("\\s+")); if(ifileds.size()!=4) { qDebug()<< "the project file has problem!" ; break; } else { if(ifileds.at(2) == "SIGNALTAP_FILE") { m_iwaveFileList << ifileds.at(3) ; } else { qDebug()<< "the project file has problem!" ; break; } } } } return 0 ; } int EziDebugPrj::parseQuartusPrjFile(QStringList &filelist) { QFile iprjFile(m_iprjName); if(!iprjFile.open(QIODevice::ReadOnly|QIODevice::Text)) { qDebug() << "Cannot Open file for reading:" << qPrintable(iprjFile.errorString()); return 1 ; } QTextStream iinStream(&iprjFile) ; while(!iinStream.atEnd()) { QString iline = iinStream.readLine(); if(iline.contains(QRegExp("\\bVERILOG_FILE\\b"))) { QStringList ifileds = iline.split(QRegExp("\\s+")); if(ifileds.size()!=4) { qDebug()<< "the project file has problem!" ; break; } else { if(ifileds.at(2) == "VERILOG_FILE") { QString ifileName = ifileds.at(3) ; QFileInfo ifileinfo(m_iprjPath,ifileName); if(!(ifileName.endsWith("_EziDebug_ScanChainReg.v")||ifileName.endsWith("_EziDebug_TOUT_m.v"))) { if(ifileinfo.exists()) { filelist.append(ifileName); } } // vlgfilemap.insert(ifileName,ifileObj); } else { qDebug()<< "the project file has problem!" ; break; } } } if(iline.contains(QRegExp("\\bVHDL_FILE\\b"))) { QStringList ifileds = iline.split(QRegExp("\\s+")); if(ifileds.size()!=4) { qDebug()<< "the project file has problem!" ; break; } else { if(ifileds.at(2) == "VHDL_FILE") { QString ifileName = ifileds.at(3) ; QFileInfo ifileinfo(m_iprjPath,ifileName); if(ifileinfo.exists()) { filelist.append(ifileName); } // vhdlfilemap.insert(ifileName,ifileObj); } else { qDebug()<< "the project file has problem!" ; break; } } } // 暂时去掉 暂不考虑 topmodule 被修改了 ,作为遗留问题跟踪 // if(iline.contains(QRegExp("\\bTOP_LEVEL_ENTITY\\b"))) // { // QStringList ifileds = iline.split(QRegExp("\\s+")); // if(ifileds.size()!=4) // { // qDebug()<< "the project file has problem!" ; // break; // } // else // { // if(ifileds.at(2) == "TOP_LEVEL_ENTITY") // { // topmodue = ifileds.at(3) ; // } // else // { // qDebug()<< "the project file has problem!" ; // break; // } // } // } } iprjFile.close(); return 0 ; } int EziDebugPrj::parseIsePrjFile(QMap<QString,EziDebugVlgFile*> &vlgFileMap ,QMap<QString,EziDebugVhdlFile*> &vhdlFileMap) { qDebug() << "parseIsePrjFile " << __LINE__ ; QFile iprjFile(m_iprjName); QString iLangType ; QString ifileInfo ; QString iprjInfo ; QString iProcessInfo ; QStringList ifileInfoList ; QStringList iProcessInfoList ; if(!iprjFile.open(QIODevice::ReadOnly|QIODevice::Text)) { qDebug() << "Cannot Open file for reading:" << qPrintable(iprjFile.errorString()); return 1 ; } QTextStream iinStream(&iprjFile) ; QString iline = iinStream.readAll(); int nstartPos = 0 ; int npositionOfProjectSetting = 0 ; int npositionOfFileKeyWord = 0 ; int npositionOfFileLeftBracket = 0 ; int npositionOfFileRightBracket = 0 ; int npositionOfProcessKeyWord = 0 ; int npositionOfProcessLeftBracket = 0 ; int npositionOfProcessRightBracket = 0 ; //m_iprjName // 查找所有 代码文件 if(m_iprjName.endsWith(".restore",Qt::CaseSensitive)) { m_itoolSoftwareVersion = "10.x" ; npositionOfProjectSetting = iline.indexOf(QRegExp("\\bset\\s+project_settings\\b"),0); if(npositionOfProjectSetting != -1 ) { npositionOfFileLeftBracket = iline.indexOf("{",npositionOfProjectSetting,Qt::CaseSensitive); if(npositionOfFileLeftBracket != -1 ) { npositionOfFileRightBracket = iline.indexOf("}",npositionOfFileLeftBracket,Qt::CaseSensitive); if(npositionOfFileRightBracket != -1) { iprjInfo = iline.mid(npositionOfFileLeftBracket+1,npositionOfFileRightBracket-npositionOfFileLeftBracket-1); QRegExp iLangExp("\"\\s*PROP_PreferredLanguage\"\\s*"); int nKeyOfLang = iLangExp.indexIn(iprjInfo,0); if(nKeyOfLang != -1) { int nlen = iLangExp.matchedLength(); int nFirstQuote = iprjInfo.indexOf("\"" ,nKeyOfLang + nlen ); int nSecondQuote = iprjInfo.indexOf("\"",nFirstQuote + 1); m_icoreLangType = iprjInfo.mid(nFirstQuote + 1 ,nSecondQuote - nFirstQuote - 1) ; } else { iprjFile.close(); return 1 ; } } } else { qDebug() << "The project File error :The left bracket is not exist!" ; iprjFile.close(); return 1 ; } } else { iprjFile.close(); return 1 ; } nstartPos = npositionOfFileRightBracket + 1 ; // 搜索代码文件 npositionOfFileKeyWord = iline.indexOf(QRegExp("\\bset\\s+user_files\\b"),nstartPos); if(npositionOfFileKeyWord != -1) { npositionOfFileLeftBracket = iline.indexOf("{",npositionOfFileKeyWord,Qt::CaseSensitive); if( npositionOfFileLeftBracket != -1) { npositionOfFileRightBracket = iline.indexOf("}",npositionOfFileKeyWord,Qt::CaseSensitive); if(npositionOfFileRightBracket != -1) { ifileInfo = iline.mid(npositionOfFileLeftBracket+1,npositionOfFileRightBracket-npositionOfFileLeftBracket-1); ifileInfoList = ifileInfo.split("\"",QString::KeepEmptyParts); QStringList::const_iterator constIterator ; for (constIterator = ifileInfoList.constBegin(); constIterator != ifileInfoList.constEnd();++constIterator) { QString ifileName = (*constIterator) ; if(ifileName.endsWith(".vhd", Qt::CaseSensitive)) { // 转换成绝对路径 QFileInfo ifileinfo(m_iprjPath,*constIterator); EziDebugVhdlFile* pvhdlFileObj = new EziDebugVhdlFile(ifileinfo.absoluteDir().absolutePath()+ QObject::tr("/") + ifileinfo.fileName()); qDebug() << const_cast<QString&>(*constIterator); if(!(ifileName.endsWith("_EziDebug_ScanChainReg.vhd")||ifileName.endsWith("_EziDebug_TOUT_m.vhd"))) { vhdlFileMap.insert(ifileName,pvhdlFileObj); m_iCodefileNameList.append(ifileName); } // vhdlfilemap.insert((*constIterator),pvhdlFileObj); } else if(ifileName.endsWith(".v", Qt::CaseSensitive)) { QFileInfo ifileinfo(m_iprjPath,*constIterator); EziDebugVlgFile* pvlgFileObj = new EziDebugVlgFile(ifileinfo.absoluteDir().absolutePath()+ QObject::tr("/") + ifileinfo.fileName()); qDebug() << const_cast<QString&>(*constIterator); if(!(ifileName.endsWith("_EziDebug_ScanChainReg.v")||ifileName.endsWith("_EziDebug_TOUT_m.v"))) { vlgFileMap.insert((*constIterator),pvlgFileObj); m_iCodefileNameList.append((*constIterator)); } // vlgfilemap.insert((*constIterator),pvlgFileObj); } else if(ifileName.endsWith(".xco", Qt::CaseSensitive)) { #if 1 QString iHdlFileName ; QString iCompleteRelativeHdlFileName = *constIterator ; QFileInfo ifileinfo(m_iprjPath,*constIterator); iHdlFileName = ifileinfo.fileName(); qDebug() << const_cast<QString&>(*constIterator); if(m_icoreLangType == "Verilog") { iHdlFileName.replace(".xco",".v"); iCompleteRelativeHdlFileName.replace(".xco",".v"); // 用绝对路径构造 EziDebugVlgFile* pvlgFileObj = new EziDebugVlgFile(ifileinfo.absoluteDir().absolutePath()+ QObject::tr("/") + iHdlFileName); pvlgFileObj->setLibaryFlag(true); vlgFileMap.insert(iCompleteRelativeHdlFileName,pvlgFileObj); m_iCodefileNameList.append(iCompleteRelativeHdlFileName); } else { // 用绝对路径构造 iHdlFileName.replace(".xco",".vhd"); iCompleteRelativeHdlFileName.replace(".xco",".vhd") ; EziDebugVhdlFile* pvhdlFileObj = new EziDebugVhdlFile(ifileinfo.absoluteDir().absolutePath()+ QObject::tr("/") + iHdlFileName); pvhdlFileObj->setLibaryFlag(true); vhdlFileMap.insert(iCompleteRelativeHdlFileName,pvhdlFileObj); m_iCodefileNameList.append(iCompleteRelativeHdlFileName); } #endif } } } else { qDebug() << "the setting file has some problem!" ; iprjFile.close(); return 1 ; } } else { qDebug() << "There is leftbracket after \"set user_files\" !"; iprjFile.close(); return 1 ; } } else { qDebug() << "There is leftbracket after \"set user_files\" !"; iprjFile.close(); return 1 ; } nstartPos = npositionOfFileRightBracket + 1; npositionOfProcessKeyWord = iline.indexOf(QRegExp("\\bset\\s+process_props\\b"),nstartPos); npositionOfProcessLeftBracket = iline.indexOf("{",npositionOfProcessKeyWord,Qt::CaseSensitive); if( npositionOfProcessLeftBracket != -1) { npositionOfProcessRightBracket = iline.indexOf("}",npositionOfProcessKeyWord,Qt::CaseSensitive); if(npositionOfProcessRightBracket != -1) { iProcessInfo = iline.mid(npositionOfProcessLeftBracket+1,npositionOfProcessRightBracket-npositionOfFileLeftBracket-1); iProcessInfoList = iProcessInfo.split("\"",QString::SkipEmptyParts); QStringList::const_iterator constIterator ; for (constIterator = iProcessInfoList.constBegin(); constIterator != iProcessInfoList.constEnd();++constIterator) { if((*constIterator)== "PROP_SynthTop") { constIterator += 2 ; qDebug() << "detect top key word!" ; if(((*constIterator).contains("Module"),Qt::CaseSensitive)||((*constIterator).contains("Architecture"),Qt::CaseSensitive)) { QString itopmodule = *constIterator ; QStringList itopModuleList = itopmodule.split("|"); m_itopModule = itopModuleList.at(1); qDebug() << m_itopModule ; } else { qDebug() << "parseIsePrjFile error!"; iprjFile.close(); return 1 ; } } } } else { qDebug() << "the setting file has some problem!" ; iprjFile.close(); return 1 ; } } else { qDebug() << "There is leftbracket after \"set user_files\" !"; iprjFile.close(); return 1 ; } } else if(m_iprjName.endsWith(".xise",Qt::CaseSensitive)) { QDomDocument idomDocument ; QString iErrorStr ; int nErrorLine ; int nErrorColumn = 0 ; if (!idomDocument.setContent(&iprjFile, true, &iErrorStr, &nErrorLine, &nErrorColumn)) { qDebug() << tr("Parse error at line %1, column %2:\n%3").arg(nErrorLine)\ .arg(nErrorColumn).arg(iErrorStr) ; return 1 ; } QDomElement root = idomDocument.documentElement(); if(root.tagName() == "project") { // 获取工程设置的代码语言 以及 获取 topmodule QDomElement iPrjProperties = root.firstChildElement("properties"); if(!iPrjProperties.isNull()) { QDomElement iPrjProperty = iPrjProperties.firstChildElement("property"); while(!iPrjProperty.isNull()) { if(iPrjProperty.attribute("xil_pn:name") == "Implementation Top") { m_itopModule = iPrjProperty.attribute("xil_pn:value") ; } if(iPrjProperty.attribute("xil_pn:name") == "Preferred Language") { m_icoreLangType = iPrjProperty.attribute("xil_pn:value"); break ; } iPrjProperty = iPrjProperties.nextSiblingElement("property") ; } } else { qDebug() << "The project file parse error!"; iprjFile.close(); return 1 ; } if(m_itopModule.isEmpty()) { qDebug() << "The project file parse error: NO Topmodule!"; iprjFile.close(); return 1 ; } if(iLangType.isEmpty()) { qDebug() << "The project file parse error: NO Language Type!"; iprjFile.close(); return 1 ; } QDomElement ifilesChild = root.firstChildElement("files"); if(!ifilesChild.isNull()) { QDomElement ifileChild = ifilesChild.firstChildElement("file"); while(!ifileChild.isNull()) { // 相对路径 QString ifileName = ifileChild.attribute("xil_pn:name") ; if(ifileName.endsWith(".v")) { QFileInfo ifileinfo(m_iprjPath,ifileName); EziDebugVlgFile* pvlgFileObj = new EziDebugVlgFile(ifileinfo.absoluteDir().absolutePath()+ QObject::tr("/") + ifileinfo.fileName()); qDebug() << ifileName ; if(!(ifileName.endsWith("_EziDebug_ScanChainReg.v")||ifileName.endsWith("_EziDebug_TOUT_m.v"))) { vlgFileMap.insert(ifileName,pvlgFileObj); m_iCodefileNameList.append(ifileName); } } else if(ifileName.endsWith(".vhd")) { QFileInfo ifileinfo(m_iprjPath,ifileName); EziDebugVhdlFile* pvhdlFileObj = new EziDebugVhdlFile(ifileinfo.absoluteDir().absolutePath()+ QObject::tr("/") + ifileinfo.fileName()); qDebug() << ifileName ; if(!(ifileName.endsWith("_EziDebug_ScanChainReg.vhd")||ifileName.endsWith("_EziDebug_TOUT_m.vhd"))) { vhdlFileMap.insert(ifileName,pvhdlFileObj); m_iCodefileNameList.append(ifileName); } } else if(ifileName.endsWith(".xco")) { if(iLangType == "Verilog") { ifileName.replace(".xco",".v") ; QFileInfo ifileinfo(m_iprjPath,ifileName); EziDebugVlgFile* pvlgFileObj = new EziDebugVlgFile(ifileinfo.absoluteDir().absolutePath()+ QObject::tr("/") + ifileinfo.fileName()); qDebug() << ifileName ; vlgFileMap.insert(ifileName,pvlgFileObj); m_iCodefileNameList.append(ifileName); } else { ifileName.replace(".xco",".vhd") ; QFileInfo ifileinfo(m_iprjPath,ifileName); EziDebugVhdlFile* pvhdlFileObj = new EziDebugVhdlFile(ifileinfo.absoluteDir().absolutePath()+ QObject::tr("/") + ifileinfo.fileName()); qDebug() << ifileName ; vhdlFileMap.insert(ifileName,pvhdlFileObj); m_iCodefileNameList.append(ifileName); } } ifileChild = ifilesChild.nextSiblingElement("file"); } } else { iprjFile.close(); return 1 ; } m_itoolSoftwareVersion = "14.x" ; } } iprjFile.close(); return 0 ; } int EziDebugPrj::parseIsePrjFile(QStringList &filelist) { qDebug() << "parseIsePrjFile " << __LINE__ ; QFile iprjFile(m_iprjName); QString ifileInfo ; QString iPrjInfo ; QString iPreferLang ; //QString iProcessInfo ; QStringList ifileInfoList ; QStringList iPrjInfoList ; //QStringList iProcessInfoList ; if(!iprjFile.open(QIODevice::ReadOnly|QIODevice::Text)) { qDebug() << "Cannot Open file for reading:" << qPrintable(iprjFile.errorString()); return 1 ; } QTextStream iinStream(&iprjFile) ; QString iline = iinStream.readAll(); //int searchPosition = 0 ; int npositionOfFileKeyWord = 0 ; int npositionOfFileLeftBracket = 0 ; int npositionOfFileRightBracket = 0 ; int npositionOfPrjKeyWord = 0 ; // int npositionOfProcessLeftBracket = 0 ; // int npositionOfProcessRightBracket = 0 ; if(m_itoolSoftwareVersion.isEmpty()) { if(m_iprjName.endsWith(".restore",Qt::CaseSensitive)) { m_itoolSoftwareVersion = "10.x" ; } else if(m_iprjName.endsWith(".xise",Qt::CaseSensitive)) { m_itoolSoftwareVersion = "14.x" ; } else { qDebug("EziDebug Error: the version of software that opened the project is confused!"); return 1 ; } } if(m_itoolSoftwareVersion == "10.x") { npositionOfPrjKeyWord = iline.indexOf(QRegExp("\\bset\\s+project_settings\\b"),0); if(npositionOfPrjKeyWord != -1) { npositionOfFileLeftBracket = iline.indexOf("{" , npositionOfPrjKeyWord , Qt::CaseSensitive); if( npositionOfFileLeftBracket != -1) { npositionOfFileRightBracket = iline.indexOf("}",npositionOfFileLeftBracket,Qt::CaseSensitive); if(npositionOfFileRightBracket != -1) { iPrjInfo = iline.mid(npositionOfFileLeftBracket+1,npositionOfFileRightBracket-npositionOfFileLeftBracket-1); iPrjInfoList = iPrjInfo.split("\"",QString::SkipEmptyParts); QStringList::ConstIterator iprjIter = iPrjInfoList.constBegin(); while(iprjIter != iPrjInfoList.constEnd()) { QString iKeyWords = *iprjIter ; if(iKeyWords == "PROP_PreferredLanguage") { iprjIter += 2 ; iPreferLang = *iprjIter ; break ; } ++iprjIter ; } } else { iprjFile.close(); qDebug() << "The Prject file parse failed!"; return 1 ; } } else { iprjFile.close(); qDebug() << "The Prject file parse failed!"; return 1 ; } } else { iprjFile.close(); qDebug() << "The Prject file parse failed!"; return 1 ; } npositionOfFileKeyWord = iline.indexOf(QRegExp("\\bset\\s+user_files\\b"),0); if(npositionOfFileKeyWord != -1) { npositionOfFileLeftBracket = iline.indexOf("{" , npositionOfFileKeyWord , Qt::CaseSensitive); if( npositionOfFileLeftBracket != -1) { npositionOfFileRightBracket = iline.indexOf("}",npositionOfFileLeftBracket,Qt::CaseSensitive); if(npositionOfFileRightBracket != -1) { //searchPosition = npositionOfFileRightBracket ; ifileInfo = iline.mid(npositionOfFileLeftBracket+1,npositionOfFileRightBracket-npositionOfFileLeftBracket-1); ifileInfoList = ifileInfo.split("\"",QString::SkipEmptyParts); QStringList::const_iterator constIterator ; for (constIterator = ifileInfoList.constBegin(); constIterator != ifileInfoList.constEnd();++constIterator) { QString ifileName = (*constIterator) ; if(ifileName.endsWith(".vhd", Qt::CaseSensitive)) { qDebug() << const_cast<QString&>(*constIterator); if(!(ifileName.endsWith("_EziDebug_ScanChainReg.vhd")||ifileName.endsWith("_EziDebug_TOUT_m.vhd"))) { filelist.append(ifileName); } // vhdlfilemap.insert((*constIterator),pvhdlFileObj); } else if(ifileName.endsWith(".v", Qt::CaseSensitive)) { qDebug() << const_cast<QString&>(*constIterator); if(!(ifileName.endsWith("_EziDebug_ScanChainReg.v")||ifileName.endsWith("_EziDebug_TOUT_m.v"))) { filelist.append(ifileName); } // vlgfilemap.insert((*constIterator),pvlgFileObj); } else if(ifileName.endsWith(".xco",Qt::CaseSensitive)) { if(iPreferLang == "Verilog") { ifileName.replace(".xco",".v"); filelist.append(ifileName); } else { ifileName.replace(".xco",".vhd"); filelist.append(ifileName); } } } } else { qDebug() << "the setting file has some problem!" ; iprjFile.close(); return 1 ; } } else { qDebug() << "There is leftbracket after \"set user_files\" !"; iprjFile.close(); return 1 ; } } else { iprjFile.close(); return 1 ; } } else if(m_itoolSoftwareVersion == "14.x") { QDomDocument idomDocument ; QString iErrorStr ; int nErrorLine ; int nErrorColumn = 0 ; if (!idomDocument.setContent(&iprjFile, true, &iErrorStr, &nErrorLine, &nErrorColumn)) { qDebug() << tr("Parse error at line %1, column %2:\n%3").arg(nErrorLine)\ .arg(nErrorColumn).arg(iErrorStr) ; return 1 ; } QDomElement root = idomDocument.documentElement(); if(root.tagName() == "project") { QDomElement ifilesChild = root.firstChildElement("files"); if(!ifilesChild.isNull()) { QDomElement ifileChild = ifilesChild.firstChildElement("file"); while(!ifileChild.isNull()) { // 相对路径 QString ifileName = ifileChild.attribute("xil_pn:name") ; if(ifileName.endsWith(".v")) { if(!(ifileName.endsWith("_EziDebug_ScanChainReg.v")||ifileName.endsWith("_EziDebug_TOUT_m.v"))) { filelist.append(ifileName); } } else if(ifileName.endsWith(".vhd")) { if(!(ifileName.endsWith("_EziDebug_ScanChainReg.vhd")||ifileName.endsWith("_EziDebug_TOUT_m.vhd"))) { filelist.append(ifileName); } } else if(ifileName.endsWith(".xco")) { if(m_icoreLangType == "Verilog") { ifileName.replace(".xco",".v") ; filelist.append(ifileName); } else { ifileName.replace(".xco",".vhd") ; filelist.append(ifileName); } } ifileChild = ifilesChild.nextSiblingElement("file"); } } else { qDebug() << "The project file parse failed: NO root element!"; iprjFile.close(); return 1 ; } } } iprjFile.close(); return 0 ; } void EziDebugPrj::deleteAllEziDebugCode(const QMap<QString,EziDebugVlgFile*> &vlgFileMap ,const QMap<QString,EziDebugVhdlFile*> &vhdlFileMap) { QMap<QString,EziDebugVlgFile*>::const_iterator i = vlgFileMap.constBegin() ; while(i != vlgFileMap.constEnd()) { EziDebugVlgFile* pfile = i.value(); pfile->deleteEziDebugCode(); ++i; } QMap<QString,EziDebugVhdlFile*>::const_iterator j = vhdlFileMap.constBegin() ; while(j != vhdlFileMap.constEnd()) { EziDebugVhdlFile* pfile = j.value(); pfile->deleteEziDebugCode(); ++j; } } int EziDebugPrj::domParseFileInfoElement(const QDomElement &element, char readflag) { /*子节点数目是否为零*/ if(!(element.childNodes().count())) { qDebug() << "domParseFileInfoElement Error:There is no fileinfo!"; return 0 ; } QDomNode ichild = element.firstChild(); /*扫描子节点 ,是否存在下一个子节点*/ while (!ichild.isNull()) { if (ichild.toElement().tagName() == "file") { if(domParseFileStructure(ichild.toElement(),readflag)) { qDebug() << "domParseFileInfoElement Error :fileinfo format is not right!"; return 1 ; } } else { qDebug() << "Info:There is no file element in the log file!"; return 0 ; } ichild = ichild.nextSibling(); } return 0 ; } int EziDebugPrj::domParseFileStructure(const QDomElement &element, char readflag) { QString ifileName ; QDateTime idateTime ; QDate idate ; QTime itime ; QStringList imoduleList ; if(element.attribute("file_name").isEmpty()) { return 1 ; } if(element.attribute("modified_date").isEmpty()) { return 1 ; } if(element.attribute("modified_time").isEmpty()) { return 1 ; } // if(element.attribute("module_array").isEmpty()) // { // return 1 ; // } if(element.attribute("macro").isEmpty()) { return 1 ; } if(element.attribute("defparameter").isEmpty()) { return 1 ; } ifileName = element.attribute("file_name"); imoduleList = element.attribute("module_array").split(QRegExp("\\s+")); QStringList idateList = element.attribute("modified_date").split("/") ; QStringList itimeList = element.attribute("modified_time").split(":") ; idate = QDate(idateList.at(2).toInt(),idateList.at(0).toInt(),idateList.at(1).toInt()) ; itime = QTime(itimeList.at(0).toInt(),itimeList.at(1).toInt(),itimeList.at(2).toInt()) ; idateTime = QDateTime(idate,itime) ; if((ifileName.endsWith(".v",Qt::CaseSensitive))) { if(readflag&READ_FILE_INFO) { /*创建文件对象指针 并加入工程对象的文件map中*/ QFileInfo ifileinfo(m_iprjPath,ifileName); QString ifileFullName = ifileinfo.absoluteDir().absolutePath()+ QObject::tr("/") + ifileinfo.fileName() ; EziDebugVlgFile * pvlgFileObj = new EziDebugVlgFile(ifileFullName,idateTime,imoduleList); if(element.attribute("macro").compare("No Macro")) { QStringList imacroList = element.attribute("macro").split("$$") ; int nmacroCount = 0 ; for(;nmacroCount < imacroList.count();nmacroCount++) { QString imacroStr = imacroList.at(nmacroCount).split("::").at(0) ; QString imacroVal = imacroList.at(nmacroCount).split("::").at(1) ; pvlgFileObj->addToMacroMap(imacroStr , imacroVal); } } if(element.attribute("defparameter").compare("No Defparam")) { QStringList idefParmeterList = element.attribute("defparameter").split("$$") ; int ndefparameterCount = 0 ; for(;ndefparameterCount < idefParmeterList.count();ndefparameterCount++) { QString icomDefParaStr = idefParmeterList.at(ndefparameterCount).split("::").at(0) ; QString idefParaVal = idefParmeterList.at(ndefparameterCount).split("::").at(1) ; QString iinstanceName = icomDefParaStr.split(".").at(0) ; QString idefParaStr = icomDefParaStr.split(".").at(1) ; pvlgFileObj->addToDefParameterMap(iinstanceName ,idefParaStr ,idefParaVal); } } m_ivlgFileMap.insert(ifileName,pvlgFileObj); m_iCodefileNameList << ifileName ; } } else if((ifileName.endsWith(".vhd",Qt::CaseSensitive))) { /*创建文件对象指针 并加入工程对象的文件map中*/ if(readflag&READ_FILE_INFO) { QFileInfo ifileinfo(m_iprjPath,ifileName); QString ifileFullName = ifileinfo.absoluteDir().absolutePath()+ QObject::tr("/") + ifileinfo.fileName() ; EziDebugVhdlFile * pvlgFileObj = new EziDebugVhdlFile(ifileFullName,idateTime,imoduleList); m_ivhdlFileMap.insert(ifileName,pvlgFileObj); m_iCodefileNameList << ifileName ; } } else { qDebug() << "domParseFileStructure Error:The log file format is not right(the source code file type is not right)!"; return 1 ; } return 0 ; } int EziDebugPrj::domParseModuleInfoElement(const QDomElement &element, char readflag) { QString imoduleName ; EziDebugModule *pmoduleObj = NULL ; /*子节点数目是否为零*/ if(!(element.childNodes().count())) { qDebug() << "Info:There is no module info in the log file!"; return 0 ; } // 存在 module 则检查 topmodule if(element.attribute("topmodule").isEmpty()) { qDebug() << "domParseEziDebugElement Error:There is no topmodule!" ; return 1 ; } else { if(element.attribute("topmodule").toLower() != "no module") { m_itopModule = element.attribute("topmodule") ; } } QDomNode ichild = element.firstChild(); /*扫描子节点 ,是否存在下一个子节点*/ while (!ichild.isNull()) { if (ichild.toElement().tagName() == "module") { if(ichild.toElement().attribute("module_name").isEmpty()) { return 1 ; } // if(ichild.toElement().attribute("appearance_count").isEmpty()) // { // return 1 ; // } // if(QRegExp("^\\d+$").exactMatch(ichild.toElement().attribute("appearance_count"))) // { // return 1 ; // } if(ichild.toElement().attribute("lib_core").isEmpty()) { return 1 ; } if(!QRegExp("^\\d+$").exactMatch(ichild.toElement().attribute("lib_core"))) { return 1 ; } if(ichild.toElement().attribute("file_name").isEmpty()) { return 1 ; } if(ichild.toElement().attribute("instance_array").isEmpty()) { return 1 ; } if(ichild.toElement().attribute("reset_signal").isEmpty()) { return 1 ; } if(ichild.toElement().attribute("parameter").isEmpty()) { return 1 ; } if(readflag&READ_MODULE_INFO) { imoduleName = ichild.toElement().attribute("module_name") ; qDebug() << "Test module" <<imoduleName ; pmoduleObj = new EziDebugModule(imoduleName) ; if(!pmoduleObj) { qDebug() << "Error: domParseModuleInfoElement :There is no memory left !" ; return 1 ; } pmoduleObj->m_isLibaryCore = ichild.toElement().attribute("lib_core").toInt() ; //pmoduleObj->m_ninstanceTimes = ichild.toElement().attribute("appearance_count").toInt(); pmoduleObj->m_ilocatedFile = ichild.toElement().attribute("file_name") ; if(!(ichild.toElement().attribute("instance_array").toLower() == "no instance")) { pmoduleObj->m_iinstanceNameList = ichild.toElement().attribute("instance_array").split("|") ; } if(ichild.toElement().attribute("reset_signal").compare("No Reset Signal")) { pmoduleObj->m_iresetMap.insert(ichild.toElement().attribute("reset_signal").split(":").at(0),\ ichild.toElement().attribute("reset_signal").split(":").at(1)); } if(ichild.toElement().attribute("parameter").compare("No Parameter")) { QStringList iparameterList = ichild.toElement().attribute("parameter").split("$$") ; int nparameterCount = 0 ; for( ; nparameterCount < iparameterList.count() ;nparameterCount++) { QString iparameterStr = iparameterList.at(nparameterCount).split("::").at(0) ; QString iparameterVal = iparameterList.at(nparameterCount).split("::").at(1) ; pmoduleObj->m_iparameter.insert(iparameterStr,iparameterVal) ; } } } /*解析module 结构*/ if(domParseModuleStructure(ichild.toElement() , readflag , pmoduleObj)) { qDebug() << "domParseFileInfoElement Error :moduleinfo format is not right!"; return 1 ; } if(pmoduleObj) { m_imoduleMap.insert(pmoduleObj->getModuleName(),pmoduleObj); } } else { qDebug() << "domParseFileInfoElement Error : There is strange element in the file!"; return 1 ; } ichild = ichild.nextSibling(); } return 0 ; } int EziDebugPrj::domParseModuleStructure(const QDomElement &element,char readflag,EziDebugModule* module) { /*子节点数目是否为零*/ int emoduleStructureExistFlag = 0 ; if(element.childNodes().count() != 4) { qDebug() << "domParseFileInfoElement Error:module format is not right!"; return 1 ; } QDomNode ichild = element.firstChild(); /*扫描子节点 ,是否存在下一个子节点*/ while (!ichild.isNull()) { if (ichild.toElement().tagName() == "clock_description") { emoduleStructureExistFlag |= MODULE_STRUCTURE_CLOCK_DESCRIPTION ; if(domParseClockDescriptionElement(ichild.toElement() , readflag , module)) { qDebug() << "domParseModuleStructure Error :moduleinfo format is not right!"; return 1 ; } } else if(ichild.toElement().tagName() == "reg_description") { emoduleStructureExistFlag |= MODULE_STRUCTURE_REG_DESCRIPTION ; if(domParseRegDescriptionElement(ichild.toElement() , readflag , module)) { qDebug() << "domParseModuleStructure Error :reginfo format is not right!"; return 1 ; } } else if(ichild.toElement().tagName() == "port_description") { emoduleStructureExistFlag |= MODULE_STRUCTURE_PORT_DESCRIPTION ; if(domParsePortDescriptionElement(ichild.toElement() , readflag ,module)) { qDebug() << "domParseModuleStructure Error :portinfo format is not right!"; return 1 ; } } else if(ichild.toElement().tagName() == "instance_port_map_description") { emoduleStructureExistFlag |= MODULE_STRUCTURE_INSTANCE_PORT_MAP_DESCRIPTION ; if(domParseInstancePortMapDescriptionElement(ichild.toElement() , readflag ,module)) { qDebug() << "domParseModuleStructure Error :portmap format is not right!"; return 1 ; } } else { qDebug() << "domParseModuleStructure Error : There is strange element in the file!"; return 1 ; } ichild = ichild.nextSibling(); } if((emoduleStructureExistFlag&MODULE_STRUCTURE_ALL_DESCRIPTION) == MODULE_STRUCTURE_ALL_DESCRIPTION ) { return 0 ; } else { return 1 ; } } int EziDebugPrj::domParseClockDescriptionElement(const QDomElement &element, char readflag, EziDebugModule* module) { /*子节点数目是否为零*/ if(!(element.childNodes().count())) { qDebug() << "EziDebug Info: There is no clockinfo " << (module? (QObject::tr("in module:%1").arg(module->getModuleName())):""); return 0 ; } QDomNode ichild = element.firstChild(); /*扫描子节点 ,是否存在下一个子节点*/ while (!ichild.isNull()) { if (ichild.toElement().tagName() == "clock") { if(ichild.toElement().attribute("clock_name").isEmpty()) { return 1 ; } if(ichild.toElement().attribute("polarity").isEmpty()) { return 1 ; } if(!((ichild.toElement().attribute("polarity").toLower() == "posedge") \ || (ichild.toElement().attribute("polarity").toLower() == "negedge"))) { return 1 ; } if(readflag & READ_MODULE_INFO) { if(module) { QString iclockName = ichild.toElement().attribute("clock_name"); module->m_iclockMap.insert(iclockName,ichild.toElement().attribute("polarity")); } else { qDebug() << "domParseClockDescriptionElement: NULL Pointer!"; return 1 ; } } } else { qDebug() << "domParseFileInfoElement Error : There is strange element in the file!"; return 1 ; } ichild = ichild.nextSibling(); } return 0 ; } int EziDebugPrj::domParseClockStructure(const QDomElement &element, char readflag , EziDebugModule* module) { return 0 ; } int EziDebugPrj::domParseRegDescriptionElement(const QDomElement &element ,char readflag, EziDebugModule* module) { /*子节点数目是否为零*/ if(!(element.childNodes().count())) { qDebug() << "EziDebug Info:There is no reginfo in the module " << (module ? module->getModuleName() : "") << "!"; return 0 ; } QDomNode ichild = element.firstChild(); /*扫描子节点 ,是否存在下一个子节点*/ while (!ichild.isNull()) { if (ichild.toElement().tagName() == "reg") { if(ichild.toElement().attribute("module_name").isEmpty()) { return 1 ; } if(ichild.toElement().attribute("locate_clock").isEmpty()) { return 1 ; } if(ichild.toElement().attribute("reg_name").isEmpty()) { return 1 ; } if(ichild.toElement().attribute("bitwidth").isEmpty()) { return 1 ; } if(ichild.toElement().attribute("regnum").isEmpty()) { return 1 ; } #if 0 if(ichild.toElement().attribute("endian").isEmpty()) { return 1 ; } #endif if(ichild.toElement().attribute("polarity").isEmpty()) { return 1 ; } if(!((ichild.toElement().attribute("polarity").toLower() == "posedge") \ || (ichild.toElement().attribute("polarity").toLower() == "negedge") \ || (ichild.toElement().attribute("polarity").toLower() == "low") \ || (ichild.toElement().attribute("polarity").toLower() == "high"))) { return 1 ; } #if 0 if(!((ichild.toElement().attribute("endian") == "0")\ ||(ichild.toElement().attribute("endian") == "1"))) { return 1 ; } #endif if(readflag & READ_MODULE_INFO) { if(module) { EziDebugModule::RegStructure * preg= new EziDebugModule::RegStructure ; // preg->m_isEndian = ichild.toElement().attribute("endian").toInt(); // preg->m_pMouduleName = (char*)malloc(ichild.toElement().attribute("module_name").size()+1); memcpy(preg->m_pMouduleName,ichild.toElement().attribute("module_name").toAscii().data(),ichild.toElement().attribute("module_name").size()+1); // preg->m_pRegName = (char*)malloc(ichild.toElement().attribute("reg_name").size()+1); memcpy(preg->m_pRegName,ichild.toElement().attribute("reg_name").toAscii().data(),ichild.toElement().attribute("reg_name").size()+1); memset(preg->m_pExpString,0,64) ; if(ichild.toElement().attribute("bitwidth").size() <= 63) { qstrcpy(preg->m_pExpString,ichild.toElement().attribute("bitwidth").toAscii().constData()); } memset(preg->m_pregNum,0,64) ; if(ichild.toElement().attribute("regnum").size() <= 63) { qstrcpy(preg->m_pregNum ,ichild.toElement().attribute("regnum").toAscii().constData()) ; } if(ichild.toElement().attribute("polarity").toLower() == "posedge") { preg->m_eedge = EziDebugModule::signalPosEdge ; } else if(ichild.toElement().attribute("polarity").toLower() == "negedge") { preg->m_eedge = EziDebugModule::signalNegEdge ; } else if(ichild.toElement().attribute("polarity").toLower() == "low") { preg->m_eedge = EziDebugModule::signalLow ; } else { preg->m_eedge = EziDebugModule::signalHigh ; } QString iclockName = ichild.toElement().attribute("locate_clock"); qstrcpy(preg->m_pclockName,iclockName.toAscii().data()); QVector<EziDebugModule::RegStructure*> iregStructureVec = module->m_iregMap.value(iclockName) ; iregStructureVec.append(preg); module->m_iregMap.insert(iclockName,iregStructureVec); } else { qDebug() << "domParseRegDescriptionElement Error: NULL Pointer!"; return 1 ; } } } else { qDebug() << "domParseRegDescriptionElement Error : There is strange element in the file!"; return 1 ; } ichild = ichild.nextSibling(); } return 0 ; } int EziDebugPrj::domParseRegStructure(const QDomElement &element , char readflag , EziDebugModule* module) { return 0 ; } int EziDebugPrj::domParsePortDescriptionElement(const QDomElement &element ,char readflag, EziDebugModule* module) { /*子节点数目是否为零*/ if(!(element.childNodes().count())) { qDebug() << "domParsePortDescriptionElement Error:There is no port!"; return 1 ; } QDomNode ichild = element.firstChild(); /*扫描子节点 ,是否存在下一个子节点*/ while (!ichild.isNull()) { if (ichild.toElement().tagName() == "port") { if(ichild.toElement().attribute("port_name").isEmpty()) { return 1 ; } if(ichild.toElement().attribute("module_name").isEmpty()) { return 1 ; } if(ichild.toElement().attribute("direction_type").isEmpty()) { return 1 ; } if(ichild.toElement().attribute("bitwidth").isEmpty()) { return 1 ; } #if 0 if(ichild.toElement().attribute("endian").isEmpty()) { return 1 ; } if(!((ichild.toElement().attribute("endian").toLower() == "little")\ ||(ichild.toElement().attribute("endian").toLower()== "big"))) { return 1 ; } #endif if(!((ichild.toElement().attribute("direction_type").toLower() == "in")\ ||(ichild.toElement().attribute("direction_type").toLower() == "out")\ ||(ichild.toElement().attribute("direction_type").toLower() == "inout"))) { return 1 ; } if(readflag & READ_MODULE_INFO) { if(module) { EziDebugModule::PortStructure * pport= new EziDebugModule::PortStructure ; // pport->m_isEndian = (ichild.toElement().attribute("endian").toLower() == "big"); //pport->m_pModuleName = (char*)malloc(ichild.toElement().attribute("module_name").size()+1); memcpy(pport->m_pModuleName,ichild.toElement().attribute("module_name").toAscii().data(),ichild.toElement().attribute("module_name").size()+1); //pport->m_pPortName = (char*)malloc(ichild.toElement().attribute("port_name").size()+1); memcpy(pport->m_pPortName,ichild.toElement().attribute("port_name").toAscii().data(),ichild.toElement().attribute("port_name").size()+1); if(ichild.toElement().attribute("direction_type").toLower() == "in") { pport->eDirectionType = EziDebugModule::directionTypeInput ; } else if(ichild.toElement().attribute("direction_type").toLower() == "out") { pport->eDirectionType = EziDebugModule::directionTypeOutput ; } else { pport->eDirectionType = EziDebugModule::directionTypeInoutput ; } memset(pport->m_pBitWidth,0,64) ; if(ichild.toElement().attribute("bitwidth").size() <= 63) { qstrcpy(pport->m_pBitWidth ,ichild.toElement().attribute("bitwidth").toAscii().constData()); } if(pport) { module->m_iportVec.append(pport); } else { return 1 ; } } else { qDebug() << "readPortStructure: NULL Pointer!"; return 1 ; } } } else { qDebug() << "domParsePortDescriptionElement Error : There is strange element in the file!"; return 1 ; } ichild = ichild.nextSibling(); } return 0 ; } int EziDebugPrj::domParseInstancePortMapDescriptionElement(const QDomElement &element,char readflag, EziDebugModule* module) { /*子节点数目是否为零*/ if(!(element.childNodes().count())) { qDebug() << "EziDebug Info:There is no instance port map !"; return 0 ; } QDomNode ichild = element.firstChild(); /*扫描子节点 ,是否存在下一个子节点*/ while (!ichild.isNull()) { if (ichild.toElement().tagName() == "instance") { if(ichild.toElement().attribute("instance_name").isEmpty()) { return 1 ; } if(ichild.toElement().attribute("port_map").isEmpty()) { return 1 ; } } if(readflag & READ_MODULE_INFO) { if(module) { int i = 0 ; QString iinstanceName = ichild.toElement().attribute("instance_name") ; QMap<QString,QString> iportMap ; QString iportMapStr = ichild.toElement().attribute("port_map") ; QStringList iportMapList = iportMapStr.split('#'); for(;i < iportMapList.count() ;i++) { iportMap.insert(iportMapList.at(i).split('@').at(0),iportMapList.at(i).split('@').at(1)); } module->m_iinstancePortMap.insert(iinstanceName,iportMap) ; } else { qDebug() << "domParsePortDescriptionElement Error : The pmodule is NULL pointer!"; return 1 ; } } ichild = ichild.nextSibling(); } return 0 ; } int EziDebugPrj::domParsePortStructure(const QDomElement &element, char readflag , EziDebugModule* module) { return 0 ; } int EziDebugPrj::domParseScanChainInfoElement(const QDomElement &element,char readflag) { QString ichainName ; QString iscanRegCore ; QString itoutCore ; QString iuserDir ; EziDebugScanChain *pchainObj = NULL ; if(element.attribute("scanreg_core_name").toLower() != "no core") { iscanRegCore = element.attribute("scanreg_core_name"); } else { iscanRegCore = "No Core"; } if(element.attribute("tout_core_name").toLower() != "no core") { itoutCore = element.attribute("tout_core_name"); } else { itoutCore = "No Core" ; } if(element.attribute("user_dir").toLower() != "no dir") { iuserDir = element.attribute("user_dir"); } else { iuserDir = "No Dir" ; } EziDebugScanChain::saveEziDebugAddedInfo(iscanRegCore , itoutCore , iuserDir) ; /*子节点数目是否为零*/ if(!(element.childNodes().count())) { qDebug() << "EziDebug Info: There is no Scan chain infomation!"; return 0 ; } QDomNode ichild = element.firstChild(); /*扫描子节点 ,是否存在下一个子节点*/ while (!ichild.isNull()) { if (ichild.toElement().tagName() == "chain") { if(ichild.toElement().attribute("chain_name").isEmpty()) { return 1 ; } // if(ichild.toElement().attribute("instance_list").isEmpty()) // { // return 1 ; // } if(ichild.toElement().attribute("scaned_file_list").isEmpty()) { return 1 ; } if(ichild.toElement().attribute("system_output").isEmpty()) { return 1 ; } ichainName = ichild.toElement().attribute("chain_name") ; if(readflag&READ_CHAIN_INFO) { pchainObj = new EziDebugScanChain(ichainName) ; if(!pchainObj) { qDebug() << "Error: domParseScanChainInfoElement :There is no memory left !" ; return 1 ; } pchainObj->m_iinstanceItemList = ichild.toElement().attribute("instance_list").split("|") ; pchainObj->m_iscanedFileNameList = ichild.toElement().attribute("scaned_file_list").split("|") ; if(ichild.toElement().attribute("system_output")!= "No Sysoutput") { pchainObj->m_isysCoreOutputPortList = ichild.toElement().attribute("system_output").split("@") ; } } // /*解析扫描链结构*/ if(domParseScanChainStructure(ichild.toElement() , readflag , pchainObj)) { qDebug() << "domParseScanChainInfoElement Error :chaininfo format is not right!"; return 1 ; } } else { qDebug() << "domParseScanChainInfoElement Error : There is strange element in the file!"; return 1 ; } ichild = ichild.nextSibling(); } return 0 ; } int EziDebugPrj::domParseScanChainStructure(const QDomElement &element,char readflag, EziDebugScanChain *chain) { /*子节点数目是否为零*/ int echainStructureExistFlag = 0 ; if(element.childNodes().count() != 2) { qDebug() << "domParseScanChainStructure Error:There is no fileinfo!"; return 1 ; } QDomNode ichild = element.firstChild(); /*扫描子节点 ,是否存在下一个子节点*/ while (!ichild.isNull()) { if (ichild.toElement().tagName() == "reglist_description") { echainStructureExistFlag |= SCAN_CHAIN_STRUCTURE_REGLIST_DESCRIPTION ; if(domParseReglistDescriptionElement(ichild.toElement() , readflag , chain)) { qDebug() << "domParseScanChainStructure Error :fileinfo format is not right!"; return 1 ; } } else if(ichild.toElement().tagName() == "code_description") { echainStructureExistFlag |= SCAN_CHAIN_STRUCTURE_CODE_DESCRIPTION ; if(domParseCodeDescriptionElement(ichild.toElement() , readflag , chain)) { qDebug() << "domParseScanChainStructure Error :reginfo format is not right!"; return 1 ; } } else { qDebug() << "domParseScanChainStructure Error : There is strange element in the file!"; return 1 ; } ichild = ichild.nextSibling(); } if((echainStructureExistFlag&SCAN_CHAIN_STRUCTURE_ALL_DESCRIPTION) == SCAN_CHAIN_STRUCTURE_ALL_DESCRIPTION ) { if(readflag&READ_CHAIN_INFO) { m_ichainInfoMap.insert(chain->m_iChainName,chain); } return 0 ; } else { return 1 ; } return 0 ; } int EziDebugPrj::domParseReglistDescriptionElement(const QDomElement &element,char readflag, EziDebugScanChain *chain) { QVector<QStringList> iregListVec ; /*子节点数目是否为零*/ if(!(element.childNodes().count())) { qDebug() << "domParseReglistDescriptionElement Error:There is no fileinfo!"; return 1 ; } QDomNode ichild = element.firstChild(); /*扫描子节点 ,是否存在下一个子节点*/ while (!ichild.isNull()) { if(ichild.toElement().tagName() == "regchain") { if(ichild.toElement().attribute("reglist").isEmpty()) { return 1 ; } if(ichild.toElement().attribute("insertclock").isEmpty()) { return 1 ; } if(readflag&READ_CHAIN_INFO) { if(chain) { QString iinsertClock = ichild.toElement().attribute("insertclock") ; int nregCount = ichild.toElement().attribute("regcount").toInt(); chain->m_nregCountMap.insert(iinsertClock,nregCount); QStringList ireglist = ichild.toElement().attribute("reglist").split("@") ; iregListVec.append(ireglist); chain->m_iregChainStructure.insert(iinsertClock,iregListVec) ; } else { return 1 ; } } } else { qDebug() << "domParseReglistStructure Error : There is unknown element in the EziDebug file!"; return 1 ; } ichild = ichild.nextSibling(); } return 0 ; } //int EziDebugPrj::domParseReglistStructure(const QDomElement &element,char readflag, EziDebugScanChain *chain) //{ // /*子节点数目是否为零*/ // if(!(element.childNodes().count())) // { // qDebug() << "domParseReglistStructure Error:There is no fileinfo!"; // return 1 ; // } // QDomNode ichild = element.firstChild(); // /*扫描子节点 ,是否存在下一个子节点*/ // while (!ichild.isNull()) // { // if(ichild.toElement().tagName() == "regchain") // { // if(ichild.toElement().attribute("reglist").isEmpty()) // { // return 1 ; // } // if(readflag&READ_CHAIN_INFO) // { // if(chain) // { // QStringList ireglist = ichild.toElement().attribute("reglist").split("|") ; // QList<EziDebugScanChain::RegListStructure*> itempRegList ; // for (int i = 0; i < ireglist.size(); i++) // { // QStringList isinglereglist = ireglist.at(i).split("%") ; // EziDebugScanChain::RegListStructure* preg = new EziDebugScanChain::RegListStructure ; // preg->m_pnamehiberarchy = (char*)malloc(isinglereglist.at(0).size()+1); // memcpy(preg->m_pnamehiberarchy,isinglereglist.at(0).toAscii().data(),isinglereglist.at(0).size()+1); // preg->m_pregName = (char*)malloc(isinglereglist.at(1).size()+1) ; // memcpy(preg->m_pregName,isinglereglist.at(1).toAscii().data(),isinglereglist.at(1).size()+1); // preg->m_pclock = (char*)malloc(isinglereglist.at(2).size()+1); // memcpy(preg->m_pclock,isinglereglist.at(2).toAscii().data(),isinglereglist.at(2).size()+1); // preg->m_nbitwidth = isinglereglist.at(3).toInt(); // preg->m_nstartbit = isinglereglist.at(4).toInt(); // preg->m_nendbit = isinglereglist.at(5).toInt(); // itempRegList.append(preg); // chain->m_iregChainStructure.append(itempRegList); // } // } // else // { // return 1 ; // } // } // } // else // { // qDebug() << "domParseReglistStructure Error : There is unknown element in the EziDebug file!"; // return 1 ; // } // ichild = ichild.nextSibling(); // } // return 0 ; //} int EziDebugPrj::domParseCodeDescriptionElement(const QDomElement &element,char readflag, EziDebugScanChain *chain) { if(!(element.childNodes().count())) { qDebug() << "domParseCodeDescriptionElement Error:There is no codedescription int ScanChain infomation!"; return 1 ; } QDomNode ichild = element.firstChild(); /*扫描子节点 ,是否存在下一个子节点*/ while (!ichild.isNull()) { if (ichild.toElement().tagName() == "added_code") { if(ichild.toElement().attribute("module_name").isEmpty()) { return 1 ; } if(ichild.toElement().attribute("user_line_code").isEmpty()) { return 1 ; } if(ichild.toElement().attribute("user_block_code").isEmpty()) { return 1 ; } if(readflag&READ_CHAIN_INFO) { if(chain) { chain->m_icodeMap.insert(ichild.toElement().attribute("module_name"),ichild.toElement().attribute("user_line_code").split("#")); if(ichild.toElement().attribute("user_block_code").toLower() != "no code") { chain->m_iblockCodeMap.insert(ichild.toElement().attribute("module_name"),ichild.toElement().attribute("user_block_code").split("#")); } } else { return 1 ; } } } else { qDebug() << "domParseCodeStructure Error : There is unknown element in the EziDebug file!"; return 1 ; } ichild = ichild.nextSibling(); } return 0 ; } //int EziDebugPrj::domParseCodeStructure(const QDomElement &element,char readflag ,EziDebugScanChain * chain) //{ // /*子节点数目是否为零*/ // if(!(element.childNodes().count())) // { // qDebug() << "domParseScanChainStructure Error:There is no fileinfo!"; // return 1 ; // } // QDomNode ichild = element.firstChild(); // /*扫描子节点 ,是否存在下一个子节点*/ // while (!ichild.isNull()) // { // if (ichild.toElement().tagName() == "added_code") // { // if(ichild.toElement().attribute("module_name").isEmpty()) // { // return 1 ; // } // if(ichild.toElement().attribute("user_code").isEmpty()) // { // return 1 ; // } // if(ichild.toElement().attribute("user_core_code").isEmpty()) // { // return 1 ; // } // if(readflag&READ_CHAIN_INFO) // { // if(chain) // { // chain->m_icodeMap.insert(ichild.toElement().attribute("module_name"),ichild.toElement().attribute("user_code").split("#")); // chain->m_iuserDefineCoreMap.insert(ichild.toElement().attribute("module_name"),ichild.toElement().attribute("user_core_code")); // } // else // { // return 1 ; // } // } // } // else // { // qDebug() << "domParseCodeStructure Error : There is unknown element in the EziDebug file!"; // return 1 ; // } // ichild = ichild.nextSibling(); // } // return 0 ; //} // 读取log文件中的 有关文件的信息 int EziDebugPrj::readFileInfo(char readflag) { // 过程中只能遇到三种类型的 xml 标签 bool isFileInfoExist = 0 ; /*读取下一个有效的开始 标签*/ m_ireader.readNext(); while(!m_ireader.atEnd()) { if(m_ireader.isStartElement()) { if(m_ireader.name() == "FILE_INFO") { /*do nothing! 继续读取 文件信息*/ isFileInfoExist = 1 ; if(readFileStructure(readflag)) return 1 ; m_ireader.readNext(); } else { qDebug() << "the log file is not complete!"; return 1 ; } } else if(m_ireader.isCharacters()) { QRegExp icomExp("\\s+"); if(icomExp.exactMatch(m_ireader.text().toString())) { m_ireader.readNext(); } else { qDebug() << "the log file's format is not right!"; return 1 ; } } else if(m_ireader.isEndElement()) { if(m_ireader.name()== "FILE_INFO") { /*存在 FILE_INFO 标签*/ if(isFileInfoExist) { return 0 ; } else { /*不存在 FILE_INFO 开始标签*/ qDebug() << "There is not label \"FILE_INFO\"'s StartElement !" ; return 1 ; } } else { qDebug() << "readFileInfo: The log file is not complete!" ; return 1 ; } } else { qDebug() << "readFileInfo: the log file format is not right!"; return 1 ; } } return 0 ; } int EziDebugPrj::readFileStructure(char readflag) { // 过程中只能遇到三种类型的 xml 标签 QString ifileName ; QDateTime idateTime ; QDate idate ; QTime itime ; QStringList imoduleList ; bool isFileStructureInfoExist = 0 ; int nfileStructureInfoCount = 0 ; /*读取下一个有效的开始 标签*/ m_ireader.readNext(); while(!m_ireader.atEnd()) { if(m_ireader.isStartElement()) { if(m_ireader.name() == "file") { isFileStructureInfoExist = 1 ; nfileStructureInfoCount++ ; if(m_ireader.attributes().value("filename").isEmpty()) { return 1 ; } if(m_ireader.attributes().value("modify_date").isEmpty()) { return 1 ; } if(m_ireader.attributes().value("modify_time").isEmpty()) { return 1 ; } if(m_ireader.attributes().value("module_array").isEmpty()) { return 1 ; } ifileName = m_ireader.attributes().value("filename").toString(); imoduleList = m_ireader.attributes().value("filename").toString().split(QRegExp("\\s+")); QStringList idateList = m_ireader.attributes().value("modify_date").toString().split("/") ; QStringList itimeList = m_ireader.attributes().value("modify_time").toString().split(":") ; idate = QDate(idateList.at(2).toInt(),idateList.at(0).toInt(),idateList.at(1).toInt()) ; itime = QTime(itimeList.at(0).toInt(),itimeList.at(1).toInt(),itimeList.at(2).toInt()) ; idateTime = QDateTime(idate,itime) ; if((ifileName.endsWith(".v",Qt::CaseSensitive))&&(readflag|READ_FILE_INFO)) { /*创建文件对象指针 并加入工程对象的文件map中*/ EziDebugVlgFile * pvlgFileObj = new EziDebugVlgFile(ifileName,idateTime,imoduleList); m_ivlgFileMap.insert(ifileName,pvlgFileObj); m_ireader.readNext() ; } else if((ifileName.endsWith(".vhd",Qt::CaseSensitive))&&(readflag|READ_FILE_INFO)) { /*创建文件对象指针 并加入工程对象的文件map中*/ EziDebugVhdlFile * pvlgFileObj = new EziDebugVhdlFile(ifileName,idateTime,imoduleList); m_ivhdlFileMap.insert(ifileName,pvlgFileObj); m_ireader.readNext() ; } else { qDebug() << "The log file format is not right(the source code file type is not right)!"; return 1 ; } } else { qDebug() << "the log file is not complete!"; return 1 ; } } else if(m_ireader.isEndElement()) { if(m_ireader.name() == "file") { if(1 == isFileStructureInfoExist) { m_ireader.readNext(); isFileStructureInfoExist = 0 ; } else { qDebug() << "The Label File Has No endElement!" ; return 1 ; } } else if(m_ireader.name() == "FILE_INFO") { if(!nfileStructureInfoCount) { qDebug() << "there is not file info exist!" ; return 1 ; } else { return 0 ; } } else { qDebug() << "end element is not completed"; return 1 ; } } else if(m_ireader.isCharacters()) { QRegExp icomExp("\\s+"); if(icomExp.exactMatch(m_ireader.text().toString())) { m_ireader.readNext(); } else { qDebug() << "the log file's format is not right!"; return 1 ; } } else { qDebug() << "the log file is not right!"; return 1 ; } } return 0 ; } int EziDebugPrj::readModuleInfo(char readflag) { // 过程中只能遇到三种类型的 xml 标签 bool isModuleInfoExist = 0 ; /*读取下一个有效的开始 标签*/ m_ireader.readNext(); while(!m_ireader.atEnd()) { if(m_ireader.isStartElement()) { if(m_ireader.name() == "MODULE_INFO") { /*继续读取 文件信息*/ isModuleInfoExist = 1 ; /*读取topmodule信息*/ if(m_ireader.attributes().value("topmodule").isEmpty()) { qDebug()<< "readModuleInfo: There is no top Module in the log file! "; return 1 ; } else { // 从默认路径下恢复 数据结构时 需要topmodule ,正常流程下 topmodule 会一致么 ? if(m_ireader.attributes().value("topmodule").toString() != m_itopModule) { //重新设置topmodule qDebug()<< "readModuleInfo: The topmodule in log file is not agree with QSF file"; return 1 ; } } if(readModuleStructure(readflag)) return 1 ; m_ireader.readNext(); } else { qDebug() << "the log file is not complete!"; return 1 ; } } else if(m_ireader.isCharacters()) { QRegExp icomExp("\\s+"); if(icomExp.exactMatch(m_ireader.text().toString())) { m_ireader.readNext(); } else { qDebug() << "the log file's format is not right!"; return 1 ; } } else if(m_ireader.isEndElement()) { if(m_ireader.name()== "MODULE_INFO") { /*存在 MODULE_INFO 标签*/ if(isModuleInfoExist) { return 0 ; } else { /*不存在 MODULE_INFO 开始标签*/ qDebug() << "The Label \"MODULE_INFO\" Has no StartElement !" ; return 1 ; } } else { qDebug() << "readModuleInfo: The log file is not complete!" ; return 1 ; } } else { qDebug() << "readModuleInfo: the log file format is not right!"; return 1 ; } } return 0 ; } int EziDebugPrj::readModuleStructure(char readflag) { // 过程中只能遇到三种类型的 xml 标签 QString imoduleName ; // QStringList iclockNameList ; // EziDebugModule::RegStructure* preg ; // EziDebugModule::PortStructure *pport ; EziDebugModule * pmoduleObj = NULL ; bool isModuleStructureInfoExist = 0 ; int nModuleStructureInfoCount = 0 ; /*读取下一个有效的开始 标签*/ m_ireader.readNext(); while(!m_ireader.atEnd()) { if(m_ireader.isStartElement()) { if(m_ireader.name() == "module") { isModuleStructureInfoExist = 1 ; nModuleStructureInfoCount++ ; if(m_ireader.attributes().value("name").isEmpty()) { return 1 ; } /* if(m_ireader.attributes().value("appearance_count").isEmpty()) { return 1 ; } */ if(m_ireader.attributes().value("lib_core").isEmpty()) { return 1 ; } if(m_ireader.attributes().value("file_name").isEmpty()) { return 1 ; } if(m_ireader.attributes().value("array_name").isEmpty()) { return 1 ; } if(readflag & READ_MODULE_INFO) { /*创建module对象指针 并加入工程对象的module map中*/ imoduleName = m_ireader.attributes().value("name").toString(); EziDebugModule *ptempModuleObj = new EziDebugModule(imoduleName); if(!ptempModuleObj) return 1 ; pmoduleObj = ptempModuleObj ; m_imoduleMap.insert(imoduleName,ptempModuleObj); ptempModuleObj->m_imoduleName = m_ireader.attributes().value("name").toString(); //ptempModuleObj->m_ninstanceTimes = static_cast<bool>(m_ireader.attributes().value("appearance_count").toString().toInt()) ; ptempModuleObj->m_isLibaryCore = (m_ireader.attributes().value("lib_core").toString().toLower() == "yes") ; ptempModuleObj->m_ilocatedFile = m_ireader.attributes().value("file_name").toString() ; ptempModuleObj->m_iinstanceNameList = m_ireader.attributes().value("file_name").toString().split("|"); } if(!readClockDescription(readflag , pmoduleObj)) { if(!readRegDescription(readflag , pmoduleObj)) { if(!readPortDescription(readflag , pmoduleObj)) { m_ireader.readNext(); } else { if(pmoduleObj) { delete pmoduleObj ; pmoduleObj = NULL ; qDebug() << "after readPortDescription ,There is no memory left !"; return 1 ; } } } else { if(pmoduleObj) { delete pmoduleObj ; pmoduleObj = NULL ; qDebug() << "after readRegDescription ,There is no memory left !"; return 1 ; } } } else { if(pmoduleObj) { delete pmoduleObj ; pmoduleObj = NULL ; qDebug() << "after readClockDescription ,There is no memory left !"; return 1 ; } } } else { qDebug() << "readModuleStructure:The Label module is not complete!"; return 1 ; } } else if(m_ireader.isEndElement()) { if(m_ireader.name() == "module") { if(1 == isModuleStructureInfoExist) { m_ireader.readNext(); isModuleStructureInfoExist = 0 ; } else { qDebug() << "readModuleStructure:The Label File Has No endElement!" ; return 1 ; } } else if(m_ireader.name() == "FILE_INFO") { if(!isModuleStructureInfoExist) { qDebug() << "readModuleStructure:there is not file info exist!" ; return 1 ; } else { return 0 ; } } else { qDebug() << "readModuleStructure:end element is not completed"; return 1 ; } } else if(m_ireader.isCharacters()) { QRegExp icomExp("\\s+"); if(icomExp.exactMatch(m_ireader.text().toString())) { m_ireader.readNext(); } else { qDebug() << "readModuleStructure:the log file's format is not right!"; return 1 ; } } else { qDebug() << "readModuleStructure:the log file is not right!"; return 1 ; } } return 0 ; } int EziDebugPrj::readClockDescription(char readflag, EziDebugModule* module) { bool isClockDescriptionMarkExist = 0 ; /*读取下一个有效的开始 标签*/ m_ireader.readNext(); while(!m_ireader.atEnd()) { if(m_ireader.isStartElement()) { if(m_ireader.name() == "clock_description") { isClockDescriptionMarkExist = 1 ; if(readClockStructure(readflag,module)) { qDebug() << "readClockDescription: ClockStructure has some problem!"; return 1 ; } } } else if(m_ireader.isEndElement()) { if(m_ireader.name() == "clock_description") { if(1 == isClockDescriptionMarkExist) { return 0 ; } else { qDebug() << "readClockDescription:The Label clock_description Has No StartElement!" ; return 1 ; } } else { qDebug() << "readClockDescription:The Label clock_description Has No EndElement!"; return 1 ; } } else if(m_ireader.isCharacters()) { QRegExp icomExp("\\s+"); if(icomExp.exactMatch(m_ireader.text().toString())) { m_ireader.readNext(); } else { qDebug() << "readClockDescription:the log file's format is not right!"; return 1 ; } } else { qDebug() << "readClockDescription:the log file is not right!"; return 1 ; } } return 0 ; } int EziDebugPrj::readClockStructure(char readflag, EziDebugModule* module) { // 过程中只能遇到三种类型的 xml 标签 bool isClockStructureInfoExist = 0 ; int nclockStructureInfoCount = 0 ; /*读取下一个有效的开始 标签*/ m_ireader.readNext(); while(!m_ireader.atEnd()) { if(m_ireader.isStartElement()) { if(m_ireader.name() == "clock") { isClockStructureInfoExist = 1 ; nclockStructureInfoCount++ ; if(m_ireader.attributes().value("clock_name").isEmpty()) { return 1 ; } if(m_ireader.attributes().value("polarity").isEmpty()) { return 1 ; } if(!(m_ireader.attributes().value("polarity").toString().toLower().compare("posedge")\ &m_ireader.attributes().value("polarity").toString().toLower().compare("negedge"))) { return 1 ; } if(readflag & READ_MODULE_INFO) { if(module) { QString iclockName = m_ireader.attributes().value("clock_name").toString(); module->m_iclockMap.insert(iclockName,m_ireader.attributes().value("polarity").toString()); } else { qDebug() << "readClockStructure: NULL Pointer!"; return 1 ; } } m_ireader.readNext(); } else { qDebug() << "the log file is not complete!"; return 1 ; } } else if(m_ireader.isEndElement()) { if(m_ireader.name() == "clock") { if(1 == isClockStructureInfoExist) { m_ireader.readNext(); isClockStructureInfoExist = 0 ; } else { qDebug() << "The Label clock Has No StartElement!" ; return 1 ; } } else if(m_ireader.name() == "clock_description") { if(!nclockStructureInfoCount) { qDebug() << "there is not clock structure info exist!" ; return 1 ; } else { return 0 ; } } else { qDebug() << "end element is not completed"; return 1 ; } } else if(m_ireader.isCharacters()) { QRegExp icomExp("\\s+"); if(icomExp.exactMatch(m_ireader.text().toString())) { m_ireader.readNext(); } else { qDebug() << "the log file's format is not right!"; return 1 ; } } else { qDebug() << "the log file is not right!"; return 1 ; } } return 0 ; } int EziDebugPrj::readRegDescription(char readflag , EziDebugModule* module) { bool isRegDescriptionMarkExist = 0 ; /*读取下一个有效的开始 标签*/ m_ireader.readNext(); while(!m_ireader.atEnd()) { if(m_ireader.isStartElement()) { if(m_ireader.name() == "reg_description") { isRegDescriptionMarkExist = 1 ; if(readRegStructure(readflag,module)) { qDebug() << "readRegDescription: readRegStructure has some problem!"; return 1 ; } } } else if(m_ireader.isEndElement()) { if(m_ireader.name() == "reg_description") { if(1 == isRegDescriptionMarkExist) { return 0 ; } else { qDebug() << "readRegDescription:The Label reg_description Has No StartElement!" ; return 1 ; } } else { qDebug() << "readRegDescription:The Label reg_description Has No EndElement!"; return 1 ; } } else if(m_ireader.isCharacters()) { QRegExp icomExp("\\s+"); if(icomExp.exactMatch(m_ireader.text().toString())) { m_ireader.readNext(); } else { qDebug() << "readClockDescription:the log file's format is not right!"; return 1 ; } } else { qDebug() << "readClockDescription:the log file is not right!"; return 1 ; } } return 0 ; } int EziDebugPrj::readRegStructure(char readflag , EziDebugModule* module) { // 过程中只能遇到三种类型的 xml 标签 bool isRegStructureInfoExist = 0 ; int nregStructureInfoCount = 0 ; /*读取下一个有效的开始 标签*/ m_ireader.readNext(); while(!m_ireader.atEnd()) { if(m_ireader.isStartElement()) { if(m_ireader.name() == "reg") { isRegStructureInfoExist = 1 ; nregStructureInfoCount++ ; if(m_ireader.attributes().value("module_name").isEmpty()) { return 1 ; } if(m_ireader.attributes().value("locate_clock").isEmpty()) { return 1 ; } if(m_ireader.attributes().value("reg_name").isEmpty()) { return 1 ; } if(m_ireader.attributes().value("bitwidth").isEmpty()) { return 1 ; } if(m_ireader.attributes().value("regnum").isEmpty()) { return 1 ; } if(m_ireader.attributes().value("endian").isEmpty()) { return 1 ; } if(!(m_ireader.attributes().value("endian").toString().toLower().compare("little")\ &m_ireader.attributes().value("endian").toString().toLower().compare("big"))) { return 1 ; } if(readflag & READ_MODULE_INFO) { if(module) { EziDebugModule::RegStructure * preg= new EziDebugModule::RegStructure ; // preg->m_isEndian = static_cast<bool>(m_ireader.attributes().value("endian").toString().toLower().compare("little")); memcpy(preg->m_pMouduleName,m_ireader.attributes().value("module_name").toString().toAscii().data(),sizeof(preg->m_pMouduleName)); memcpy(preg->m_pRegName,m_ireader.attributes().value("reg_name").toString().toAscii().data(),sizeof(preg->m_pRegName)); // preg->m_unBitWidth = m_ireader.attributes().value("bitwidth").toString().toInt(); preg->m_unRegNum = m_ireader.attributes().value("regnum").toString().toInt(); QString iclockName = m_ireader.attributes().value("locate_clock").toString(); QVector<EziDebugModule::RegStructure*> iregStructureVec = module->m_iregMap.value(iclockName) ; iregStructureVec.append(preg); module->m_iregMap.insert(iclockName,iregStructureVec); } else { qDebug() << "readRegStructure: NULL Pointer!"; return 1 ; } } m_ireader.readNext(); } else { qDebug() << "readRegStructure: the log file is not complete!(There is no reg)"; return 1 ; } } else if(m_ireader.isEndElement()) { if(m_ireader.name() == "reg") { if(1 == isRegStructureInfoExist) { m_ireader.readNext(); isRegStructureInfoExist = 0 ; } else { qDebug() << "The Label reg Has No StartElement!" ; return 1 ; } } else if(m_ireader.name() == "reg_description") { if(!nregStructureInfoCount) { qDebug() << "there is not reg structure info exist!" ; return 1 ; } else { return 0 ; } } else { qDebug() << "end element is not completed"; return 1 ; } } else if(m_ireader.isCharacters()) { QRegExp icomExp("\\s+"); if(icomExp.exactMatch(m_ireader.text().toString())) { m_ireader.readNext(); } else { qDebug() << "the log file's format is not right!"; return 1 ; } } else { qDebug() << "the log file is not right!"; return 1 ; } } return 0 ; } int EziDebugPrj::readPortDescription(char readflag , EziDebugModule* module) { bool isPortDescriptionMarkExist = 0 ; /*读取下一个有效的开始 标签*/ m_ireader.readNext(); while(!m_ireader.atEnd()) { if(m_ireader.isStartElement()) { if(m_ireader.name() == "port_description") { isPortDescriptionMarkExist = 1 ; if(readPortStructure(readflag,module)) { qDebug() << "readPortDescription: readPortStructure has some problem!"; return 1 ; } } } else if(m_ireader.isEndElement()) { if(m_ireader.name() == "port_description") { if(1 == isPortDescriptionMarkExist) { return 0 ; } else { qDebug() << "readPortDescription:The Label port_description Has No StartElement!" ; return 1 ; } } else { qDebug() << "readPortDescription:The Label port_description Has No EndElement!"; return 1 ; } } else if(m_ireader.isCharacters()) { QRegExp icomExp("\\s+"); if(icomExp.exactMatch(m_ireader.text().toString())) { m_ireader.readNext(); } else { qDebug() << "readPortDescription:the log file's format is not right!"; return 1 ; } } else { qDebug() << "readPortDescription:the log file is not right!"; return 1 ; } } return 0 ; } int EziDebugPrj::readPortStructure(char readflag , EziDebugModule* module) { // 过程中只能遇到三种类型的 xml 标签 bool isPortStructureInfoExist = 0 ; int nPortStructureInfoCount = 0 ; /*读取下一个有效的开始 标签*/ m_ireader.readNext(); while(!m_ireader.atEnd()) { if(m_ireader.isStartElement()) { if(m_ireader.name() == "reg") { isPortStructureInfoExist = 1 ; nPortStructureInfoCount++ ; if(m_ireader.attributes().value("port_name").isEmpty()) { return 1 ; } if(m_ireader.attributes().value("module_name").isEmpty()) { return 1 ; } if(m_ireader.attributes().value("direction_type").isEmpty()) { return 1 ; } if(m_ireader.attributes().value("bitwidth").isEmpty()) { return 1 ; } if(m_ireader.attributes().value("endian").isEmpty()) { return 1 ; } if(!(m_ireader.attributes().value("endian").toString().toLower().compare("little")\ &m_ireader.attributes().value("endian").toString().toLower().compare("big"))) { return 1 ; } if(!(m_ireader.attributes().value("direction_type").toString().toLower().compare("in")\ &m_ireader.attributes().value("direction_type").toString().toLower().compare("out"))) { return 1 ; } if(readflag & READ_MODULE_INFO) { if(module) { EziDebugModule::PortStructure * pport= new EziDebugModule::PortStructure ; // pport->m_isEndian = static_cast<bool>(m_ireader.attributes().value("endian").toString().toLower().compare("little")); //pport->m_pModuleName = m_ireader.attributes().value("module_name").toString().toAscii().data(); memcpy(pport->m_pModuleName,m_ireader.attributes().value("module_name").toString().toAscii().data(),m_ireader.attributes().value("module_name").size()+1); if(m_ireader.attributes().value("direction_type").toString().toLower() == "in") { pport->eDirectionType = EziDebugModule::directionTypeInput ; } else if(m_ireader.attributes().value("direction_type").toString().toLower() == "out") { pport->eDirectionType = EziDebugModule::directionTypeInput ; } else { delete pport ; return 1 ; } pport->m_unBitwidth = m_ireader.attributes().value("bitwidth").toString().toInt(); //pport->m_pPortName = m_ireader.attributes().value("regnum").toString().toAscii().data(); memcpy(pport->m_pPortName,m_ireader.attributes().value("regnum").toString().toAscii().data(),m_ireader.attributes().value("regnum").size()+1); if(pport) { module->m_iportVec.append(pport); } else { return 1 ; } } else { qDebug() << "readPortStructure: NULL Pointer!"; return 1 ; } } m_ireader.readNext(); } else { qDebug() << "readPortStructure: the log file is not complete!(There is no reg)"; return 1 ; } } else if(m_ireader.isEndElement()) { if(m_ireader.name() == "port") { if(1 == isPortStructureInfoExist) { m_ireader.readNext(); isPortStructureInfoExist = 0 ; } else { qDebug() << "The Label port Has No StartElement!" ; return 1 ; } } else if(m_ireader.name() == "port_description") { if(!nPortStructureInfoCount) { qDebug() << "there is not port structure info exist!" ; return 1 ; } else { return 0 ; } } else { qDebug() << "end element is not completed"; return 1 ; } } else if(m_ireader.isCharacters()) { QRegExp icomExp("\\s+"); if(icomExp.exactMatch(m_ireader.text().toString())) { m_ireader.readNext(); } else { qDebug() << "the log file's format is not right!"; return 1 ; } } else { qDebug() << "the log file is not right!"; return 1 ; } } return 0 ; } int EziDebugPrj::readScanChainInfo(char readflag) { // 过程中只能遇到三种类型的 xml 标签 QString ifileName ; QDateTime idateTime ; QDate idate ; QTime itime ; QStringList imoduleList ; bool isFileStructureInfoExist = 0 ; int nfileStructureInfoCount = 0 ; m_ireader.readNext(); /*读取下一个有效的开始 标签*/ while(!m_ireader.atEnd()) { if(m_ireader.isStartElement()) { if(m_ireader.name() == "file") { isFileStructureInfoExist = 1 ; nfileStructureInfoCount++ ; if(m_ireader.attributes().value("filename").isEmpty()) { return 1 ; } if(m_ireader.attributes().value("modify_date").isEmpty()) { return 1 ; } if(m_ireader.attributes().value("modify_time").isEmpty()) { return 1 ; } if(m_ireader.attributes().value("module_array").isEmpty()) { return 1 ; } ifileName = m_ireader.attributes().value("filename").toString(); imoduleList = m_ireader.attributes().value("filename").toString().split(QRegExp("\\s+")); QStringList idateList = m_ireader.attributes().value("modify_date").toString().split("/") ; QStringList itimeList = m_ireader.attributes().value("modify_time").toString().split(":") ; idate = QDate(idateList.at(2).toInt(),idateList.at(0).toInt(),idateList.at(1).toInt()) ; itime = QTime(itimeList.at(0).toInt(),itimeList.at(1).toInt(),itimeList.at(2).toInt()) ; idateTime = QDateTime(idate,itime) ; if((ifileName.endsWith(".v",Qt::CaseSensitive))&&(readflag|READ_FILE_INFO)) { /*创建文件对象指针 并加入工程对象的文件map中*/ EziDebugVlgFile * pvlgFileObj = new EziDebugVlgFile(ifileName,idateTime,imoduleList); m_ivlgFileMap.insert(ifileName,pvlgFileObj); continue ; } else if((ifileName.endsWith(".vhd",Qt::CaseSensitive))&&(readflag|READ_FILE_INFO)) { /*创建文件对象指针 并加入工程对象的文件map中*/ EziDebugVhdlFile * pvlgFileObj = new EziDebugVhdlFile(ifileName,idateTime,imoduleList); m_ivhdlFileMap.insert(ifileName,pvlgFileObj); continue ; } else { qDebug() << "The log file format is not right(the source code file type is not right)!"; return 1 ; } } else { qDebug() << "the log file is not complete!"; return 1 ; } } else if(m_ireader.isEndElement()) { if(m_ireader.name() == "file") { if(1 == isFileStructureInfoExist) { m_ireader.readNext(); isFileStructureInfoExist = 0 ; } else { qDebug() << "The Label File Has No endElement!" ; return 1 ; } } else if(m_ireader.name() == "FILE_INFO") { if(!nfileStructureInfoCount) { qDebug() << "there is not file info exist!" ; return 1 ; } else { return 0 ; } } else { qDebug() << "end element is not completed"; return 1 ; } } else if(m_ireader.isCharacters()) { QRegExp icomExp("\\s+"); if(icomExp.exactMatch(m_ireader.text().toString())) { m_ireader.readNext(); } else { qDebug() << "the log file's format is not right!"; return 1 ; } } else { qDebug() << "the log file is not right!"; return 1 ; } } return 0 ; } /*检测 log 文件 是否 OK */ int EziDebugPrj::detectLogFile(char nreadFlag) { QFile file(m_ilogFileName); #ifdef Parse_by_QXmlStreamReader bool isFileMarkExist = 0 ; #endif if (!file.open(QFile::ReadOnly | QFile::Text)) { qDebug() << "Error: Cannot read file " << qPrintable(m_ilogFileName) \ << ": " << qPrintable(file.errorString()) << __LINE__ << __FILE__; return 1 ; } #ifdef Parse_by_QDom QString ierrorStr; int nerrorLine; int nerrorColumn; QDomDocument idoc ; if (!idoc.setContent(&file, false, &ierrorStr, &nerrorLine, &nerrorColumn)) { qDebug() << "Error: Parse error at line " << nerrorLine << ", " << "column " << nerrorColumn << ": " << qPrintable(ierrorStr) ; return 1 ; } QDomElement irootElement = idoc.documentElement(); if (irootElement.tagName() != "EziDebug") { qDebug() << "detectLogFile Error: Not a EziDebug file" ; return 1 ; } if(domParseEziDebugElement(irootElement,nreadFlag)) { file.close(); return 1 ; } #endif #ifdef Parse_by_QXmlStreamReader m_ireader.setDevice(&file); m_ireader.readNext(); while (!m_ireader.atEnd()) { if (m_ireader.isStartElement()) { QStringRef ielement = m_ireader.name(); QString ielementString = ielement.toString(); if (ielementString == "EZIDEBUG") { isFileMarkExist = 1 ; if(readFileInfo(nreadFlag)) { qDebug() << "detectLogFile: encounter some problem in readFileInfo!"; file.close(); return 1 ; } else { if(readModuleInfo(nreadFlag)) { qDebug() << "detectLogFile: encounter some problem in readModuleInfo!"; file.close(); return 1 ; } else { m_ireader.readNext(); if(readScanChainInfo(nreadFlag)) { qDebug() << "detectLogFile: encounter some problem in readScanChainInfo!"; file.close(); return 1 ; } } } } else if(m_ireader.isEndElement()) { if(m_ireader.name() == "EZIDEBUG") { if(isFileMarkExist) { // return 0 ; // do nothing ! } else { qDebug() << "detectLogFile: \"EZIDEBUG\" has no StartElement "; file.close(); return 1 ; } } else { qDebug() << "detectLogFile: This Is Not a EziDebug File!"; file.close(); return 1 ; } } else { m_ireader.raiseError(QObject::tr("Not a EZIDEBUG file")); file.close(); return 1 ; } } else if(m_ireader.isCharacters()) { QRegExp icomExp("\\s+"); if(icomExp.exactMatch(m_ireader.text().toString())) { m_ireader.readNext(); } else { break ; } } else if(m_ireader.isStartDocument()) { m_ireader.readNext(); } else { qDebug() << "the saved logfile format is not right, needed to scan the whole prject again!" ; file.close(); return 1 ; } } #endif file.close(); return 0 ; } int EziDebugPrj::updatePrjAllFile(const QStringList& addfilelist,const QStringList& delfilelist,const QStringList& chgfilelist,QList<LOG_FILE_INFO*>& addinfolist , QList<LOG_FILE_INFO*> &deleteinfolist ,bool updateFlag) { int i = 0 ; QStringList ifileList ; ifileList = delfilelist ; /*获取删除的文件信息*/ /*找到相应的文件对象,删除有关的结构,然后释放对象指针*/ for(; i < ifileList.count(); i++) { eliminateFile(ifileList.at(i),deleteinfolist); preupdateProgressBar(updateFlag,(10+(i/ifileList.count())*10)); } ifileList.clear(); ifileList = addfilelist ; /*获取增加的文件信息*/ /*扫描新添加的文件、创建文件对象指针、加入相应的结构*/ for(i = 0 ; i < ifileList.count() ; i++) { preupdateProgressBar(updateFlag,(20+(i/ifileList.count())*15)); if(addFile(ifileList.at(i),partScanType,addinfolist)) { #if 0 QMessageBox::StandardButton rb = QMessageBox::question(NULL, tr("扫描文件错误"), tr("是否继续扫描?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); #else QMessageBox::StandardButton rb = QMessageBox::question(NULL, tr("EziDebug"), tr("Scan file Error , do you want to continue to scan file ?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); #endif if(rb == QMessageBox::Yes) { ++i; continue ; } else { return 1 ; } } } ifileList.clear(); ifileList = chgfilelist ; /*获取更改的文件信息*/ /*扫描被更改的文件、创建文件对象指针、加入相应的结构 */ for(i = 0 ; i < ifileList.count() ; i++) { QString irelativeFileName = ifileList.at(i); if(ifileList.at(i).endsWith(".v")) { EziDebugVlgFile* pfile = m_ivlgFileMap.value(ifileList.at(i)) ; preupdateProgressBar(updateFlag,(35+(i/ifileList.count())*15)); if(!pfile->scanFile(this,partScanType,addinfolist,deleteinfolist)) { // 文件被修改了 需要重新保存文件日期 LOG_FILE_INFO* pdelFileInfo = new LOG_FILE_INFO ; pdelFileInfo->etype = infoTypeFileInfo ; pdelFileInfo->pinfo = NULL ; memcpy(pdelFileInfo->ainfoName , irelativeFileName.toAscii().data() , irelativeFileName.size()+1); deleteinfolist.append(pdelFileInfo); struct LOG_FILE_INFO* paddFileInfo = new LOG_FILE_INFO ; paddFileInfo->etype = infoTypeFileInfo ; paddFileInfo->pinfo = pfile ; memcpy(paddFileInfo->ainfoName , irelativeFileName.toAscii().data(), irelativeFileName.size()+1); addinfolist.append(paddFileInfo); } else { // 如果出错 ,提示是否继续扫描 #if 0 QMessageBox::StandardButton rb = QMessageBox::question(NULL, tr("扫描文件错误"), tr("是否继续扫描?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); #else QMessageBox::StandardButton rb = QMessageBox::question(NULL, tr("EziDebug"), tr("Scan file Error , do you want to continue to scan file ?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); #endif if(rb == QMessageBox::Yes) { ++i; continue ; } else { return 1 ; } } } else if(ifileList.at(i).endsWith(".vhd")) { EziDebugVhdlFile* pfile = m_ivhdlFileMap.value(ifileList.at(i)) ; // if(!pfile->scanFile(currentPrj,EziDebugPrj::partScanType,iaddedinfoList,ideletedinfoList)) // { // } // else // { // // 如果出错 ,提示是否继续扫描 // } } else { } } return 0 ; } void EziDebugPrj::preupdateProgressBar(bool updateflag ,int value) { if(updateflag) { emit updateProgressBar(value); } } void EziDebugPrj::compareFileList(const QStringList& newfilelist,QStringList& addFileList,QStringList &delFileList,QStringList &chgFileList) { std::list<QString> ideletedFileList(m_iCodefileNameList.count()) ; std::list<QString> iidenticalFileList(m_iCodefileNameList.count()) ; std::list<QString> iaddedFileList(m_iCodefileNameList.count()) ; std::list<QString>::iterator ioutDelIterator = ideletedFileList.begin() ; std::list<QString>::iterator ioutIdenticalIterator = iidenticalFileList.begin() ; std::list<QString>::iterator ioutAddIterator = iaddedFileList.begin() ; //newfilelist.sort(); QStringList::const_iterator ifirstBeginIterator = newfilelist.begin() ; QStringList::const_iterator ifirstEndIterator = newfilelist.end() ; m_iCodefileNameList.sort(); QStringList::Iterator iSecondBeginIterator = m_iCodefileNameList.begin() ; QStringList::Iterator iSecondEndIterator = m_iCodefileNameList.end() ; // ifirstBeginIterator 最新文件列表 iSecondBeginIterator 旧的文件列表 std::set_difference(ifirstBeginIterator,ifirstEndIterator,iSecondBeginIterator,iSecondEndIterator,ioutDelIterator); addFileList = QList<QString>::fromStdList(ideletedFileList) ; addFileList = delFileList.filter(QRegExp(QObject::tr(".+"))) ; std::set_difference(iSecondBeginIterator,iSecondEndIterator,ifirstBeginIterator,ifirstEndIterator,ioutAddIterator); delFileList = QList<QString>::fromStdList(iaddedFileList); delFileList = addFileList.filter(QRegExp(QObject::tr(".+"))) ; std::set_intersection(ifirstBeginIterator,ifirstEndIterator,iSecondBeginIterator,iSecondEndIterator,ioutIdenticalIterator); ioutIdenticalIterator = iidenticalFileList.begin() ; while(ioutIdenticalIterator != iidenticalFileList.end()) { QFileInfo itempFileInfo(m_iprjPath,*ioutIdenticalIterator); QDateTime idateTime = itempFileInfo.lastModified() ; if((*ioutIdenticalIterator).endsWith(".v")) { QDateTime ilastDateTime = m_ivlgFileMap.value(*ioutIdenticalIterator)->getLastStoredTime(); if(idateTime.toString("dd.MM.yyyy hh:mm:ss") != ilastDateTime.toString("dd.MM.yyyy hh:mm:ss")) { qDebug() << idateTime << ilastDateTime ; chgFileList.append(*ioutIdenticalIterator); } } else if((*ioutIdenticalIterator).endsWith(".vhd")) { QDateTime ilastDateTime = m_ivhdlFileMap.value(*ioutIdenticalIterator)->getLastStoredTime(); if(idateTime != ilastDateTime) { chgFileList.append(*ioutIdenticalIterator); } } else { // do nothing } ++ioutIdenticalIterator ; } if(addFileList.count()&&delFileList.count()&&chgFileList.count()) { m_isUpdated = true ; } } int EziDebugPrj::domParseEziDebugElement(const QDomElement &element,char readflag) { QDomNode ichild = element.firstChild(); bool eeziDebugFileStructureExistFlag = 0 ; qDebug() << "Attention: Begin to detect the log file!"; while(!ichild.isNull()) { if(ichild.toElement().tagName() == "FILE_INFO") { eeziDebugFileStructureExistFlag |= EZIDEBUG_STRUCTURE_FILE ; if(domParseFileInfoElement(ichild.toElement(),readflag)) { qDebug() << "domParseEziDebugElement Error: function domParseFileInfoElement return wrong!" ; goto Error ; } } else if(ichild.toElement().tagName() == "MODULE_INFO") { eeziDebugFileStructureExistFlag |= EZIDEBUG_STRUCTURE_MODULE ; if(domParseModuleInfoElement(ichild.toElement(),readflag)) { qDebug() << "domParseEziDebugElement Error: function domParseModuleInfoElement return wrong!" ; goto Error ; } } else if(ichild.toElement().tagName() == "SCAN_CHAIN_INFO") { eeziDebugFileStructureExistFlag |= EZIDEBUG_STRUCTURE_SCAN_CHAIN ; if(domParseScanChainInfoElement(ichild.toElement(),readflag)) { qDebug() << "domParseEziDebugElement Error: function domParseScanChainInfoElement return wrong!" ; goto Error ; } } else { qDebug() << "domParseEziDebugElement Error: There is unknown element in the EziDebug File!" ; goto Error ; } ichild = ichild.nextSibling(); } if((eeziDebugFileStructureExistFlag&EZIDEBUG_STRUCTURE_ALL) == EZIDEBUG_STRUCTURE_ALL) { goto Error ; } return 0 ; Error: return 1 ; } const int &EziDebugPrj::getMaxRegNumPerChain(void) const { return m_nmaxRegNumInChain ; } int EziDebugPrj::setToolType(TOOL tool) { if(ToolOther <= tool) { //QMessageBox::warning(0,QObject::tr("设置工具类型"),QObject::tr("确认工具是否正确")); return 1 ; } m_eusedTool = tool ; return 0 ; } int EziDebugPrj::setMaxRegNumPerChain(int num) { /*需要 判断 个数是否在 范围中 */ m_nmaxRegNumInChain = num ; return 0 ; } void EziDebugPrj::setLogFileExistFlag(bool flag) { m_isLogFileExist = flag ; return ; } void EziDebugPrj::setXilinxErrCheckedFlag(bool flag) { m_isDisXilinxErrChecked = flag ; } void EziDebugPrj::setLogFileName(const QString& filename) { m_ilogFileName = filename ; return ; } void EziDebugPrj::setMaxRegWidth(int width) { if(m_imaxRegWidth < width) { m_imaxRegWidth = width ; } } void EziDebugPrj::setLogfileDestroyedFlag(bool flag) { m_isLogFileDestroyed = flag ; } bool EziDebugPrj::getLogfileDestroyedFlag(void) { return m_isLogFileDestroyed ; } int EziDebugPrj::parsePrjFile(QMap<QString,EziDebugVlgFile*> &vlgFileMap ,QMap<QString,EziDebugVhdlFile*> &vhdlFileMap) { m_iCodefileNameList.clear(); if(ToolQuartus == m_eusedTool) { if(parseQuartusPrjFile(vlgFileMap,vhdlFileMap)) { qDebug() << "Error:Parse Quartus PrjFile failed!" ; return 1 ; } } else if(ToolIse == m_eusedTool) { if(parseIsePrjFile(vlgFileMap,vhdlFileMap)) { qDebug() << "Error:Parse ISE PrjFile failed!" ; return 1 ; } } else { qDebug() << "EziDebug is not support this sortware project file parse!"; return 1 ; } // QMessageBox::information(0, QObject::tr("EziDebug解析文件"),QObject::tr("可以继续试验了")); return 0 ; } void EziDebugPrj::checkDelFile(QMap<QString,EziDebugVlgFile*> &vlgFileMap , QMap<QString,EziDebugVhdlFile*> &vhdlFileMap , QList<LOG_FILE_INFO*> &deleteinfolist) { QMap<QString,EziDebugVlgFile*>::const_iterator i = m_ivlgFileMap.constBegin(); while(i != m_ivlgFileMap.constEnd()) { QString ifileName = i.key() ; EziDebugVlgFile* pnewFile = vlgFileMap.value(ifileName,NULL); if(!pnewFile) { struct LOG_FILE_INFO* pdelFileInfo = new LOG_FILE_INFO ; pdelFileInfo->etype = infoTypeFileInfo ; pdelFileInfo->pinfo = NULL ; memcpy(pdelFileInfo->ainfoName , ifileName.toAscii().data() , ifileName.size()+1); deleteinfolist.append(pdelFileInfo); } ++i ; } QMap<QString,EziDebugVhdlFile*>::const_iterator j = m_ivhdlFileMap.constBegin() ; while(j != m_ivhdlFileMap.constEnd()) { QString ifileName = j.key() ; EziDebugVhdlFile* pnewFile = vhdlFileMap.value(ifileName,NULL); if(!pnewFile) { struct LOG_FILE_INFO* pdelFileInfo = new LOG_FILE_INFO ; pdelFileInfo->etype = infoTypeFileInfo ; pdelFileInfo->pinfo = NULL ; memcpy(pdelFileInfo->ainfoName , ifileName.toAscii().data() , ifileName.size()+1); deleteinfolist.append(pdelFileInfo); } ++j ; } } void EziDebugPrj::updateFileMap(const QMap<QString,EziDebugVlgFile*> &vlgFileMap ,const QMap<QString,EziDebugVhdlFile*> &vhdlFileMap) { EziDebugVlgFile* poldVlgFile = NULL ; EziDebugVhdlFile* poldVhdlFile = NULL ; EziDebugVlgFile* pnewVlgFile = NULL ; EziDebugVhdlFile* pnewVhdlFile = NULL ; QMap<QString,EziDebugVlgFile*>::const_iterator ivlgFileIter = m_ivlgFileMap.constBegin() ; QMap<QString,EziDebugVhdlFile*>::const_iterator ivhdlFileIter = m_ivhdlFileMap.constBegin() ; while(ivlgFileIter != m_ivlgFileMap.constEnd()) { poldVlgFile = ivlgFileIter.value() ; delete poldVlgFile ; poldVlgFile = NULL ; ++ivlgFileIter ; } m_ivlgFileMap.clear(); while(ivhdlFileIter != m_ivhdlFileMap.constEnd()) { poldVhdlFile = ivhdlFileIter.value() ; delete poldVhdlFile ; poldVhdlFile = NULL ; ++ivhdlFileIter ; } m_ivhdlFileMap.clear(); if(vlgFileMap.count()!= 0) { ivlgFileIter = vlgFileMap.constBegin(); while(ivlgFileIter != vlgFileMap.constEnd()) { pnewVlgFile = ivlgFileIter.value() ; m_ivlgFileMap.insert(ivlgFileIter.key() , pnewVlgFile); ++ivlgFileIter ; } } if(vhdlFileMap.count()!= 0) { ivhdlFileIter = vhdlFileMap.constBegin(); while(ivhdlFileIter != vhdlFileMap.constEnd()) { pnewVhdlFile = ivhdlFileIter.value() ; m_ivhdlFileMap.insert(ivhdlFileIter.key() , pnewVhdlFile); ++ivhdlFileIter ; } } } int EziDebugPrj::traverseAllCodeFile(EziDebugPrj::SCAN_TYPE type , const QMap<QString,EziDebugVlgFile*> &vlgFileMap ,const QMap<QString,EziDebugVhdlFile*> &vhdlFileMap ,QList<LOG_FILE_INFO*> &addedinfoList,QList<LOG_FILE_INFO*> &deletedinfoList) { //QList<LOG_FILE_INFO*> iaddedinfoList ; //QList<LOG_FILE_INFO*> ideletedinfoList ; QString irelativeFileName ; EziDebugVlgFile* poldVlgFile = NULL ; EziDebugVhdlFile* poldVhdlFile = NULL ; EziDebugVlgFile* pnewVlgFile = NULL ; EziDebugVhdlFile* pnewVhdlFile = NULL ; int nfileCount = 0 ; /*解析每个代码文件*/ qDebug() << QObject::tr("EziDebug::Begin traverAllCodeFile!"); /* 遍历 verilog 文件 获取 所有 module 信息*/ // 15 + (i/vlgFileMap.count())*45 if(vlgFileMap.count()!= 0) { QMap<QString,EziDebugVlgFile*>::const_iterator i = vlgFileMap.constBegin(); while(i != vlgFileMap.constEnd()) { pnewVlgFile = i.value() ; irelativeFileName = i.key() ; if(pnewVlgFile) { if(pnewVlgFile->scanFile(this,type,addedinfoList,deletedinfoList)) { qDebug() << "traverseAllCodeFile:scan file failed! FILE NAME" << i.key(); //dynamic_cast<QWidget*>(this->parent()) #if 0 QMessageBox::StandardButton rb = QMessageBox::question(NULL, tr("扫描文件错误"), tr("是否继续扫描?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); #else QMessageBox::StandardButton rb = QMessageBox::question(NULL, tr("EziDebug"), tr("Scan file Error , do you want to continue to scan file ?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); #endif if(rb == QMessageBox::Yes) { ++i; continue ; } else { return 1 ; } } else { // 已经存在 扫描文件 if((poldVlgFile = m_ivlgFileMap.value(i.key(),NULL))) { if((poldVlgFile->getLastStoredTime() != pnewVlgFile->getLastStoredTime())\ ||(poldVlgFile->getModuleList() == pnewVlgFile->getModuleList())) { struct LOG_FILE_INFO* pdelFileInfo = new LOG_FILE_INFO ; pdelFileInfo->etype = infoTypeFileInfo ; pdelFileInfo->pinfo = NULL ; memcpy(pdelFileInfo->ainfoName , irelativeFileName.toAscii().data() , irelativeFileName.size()+1); deletedinfoList.append(pdelFileInfo); // 新增文件 struct LOG_FILE_INFO* paddFileInfo = new LOG_FILE_INFO ; paddFileInfo->etype = infoTypeFileInfo ; paddFileInfo->pinfo = pnewVlgFile ; memcpy(paddFileInfo->ainfoName , irelativeFileName.toAscii().data(), irelativeFileName.size()+1); addedinfoList.append(paddFileInfo); } // m_ivlgFileMap.remove(i.key()); // delete poldVlgFile ; } else { // 新增文件 struct LOG_FILE_INFO* paddFileInfo = new LOG_FILE_INFO ; paddFileInfo->etype = infoTypeFileInfo ; paddFileInfo->pinfo = pnewVlgFile ; memcpy(paddFileInfo->ainfoName , irelativeFileName.toAscii().data() , irelativeFileName.size()+1); addedinfoList.append(paddFileInfo); } // m_ivlgFileMap.insert(i.key() , pnewVlgFile); ++i; emit updateProgressBar(15 + (nfileCount/vlgFileMap.count())*45); nfileCount++ ; continue ; } } else { qDebug() << "null fileobj pointer!"; } ++i; } } /* 遍历 vhdl 文件 获取 所有 module 信息*/ if(vhdlFileMap.count() != 0) { QMap<QString,EziDebugVhdlFile*>::const_iterator i = vhdlFileMap.constBegin(); while(i != vhdlFileMap.constEnd()) { if(i.value()) { //(i.value())->scanFile(); } else { qDebug() << "null fileobj pointer!"; return 1 ; } ++i; } } qDebug() << QObject::tr("EziDebug:: finish tranverse all code file!"); return 0 ; } int EziDebugPrj::resumeDataFromFile(void) { return 0 ; } int EziDebugPrj::generateTreeView(void) { QStringList imoduleList ; QString itopModuleName = m_itopModule + QObject::tr(":")+ m_itopModule ; if(!m_imoduleMap.contains(m_itopModule)) { qDebug() << "EziDebug Error: There is no Topmodule definition!"; return 1; } /*根据topmodule 构造树状显示结构的数据信息*/ // if (!m_imoduleMap.contains(m_itopModule)) // { // qDebug() << " there is not topModule!"; // return 1 ; // } EziDebugInstanceTreeItem* item = new EziDebugInstanceTreeItem(m_itopModule,m_itopModule); if(!item) { qDebug() << "Error:There is no memory left!"; return 1 ; } m_headItem = item ; //return (traverseModuleTree(itopModuleName,item)); return(traverseModuleTree(itopModuleName,item)) ; } int EziDebugPrj::traverseModuleTree(const QString &module,EziDebugInstanceTreeItem* item) { QString iparentItemModuleName = module.split(":").at(0); QString iparentItemInstanceName = module.split(":").at(1); QMap<QString,QString> iparentClockMap = m_imoduleMap.value(iparentItemModuleName)->getClockSignal(); QStringList iinstanceList ; QString ihierarchyName ; // QMap<QString,QString> iclockSignalMap = m_imoduleMap.value(pchildItem->getModuleName())->getClockSignal() ; QMap<QString,QString> ichildClockMap ; QMap<QString,QString>::const_iterator iclockIter = iparentClockMap .constBegin(); QMap<QString,QString> iparentResetMap = m_imoduleMap.value(iparentItemModuleName)->getResetSignal(); QMap<QString,QString> ichildResetMap ; // 创建本节点 然后再根据 子module 创建 子节点 EziDebugInstanceTreeItem* pparentItem = item ; if(!pparentItem) { qDebug() << "Error:There is no memory left!" ; return 1 ; } if(iparentItemModuleName == m_itopModule) { qDebug() << "This is topModule!" ; pparentItem->settItemHierarchyName(ihierarchyName); } else { ihierarchyName = pparentItem->parent()->getItemHierarchyName(); ihierarchyName = ihierarchyName ; ihierarchyName.append(QObject::tr("%1:%2|").arg(iparentItemModuleName).arg(iparentItemInstanceName)); pparentItem->settItemHierarchyName(ihierarchyName); // chainInfo 有值 、treeitem无值 if((m_ichainInfoMap.count())&&(!m_ichainTreeItemMap.count())) { QMap<QString,EziDebugScanChain*>::const_iterator i = m_ichainInfoMap.constBegin() ; while(i != m_ichainInfoMap.constEnd()) { EziDebugScanChain *pchain = i.value() ; if(pchain) { QString itopInstanceNode = pchain->getInstanceItemList().last(); if(itopInstanceNode == module) { pparentItem->setScanChainInfo(pchain); pchain->setHeadTreeItem(pparentItem); m_ibackupChainTreeItemMap.insert(pchain->getChainName(),pparentItem); m_iqueryTreeItemMap.insert(module,pparentItem); m_ichainInfoMap.remove(i.key()); break ; } } ++i ; } } } if(m_imoduleMap.contains(iparentItemModuleName)) { iinstanceList = (m_imoduleMap.value(iparentItemModuleName))->getInstanceList(); // 将所有的defparameter 记录到 module中方便 计算寄存器宽度 QMap<QString,QString> idefparameterMap = m_idefparameter.value(iparentItemInstanceName); QMap<QString,QString>::const_iterator iiterrator = idefparameterMap.constBegin() ; while(iiterrator != idefparameterMap.constEnd()) { m_imoduleMap.value(iparentItemModuleName)->addToDefParameterMap(iparentItemInstanceName,iiterrator.key(),iiterrator.value()); ++iiterrator ; } m_imoduleMap.value(iparentItemModuleName)->calInstanceRegData(this,iparentItemInstanceName); // 将寄存器宽度 所有的 宏全部替换 } else { qDebug() << "Error:module:" << iparentItemModuleName << "has no definition !" << "Can't finded in module map!" ; return 1 ; } if(!(iinstanceList.count())) { return 0 ; } else { for(int i = 0 ; i < iinstanceList.count();i++) { QString ichildItemCombinedName = iinstanceList.at(i) ; QString ichildItemModuleName = (ichildItemCombinedName.split(":")).at(0) ; // 每个子例化名 if(!m_imoduleMap.value(ichildItemModuleName,NULL)) { qDebug() << "Warnning:: module:" << ichildItemModuleName << "has no definition!"; continue ; } // 确定 子module 与 父module 之间的 clock 对应关系 QString ichildItemInstanceName = (ichildItemCombinedName.split(":")).at(1) ; EziDebugInstanceTreeItem * pchildItem = new EziDebugInstanceTreeItem(ichildItemInstanceName,ichildItemModuleName); if(!pchildItem) { qDebug() << "Error:There is not memory left !" ; return 1 ; } pparentItem->appendChild(pchildItem); pchildItem->setItemParent(pparentItem); if(m_imoduleMap.value(pchildItem->getModuleName())->isLibaryCore()) { // 专门为 libarycore 加入 层次名 QString ichildhierarchyName = pparentItem->getItemHierarchyName(); ichildhierarchyName.append(QObject::tr("%1:%2|").arg(ichildItemModuleName).arg(ichildItemInstanceName)); pchildItem->settItemHierarchyName(ichildhierarchyName); continue ; } // QString iparentClockName ; // 只针对单一时钟情况 遍历所有节点之前 确保父节点 有 存在 clock // QMap<QString,QString>::const_iterator iclockIter = iclockSignalMap.constBegin(); // int j = 0 ; // if(!iparentClockMap.count()) // { // /*检查 clock 是否 缺少*/ // /*根据子节点 的 port-map 和 子节点 的 clock 来找到 父节点 的 clock */ // QString icheckInstanceName = pchildItem->getInstanceName() ; // QString icheckModuleName = pchildItem->getModuleName() ; // if(!iclockSignalMap.count()) // { // qDebug() << "EziDebug Info: child module:"<< pchildItem->getModuleName() << "has no clock!"; // while(!iclockSignalMap.count()) // { // j++ ; // if(j >= iinstanceList.count()) // { // qDebug() << "EziDebug Error: The module:" << iparentItemModuleName << "'s child instance is ignoreg for no clock!" ; // return 0 ; // } // icheckInstanceName = iinstanceList.at(i+j).split(":").at(1) ; // icheckModuleName = iinstanceList.at(i+j).split(':').at(0) ; // iclockSignalMap = m_imoduleMap.value(icheckModuleName)->getClockSignal(); // } // } // else // { // //iparentClockName = ; // if(iclockSignalMap.count()>1) // { // qDebug() << "EziDebug Error: It is not Supported muticlock domain!"; // return 1 ; // } // iclockIter = iclockSignalMap.constBegin(); // while(iclockIter != iclockSignalMap.constEnd()) // { // iparentClockName = m_imoduleMap.value(pparentItem->getModuleName())->getInstancePortMap(pchildItem->getInstanceName()).value(iclockIter.key(),NULL); // if(iparentClockName.isEmpty()) // { // qDebug() << "EziDebug Error: clock wire is not correspond to the clock port!"; // return 1 ; // } // m_imoduleMap.value(pparentItem->getModuleName())->addToClockMap(iparentClockName); // ++iclockIter ; // } // } // if(iclockSignalMap.count()>1) // { // qDebug() << "EziDebug Error: It is not Supported muticlock domain!"; // return 1 ; // } // iclockIter = iclockSignalMap.constBegin(); // while(iclockIter != iclockSignalMap.constEnd()) // { // iparentClockName = m_imoduleMap.value(pparentItem->getModuleName())->getInstancePortMap(icheckInstanceName).value(iclockIter.key(),NULL); // if(iparentClockName.isEmpty()) // { // qDebug() << "EziDebug Error: clock wire is not correspond to the clock port!"; // return 1 ; // } // ++iclockIter ; // } // QString ichildClockName ; // QVector<EziDebugModule::PortStructure*> iportVec = m_imoduleMap.value(pchildItem->getModuleName())->getPort() ; // while(iclockIter != iclockSignalMap.constEnd()) // { // for(int j = 0 ; j < iportVec.count(); j++) // { // if(iclockIter.key() == QString::fromAscii(iportVec.at(j)->m_pPortName)) // { // ichildClockName = iclockIter.key() ; // QMap<QString,QString> iportMap = m_imoduleMap.value(pparentItem->getModuleName())->getInstancePortMap(pchildItem->getInstanceName()); // iparentClockName = iportMap.value(ichildClockName,QString()) ; // if(iparentClockName.isEmpty()) // { // qDebug() << "Error: The clock is not correspond!"; // return 1 ; // } // // 以后加上 检查 父节点端口 clock 和 例化端口 的 clock 是不是 一一对应的 // if(m_imoduleMap.value(pparentItem->getModuleName())->getClockSignal().value(iparentClockName,QString()).isEmpty()) // { // m_imoduleMap.value(pparentItem->getModuleName())->addToClockMap(iparentClockName); // } // } // } // ++iclockIter ; // } //iclockSignalMap.clear(); // 添加相应的 本module里面的 clock 和 子例化的 module clock 名字对应关系 // 以后要 获取 是否 存在 clock 的别名,用于 clock 的 连接 <端口clock,别名clock> // 在找对应关系时 端口clock 和 instance 的clock 不匹配 ,则尝试用别名匹配 QMap<QString,QMap<QString,QString> > iinstancePortMap = m_imoduleMap.value(iparentItemModuleName)->getInstancePortMap() ; QMap<QString,QString> ichildPortMap = iinstancePortMap.value(ichildItemInstanceName); //QMap<QString,QMap<QString,QString> >::const_iterator i = iinstancePortMap.constBegin() ; if(traverseModuleTree(ichildItemCombinedName,pchildItem)) { qDebug() << "EziDebug Error: The node" << ichildItemCombinedName << "Travere Error!"; pparentItem->removeChild(pchildItem); pchildItem->setItemParent(NULL); delete pchildItem ; return 1; } else { // 子节点的时钟 map , 将子节点的时钟 填充到 父节点 中 ,防止 父节点无时钟 ichildClockMap = m_imoduleMap.value(pchildItem->getModuleName())->getClockSignal() ; iclockIter = ichildClockMap.constBegin() ; while(iclockIter != ichildClockMap.constEnd()) { // 将所有子节点的时钟 加入 到 父节点的 时钟 map 中 // 应该 根据 iclockIter.key() 和 端口 列表 以及 端口对应关系 得到 父节点的时钟 // 目前不考虑 时钟名字 改变 即 子节点的时钟端口名与时钟名一致 QString iparentCLockName = ichildPortMap.value(iclockIter.key(),QString()) ; if(!iparentCLockName.isEmpty()) { m_imoduleMap.value(pparentItem->getModuleName())->addToClockMap(iparentCLockName); } ++iclockIter ; } // 子节点的时钟 map , 将子节点的时钟 填充到 父节点 中 ,防止 父节点无时钟 ichildResetMap = m_imoduleMap.value(pchildItem->getModuleName())->getResetSignal(); iclockIter = ichildResetMap.constBegin() ; while(iclockIter != ichildResetMap.constEnd()) { // 将所有子节点的时钟 加入 到 父节点的 时钟 map 中 // 应该 根据 iclockIter.key() 和 端口 列表 以及 端口对应关系 得到 父节点的时钟 // 目前不考虑 时钟名字 改变 即 子节点的时钟端口名与时钟名一致 QString iparentResetName = ichildPortMap.value(iclockIter.key(),QString()) ; QString iedge = iclockIter.value() ; if(!iparentResetName.isEmpty()) { m_imoduleMap.value(pparentItem->getModuleName())->addToResetSignalMap(iparentResetName,iedge); } ++iclockIter ; } //iclockSignalMap.clear(); //iclockSignalMap = m_imoduleMap.value(pparentItem->getModuleName())->getClockSignal() ; } } QMap<QString,QString> iclockMap ; iparentClockMap = m_imoduleMap.value(iparentItemModuleName)->getClockSignal(); iparentResetMap = m_imoduleMap.value(iparentItemModuleName)->getResetSignal(); // 遍历完所有节点之后 根据父节点 的 clock map 找到 填充 子节点 的 clock map // 填充 父节点的clock map for(int i = 0 ; i < pparentItem->childCount();i++) { iclockMap.clear(); QString ichildModuleName = pparentItem->child(i)->getModuleName() ; QString ichildInstanceName = pparentItem->child(i)->getInstanceName() ; QMap<QString,QString> ichildPortMap = m_imoduleMap.value(iparentItemModuleName)->getInstancePortMap(ichildInstanceName) ; iclockIter = iparentClockMap.constBegin() ; ichildClockMap = m_imoduleMap.value(ichildModuleName)->getClockSignal(); while(iclockIter != iparentClockMap.constEnd()) { QString ichildClockName = ichildPortMap.key(iclockIter.key()); if(!ichildClockName.isEmpty()) { QMap<QString,QMap<QString,QString> > iinstancesPortMap = m_imoduleMap.value(ichildModuleName)->getInstancePortMap(); QMap<QString,QMap<QString,QString> >::const_iterator iportMapIter = iinstancesPortMap.constBegin() ; while(iportMapIter != iinstancesPortMap.constEnd()) { QMap<QString,QString> iinstancePortMap = iportMapIter.value(); if(!(iinstancePortMap.key(ichildClockName,QString()).isEmpty())) { // 子节点用到了 这个 clock m_imoduleMap.value(ichildModuleName)->addToClockMap(ichildClockName) ; iclockMap.insert(iclockIter.key(),ichildClockName); } ++iportMapIter ; } //子节点 本身含有 这个clock if(!ichildClockMap.value(ichildClockName,QString()).isEmpty()) { iclockMap.insert(iclockIter.key(),ichildClockName); } } ++iclockIter ; } pparentItem->setModuleClockMap(ichildInstanceName,iclockMap); iclockIter = iparentResetMap.constBegin() ; while(iclockIter != iparentResetMap.constEnd()) { QString ichildResetSignalName = ichildPortMap.key(iclockIter.key()); QString iedge = iclockIter.value() ; if(!ichildResetSignalName.isEmpty()) { QMap<QString,QMap<QString,QString> > iinstancesPortMap = m_imoduleMap.value(ichildModuleName)->getInstancePortMap(); QMap<QString,QMap<QString,QString> >::const_iterator iportMapIter = iinstancesPortMap.constBegin() ; while(iportMapIter != iinstancesPortMap.constEnd()) { QMap<QString,QString> iinstancePortMap = iportMapIter.value(); if(!(iinstancePortMap.key(ichildResetSignalName,QString()).isEmpty())) { // 子节点用到了 这个 clock m_imoduleMap.value(ichildModuleName)->addToResetSignalMap(ichildResetSignalName,iedge); } ++iportMapIter ; } } ++iclockIter ; } } } return 0 ; } EziDebugInstanceTreeItem * EziDebugPrj::getInstanceTreeHeadItem(void) { return m_headItem ; } void EziDebugPrj::setInstanceTreeHeadItem(EziDebugInstanceTreeItem *item) { m_headItem = item ; return ; } void EziDebugPrj::updateOperation(OPERATE_TYPE type, EziDebugScanChain* chain,EziDebugInstanceTreeItem* item) { m_elastOperation = type ; m_pLastOperateChain = chain ; m_pLastOperteTreeItem = item ; if(OperateTypeNone == type) { m_ibackupChainInfoMap.clear(); m_ibackupChainTreeItemMap.clear(); m_ibackupQueryTreeItemMap.clear(); } return ; } int EziDebugPrj::changedLogFile(const QList<LOG_FILE_INFO*>& addlist, const QList<LOG_FILE_INFO*> &deletelist) { QFile file(m_ilogFileName); if(!file.open(QFile::ReadOnly | QFile::Text)) { qDebug() << "Error: Cannot read file " << qPrintable(m_ilogFileName) \ << ": " << qPrintable(file.errorString()) << __LINE__ << __FILE__; return 1 ; } QDomDocument idoc; QString ierrorStr; int nerrorLine; int nerrorColumn; if (!idoc.setContent(&file, false, &ierrorStr, &nerrorLine,&nerrorColumn)) { qDebug() << "Error: Parse error at line " << nerrorLine << ", " << "column " << nerrorColumn << ": " << qPrintable(ierrorStr) ; return 1 ; } qDebug() << "changedLogFile" << __FILE__ << __LINE__ << deletelist.count(); for(int i = 0 ; i < deletelist.count() ; i++) { LOG_FILE_INFO* pinfo = deletelist.at(i) ; if(deleteLogFileElement(idoc,pinfo)) { file.close(); return 1 ; } } for(int i = 0 ; i < addlist.count() ; i++) { LOG_FILE_INFO* pinfo = addlist.at(i) ; if(saveInfoToLogFile(idoc,pinfo)) { file.close(); qDebug() << "Error:save info!!!!" ; return 1 ; } qDebug() << "save info to log file " << i; } file.close(); if(!file.open(QFile::WriteOnly | QIODevice::Truncate | QFile::Text)) { qDebug() << "Error: Cannot write file " << qPrintable(m_ilogFileName) \ << ": " << qPrintable(file.errorString()); return 1 ; } QTextStream iout(&file); iout.setCodec("UTF-8"); idoc.save(iout,4,QDomNode::EncodingFromTextStream); file.close(); return 0 ; } int EziDebugPrj::createLogFile(void) { QString iuserDir = "No Dir"; QString itoutCore = "No Core" ; QString iscanRegCore = "No Core" ; QDomDocument idoc; QDomElement iroot = idoc.createElement("EziDebug"); idoc.appendChild(iroot); QDomElement ifileInfo = idoc.createElement("FILE_INFO"); iroot.appendChild(ifileInfo); QDomElement imoduleInfo = idoc.createElement("MODULE_INFO"); imoduleInfo.setAttribute("topmodule","No Module"); iroot.appendChild(imoduleInfo); if(EziDebugScanChain::getChainRegCore().toLower() != "no core") { iscanRegCore = EziDebugScanChain::getChainRegCore() ; } if(EziDebugScanChain::getChainToutCore().toLower() != "no core") { itoutCore = EziDebugScanChain::getChainToutCore() ; } if(EziDebugScanChain::getUserDir().toLower() != "no dir") { iuserDir = EziDebugScanChain::getUserDir() ; } QDomElement iscanChainInfo = idoc.createElement("SCAN_CHAIN_INFO"); iscanChainInfo.setAttribute("scanreg_core_name",iscanRegCore); iscanChainInfo.setAttribute("tout_core_name",itoutCore); iscanChainInfo.setAttribute("user_dir",iuserDir); iroot.appendChild(iscanChainInfo); QFile ifile(m_iprjPath.absoluteFilePath("config.ezi")); if (!ifile.open(QIODevice::WriteOnly | QIODevice::Truncate |QIODevice::Text)) { return 1 ; } QTextStream iout(&ifile); iout.setCodec("UTF-8"); idoc.save(iout,4,QDomNode::EncodingFromTextStream); m_ilogFileName = m_iprjPath.absoluteFilePath("config.ezi") ; ifile.close(); return 0 ; } int EziDebugPrj::updateCodeFile() { return 0 ; } int EziDebugPrj::saveInfoToLogFile(QDomDocument &idoc, LOG_FILE_INFO* loginfo) { //void *info , INFO_TYPE type INFO_TYPE type = loginfo->etype ; void *info = loginfo->pinfo ; if(!loginfo) { qDebug() << "NULL Pointer!" << __LINE__ << __FILE__ ; return 1 ; } if(!info) { qDebug() << "NULL Pointer!" << __LINE__ << __FILE__ ; return 1 ; } if(type == infoTypeFileInfo) { //qDebug() << "saveInfoToLogFile!" << __LINE__ << __FILE__ ; EziDebugFile * pfile = static_cast<EziDebugFile*>(info); if(pfile->fileName().endsWith(".v")) { EziDebugVlgFile *pvlgFile = static_cast<EziDebugVlgFile*>(info); QDomElement ielement = idoc.elementsByTagName("FILE_INFO").at(0).toElement() ; QDomElement ifileElement = idoc.createElement("file") ; QStringList imoduleList = pvlgFile->getModuleList() ; QString imodule_array = imoduleList.join(","); ifileElement.setAttribute("file_name",m_iprjPath.relativeFilePath(pvlgFile->fileName())); ifileElement.setAttribute("module_array",imodule_array); QDateTime idateTime = pvlgFile->getLastStoredTime() ; QDate imodifiedDate = idateTime.date(); QTime imodifiedTime = idateTime.time(); if(imodifiedDate.isNull()||imodifiedTime.isNull()) { qDebug() << "EziDebug Error: !!!!! save date and time error !!!!"; } ifileElement.setAttribute("modified_date",imodifiedDate.toString("MM/dd/yyyy")); ifileElement.setAttribute("modified_time",imodifiedTime.toString("hh:mm:ss")); // macro QStringList imacroStrList ; QMap<QString,QString>::const_iterator imacroIter = pvlgFile->m_imacro.constBegin() ; while(imacroIter != pvlgFile->m_imacro.constEnd()) { QString imacroStr = imacroIter.key() ; QString imacroVal = imacroIter.value() ; imacroStrList.append(imacroStr + tr("::") + imacroVal) ; ++imacroIter ; } if(imacroStrList.count()) { ifileElement.setAttribute("macro",imacroStrList.join("$$")); } else { ifileElement.setAttribute("macro" , "No Macro"); } // defparameter QStringList idefParamList ; QMap<QString,QMap<QString,QString> >::const_iterator idefParaIter = pvlgFile->m_idefparameter.constBegin() ; while(idefParaIter != pvlgFile->m_idefparameter.constEnd()) { QString iinstanceName = idefParaIter.key() ; QMap<QString,QString> iparameterMap = idefParaIter.value() ; QMap<QString,QString>::const_iterator iparameterIter = iparameterMap.constBegin() ; while(iparameterIter != iparameterMap.constEnd()) { QString iparameterStr = iparameterIter.key() ; QString iparameterVal = iparameterIter.value() ; idefParamList.append(iinstanceName + tr(".") + iparameterStr + tr("::") + iparameterVal); ++iparameterIter ; } ++idefParaIter ; } if(idefParamList.count()) { ifileElement.setAttribute("defparameter",idefParamList.join("$$")); } else { ifileElement.setAttribute("defparameter", "No Defparam"); } ielement.appendChild(ifileElement); } } else if(type == infoTypeModuleStructure) { //qDebug() << "saveInfoToLogFile!" << __LINE__ << __FILE__ ; EziDebugModule *pmodule = static_cast<EziDebugModule*>(info); QDomElement imoduleInfoElement = idoc.elementsByTagName("MODULE_INFO").at(0).toElement() ; if(imoduleInfoElement.attribute("topmodule").toLower() == "no module") { imoduleInfoElement.setAttribute("topmodule",m_itopModule); } //qDebug() << "saveInfoToLogFile!" << __LINE__ << __FILE__ ; QDomElement imoduleElement = idoc.createElement("module") ; imoduleElement.setAttribute("module_name",pmodule->m_imoduleName); //imoduleElement.setAttribute("appearance_count",QString::number(pmodule->m_ninstanceTimes)); imoduleElement.setAttribute("lib_core",pmodule->m_isLibaryCore); imoduleElement.setAttribute("file_name",pmodule->m_ilocatedFile); if(!pmodule->m_iinstanceNameList.size()) { imoduleElement.setAttribute("instance_array","No Instance"); } else { imoduleElement.setAttribute("instance_array",pmodule->m_iinstanceNameList.join("|")); } //qDebug() << "saveInfoToLogFile!" << __LINE__ << __FILE__ ; QStringList iresetList ; QMap<QString,QString>::const_iterator i = pmodule->m_iresetMap.constBegin(); while (i != pmodule->m_iresetMap.constEnd()) { iresetList.append(i.key()+ QObject::tr(":") + i.value()); ++i; } if(iresetList.size()) { imoduleElement.setAttribute("reset_signal",iresetList.join("|")); } else { imoduleElement.setAttribute("reset_signal","No Reset Signal"); } // 插入parameter 参数 QStringList ipraramList ; QMap<QString,QString>::const_iterator iparamIter = pmodule->m_iparameter.constBegin() ; while(iparamIter != pmodule->m_iparameter.constEnd()) { QString iparamStr = iparamIter.key() ; QString iparamVal = iparamIter.value() ; ipraramList.append(iparamStr + tr("::") + iparamVal); ++iparamIter ; } if(ipraramList.count()) { imoduleElement.setAttribute("parameter",ipraramList.join("$$")); } else { imoduleElement.setAttribute("parameter","No Parameter"); } QDomElement iclockDescriptionElement = idoc.createElement("clock_description") ; QMap<QString,QString>::const_iterator j = pmodule->m_iclockMap.constBegin(); while (j != pmodule->m_iclockMap.constEnd()) { QDomElement iclock = idoc.createElement("clock") ; iclock.setAttribute("clock_name",j.key()); iclock.setAttribute("polarity",j.value()); iclockDescriptionElement.appendChild(iclock); ++j ; } imoduleElement.appendChild(iclockDescriptionElement) ; //qDebug() << "saveInfoToLogFile!" << __LINE__ << __FILE__ ; QDomElement iregDescriptionElement = idoc.createElement("reg_description") ; QMap<QString,QVector<EziDebugModule::RegStructure*> >::const_iterator k= pmodule->m_iregMap.constBegin(); while (k!= pmodule->m_iregMap.constEnd()) { for(int m = 0; m < k.value().size(); ++m) { QDomElement ireg = idoc.createElement("reg") ; EziDebugModule::RegStructure * preg = k.value().at(m) ; ireg.setAttribute("module_name",QString::fromLocal8Bit(preg->m_pMouduleName)); ireg.setAttribute("locate_clock",k.key()); ireg.setAttribute("reg_name",QString::fromLocal8Bit(preg->m_pRegName)); ireg.setAttribute("regnum",preg->m_pregNum); //ireg.setAttribute("endian",preg->m_isEndian); // 保存 位宽字符串 ireg.setAttribute("bitwidth",QString::fromAscii(preg->m_pExpString)); if(preg->m_eedge == EziDebugModule::signalPosEdge) { ireg.setAttribute("polarity","posedge"); } else if(preg->m_eedge == EziDebugModule::signalNegEdge) { ireg.setAttribute("polarity","negedge"); } else { ireg.setAttribute("polarity","noedge"); } iregDescriptionElement.appendChild(ireg); } ++k ; } imoduleElement.appendChild(iregDescriptionElement) ; //qDebug() << "saveInfoToLogFile!" << __LINE__ << __FILE__ ; QDomElement iportDescriptionElement = idoc.createElement("port_description") ; for(int n = 0 ; n < pmodule->m_iportVec.size();++n) { QDomElement iport = idoc.createElement("port") ; EziDebugModule::PortStructure *pport = pmodule->m_iportVec.at(n) ; iport.setAttribute("port_name",QString::fromLocal8Bit(pport->m_pPortName)); iport.setAttribute("module_name",QString::fromLocal8Bit(pport->m_pModuleName)); if(pport->eDirectionType == EziDebugModule::directionTypeInput) { iport.setAttribute("direction_type","in"); } else if(pport->eDirectionType == EziDebugModule::directionTypeOutput) { iport.setAttribute("direction_type","out"); } else { iport.setAttribute("direction_type","inout"); } iport.setAttribute("bitwidth",QString::fromAscii(pport->m_pBitWidth)); // iport.setAttribute("endian",(pport->m_isEndian ? "big" :"little")); iportDescriptionElement.appendChild(iport); } imoduleElement.appendChild(iportDescriptionElement); //qDebug() << "saveInfoToLogFile!" << __LINE__ << __FILE__ ; QStringList iportList ; QDomElement iinstancePortMapDescriptionElement = idoc.createElement("instance_port_map_description") ; QMap<QString,QMap<QString,QString> > iinstancePortMap = pmodule->getInstancePortMap() ; QMap<QString,QMap<QString,QString> >::const_iterator instanceportiterator = iinstancePortMap.constBegin(); while(instanceportiterator != iinstancePortMap.constEnd()) { iportList.clear(); QDomElement iinstance = idoc.createElement("instance") ; iinstance.setAttribute("instance_name",instanceportiterator.key()); QMap<QString,QString> iportMap = instanceportiterator.value() ; QMap<QString,QString>::const_iterator iportMapIterator = iportMap.constBegin(); while(iportMapIterator != iportMap.constEnd()) { iportList << iportMapIterator.key() + QObject::tr("@") + iportMapIterator.value(); ++iportMapIterator ; } iinstance.setAttribute("port_map",iportList.join("#")); iinstancePortMapDescriptionElement.appendChild(iinstance); ++instanceportiterator ; } imoduleElement.appendChild(iinstancePortMapDescriptionElement); imoduleInfoElement.appendChild(imoduleElement); } else if(type == infoTypeScanChainStructure) { EziDebugScanChain * pchain = static_cast<EziDebugScanChain*>(info); QDomElement ielement = idoc.elementsByTagName("SCAN_CHAIN_INFO").at(0).toElement() ; // 重新创建log文件时, 保证信息不为空 if(ielement.attribute("scanreg_core_name").toLower() == "no core") { QString iregCore = EziDebugScanChain::getChainRegCore().toLower() ; if(iregCore == "no core") { qDebug() << "EziDebug Error: there is no core info!"; } ielement.setAttribute("scanreg_core_name","_EziDebug_ScnReg"); } if(ielement.attribute("tout_core_name").toLower() == "no core") { QString itoutCore = EziDebugScanChain::getChainToutCore().toLower() ; if(itoutCore == "no core") { qDebug() << "EziDebug Error: there is no core info!"; } ielement.setAttribute("tout_core_name","_EziDebug_TOUT_m"); } if(ielement.attribute("user_dir").toLower().toLower() == "no dir") { ielement.setAttribute("user_dir","/EziDebug_1.0"); } QDomElement ichainElement = idoc.createElement("chain") ; ichainElement.setAttribute("chain_name",pchain->m_iChainName); ichainElement.setAttribute("instance_list",pchain->m_iinstanceItemList.join("|")); ichainElement.setAttribute("scaned_file_list",pchain->m_iscanedFileNameList.join("|")); if(pchain->m_isysCoreOutputPortList.count()) { ichainElement.setAttribute("system_output",pchain->m_isysCoreOutputPortList.join("@")); } else { ichainElement.setAttribute("system_output","No Sysoutput"); } QDomElement iregListDescriptionElement = idoc.createElement("reglist_description"); QMap<QString,QVector<QStringList> >::const_iterator iregChainIter = pchain->m_iregChainStructure.constBegin() ; while(iregChainIter != pchain->m_iregChainStructure.constEnd()) { QString iinsertClock = iregChainIter.key() ; QVector<QStringList> iregListVec = iregChainIter.value() ; for(int p = 0 ; p < iregListVec.size(); ++p) { QStringList iregList = iregListVec.at(p) ; QString iregString ; iregString = iregList.join("@"); QDomElement iregChainElement = idoc.createElement("regchain") ; iregChainElement.setAttribute("insertclock",iinsertClock); iregChainElement.setAttribute("regcount",pchain->m_nregCountMap.value(iinsertClock,0)); iregChainElement.setAttribute("reglist",iregString); iregListDescriptionElement.appendChild(iregChainElement); } ++iregChainIter ; } ichainElement.appendChild(iregListDescriptionElement); QDomElement icodeDescriptionElement = idoc.createElement("code_description") ; QMap<QString,QStringList>::const_iterator u = pchain->m_icodeMap.constBegin() ; while(u != pchain->m_icodeMap.constEnd()) { QStringList iblockCodeList = pchain->m_iblockCodeMap.value(u.key(),QStringList()) ; QDomElement icode = idoc.createElement("added_code"); icode.setAttribute("module_name",u.key()); icode.setAttribute("user_line_code",u.value().join("#")); icodeDescriptionElement.appendChild(icode); if(iblockCodeList.count()) { icode.setAttribute("user_block_code",iblockCodeList.join("#")); } else { icode.setAttribute("user_block_code","No Code"); } ++u ; } ichainElement.appendChild(icodeDescriptionElement); ielement.appendChild(ichainElement); } else { return 1 ; } return 0 ; } // 删除指定的 file、module、chain 元素 int EziDebugPrj::deleteLogFileElement(QDomDocument &idoc ,LOG_FILE_INFO* loginfo) { QString ielementName ; QString iattributionName ; if(!loginfo) { return 1 ; } QString iinfoName = QString::fromAscii(loginfo->ainfoName); INFO_TYPE etype = loginfo->etype ; QDomNode ielement ; if(etype == infoTypeFileInfo) { ielement = idoc.elementsByTagName("FILE_INFO").at(0); ielementName = "file" ; iattributionName = "file_name" ; } else if(etype == infoTypeModuleStructure) { ielement = idoc.elementsByTagName("MODULE_INFO").at(0); ielementName = "module" ; iattributionName = "module_name" ; } else if(etype == infoTypeScanChainStructure) { ielement = idoc.elementsByTagName("SCAN_CHAIN_INFO").at(0); ielementName = "chain" ; iattributionName = "chain_name" ; } else { qDebug() << "Error: The element type is not suppport now!"; return 1 ; } //ichild.toElement().attribute("module_name") QDomNode ichild = ielement.firstChild() ; while(!ichild.isNull()) { if((ichild.toElement().tagName() == ielementName )&&(ichild.toElement().attribute(iattributionName) == iinfoName)) { ielement.removeChild(ichild); return 0 ; } ichild = ichild.nextSibling() ; } qDebug() << "EziDebug Info: The element is not delete !" ; return 0 ; } void EziDebugPrj::addToChainMap(EziDebugScanChain* chain) { m_ichainInfoMap.insert(chain->getChainName(),chain); return ; } void EziDebugPrj::addToTreeItemMap(const QString &chain ,EziDebugInstanceTreeItem* item) { m_ichainTreeItemMap.insert(chain,item); return ; } void EziDebugPrj::addToQueryItemMap(const QString &name ,EziDebugInstanceTreeItem* item) { m_iqueryTreeItemMap.insert(name,item); return ; } // 将所有文件中的宏放入到 prj 中 方便后面读取 void EziDebugPrj::addToMacroMap(void) { // 目前只考虑 verilog 的宏 不清楚 vhdl 的宏或者其他参数等 m_imacro.clear(); QMap<QString,EziDebugVlgFile*>::const_iterator ifileIter = m_ivlgFileMap.constBegin() ; while(ifileIter != m_ivlgFileMap.constEnd()) { EziDebugVlgFile *pfile = ifileIter.value() ; QMap<QString,QString> imacroMap = pfile->getMacroMap(); QMap<QString,QString>::const_iterator imacroIter = imacroMap.constBegin() ; while(imacroIter != imacroMap.constEnd()) { QString imacroStr = imacroIter.key() ; QString imacroVal = imacroIter.value() ; m_imacro.insert(imacroStr,imacroVal); ++imacroIter ; } ++ifileIter ; } } const QMap<QString,QString> &EziDebugPrj::getMacroMap(void) const { return m_imacro ; } void EziDebugPrj::addToDefparameterMap(void) { m_idefparameter.clear(); QMap<QString,EziDebugVlgFile*>::const_iterator ifileIter = m_ivlgFileMap.constBegin() ; while(ifileIter != m_ivlgFileMap.constEnd()) { EziDebugVlgFile* pfile = ifileIter.value(); QMap<QString,QMap<QString,QString> > idefParamMap = pfile->getDefParamMap() ; QMap<QString,QMap<QString,QString> >::const_iterator idefParamIter = idefParamMap.constBegin() ; while(idefParamIter != idefParamMap.constEnd()) { QMap<QString,QString> iparamMap = idefParamIter.value() ; QString iinstanceName = idefParamIter.key() ; QMap<QString,QString>::const_iterator iparamIter = iparamMap.constBegin() ; while(iparamIter != iparamMap.constEnd()) { QString iparamStr = iparamIter.key() ; QString iparamVal = iparamIter.value() ; QMap<QString,QString> ivalueMap ; ivalueMap = m_idefparameter.value(iinstanceName,ivalueMap) ; ivalueMap.insert(iparamStr,iparamVal) ; m_idefparameter.insert(iinstanceName,ivalueMap) ; ++iparamIter ; } ++idefParamIter ; } ++ifileIter ; } } QMap<QString,QString> EziDebugPrj::getdefparam(const QString &instancename) { QMap<QString,QString> idefparamMap ; return m_idefparameter.value(instancename,idefparamMap) ; } EziDebugInstanceTreeItem* EziDebugPrj::getQueryItem(const QString &name) { return m_iqueryTreeItemMap.value(name,NULL); } void EziDebugPrj::updateTreeItem(EziDebugInstanceTreeItem* item) { EziDebugInstanceTreeItem* pitem = NULL ; // 获得 那些已经加入链的 头节点,用来给新的节点 赋值 if(m_elastOperation == OperateTypeDelAllScanChain) { pitem = m_ibackupQueryTreeItemMap.value(item->getNameData(),NULL); if(pitem) { item->setScanChainInfo(pitem->getScanChainInfo()) ; m_iqueryTreeItemMap.insert(item->getNameData(),item); m_ibackupChainTreeItemMap.insert(pitem->getScanChainInfo()->getChainName(),item); } } else { pitem = m_iqueryTreeItemMap.value(item->getNameData(),NULL); if(pitem) { item->setScanChainInfo(pitem->getScanChainInfo()) ; m_ibackupQueryTreeItemMap.insert(item->getNameData(),item); m_ichainTreeItemMap.insert(pitem->getScanChainInfo()->getChainName(),item); } // 添加链、或删除链 if(m_pLastOperteTreeItem) { if(m_pLastOperteTreeItem->getNameData() == item->getNameData()) { m_pLastOperteTreeItem = item ; } } } // m_ichainTreeItemMap.insert(pitem->getScanChainInfo()->getChainName(),item); // EziDebugScanChain* pchain = m_ichainInfoMap.value(pitem->getScanChainInfo()->getChainName(),NULL); // if(pchain) // { // pchain->setHeadTreeItem(item); // } // else // { // qDebug() << "NULL Pointer!" << __LINE__ << __FILE__ ; // } // 遍历所有子节点 for(int i = 0 ; i < item->childCount() ;i++) { updateTreeItem(item->child(i)); } } void EziDebugPrj::eliminateChainFromMap(const QString &chain) { m_ichainInfoMap.remove(chain); return ; } void EziDebugPrj::eliminateTreeItemFromMap(const QString &chain) { m_ichainTreeItemMap.remove(chain); return ; } void EziDebugPrj::eliminateTreeItemFromQueryMap(const QString &combinedname) { m_iqueryTreeItemMap.remove(combinedname); return ; } void EziDebugPrj::backupChainQueryTreeItemMap(void) { m_ibackupQueryTreeItemMap = m_iqueryTreeItemMap ; return ; } void EziDebugPrj::backupChainTreeItemMap(void) { m_ibackupChainTreeItemMap = m_ichainTreeItemMap ; return ; } void EziDebugPrj::cleanupBakChainTreeItemMap(void) { m_ibackupChainTreeItemMap.clear() ; return ; } void EziDebugPrj::cleanupChainTreeItemMap(void) { m_ichainTreeItemMap.clear(); return ; } void EziDebugPrj::cleanupChainQueryTreeItemMap(void) { m_iqueryTreeItemMap.clear(); return ; } void EziDebugPrj::cleanupBakChainQueryTreeItemMap(void) { m_ibackupQueryTreeItemMap.clear(); return ; } void EziDebugPrj::resumeChainTreeItemMap(void) { m_ichainTreeItemMap = m_ibackupChainTreeItemMap ; } void EziDebugPrj::resumeChainQueryTreeItemMap(void) { m_iqueryTreeItemMap = m_ibackupQueryTreeItemMap ; } void EziDebugPrj::backupChainMap(void) { m_ibackupChainInfoMap = m_ichainInfoMap ; } void EziDebugPrj::cleanupChainMap(void) { m_ichainInfoMap.clear(); } void EziDebugPrj::resumeChainMap(void) { m_ichainInfoMap = m_ibackupChainInfoMap ; return ; } int EziDebugPrj::createCfgFile(EziDebugInstanceTreeItem * item) { if(m_eusedTool == ToolQuartus) { if(m_itoolSoftwareVersion == "8.0") { /*创建 stp 文件 */ QString istpFileName("_EziDebug_stp.stp"); int istpCount = 0 ; while(m_iwaveFileList.contains(istpFileName)) { istpFileName = QObject::tr("_EziDebug_stp%1.stp").arg(istpCount); istpCount++ ; } QFileInfo istpFileInfo(m_iprjPath ,istpFileName); QFile istpFile(istpFileInfo.absoluteFilePath()); if(!istpFile.open(QIODevice::WriteOnly|QIODevice::Text)) { qDebug() << "Cannot Open file for reading:" << qPrintable(istpFile.errorString()); return 1 ; } QTextStream istpOutStream(&istpFile) ; /*判断软件版本*/ QString ifileContent ; // <session sof_file="" top_level_entity="tb_ifft_top"> QString ilabelSessionStart(QObject::tr("<session sof_file=\"\" top_level_entity=\"%1\">").arg(m_itopModule)); // <display_tree gui_logging_enabled="0"> QString ilabelDisplay_treeStart(QObject::tr("\n <display_tree gui_logging_enabled=\"0\">")); ifileContent.append(ilabelSessionStart); ifileContent.append(ilabelDisplay_treeStart); /* <display_branch instance="auto_signaltap_0" signal_set="USE_GLOBAL_TEMP" trigger="USE_GLOBAL_TEMP"/> <display_branch instance="auto_signaltap_1" signal_set="USE_GLOBAL_TEMP" trigger="USE_GLOBAL_TEMP"/> */ EziDebugModule *pmodule = this->getPrjModuleMap().value(item->getModuleName()); for(int i = 0 ; i < pmodule->getClockSignal().count() ;i++) { QString ilabelDisplay_branch(QObject::tr("\n <display_branch instance=\"auto_signaltap_%1\" signal_set=\"USE_GLOBAL_TEMP\" trigger=\"USE_GLOBAL_TEMP\"/>")\ .arg(i)) ; ifileContent.append(ilabelDisplay_branch); } // </display_tree> QString ilabelDisplay_treeEnd(QObject::tr("\n </display_tree>")) ; ifileContent.append(ilabelDisplay_treeEnd); /*创建 各个时钟 的 instance */ /* <instance entity_name="sld_signaltap" is_auto_node="yes" is_expanded="true" name="auto_signaltap_0" source_file="sld_signaltap.vhd"> <node_ip_info instance_id="0" mfg_id="110" node_id="0" version="6"/> <position_info> <single attribute="active tab" value="1"/> <single attribute="setup horizontal scroll position" value="0"/> <single attribute="setup vertical scroll position" value="0"/> </position_info> */ // QString ilabelInstanceStart(tr(""\ // "<instance entity_name=\"sld_signaltap\" is_auto_node=\"yes\" is_expanded=\"true\" name=\"auto_signaltap_0\" source_file=\"sld_signaltap.vhd\">")) ; // ifileContent.append(ilabelInstanceStart); QString iinstanceString = constructCfgInstanceString(item); if(iinstanceString.isEmpty()) { return 1 ; } ifileContent.append(iinstanceString); QString ilabelGlobal_infoStart(QObject::tr("\n <global_info>")); ifileContent.append(ilabelGlobal_infoStart); QString ilabelSingle1(QObject::tr("\n <single attribute=\"active instance\" value=\"0\"/>")); ifileContent.append(ilabelSingle1); QString ilabelSingle2(QObject::tr("\n <single attribute=\"lock mode\" value=\"36110\"/>")); ifileContent.append(ilabelSingle2); QString ilabelmulti1(QObject::tr("\n <multi attribute=\"column width\" size=\"18\" value=\"34,34,223,74,68,70,88,100,101,101,101,101,101,101,101,101,107,78\"/>")); ifileContent.append(ilabelmulti1); QString ilabelmulti2(QObject::tr("\n <multi attribute=\"window position\" size=\"9\" value=\"1440,799,398,124,356,50,124,0,0\"/>")); ifileContent.append(ilabelmulti2); QString ilabelGlobal_infoEnd(QObject::tr("\n </global_info>")); ifileContent.append(ilabelGlobal_infoEnd); QString ilabelSessionEnd(QObject::tr("\n</session>")); ifileContent.append(ilabelSessionEnd); istpOutStream << ifileContent ; istpFile.close(); QFile iprjFile(m_iprjName); if(!iprjFile.open(QIODevice::ReadOnly|QIODevice::Text)) { qDebug() << "Cannot Open file for reading:" << qPrintable(iprjFile.errorString()); return 1 ; } QTextStream iinStream(&iprjFile) ; QString ifileAllString = iinStream.readAll(); iprjFile.close(); int nlastPosOfVlgKeyWord = ifileAllString.lastIndexOf(QRegExp(QObject::tr("\\bVERILOG_FILE\\b"))); int nlastPosOfVhdlKeyWord = ifileAllString.lastIndexOf(QRegExp(QObject::tr("\\bVHDL_FILE\\b"))) ; if(nlastPosOfVlgKeyWord > nlastPosOfVhdlKeyWord) { int ienterPos = ifileAllString.indexOf('\n',nlastPosOfVlgKeyWord); ifileAllString.insert(ienterPos,QObject::tr("\n""set_global_assignment -name SIGNALTAP_FILE %1").arg(istpFileName)); } else { int ienterPos = ifileAllString.indexOf('\n',nlastPosOfVhdlKeyWord); ifileAllString.insert(ienterPos,QObject::tr("\n""set_global_assignment -name SIGNALTAP_FILE %1").arg(istpFileName)); } if(!iprjFile.open(QIODevice::WriteOnly|QIODevice::Text|QIODevice::Truncate)) { qDebug() << "Cannot Open file for reading:" << qPrintable(iprjFile.errorString()); return 1 ; } QTextStream iprjOutStream(&iprjFile) ; iprjOutStream << ifileAllString ; iprjFile.close(); } } else if(m_eusedTool == ToolIse) { QString iinstanceName = item->getInstanceName(); QString ifileContent(QObject::tr("#ChipScope Core Inserter Project File Version 3.0")) ; /*创建 cdc 文件 */ QString icdcFileName(QObject::tr("_EziDebug_%1.cdc").arg(iinstanceName)); QString ichainName(item->getScanChainInfo()->getChainName()) ; QString iilaStr ; int icdcCount = 0 ; while(m_iprjPath.exists(icdcFileName)) { icdcFileName = QObject::tr("_EziDebug_%1.cdc").arg(iinstanceName+QString::number(icdcCount)); icdcCount++ ; } QString iprjPath ; iprjPath.clear(); QString iinputFilePath = m_iprjPath.absolutePath(); QString isingleSep(QDir::separator()); QString idoubleSep ; if(isingleSep == "\\") { isingleSep = "\\"; idoubleSep = "\\\\" ; } else { isingleSep = "\\"; idoubleSep = "\\\\" ; } iinputFilePath = QDir::toNativeSeparators(iinputFilePath) ; iinputFilePath.replace(isingleSep ,idoubleSep ); QString icolon ; icolon.append(isingleSep + ":"); iinputFilePath.replace(":", icolon); iprjPath.append(iinputFilePath) ; iinputFilePath.append(tr("%1%2.ngc").arg(idoubleSep).arg(m_headItem->getModuleName())); QString ioutputDir = iprjPath.append(tr("%1_ngo").arg(idoubleSep)); QFileInfo icdcFileInfo(m_iprjPath ,icdcFileName); QFile icdcFile(icdcFileInfo.absoluteFilePath()); if(!icdcFile.open(QIODevice::WriteOnly|QIODevice::Text)) { qDebug() << "Cannot Open file for reading:" << icdcFile.errorString(); return 1 ; } QTextStream icdcOutStream(&icdcFile) ; QDate icurrentDate = QDate::currentDate() ; QTime icurrentTime = QTime::currentTime() ; //QString idateCom = QObject::tr("%1" "%2" "%3").arg(day[icurrentDate.dayOfWeek()]).arg(month[icurrentDate.month()]).arg(icurrentDate.daysInMonth()); // icurrentDate.toString("ddd MMM dd") QString itimeString(QObject::tr("\n""#%1 %2 %3 %4 CST %5")\ .arg(day[icurrentDate.dayOfWeek()]) \ .arg(month[icurrentDate.month()])\ .arg(icurrentDate.toString("dd"))\ .arg(icurrentTime.toString(QObject::tr("hh:mm:ss"))) .arg(icurrentDate.year())) ; /*工程 导入 的网表文件 和 导出的 网表文件 */ QString iinNetFile(QObject::tr("\n""Project.device.designInputFile=%1").arg(iinputFilePath)); QString ioutNetFile(QObject::tr("\n""Project.device.designOutputFile=%1").arg(iinputFilePath)); QString ideviceFamily(QObject::tr("\n""Project.device.deviceFamily=12")); QString idevice_enableRPMs(QObject::tr("\n""Project.device.enableRPMs=true")); QString idevice_outputDirectory(QObject::tr("\n""Project.device.outputDirectory=%1").arg(ioutputDir)); QString idevice_useSRL16(QObject::tr("\n""Project.device.useSRL16=true")); QString ifilter_dimension(QObject::tr("\n""Project.filter.dimension=1")); QString ifilter(QObject::tr("\n""Project.filter<0>=")); QString iicon_boundaryScanChain(QObject::tr("\n""Project.icon.boundaryScanChain=1")); QString iicon_disableBUFGInsertion(QObject::tr("\n""Project.icon.disableBUFGInsertion=false")); QString iicon_enableExtTriggerIn(QObject::tr("\n""Project.icon.enableExtTriggerIn=false")); QString iicon_enableExtTriggerOut(QObject::tr("\n""Project.icon.enableExtTriggerOut=false")); QString iicon_triggerInPinName(QObject::tr("\n""Project.icon.triggerInPinName=")); QString iicon_triggerOutPinName(QObject::tr("\n""Project.icon.triggerOutPinName=")); /* #ChipScope Core Inserter Project File Version 3.0 #Mon Sep 03 15:30:56 CST 2012 Project.device.designInputFile=E\:\\gy\\ise_test\\ise_test.ngc Project.device.designOutputFile=E\:\\gy\\ise_test\\ise_test.ngc Project.device.deviceFamily=12 Project.device.enableRPMs=true Project.device.outputDirectory=E\:\\gy\\ise_test\\_ngo Project.device.useSRL16=true Project.filter.dimension=1 Project.filter<0>= Project.icon.boundaryScanChain=1 Project.icon.disableBUFGInsertion=false Project.icon.enableExtTriggerIn=false Project.icon.enableExtTriggerOut=false Project.icon.triggerInPinName= Project.icon.triggerOutPinName= Project.unit.dimension=1 Project.unit<0>.clockChannel=clk_BUFGP Project.unit<0>.clockEdge=Rising Project.unit<0>.dataDepth=512 Project.unit<0>.dataEqualsTrigger=true Project.unit<0>.dataPortWidth=2 Project.unit<0>.enableGaps=false Project.unit<0>.enableStorageQualification=true Project.unit<0>.enableTimestamps=false Project.unit<0>.timestampDepth=0 Project.unit<0>.timestampWidth=0 Project.unit<0>.triggerChannel<0><0>=cnt1 Project.unit<0>.triggerChannel<0><1>=cnt2 Project.unit<0>.triggerConditionCountWidth=0 Project.unit<0>.triggerMatchCount<0>=1 Project.unit<0>.triggerMatchCountWidth<0><0>=0 Project.unit<0>.triggerMatchType<0><0>=0 Project.unit<0>.triggerPortCount=1 Project.unit<0>.triggerPortIsData<0>=true Project.unit<0>.triggerPortWidth<0>=2 Project.unit<0>.triggerSequencerLevels=16 Project.unit<0>.triggerSequencerType=1 Project.unit<0>.type=ilaprol */ // QMap<QString,QString> iclockMap = item->parent()->getModuleClockMap(item->getInstanceName()) ; QString iregHiberarchy = item->getItemHierarchyName(); QRegExp ireplaceRegExp(QObject::tr("\\b\\w*:")); QRegExp iregExp(QObject::tr("\\b%1:%2.*").arg(item->getModuleName()).arg(item->getInstanceName())); QString inewRegHiberarchy = iregHiberarchy.replace('|','/') ; inewRegHiberarchy = inewRegHiberarchy.replace(iregExp,"") ; // 剔出 modulexxx: 字符 inewRegHiberarchy.replace(ireplaceRegExp,""); int i = 0 ; int ntriggerNum = 0 ; QMap<QString,QString>::const_iterator iclockIterator = iclockMap.constBegin(); { int nregWidth = -1 ; ntriggerNum = 0 ; QString itriggerChannelString ; //Project.unit<0>.clockChannel=clk_BUFGP //Project.unit<0>.clockEdge=Rising // .arg(iclockIterator.key()) #if 0 QString iedgeString = this->getPrjModuleMap().value(item->getModuleName())->getClockSignal().value(iclockIterator.value()); if(iedgeString == "posedge") { iedgeString = QObject::tr("Rising"); } else { iedgeString = QObject::tr("Descending"); } #endif if((iclockIterator.key() == item->getScanChainInfo()->getscaningPortClock())||(iclockMap.count()==1)) { QString isuffixString ; QString itdoPortRegName(QObject::tr("_EziDebug_%1_%2_tdo_r").arg(item->getScanChainInfo()->getChainName()).arg(iclockIterator.value())); for(int m = (item->getScanChainInfo()->getChildChainNum(iclockIterator.key()) - 1) ; m >= 0 ; m--) { if(item->getScanChainInfo()->getChildChainNum(iclockIterator.key()) > 1) { isuffixString = QObject::tr("<%1>").arg(m) ; } else { isuffixString.clear(); } if(nregWidth == 255) { ntriggerNum++ ; nregWidth = 0 ; } else { nregWidth++ ; } itriggerChannelString.append(QObject::tr("\n""Project.unit<%1>.triggerChannel<%2><%3>=%4")\ .arg(i).arg(ntriggerNum).arg(nregWidth).arg(inewRegHiberarchy + itdoPortRegName + isuffixString)); } // tout if(nregWidth == 255) { ntriggerNum++ ; nregWidth = 0 ; } else { nregWidth++ ; } QString itoutPortRegName(QObject::tr("_EziDebug_%1_tout_r").arg(item->getScanChainInfo()->getChainName())); itriggerChannelString.append(QObject::tr("\n""Project.unit<%1>.triggerChannel<%2><%3>=%4")\ .arg(i).arg(ntriggerNum).arg(nregWidth).arg(inewRegHiberarchy + itoutPortRegName)); EziDebugModule * pmodule = m_imoduleMap.value(item->getModuleName(),NULL) ; if(!pmodule) { qDebug() << "EziDebug Error: NULL Pointer!"; return 1 ; } QVector<EziDebugModule::PortStructure*> iportVec = this->getPrjModuleMap().value(item->getModuleName())->getPort(this,item->getInstanceName()); for(int j = 0 ; j < iportVec.count() ; j++) { QString iportName = QString::fromAscii(iportVec.at(j)->m_pPortName) ; QString iportRegName(QObject::tr("_EziDebug_%1_%2_r").arg(ichainName).arg(iportName)); // 跳过时钟 复位信号 if(!(pmodule->getClockSignal().value(iportName,QString())).isEmpty()) { continue ; } if(!(pmodule->getResetSignal().value(iportName,QString())).isEmpty()) { continue ; } QString isuffixString ; for(int m = 0 ; m < iportVec.at(j)->m_unBitwidth ; m++) { if(1 == iportVec.at(j)->m_unBitwidth) { isuffixString.clear(); } else { if(iportVec.at(j)->m_eEndian == EziDebugModule::endianBig) { isuffixString = QObject::tr("<%1>").arg(iportVec.at(j)->m_unStartBit- m) ; } else { isuffixString = QObject::tr("<%1>").arg(iportVec.at(j)->m_unStartBit + m) ; } } if(nregWidth == 255) { ntriggerNum++ ; nregWidth = 0 ; } else { nregWidth++ ; } itriggerChannelString.append(QObject::tr("\n""Project.unit<%1>.triggerChannel<%2><%3>=%4")\ .arg(i).arg(ntriggerNum).arg(nregWidth).arg(inewRegHiberarchy + iportRegName + isuffixString)); } } // 内部端口寄存器 QStringList iportList = item->getScanChainInfo()->getSyscoreOutputPortList() ; for(int n = 0 ; n < iportList.count() ; n++ ) { QString ihierarchyName = iportList.at(n).split(QObject::tr("#")).at(0); QRegExp ieraseExp(QObject::tr("\\b\\w*:")); ihierarchyName.replace(ieraseExp,""); ihierarchyName.replace("|","/"); QString iregName = iportList.at(n).split(QObject::tr("#")).at(2); int nbitWidth = iportList.at(n).split(QObject::tr("#")).at(3).toInt(); QString isuffixString ; for(int n = (nbitWidth -1) ; n >= 0 ; n--) { if(nbitWidth > 1) { isuffixString = QObject::tr("<%1>").arg(n) ; } else { isuffixString.clear(); } if(nregWidth == 255) { ntriggerNum++ ; nregWidth = 0 ; } else { nregWidth++ ; } itriggerChannelString.append(QObject::tr("\n""Project.unit<%1>.triggerChannel<%2><%3>=%4")\ .arg(i).arg(ntriggerNum).arg(nregWidth).arg(ihierarchyName + iregName + isuffixString)); } } } else { qDebug() << "EziDebug Error: create the cdc file error!"; return 2 ; } QString iclockChannel(QObject::tr("\n""Project.unit<%1>.clockChannel=").arg(i)); QString iclockEdge(QObject::tr("\n""Project.unit<%1>.clockEdge=").arg(i)); QString idataDepth(QObject::tr("\n""Project.unit<%1>.dataDepth=%2").arg(i).arg(m_nmaxRegNumInChain*2)); QString idataEqualsTrigger(QObject::tr("\n""Project.unit<%1>.dataEqualsTrigger=true").arg(i)); QString idataPortWidth(QObject::tr("\n""Project.unit<%1>.dataPortWidth=").arg(i)); QString ienableGaps(QObject::tr("\n""Project.unit<%1>.enableGaps=false").arg(i)); QString ienableStorageQualification(QObject::tr("\n""Project.unit<%1>.enableStorageQualification=true").arg(i)); QString ienableTimestamps(QObject::tr("\n""Project.unit<%1>.enableTimestamps=false").arg(i)); QString itimestampDepth(QObject::tr("\n""Project.unit<%1>.timestampDepth=0").arg(i)); QString itimestampWidth(QObject::tr("\n""Project.unit<%1>.timestampWidth=0").arg(i)); QString itriggerConditionCountWidth(QObject::tr("\n""Project.unit<%1>.triggerConditionCountWidth=0").arg(i)); QString itriggerMatchCount(QObject::tr("\n""Project.unit<%1>.triggerMatchCount<0>=1").arg(i)); QString itriggerMatchCountWidth(QObject::tr("\n""Project.unit<%1>.triggerMatchCountWidth<0><0>=0").arg(i)); QString itriggerMatchType(QObject::tr("\n""Project.unit<%1>.triggerMatchType<0><0>=0").arg(i)); QString itriggerPortCount(QObject::tr("\n""Project.unit<%1>.triggerPortCount=%2").arg(i).arg(ntriggerNum+1)) ; QString itriggerPortIsData ; for(int trinum = 0 ; trinum < (ntriggerNum+1);trinum++) { itriggerPortIsData.append(QObject::tr("\n""Project.unit<%1>.triggerPortIsData<%2>=true").arg(i).arg(trinum)); } QString itriggerPortWidth ; for(int trinum = 0 ; trinum < (ntriggerNum+1);trinum++) { if(trinum == ntriggerNum) { itriggerPortWidth.append(QObject::tr("\n""Project.unit<%1>.triggerPortWidth<%2>=%3").arg(i).arg(trinum).arg(nregWidth)); } else { itriggerPortWidth.append(QObject::tr("\n""Project.unit<%1>.triggerPortWidth<%2>=%3").arg(i).arg(trinum).arg(255)); } } QString itriggerSequencerLevels(QObject::tr("\n""Project.unit<%1>.triggerSequencerLevels=16").arg(i)); QString itriggerSequencerType(QObject::tr("\n""Project.unit<%1>.triggerSequencerType=1").arg(i)); QString itype(QObject::tr("\n""Project.unit<%1>.type=ilapro").arg(i)); QString iprjUnit = iclockChannel \ + iclockEdge \ + idataDepth \ + idataEqualsTrigger \ + idataPortWidth \ + ienableGaps \ + ienableStorageQualification \ + ienableTimestamps \ + itimestampDepth \ + itimestampWidth \ + itriggerChannelString \ + itriggerConditionCountWidth \ + itriggerMatchCount \ + itriggerMatchCountWidth \ + itriggerPortCount \ + itriggerMatchType \ + itriggerPortIsData \ + itriggerPortWidth \ + itriggerSequencerLevels \ + itriggerSequencerType \ + itype ; iilaStr.append(iprjUnit) ; ++i ; ++iclockIterator ; } QString iunit_dimension(QObject::tr("\n""Project.unit.dimension=%1").arg(i)); QString ipartOneString = itimeString \ + iinNetFile \ + ioutNetFile \ + ideviceFamily \ + idevice_enableRPMs \ + idevice_outputDirectory \ + idevice_useSRL16 \ + ifilter_dimension \ + ifilter \ + iicon_boundaryScanChain \ + iicon_disableBUFGInsertion \ + iicon_enableExtTriggerIn \ + iicon_enableExtTriggerOut \ + iicon_triggerInPinName \ + iicon_triggerOutPinName \ + iunit_dimension ; ifileContent.append(ipartOneString) ; ifileContent.append(iilaStr) ; icdcOutStream << ifileContent ; icdcFile.close(); } else { /*输出文本*/ return 1 ; } return 0 ; } int EziDebugPrj:: chkEziDebugFileInvolved() { QFile iprjFile(m_iprjName); if(!iprjFile.open(QIODevice::Text|QIODevice::ReadOnly)) { qDebug() << "EziDebug Error:Can not Open file for reading:" << qPrintable(iprjFile.errorString()); return -1 ; } // "A" "" "" "" "PROP_UserBrowsedStrategyFiles" "" QTextStream ifileStream(&iprjFile); QString ifileContent = ifileStream.readAll() ; iprjFile.close(); if(m_eusedTool == ToolQuartus) { return 0 ; } else if(m_eusedTool == ToolIse) { if(m_itoolSoftwareVersion == "10.x") { // 修改 set user_files // set user_files int nfileKeyPos = ifileContent.indexOf("set user_files") ; if(nfileKeyPos != -1) { int nleftBra = ifileContent.indexOf('}',nfileKeyPos) ; if(nleftBra != -1) { QString ifileListStr = ifileContent.mid(nfileKeyPos,nleftBra - nfileKeyPos + 1); if((ifileListStr.contains(QRegExp("\"EziDebug_1.0/_EziDebug_ScanChainReg.v\""))) &&(ifileListStr.contains(QRegExp("\"EziDebug_1.0/_EziDebug_TOUT_m.v\"")))) { qDebug() << "The project file already contains the new file info!"; return 1 ; } else { return 0 ; } } else { qDebug() << "EziDebug Error:reading filecontent error!" << __LINE__; return -1; } } else { qDebug() << "EziDebug Error:reading filecontent error!" << __LINE__; return -1 ; } } else if(m_itoolSoftwareVersion == "14.x") { return 0 ; } else { return 0 ; // do nothing! } } else { return 0 ; // do nothing! } } QString EziDebugPrj::constructCfgInstanceString(EziDebugInstanceTreeItem * item) { /* <node_ip_info instance_id="0" mfg_id="110" node_id="0" version="6"/> <position_info> <single attribute="active tab" value="1"/> <single attribute="setup horizontal scroll position" value="0"/> <single attribute="setup vertical scroll position" value="0"/> </position_info> */ QString ifileContent ; EziDebugModule *pmodule = this->getPrjModuleMap().value(item->getModuleName()); QMap<QString,QString>::const_iterator iclockiterator = pmodule->getClockSignal().constBegin() ; QString iscanPortClock = item->getScanChainInfo()->getscaningPortClock() ; if(!iscanPortClock.isEmpty()) { iscanPortClock = item->parent()->getModuleClockMap(item->getInstanceName()).value(item->getScanChainInfo()->getscaningPortClock(),QString()); } else { if(pmodule->getClockSignal().count()!= 1) { return QString(); } else { while(iclockiterator != pmodule->getClockSignal().constEnd()) { iscanPortClock = iclockiterator.key(); ++iclockiterator ; } } } int i = 0 ; iclockiterator = pmodule->getClockSignal().constBegin() ; while(iclockiterator != pmodule->getClockSignal().constEnd()) { QString ilabelInstanceStart(QObject::tr("\n <instance entity_name=\"sld_signaltap\" is_auto_node=\"yes\" is_expanded=\"true\" name=\"auto_signaltap_%1\" source_file=\"sld_signaltap.vhd\">").arg(i)); ifileContent.append(ilabelInstanceStart); QString ilabelNode_ip_info(QObject::tr("\n <node_ip_info instance_id=\"%1\" mfg_id=\"110\" node_id=\"0\" version=\"6\"/>").arg(i)); ifileContent.append(ilabelNode_ip_info); /* <signal_set global_temp="1" name="signal_set: 2012/10/31 17:44:31 #0"> <clock name="auto_stp_external_clock_0" polarity="posedge" tap_mode="classic"/> <config ram_type="M4K" reserved_data_nodes="0" reserved_trigger_nodes="0" sample_depth="128" trigger_in_enable="no" trigger_out_enable="no"/> <top_entity/> <signal_vec> <trigger_input_vec> */ QDate icurrentDate = QDate::currentDate(); QTime icurrentTime = QTime::currentTime(); QString ilabelSignal_setStart(QObject::tr("\n <signal_set global_temp=\"1\" name=\"signal_set: %1 %2 #0\">").arg(icurrentDate.toString(QObject::tr("yyyy/MM/dd")))\ .arg(icurrentTime.toString(QObject::tr("hh:mm:ss")))) ; ifileContent.append(ilabelSignal_setStart); QString idefaultLabelClock(QObject::tr("\n <clock name=\"auto_stp_external_clock_0\" polarity=\"posedge\" tap_mode=\"classic\"/>")); ifileContent.append(idefaultLabelClock); QString idefaultConfig(QObject::tr("\n <config ram_type=\"M4K\" reserved_data_nodes=\"0\" reserved_trigger_nodes=\"0\" sample_depth=\"128\" trigger_in_enable=\"no\" trigger_out_enable=\"no\"/>")); ifileContent.append(idefaultConfig); QString ilabelTop_entity(QObject::tr("\n <top_entity/>")); ifileContent.append(ilabelTop_entity); QString ilabelSignal_vecStart(QObject::tr("\n <signal_vec>")); ifileContent.append(ilabelSignal_vecStart); QString ilabeltrigger_input_vecStart(QObject::tr("\n <trigger_input_vec>")); ifileContent.append(ilabeltrigger_input_vecStart); // 新加入的 tdo_reg 输出端口 的 reg QString iTdoPortName(QObject::tr("_EziDebug_%1_%2_TDO_r").arg(item->getScanChainInfo()->getChainName()).arg(iclockiterator.key())); QString ichainClock = item->parent()->getModuleClockMap(item->getInstanceName()).key(iclockiterator.key(),QString()); int nchildChainNum = item->getScanChainInfo()->getChildChainNum(ichainClock); QString iregTdoHiberarchy = item->getItemHierarchyName(); if(1 == nchildChainNum) { QString itdo_reg(QObject::tr("\n <wire name=\"%1\" tap_mode=\"classic\" type=\"register\"/>").arg(iregTdoHiberarchy + iTdoPortName)); ifileContent.append(itdo_reg); } else if(nchildChainNum > 1) { for(int m = 0 ; m < nchildChainNum ; m++) { QString itdo_reg(QObject::tr("\n <wire name=\"%1[%2]\" tap_mode=\"classic\" type=\"register\"/>").arg(iregTdoHiberarchy + iTdoPortName).arg(m)); ifileContent.append(itdo_reg); } } else { return QString(); } QString iToutRegName(QObject::tr("_EziDebug_%1_TOUT_reg").arg(item->getScanChainInfo()->getChainName())); QString itout_reg(QObject::tr("\n <wire name=\"%1\" tap_mode=\"classic\" type=\"register\"/>").arg(iregTdoHiberarchy + iToutRegName)); ifileContent.append(itout_reg); if(iscanPortClock == iclockiterator.key()) { // 所有观测模块的 输入输出端口的 reg QVector<EziDebugModule::PortStructure*> iportVec = pmodule->getPort(this,item->getInstanceName()); for(int i = 0 ; i < iportVec.count() ;i++) { QString iportName = QString::fromAscii(iportVec.at(i)->m_pPortName) ; if(!(pmodule->getClockSignal().value(iportName,QString())).isEmpty()) { continue ; } if(!(pmodule->getResetSignal().value(iportName,QString())).isEmpty()) { continue ; } QString iregHiberarchy = item->getItemHierarchyName(); QString ieziDebugPortName ; //ieziDebugPortName.append(QObject::tr("_EziDebug_")+iportName + QObject::tr("_r")); ieziDebugPortName.append(QObject::tr("_EziDebug_%1_%2_r").arg(item->getScanChainInfo()->getChainName()).arg(iportName)); if(1 == iportVec.at(i)->m_unBitwidth) { QString ilabelwire(QObject::tr("\n <wire name=\"%1\" tap_mode=\"classic\" type=\"register\"/>").arg(iregHiberarchy + ieziDebugPortName)); ifileContent.append(ilabelwire); } else { for(unsigned int j = 0 ;j < iportVec.at(i)->m_unBitwidth ; j++) { QString ilabelwire(QObject::tr("\n <wire name=\"%1\" tap_mode=\"classic\" type=\"register\"/>").arg(iregHiberarchy +ieziDebugPortName+QObject::tr("[%1]").arg(j))); ifileContent.append(ilabelwire); } } } } if(iscanPortClock == iclockiterator.key()) { // 内部系统模块的输出端口 reg QStringList iportList = item->getScanChainInfo()->getSyscoreOutputPortList() ; for(int n = 0 ; n < iportList.count() ;n++) { QString iportHiberarchy = iportList.at(n).split(QObject::tr("#")).at(0); QString iportName = iportList.at(n).split(QObject::tr("#")).at(1); QString iportBitWidth = iportList.at(n).split(QObject::tr("#")).at(2) ; // QString iportEndian = iportList.at(n).split(QObject::tr("#")).at(3) ; QString iportReg = QObject::tr("_EziDebug_%1_%2_r").arg(item->getScanChainInfo()->getChainName()).arg(iportName); int nportBitWidth = iportBitWidth.toInt(); if(1 == nportBitWidth) { QString itdo_reg(QObject::tr("\n <wire name=\"%1\" tap_mode=\"classic\" type=\"register\"/>").arg(iportHiberarchy + iportReg)); ifileContent.append(itdo_reg); } else if(nportBitWidth > 1) { for(int m = 0 ; m < nchildChainNum ; m++) { QString itdo_reg(QObject::tr("\n <wire name=\"%1[%2]\" tap_mode=\"classic\" type=\"register\"/>").arg(iportHiberarchy + iportReg).arg(m)); ifileContent.append(itdo_reg); } } else { return QString(); } } } QString ilabeltrigger_input_vecEnd(QObject::tr("\n </trigger_input_vec>")); ifileContent.append(ilabeltrigger_input_vecEnd); QString ilabelData_input_vecStart(QObject::tr("\n <data_input_vec>")); ifileContent.append(ilabelData_input_vecStart); // 新加入的 tdo_reg 输出端口 的 reg // QString iTdoPortName(QObject::tr("_EziDebug_%1_%2_TDO_r").arg(item->getScanChainInfo()->getChainName()).arg(iclockiterator.key())); // int nchildChainNum = item->getScanChainInfo()->getChildChainNum(iclockiterator.key()); if(1 == nchildChainNum) { QString itdo_reg(QObject::tr("\n <wire name=\"%1\" tap_mode=\"classic\" type=\"register\"/>").arg(iregTdoHiberarchy + iTdoPortName)); ifileContent.append(itdo_reg); } else if(nchildChainNum > 1) { for(int m = 0 ; m < nchildChainNum ; m++) { QString itdo_reg(QObject::tr("\n <wire name=\"%1[%2]\" tap_mode=\"classic\" type=\"register\"/>").arg(iregTdoHiberarchy + iTdoPortName).arg(m)); ifileContent.append(itdo_reg); } } else { return QString(); } QString itout_reg1(QObject::tr("\n <wire name=\"%1\" tap_mode=\"classic\" type=\"register\"/>").arg(iregTdoHiberarchy + iToutRegName)); ifileContent.append(itout_reg1); if(iscanPortClock == iclockiterator.key()) { // 所有观测模块的 输入输出端口的 reg QVector<EziDebugModule::PortStructure*> iportVec = pmodule->getPort(this,item->getInstanceName()); for(int i = 0 ; i < iportVec.count() ;i++) { QString iportName = QString::fromAscii(iportVec.at(i)->m_pPortName) ; if(!(pmodule->getClockSignal().value(iportName,QString())).isEmpty()) { continue ; } if(!(pmodule->getResetSignal().value(iportName,QString())).isEmpty()) { continue ; } QString iregHiberarchy = item->getItemHierarchyName(); QString ieziDebugPortName ; ieziDebugPortName.append(QObject::tr("_EziDebug_%1_%2_r").arg(item->getScanChainInfo()->getChainName()).arg(iportName)); if(1 == iportVec.at(i)->m_unBitwidth) { QString ilabelwire(QObject::tr("\n <wire name=\"%1\" tap_mode=\"classic\" type=\"register\"/>").arg(iregHiberarchy + ieziDebugPortName)); ifileContent.append(ilabelwire); } else { for(unsigned int j = 0 ;j < iportVec.at(i)->m_unBitwidth ; j++) { QString ilabelwire(QObject::tr("\n <wire name=\"%1\" tap_mode=\"classic\" type=\"register\"/>").arg(iregHiberarchy + ieziDebugPortName + QObject::tr("[%1]").arg(j))); ifileContent.append(ilabelwire); } } } } if(iscanPortClock == iclockiterator.key()) { // 内部系统模块的输出端口 reg QStringList iportList = item->getScanChainInfo()->getSyscoreOutputPortList() ; for(int n = 0 ; n < iportList.count() ;n++) { QString iportHiberarchy = iportList.at(n).split(QObject::tr("#")).at(0); QString iportName = iportList.at(n).split(QObject::tr("#")).at(1); int nportBitWidth = iportList.at(n).split(QObject::tr("#")).at(2).toInt(); QString iportReg = QObject::tr("_EziDebug_%1_%2_r").arg(item->getScanChainInfo()->getChainName()).arg(iportName); if(1 == nportBitWidth) { QString itdo_reg(QObject::tr("\n <wire name=\"%1\" tap_mode=\"classic\" type=\"register\"/>").arg(iportHiberarchy + iportReg)); ifileContent.append(itdo_reg); } else if(nportBitWidth > 1) { for(int m = 0 ; m < nchildChainNum ; m++) { QString itdo_reg(QObject::tr("\n <wire name=\"%1[%2]\" tap_mode=\"classic\" type=\"register\"/>").arg(iportHiberarchy + iportReg).arg(m)); ifileContent.append(itdo_reg); } } else { return QString(); } } } QString ilabelData_input_vecEnd(QObject::tr("\n </data_input_vec>")); ifileContent.append(ilabelData_input_vecEnd); QString ilabelSignal_vecEnd(QObject::tr("\n </signal_vec>")); ifileContent.append(ilabelSignal_vecEnd); QString ilabelPresentationStart(QObject::tr("\n <presentation>")); ifileContent.append(ilabelPresentationStart); QString ilabelData_viewStart(QObject::tr("\n <data_view>")); ifileContent.append(ilabelData_viewStart); // 新加入的 tdo_reg 输出端口 的 reg // QString iTdoPortName(QObject::tr("_EziDebug_%1_%2_TDO_r").arg(item->getScanChainInfo()->getChainName()).arg(iclockiterator.key())); // int nchildChainNum = item->getScanChainInfo()->getChildChainNum(iclockiterator.key()); if(1 == nchildChainNum) { QString ilabelnet(QObject::tr("\n <net is_signal_inverted=\"no\" name=\"%1\"/>").arg(iregTdoHiberarchy + iTdoPortName)); ifileContent.append(ilabelnet); } else if(nchildChainNum > 1) { QString ilabelbusStart(QObject::tr("\n <bus is_signal_inverted=\"no\" link=\"all\" name=\"%1\" order=\"lsb_to_msb\" radix=\"hex\" state=\"collapse\" type=\"register\">").arg(iTdoPortName)); ifileContent.append(ilabelbusStart); for(int m = 0 ; m < nchildChainNum ; m++) { QString ilabelnet(QObject::tr("\n <net is_signal_inverted=\"no\" name=\"%1[%2]\"/>").arg(iregTdoHiberarchy + iTdoPortName).arg(m)); ifileContent.append(ilabelnet); } QString ilabelbusEnd(QObject::tr("\n </bus>")); ifileContent.append(ilabelbusEnd); } else { return QString(); } QString itout_reg2(QObject::tr("\n <net is_signal_inverted=\"no\" name=\"%1\"/>").arg(iregTdoHiberarchy + iToutRegName)); ifileContent.append(itout_reg2); if(iscanPortClock == iclockiterator.key()) { // 所有观测模块的 输入输出端口的 reg QVector<EziDebugModule::PortStructure*> iportVec = pmodule->getPort(this,item->getInstanceName()); for(int i = 0 ; i < iportVec.count() ;i++) { QString iportName = QString::fromAscii(iportVec.at(i)->m_pPortName) ; if(!(pmodule->getClockSignal().value(iportName,QString())).isEmpty()) { continue ; } if(!(pmodule->getResetSignal().value(iportName,QString())).isEmpty()) { continue ; } QString iregHiberarchy = item->getItemHierarchyName(); QString ieziDebugPortName ; //ieziDebugPortName.append(QObject::tr("_EziDebug_")+iportName + QObject::tr("_r")); ieziDebugPortName.append(QObject::tr("_EziDebug_%1_%2_r").arg(item->getScanChainInfo()->getChainName()).arg(iportName)); if(1 == iportVec.at(i)->m_unBitwidth) { QString ilabelnet(QObject::tr("\n <net is_signal_inverted=\"no\" name=\"%1\"/>").arg(iregHiberarchy + ieziDebugPortName)); ifileContent.append(ilabelnet); } else { QString ilabelbusStart(QObject::tr("\n <bus is_signal_inverted=\"no\" link=\"all\" name=\"%1\" order=\"lsb_to_msb\" radix=\"hex\" state=\"collapse\" type=\"register\">").arg(ieziDebugPortName)); ifileContent.append(ilabelbusStart); for(unsigned int j = 0 ;j < iportVec.at(i)->m_unBitwidth ; j++) { QString ilabelnet(QObject::tr("\n <net is_signal_inverted=\"no\" name=\"%1[%2]\"/>").arg(iregHiberarchy + ieziDebugPortName).arg(j)); ifileContent.append(ilabelnet); } QString ilabelbusEnd(QObject::tr("\n </bus>")); ifileContent.append(ilabelbusEnd); } } } if(iscanPortClock == iclockiterator.key()) { // 内部系统模块的输出端口 reg QStringList iportList = item->getScanChainInfo()->getSyscoreOutputPortList() ; for(int n = 0 ; n < iportList.count() ;n++) { QString iportHiberarchy = iportList.at(n).split(QObject::tr("#")).at(0); QString iportName = iportList.at(n).split(QObject::tr("#")).at(1); int nportBitWidth = iportList.at(n).split(QObject::tr("#")).at(2).toInt(); QString iportReg = QObject::tr("_EziDebug_%1_%2_r").arg(item->getScanChainInfo()->getChainName()).arg(iportName); if(1 == nportBitWidth) { QString ilabelnet(QObject::tr("\n <net is_signal_inverted=\"no\" name=\"%1\"/>").arg(iportHiberarchy + iportReg)); ifileContent.append(ilabelnet); } else if(nportBitWidth > 1) { QString ilabelbusStart(QObject::tr("\n <bus is_signal_inverted=\"no\" link=\"all\" name=\"%1\" order=\"lsb_to_msb\" radix=\"hex\" state=\"collapse\" type=\"register\">").arg(iportHiberarchy + iportReg)); ifileContent.append(ilabelbusStart); for(int m = 0 ; m < nchildChainNum ; m++) { QString ilabelnet(QObject::tr("\n <net is_signal_inverted=\"no\" name=\"%1[%2]\"/>").arg(iportHiberarchy + iportName).arg(m)); ifileContent.append(ilabelnet); } QString ilabelbusEnd(QObject::tr("\n </bus>")); ifileContent.append(ilabelbusEnd); } else { return QString(); } } } QString ilabelData_viewEnd(QObject::tr("\n </data_view>")); ifileContent.append(ilabelData_viewEnd); QString ilabelSetup_viewStart(QObject::tr("\n <setup_view>")); ifileContent.append(ilabelSetup_viewStart); // 新加入的 tdo_reg 输出端口 的 reg // QString iTdoPortName(QObject::tr("_EziDebug_%1_%2_TDO_r").arg(item->getScanChainInfo()->getChainName()).arg(iclockiterator.key())); // int nchildChainNum = item->getScanChainInfo()->getChildChainNum(iclockiterator.key()); if(1 == nchildChainNum) { QString ilabelnet(QObject::tr("\n <net is_signal_inverted=\"no\" name=\"%1\"/>").arg(iregTdoHiberarchy + iTdoPortName)); ifileContent.append(ilabelnet); } else if(nchildChainNum > 1) { QString ilabelbusStart(QObject::tr("\n <bus is_signal_inverted=\"no\" link=\"all\" name=\"%1\" order=\"lsb_to_msb\" radix=\"hex\" state=\"collapse\" type=\"register\">").arg(iTdoPortName)); ifileContent.append(ilabelbusStart); for(int m = 0 ; m < nchildChainNum ; m++) { QString ilabelnet(QObject::tr("\n <net is_signal_inverted=\"no\" name=\"%1[%2]\"/>").arg(iregTdoHiberarchy + iTdoPortName).arg(m)); ifileContent.append(ilabelnet); } QString ilabelbusEnd(QObject::tr("\n </bus>")); ifileContent.append(ilabelbusEnd); } else { return QString(); } QString itout_reg3(QObject::tr("\n <net is_signal_inverted=\"no\" name=\"%1\"/>").arg(iregTdoHiberarchy + iToutRegName)); ifileContent.append(itout_reg3); if(iscanPortClock == iclockiterator.key()) { // 所有观测模块的 输入输出端口的 reg QVector<EziDebugModule::PortStructure*> iportVec = pmodule->getPort(this,item->getInstanceName()); for(int i = 0 ; i < iportVec.count() ;i++) { QString iportName = QString::fromAscii(iportVec.at(i)->m_pPortName) ; if(!(pmodule->getClockSignal().value(iportName,QString())).isEmpty()) { continue ; } if(!(pmodule->getResetSignal().value(iportName,QString())).isEmpty()) { continue ; } QString iregHiberarchy = item->getItemHierarchyName(); QString ieziDebugPortName ; //ieziDebugPortName.append(QObject::tr("_EziDebug_")+iportName + QObject::tr("_r")); ieziDebugPortName.append(QObject::tr("_EziDebug_%1_%2_r").arg(item->getScanChainInfo()->getChainName()).arg(iportName)); if(1 == iportVec.at(i)->m_unBitwidth) { QString ilabelnet(QObject::tr("\n <net is_signal_inverted=\"no\" name=\"%1\"/>").arg(iregHiberarchy + ieziDebugPortName)); ifileContent.append(ilabelnet); } else { QString ilabelbusStart(QObject::tr("\n <bus is_signal_inverted=\"no\" link=\"all\" name=\"%1\" order=\"lsb_to_msb\" radix=\"hex\" state=\"collapse\" type=\"register\">").arg(ieziDebugPortName)); ifileContent.append(ilabelbusStart); for(int j = 0 ;j < iportVec.at(i)->m_unBitwidth ; j++) { QString ilabelnet(QObject::tr("\n <net is_signal_inverted=\"no\" name=\"%1[%2]\"/>").arg(iregHiberarchy + ieziDebugPortName).arg(j)); ifileContent.append(ilabelnet); } QString ilabelbusEnd(QObject::tr("\n </bus>")); ifileContent.append(ilabelbusEnd); } } } if(iscanPortClock == iclockiterator.key()) { // 内部系统模块的输出端口 reg QStringList iportList = item->getScanChainInfo()->getSyscoreOutputPortList() ; for(int n = 0 ; n < iportList.count() ;n++) { QString iportHiberarchy = iportList.at(n).split(QObject::tr("#")).at(0); QString iportName = iportList.at(n).split(QObject::tr("#")).at(1); QString iportReg = QObject::tr("_EziDebug_%1_%2_r").arg(item->getScanChainInfo()->getChainName()).arg(iportName); int nportBitWidth = iportList.at(n).split(QObject::tr("#")).at(2).toInt(); if(1 == nportBitWidth) { QString ilabelnet(QObject::tr("\n <net is_signal_inverted=\"no\" name=\"%1\"/>").arg(iportHiberarchy + iportReg)); ifileContent.append(ilabelnet); } else if(nportBitWidth > 1) { QString ilabelbusStart(QObject::tr("\n <bus is_signal_inverted=\"no\" link=\"all\" name=\"%1\" order=\"lsb_to_msb\" radix=\"hex\" state=\"collapse\" type=\"register\">").arg(iportHiberarchy + iportReg)); ifileContent.append(ilabelbusStart); for(int m = 0 ; m < nchildChainNum ; m++) { QString ilabelnet(QObject::tr("\n <net is_signal_inverted=\"no\" name=\"%1[%2]\"/>").arg(iportHiberarchy + iportReg).arg(m)); ifileContent.append(ilabelnet); } QString ilabelbusEnd(QObject::tr("\n </bus>")); ifileContent.append(ilabelbusEnd); } else { return QString(); } } } QString ilabelSetup_viewEnd(QObject::tr("\n </setup_view>")); ifileContent.append(ilabelSetup_viewEnd); QString ilabelPresentationEnd("\n </presentation>"); ifileContent.append(ilabelPresentationEnd); /* <trigger attribute_mem_mode="false" global_temp="1" name="trigger: 2012/10/31 19:32:21 #1" position="pre" power_up_trigger_mode="false" segment_size="1" trigger_in="dont_care" trigger_out="active high" trigger_type="circular"> <power_up_trigger position="pre" trigger_in="dont_care" trigger_out="active high"/> <events use_custom_flow_control="no"> <level enabled="yes" name="condition1" type="basic"> <power_up enabled="yes"> </power_up> <op_node/> </level> </events> </trigger> </signal_set> </instance> <mnemonics/> */ icurrentDate = QDate::currentDate(); icurrentTime = QTime::currentTime(); QString ilabelTriggerStart(QObject::tr("\n <trigger attribute_mem_mode=\"false\" global_temp=\"1\" name=\"trigger: %1 %2 #1\" position=\"pre\" power_up_trigger_mode=\"false\" segment_size=\"1\" trigger_in=\"dont_care\" trigger_out=\"active high\" trigger_type=\"circular\">").arg(icurrentDate.toString(QObject::tr("yyyy/MM/dd")))\ .arg(icurrentTime.toString(QObject::tr("hh:mm:ss")))) ; ifileContent.append(ilabelTriggerStart); QString ilabelPower_up_trigger(QObject::tr("\n <power_up_trigger position=\"pre\" trigger_in=\"dont_care\" trigger_out=\"active high\"/>")); ifileContent.append(ilabelPower_up_trigger); QString ilabelEventStart(QObject::tr("\n <events use_custom_flow_control=\"no\">")); ifileContent.append(ilabelEventStart); QString ilabelLevelStart(QObject::tr("\n <level enabled=\"yes\" name=\"condition1\" type=\"basic\">")); ifileContent.append(ilabelLevelStart); QString ilabelPower_upStart(QObject::tr("\n <power_up enabled=\"yes\">")); ifileContent.append(ilabelPower_upStart); QString ilabelPower_upEnd(QObject::tr("\n </power_up>")); ifileContent.append(ilabelPower_upEnd); QString ilabelOp_nodeStart(QObject::tr("\n <op_node/>")); ifileContent.append(ilabelOp_nodeStart); QString ilabelLevelEnd(QObject::tr("\n </level>")); ifileContent.append(ilabelLevelEnd); QString ilabelEventEnd(QObject::tr("\n </events>")); ifileContent.append(ilabelEventEnd); QString ilabelTriggerEnd(QObject::tr("\n </trigger>")); ifileContent.append(ilabelTriggerEnd); QString ilabelSignal_setEnd(QObject::tr("\n </signal_set>")); ifileContent.append(ilabelSignal_setEnd); QString ilabelPosition_infoStart(QObject::tr("\n <position_info>")) ; ifileContent.append(ilabelPosition_infoStart); QString ilableSingle1(QObject::tr("\n <single attribute=\"active tab\" value=\"1\"/>")); ifileContent.append(ilableSingle1); QString ilableSingle2(QObject::tr("\n <single attribute=\"setup horizontal scroll position\" value=\"0\"/>")); ifileContent.append(ilableSingle2); QString ilableSingle3(QObject::tr("\n <single attribute=\"setup vertical scroll position\" value=\"0\"/>")); ifileContent.append(ilableSingle3); QString ilabelPosition_infoEnd(QObject::tr("\n </position_info>")) ; ifileContent.append(ilabelPosition_infoEnd); QString ilabelInstanceEnd(QObject::tr("\n </instance>")); ifileContent.append(ilabelInstanceEnd); if(0 == i) { QString ilabelMnemonics(QObject::tr("\n <mnemonics/>")); ifileContent.append(ilabelMnemonics); } ++iclockiterator ; ++i ; } return ifileContent ; } #if 0 void EziDebugPrj::constructIlaunitString(int ®width,int &triggernum) { if(regwidth >= 255) { regwidth = 0 ; triggernum++ ; } else { ++regwidth ; } } #endif