OpenCores
URL https://opencores.org/ocsvn/ezidebug/ezidebug/trunk

Subversion Repositories ezidebug

[/] [ezidebug/] [trunk/] [EziDebug_src/] [ezidebugvlgfile.cpp] - Rev 2

Compare with Previous | Blame | View Log

#include "ezidebugfile.h"
#include "ezidebugvlgfile.h"
#include "ezidebugprj.h"
#include "ezidebugscanchain.h"
#include "ezidebugmodule.h"
#include "reg_scan.h"
#include "string.h"
#include <QDebug>
#include <QMessageBox>
 
extern unsigned int unModuCnt ;
extern unsigned int unMacroCnt ;
 
extern ModuleMem ModuleTab[MAX_T_LEN];
extern MacroMem MacroTab[MAX_T_LEN];
 
extern QMap<QString,QString> def_map ;  // 实体名.端口名,数值
extern QMap<QString ,QMap<QString,QString> >inst_map ;
extern QStringList iinstNameList ;
 
char buffer[200000];
 
 
const char *g_pscanRegModuleName =
"" ;
const char *g_pScanRegfileContentFirst =
"(\n"
"\tclock,\n"
"\tresetn,\n"
"\tTDI_reg,\n"
"\tTDO_reg,\n"
"\tTOUT_reg,\n"
"\tshift_reg\n"
"\t);\n"
"\tparameter shift_width = 100;\n"
"\n"
"\tinput   clock;\n"
"\tinput   resetn;\n"
"\tinput   TDI_reg;\n"
"\toutput  TDO_reg;\n"
"\tinput   TOUT_reg;\n"
"\tinput   [shift_width-1:0] shift_reg;\n"
"\n"
"\treg     [shift_width-1:0] shift_reg_r;\n" ;
 
 
 
const char *g_pScanRegfileContentSecond =
"\talways@(posedge clock or negedge resetn)\n"
"\t\tif(!resetn)\n"
"\t\t\tshift_reg_r <= ~shift_reg_r ;\n"
"\t\telse if(TOUT_reg)\n"
"\t\t\tshift_reg_r <=  shift_reg;\n"
"\t\telse\n"
"\t\t\tshift_reg_r <= {shift_reg_r[shift_width-2:0],TDI_reg};\n"
"\n"
"\tassign TDO_reg = shift_reg_r[shift_width-1] ;\n"
"\n"
"endmodule\n"
;
 
 
 
//  "\talways@(posedge clock or negedge resetn)\n"
 
 
const char *g_pscanIoModuleName =
"module _EziDebugScanChainIo(\n" ;
const char *g_pScanIofileContentFirst =
"\tclock,\n"
"\tresetn,\n"
"\tTDI_reg,\n"
"\tTDO_reg,\n"
"\tTOUT_reg,\n"
"\tshift_reg\n"
"\t);\n"
"\tparameter shift_width = 100;\n"
"\n"
"\tinput   clock;\n"
"\tinput   resetn;\n"
"\tinput   TDI_reg;\n"
"\toutput  TDO_reg;\n"
"\tinput   TOUT_reg;\n"
"\tinput   [shift_width-1:0] shift_io;\n"
"\n"
"\treg     [shift_width-1:0] shift_io_r;\n" ;
 
 
 
 
const char*g_pScanIoFileContentSecond =
"\talways@(posedge clock or negedge resetn)\n"
"\t\tif(!resetn)\n"
"\t\t\tshift_io_r <= 0;\n"
"\t\telse if(TOUT_reg)\n"
"\t\t\tshift_io_r <=  shift_io;\n"
"\t\telse\n"
"\t\t\tshift_io_r <= {shift_io_r[shift_width-2:0],TDI_reg};\n"
"\n"
"\tassign TDO_reg = shift_io_r[shift_width-1] ;\n"
"\n"
"endmodule\n"
;
 
 
const char* g_ptoutfileContentFirst =
"(\n"
"\t""clock ,\n"
"\t""reset ,\n"
"\t""rstn_out ,\n"
"\t""TOUT_reg \n"
"\t"") ;\n"
"\n"
"\t""input   clock ;\n"
"\t""input   reset ;\n"
"\t""output  rstn_out ;\n"
"\t""output  TOUT_reg ;\n"
"\t""reg[31:0] cnt ;\n"
"\t""reg[31:0] counter ;\n"
"\t""parameter CNT_MAX = 32'd";
 
 
const char* g_ptoutfileContentSecond =
"\n\n\t""always@(posedge clock or posedge reset)\n"
"\t\t""if(reset)\n"
"\t\t\t""cnt <= 32'h0 ;\n"
"\t\t""else if(cnt != CNT_MAX)\n"
"\t\t\t""cnt <= cnt + 32'h1 ;\n"
"\n\t""assign rstn_out = (cnt != CNT_MAX ) ? 1'b0 : 1'b1 ;"
"\n\n\t""always@(posedge clock or posedge reset)\n"
"\t\t""if(reset)\n"
"\t\t\t""counter <= 32'h0 ;\n"
"\t\t""else if(counter >= CNT_MAX)\n"
"\t\t\t""counter <= 32'h0 ;\n"
"\t\t""else\n"
"\t\t\t""counter <= counter + 32'h1 ;\n"
"\n"
"\t""assign TOUT_reg = (counter == 32'h0)? 1'b1 : 1'b0 ;\n"
"\n\t""endmodule\n";
 
 
 
 
EziDebugVlgFile::EziDebugVlgFile(const QString &filename):EziDebugFile(filename)
{
 
}
 
EziDebugVlgFile::EziDebugVlgFile(const QString &filename,const QDateTime &datetime,const QStringList &modulelist)\
    :EziDebugFile(filename,datetime,modulelist)
{
 
}
 
 
EziDebugVlgFile::~EziDebugVlgFile()
{
 
}
 
int EziDebugVlgFile::deleteScanChain(QStringList &ideletelinecodelist,const QStringList &ideleteblockcodelist,EziDebugScanChain *pchain,EziDebugPrj::OPERATE_TYPE type)
{
    int npos = 0 ;
    int ndeletePos = 0 ;
    int nresultPos = 0 ;
    QList<int> iposList ;
    QMap<int,int> ideleteCodePosMap ;
    QDateTime ilastModifedTime ;
 
    qDebug() << fileName() ;
 
    if(fileName().endsWith("SspApbifX.v"))
    {
        qDebug() << "SspApbifX.v";
    }
 
    // 打开
    // 读取 文件
    if(!open(QIODevice::ReadOnly | QIODevice::Text))
    {
        // 向用户输出  文件打不开
        qDebug() << errorString() << fileName() ;
        return 1 ;
    }
 
    QTextStream iin(this);
    QString ifileContent = iin.readAll();
 
    // 关闭
    close();
    // 打开 写 文件
 
    /*备份扫描过的文件*/
    QString ieziDebugFileSuffix ;
    if(type == EziDebugPrj::OperateTypeDelSingleScanChain)
    {
        ieziDebugFileSuffix.append(tr(".delete.%1").arg(pchain->getChainName()));
    }
    else if(type == EziDebugPrj::OperateTypeDelAllScanChain)
    {
        ieziDebugFileSuffix.append(tr(".deleteall"));
    }
    else
    {
        return 1 ;
    }
 
    EziDebugPrj *pprj = const_cast<EziDebugPrj *>(EziDebugInstanceTreeItem::getProject());
    QFileInfo ifileInfo(fileName());
 
    QString idir = EziDebugScanChain::getUserDir() ;
    QString ibackupFileName = pprj->getCurrentDir().absolutePath()\
            + idir + tr("/") + ifileInfo.fileName() \
            + ieziDebugFileSuffix ;
    copy(ibackupFileName);
    pchain->addToScanedFileList(fileName());
 
 
    // 将注释 替换成 空格
    QString iblankString = replaceCommentaryByBlank(ifileContent);
 
#if 0
    QFile itestfile("d:/test.txt");
    if(!itestfile.open(QIODevice::Text|QIODevice::WriteOnly))
    {
        qDebug()<<"aaaaaaaa";
    }
    QTextStream itestout(&itestfile);
    itestout << iblankString ;
    itestfile.close();
#endif
 
    //QString icaptureString ;
    // 删除行代码
    for(int i = 0 ; i < ideletelinecodelist.count() ; i++)
    {
        // 从 stringlist 提取 字符串 创建 QRegExp
        QRegExp ifindExp(ideletelinecodelist.at(i));
        ifindExp.setMinimal(true);
        QRegExp ifindExpOther(tr("\\s*") + ideletelinecodelist.at(i) );
        ifindExpOther.setMinimal(true);
        // 查找 待删除的字符串
        if((nresultPos = ifindExp.indexIn(iblankString,npos)) == -1)
        {
            // 向用户输出  查找不到 字符串
            qDebug() << "EziDebug info: Can't find the string:" <<ideletelinecodelist.at(i) ;
            continue ;
        }
        else
        {
            // 删除至 上一个非空白字符
            ndeletePos = nresultPos ;
            int nlastNoBlankChar = ifileContent.lastIndexOf(QRegExp("\\S"),ndeletePos-1) ;
 
            npos = ndeletePos + ifindExp.matchedLength() ;
 
            if(-1 == nlastNoBlankChar)
            {
                ndeletePos = ndeletePos ;
            }
            else
            {
                ndeletePos = nlastNoBlankChar + 1 ;
            }
 
            //QString icatchStr = ifindExp.capturedTexts().at(0) ;
            //QString itest = ifileContent.mid(ndeletePos,nresultPos - ndeletePos +ifindExp.matchedLength()) ;
            //qDebug() << itest << icatchStr ;
            iposList.append(ndeletePos);
            ideleteCodePosMap.insert(ndeletePos,(nresultPos - ndeletePos + ifindExp.matchedLength()));
 
            // 替换 带删除的字符串 为空字符串
            //ifileContent.replace(icaptureString,tr(""));
        }
    }
 
    // 删除块代码
    npos = 0 ;
    for(int i = 0 ; i < ideleteblockcodelist.count() ; i++)
    {
        // 从 stringlist 提取 字符串 创建 QRegExp
        QRegExp ifindExp(ideleteblockcodelist.at(i));
 
 
        // 查找 待删除的字符串
        if((npos = ifindExp.indexIn(iblankString,npos)) == -1)
        {
            // 向用户输出  查找不到 字符串
            qDebug() << ideletelinecodelist.at(i) ;
        }
        else
        {
            // always 和 ;
 
            // 寻找 always
            int nalwaysPos = iblankString.lastIndexOf(QRegExp(QObject::tr("\\balways\\b")),npos);
            // 最近的非空白字符, 从第一个空白字符开始 到 always 结束 替换为空
            if(-1 != ifileContent.lastIndexOf(QRegExp(QObject::tr("\\S")),nalwaysPos-1))
            {
                nalwaysPos = ifileContent.lastIndexOf(QRegExp(QObject::tr("\\S")),nalwaysPos-1) + 1;
            }
 
            int nfirstBeginPos = iblankString.indexOf(QRegExp(QObject::tr("\\bbegin\\b")),nalwaysPos);
            /*查找匹配的  end*/
            QRegExp iwordsExp(QObject::tr("\\b\\w+\\b"));
            iwordsExp.setMinimal(true);
            int nmatch = 1 ;
            int nendPos = 0 ;
            int nbeginPos = nfirstBeginPos + 5 ;
 
            while((nbeginPos = iwordsExp.indexIn(iblankString,nbeginPos)) != -1)
            {
                if(iwordsExp.capturedTexts().at(0) == "begin")
                {
                    nmatch++ ;
 
                }
                else if(iwordsExp.capturedTexts().at(0) == "end")
                {
                    nmatch-- ;
                    if(0 == nmatch)
                    {
                        nendPos = nbeginPos ;
                        break ;
                    }
 
                }
                else
                {
                    //
                }
                nbeginPos += iwordsExp.matchedLength();
            }
 
            if(nmatch != 0)
            {
                qDebug() << "no matching end string!";
                close();
                return 1 ;
            }
 
            if(nendPos != 0)
            {
                //qDebug() << ifileContent.mid(nalwaysPos,nendPos - nalwaysPos + 3);
                //ifileContent.replace(nalwaysPos , nendPos - nalwaysPos + 3 ,"");
                iposList.append(nalwaysPos);
                ideleteCodePosMap.insert(nalwaysPos , nendPos - nalwaysPos + 3);
                npos = nendPos + 3 ;
            }
            else
            {
                qDebug() << "no finding end string!";
            }
        }
    }
 
    qSort(iposList.begin(), iposList.end(), qGreater<int>());
 
    for(int j = 0 ; j < iposList.count() ; j++)
    {
        int nstartPos = iposList.at(j) ;
        int nlength = ideleteCodePosMap.value(nstartPos , -1) ;
        ifileContent.replace(nstartPos , nlength ,"");
    }
 
 
    if(!open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate))
    {
        // 向用户输出  文件打不开
        qDebug() << errorString() << fileName() ;
        return 1 ;
    }
 
    QTextStream iout(this);
    iout << ifileContent ;
 
    //关闭
    close();
 
    ilastModifedTime = ifileInfo.lastModified() ;
    modifyStoredTime(ilastModifedTime);
 
    return 0 ;
}
 
int EziDebugVlgFile::addScanChain(INSERT_TYPE type,QMap<QString,EziDebugInstanceTreeItem::SCAN_CHAIN_STRUCTURE*> &chainStructuremap ,EziDebugScanChain* pchain, EziDebugInstanceTreeItem *pitem)
{
 
    QString ifileData ;
    QString ilastString ;
    QString ichainClock ;
    QString inoSynCode ;
    int noffSet = 0 ;
    EziDebugPrj * iprj = const_cast<EziDebugPrj *>(EziDebugInstanceTreeItem::getProject());
    EziDebugModule *pmodule =  iprj->getPrjModuleMap().value(pitem->getModuleName()) ;
 
    EziDebugModule *pparentMoudle = iprj->getPrjModuleMap().value(pitem->parent()->getModuleName()) ;
    QMap<QString,QString> iclockMap = pmodule->getClockSignal() ;
    //QMap<QString,QString> iresetMap = pmodule->getResetSignal() ;
 
    qDebug() << "Add chain in file:" << fileName();
    if(!open(QIODevice::ReadOnly|QIODevice::Text))
    {
        qDebug() << "Cannot Open file for reading:" << qPrintable(this->errorString());
        return 1 ;
    }
 
#if 0
    if(fileName().endsWith("ifft_airif_rdctrl.v"))
    {
        qDebug("add chain in iifft_airif_rdctrl.v");
    }
#endif
 
    /*遍历节点时生成 一个寄存器的 迭代关系 字符串  要传入 verilog 文件的 addScanChain 函数中 ,方便插完链之后  保存到相应的对象中*/
    /*读取文件所有字符  从上一个注释的结束端 到 下一个注释的开始端 之间 查找需要的字符串*/
    ifileData = this->readAll();
    close();
 
 
 
    /*记录到 扫描过的文件  并备份  */
    QFileInfo ifileInfo(fileName());
    pchain->addToScanedFileList(fileName());
 
    QString idir = EziDebugScanChain::getUserDir() ;
    QString ibackupFileName = iprj->getCurrentDir().absolutePath()\
            + idir + tr("/")+ ifileInfo.fileName() \
            + tr(".add") + tr(".%1").arg(pchain->getChainName());
    copy(ibackupFileName);
 
    QDateTime ilastModifedTime ;
 
    if(iprj->getToolType() == EziDebugPrj::ToolQuartus)
    {
        inoSynCode = "/*synthesis noprune*/" ;
    }
    else if(iprj->getToolType() == EziDebugPrj::ToolIse)
    {
        inoSynCode = "/* synthesis syn_keep = 1 xc_props = \"x\" */" ;
    }
 
    /*根据插入代码类型 分别加入代码 */
    // 加入函数 判断 新加入的 代码是否重复 ,如果重复 则在后面加入数字
    if(InsertTimer == type)
    {
        /*如果是定时器 相关代码  */
 
        struct SEARCH_STRING_STRUCTURE iModuleKeyWordSt ;
        iModuleKeyWordSt.m_etype = SearchModuleKeyWordPos ;
        iModuleKeyWordSt.m_icontent.m_imodulest.m_eportAnnounceFormat = NonAnsicFormat ;
        // 父节点的 的 module name
 
        strcpy(iModuleKeyWordSt.m_icontent.m_imodulest.m_amoduleName,pitem->parent()->getModuleName().toAscii().data());
        //  module 名
        int nmoduleKeyWordStartPos = 0 ;
        /*找到  右键加入扫描链的 module 对应例化 的 module */
        if(skipCommentaryFind(ifileData,0,iModuleKeyWordSt,nmoduleKeyWordStartPos))
        {
            close();
            return 1 ;
        }
 
        struct SEARCH_MODULE_POS_STRUCTURE imodulePos ;
        strcpy(imodulePos.m_amoduleName,iModuleKeyWordSt.m_icontent.m_imodulest.m_amoduleName);
        /*不用管 端口声明的  方式*/
        imodulePos.m_nendModuleKeyWordPos = -1 ;
        /*置为标准的,避免扫描 port */
        imodulePos.m_eportFormat = AnsicFormat ;
        imodulePos.m_nlastRegKeyWordPos = -1 ;
        imodulePos.m_nlastPortKeyWordPos = -1 ;
        imodulePos.m_nlastWireKeyWordPos = -1 ;
        imodulePos.m_nnextRightBracketPos = nmoduleKeyWordStartPos ;
 
 
        struct SEARCH_INSTANCE_POS_STRUCTURE *pinstanceSt = (struct SEARCH_INSTANCE_POS_STRUCTURE *)operator new(sizeof(struct SEARCH_INSTANCE_POS_STRUCTURE)) ;
        strcpy(pinstanceSt->m_amoduleName,pitem->getModuleName().toAscii().data());
        strcpy(pinstanceSt->m_ainstanceName,pitem->getInstanceName().toAscii().data());
        pinstanceSt->m_einstanceFormat = NonStardardFormat ;
        pinstanceSt->m_nnextRightBracketPos = -1 ;
 
        QMap<QString,SEARCH_INSTANCE_POS_STRUCTURE*> iinstancePosMap ;
        iinstancePosMap.insert(pitem->getInstanceName(),pinstanceSt);
        QString iinstanceCode ;
        QString iresetnWireName ;
        QString iresetnWireCode ;
        QString itoutWireName ;
        QString itoutRegName ;
        QString itdoWireCode ;
        QString itdoWireName ;
        QString itoutRegCode;
        QString itdoRegCode ;
        QString itdoRegName ;
        //QString itdoRegEvaluateCode ;
        QString itoutWireCode ;
        QString iblockCode ;
        QString ianncounceCode ;
        QString iaddedCode ;
        QStringList iaddedCodeList ;
        QStringList iaddedBlockCodeList ;
        // 找到 lastreg 、lastwire、右键节点的例化位置
        if(!matchingTargetString(ifileData,imodulePos,iinstancePosMap))
        {
 
            // 目前不 检查 端口名 是否 重复
            //5、查找 最后的寄存器代码 ,根据 端口 时钟个数 判断加入几个
 
            //怎么传入端口时钟
 
            // 加入 定义 线 tout_wire 的代码
            itoutWireName.append(tr("_EziDebug_%1_tout_w").arg(pchain->getChainName()));
            itoutWireCode.append(tr("\n\t""wire _EziDebug_%1_tout_w ;").arg(pchain->getChainName()));
            iaddedCodeList.append(tr("\\bwire\\s+_EziDebug_%1_tout_w\\s*;").arg(pchain->getChainName()));
 
 
 
            itoutRegName.append(tr("_EziDebug_%1_tout_r").arg(pchain->getChainName()));
            itoutRegCode.append(tr("\n\t""reg %1 %2 ;").arg(itoutRegName).arg(inoSynCode));
            iaddedCodeList.append(tr("\\breg\\s*%1\\s*.*;").arg(itoutRegName));
 
            // 加入用于控制翻转的 reset 信号
            iresetnWireName.append(tr("_EziDebug_%1_rstn_w").arg(pchain->getChainName()));
            iresetnWireCode.append(tr("\n\t""wire _EziDebug_%1_rstn_w ;").arg(pchain->getChainName()));
            iaddedCodeList.append(tr("\\bwire\\s+_EziDebug_%1_rstn_w\\s*;").arg(pchain->getChainName()));
 
            // iaddedCode.append(itoutWireCode) ;
            ianncounceCode.append(itoutWireCode);
            ianncounceCode.append(itoutRegCode);
            ianncounceCode.append(iresetnWireCode);
 
            SEARCH_INSTANCE_POS_STRUCTURE *pchainInstanceSt = iinstancePosMap.value(pitem->getInstanceName()) ;
            //clockname 为 module 里面的 clock 名字
            int num = 0 ;
            iinstanceCode.append("\n\t\t") ;
            QMap<QString,QString>::const_iterator i = iclockMap.constBegin();
            while(i != iclockMap.constEnd())
            {
                QString iparentClock ;
                QMap<QString,QString> iparentClockMap = pparentMoudle->getClockSignal();
                QMap<QString,QString>::const_iterator iparentClockIter = iparentClockMap.constBegin() ;
                while(iparentClockIter != iparentClockMap.constEnd())
                {
                    iparentClock = iparentClockIter.key();
                    ++iparentClockIter ;
                }
                /*根据当前节点的时钟 获得 扫描链个数  TDI 输入*/
                QString iconstBit(tr("%1'b").arg(chainStructuremap.value(i.key())->m_untotalChainNumber));
                for(int j = 0 ;j < chainStructuremap.value(i.key())->m_untotalChainNumber ; j++)
                {
                    iconstBit.append("1");
                }
                //6、查找 右键插入链的 instance 的代码 ,根据 时钟个数 ,插入多少个 2*TDI TDO ,位宽chainStructuremap 中有多少条链的变量
                // 根据 module 里面多少个 时钟, 创建 多少个 和
                //   _EziDebug_clockname_TDI_reg
                //   _EziDebug_clockname_TDO_reg
                //   _EziDebug_TOUT_reg
                //  1、 ,\n\t._EziDebug_clockname_TDI_reg(1),\n\t_EziDebug_clockname_TDO_reg(wire_tdo 名字),\n\t_EziDebug_TOUT_reg(wire_tout名字)\n
                //  2、 , 1 , wire_tdo 名字 , wire_tout名字
 
                //  加入定义 线  tdo_wire 的代码  // 位宽、多少个 wire(clock 个数)
                // wire [number:0] _EziDebug_chainName_tdo_wire序号 ;\n
 
                itdoWireName.append(tr("_EziDebug_%1_%2_tdo_w").arg(pchain->getChainName()).arg(i.key()));
                itdoRegName.append(tr("_EziDebug_%1_%2_tdo_r").arg(pchain->getChainName()).arg(i.key()));
 
                if((chainStructuremap.value(i.key())->m_untotalChainNumber) > 1)
                {
 
                    itdoWireCode.append(tr("\n\t""wire [%1:0] %2 ;").arg(chainStructuremap.value(i.key())->m_untotalChainNumber-1).arg(itdoWireName));
                    //wire [ %1 : 0 ] _EziDebug_%2_tdo_wire%3 ;
                    iaddedCodeList.append(tr("\\b")+tr("wire\\s+\\[")+tr("\\s*%1")\
                                          .arg(chainStructuremap.value(i.key())->m_untotalChainNumber - 1)\
                                          + tr("\\s*:\\s*0\\s*\\]\\s*") + tr("%1\\s*;")\
                                          .arg(itdoWireName));
 
                    itdoRegCode.append(tr("\n\t""reg [%1:0] %2 %3 ;").arg(chainStructuremap.value(i.key())->m_untotalChainNumber-1).arg(itdoRegName).arg(inoSynCode));
                    iaddedCodeList.append(tr("\\breg\\s*\\[\\s*%1\\s*:\\s*0\\s*\\]\\s*%2\\s*.*;").arg(chainStructuremap.value(i.key())->m_untotalChainNumber-1).arg(itdoRegName));
                }
                else
                {
                    itdoWireCode.append(tr("\n\t""wire %1 ;").arg(itdoWireName));
                    iaddedCodeList.append(tr("\\b")+tr("wire\\s+")+tr("%1\\s*;").arg(itdoWireName));
 
                    itdoRegCode.append(tr("\n\t""reg %1 %2 ;").arg(itdoRegName).arg(inoSynCode));
                    iaddedCodeList.append(tr("\\breg\\s*%1\\s*.*;").arg(itdoRegName));
                }
 
                //iaddedCode.append(itdoWireCode);
                //iaddedCode.append(itdoRegCode);
 
                ianncounceCode.append(itdoWireCode);
                ianncounceCode.append(itdoRegCode);
 
 
                // tdo always 赋值语句 无复位信号
 
                iblockCode.append(tr("\n\n\t""always@(posedge %1)").arg(iparentClock));
                iblockCode.append(tr("\n\t\tbegin"));
                iblockCode.append(tr("\n\t\t""%1 <= %2 ;").arg(itdoRegName).arg(itdoWireName));
                iblockCode.append(tr("\n\t\t""%1 <= %2 ;").arg(itoutRegName).arg(itoutWireName));
                iblockCode.append(tr("\n\t\tend"));
 
 
 
                iaddedBlockCodeList.append(tr("%1\\s*<=\\s*%2\\s*;").arg(itdoRegName).arg(itdoWireName));
                iaddedCode.append(iblockCode);
 
                /*
                    always@(posedge clk or negedge rstn)
                        if(!rstn)
                            TOut_reg <= 1'b0;
                        else if( addr[8:0] == 9'h0 )
                            TOut_reg <= 1'b1;
                        else
                            TOut_reg <= 1'b0;
                */
                if(StardardForamt == pchainInstanceSt->m_einstanceFormat)
                {
                    QString iportName = tr(",\n\t\t""._EziDebug_%1_%2_TDI_reg(%3),\n\t\t""._EziDebug_%4_%5_TDO_reg(%6)")\
                            .arg(pchain->getChainName()).arg(i.key()).arg(iconstBit).arg(pchain->getChainName()).arg(i.key()).arg(itdoWireName);
                    iinstanceCode.append(iportName);
                    //iportName.replace("\n\t","\\s*");
                    iaddedCodeList.append(tr(",\\s*\\._EziDebug_%1_%2_TDI_reg\\s*\\(\\s*%3\\s*\\)").arg(pchain->getChainName()).arg(i.key()).arg(iconstBit));
                    iaddedCodeList.append(tr(",\\s*\\._EziDebug_%1_%2_TDO_reg\\s*\\(\\s*%3\\s*\\)").arg(pchain->getChainName()).arg(i.key()).arg(itdoWireName));
                }
                else if(NonStardardFormat == pchainInstanceSt->m_einstanceFormat)
                {
                    QString iportName = tr(", %1 , %2 ,").arg(iconstBit).arg(itdoWireName) ;
 
                    iinstanceCode.append(iportName);
                    //iportName.replace(" ","\\s*");
                    iaddedCodeList.append(tr(",\\s*%1").arg(iconstBit));
                    iaddedCodeList.append(tr(",\\s*%1").arg(itdoWireName));
                }
                else
                {
                    // 释放内存
                    iinstancePosMap.remove(pitem->getInstanceName());
                    delete pinstanceSt ;
                    close();
                    return 1 ;
                }
                /*构造字符串*/
 
                ++i ;
                num++;
            }
 
            ifileData.insert(pinstanceSt->m_nstartPos,ianncounceCode);
            noffSet += ianncounceCode.size() ;
            // ._EziDebug_chn_rstn(_EziDebug_chn_rstn_w)
            if(StardardForamt == pchainInstanceSt->m_einstanceFormat)
            {
                iinstanceCode.append(tr(",\n\t\t""._EziDebug_%1_rstn(%2)"",\n\t\t""._EziDebug_%3_TOUT_reg(%4)").arg(pchain->getChainName()).arg(iresetnWireName).arg(pchain->getChainName()).arg(itoutWireName)) ;
 
                iaddedCodeList.append(tr(",\\s*\\._EziDebug_%1_rstn\\s*\\(\\s*%2\\s*\\)").arg(pchain->getChainName()).arg(iresetnWireName));
                iaddedCodeList.append(tr(",\\s*\\._EziDebug_%1_TOUT_reg\\s*\\(\\s*%2\\s*\\)").arg(pchain->getChainName()).arg(itoutWireName));
            }
            else
            {
                iinstanceCode.append(tr(", %1 , %2").arg(iresetnWireName).arg(itoutWireName)) ;
                iaddedCodeList.append(tr(",\\s*%1\\s*,\\s*%2").arg(iresetnWireName).arg(itoutWireName));
            }
 
            // 所有位置偏移 iinstanceCode.size()
            ifileData.insert(pinstanceSt->m_nnextRightBracketPos + noffSet , iinstanceCode);
            noffSet += iinstanceCode.size() ;
 
            // 端口对应 所有寄存器 定义
            iaddedCode.append(tr("\n"));
            QVector<EziDebugModule::PortStructure*> iportVec = pmodule->getPort(iprj,pitem->getInstanceName()) ;
            QString iportRegCode ;
            QString iportRegName ;
            QStringList iportRegEvaluationStrList ;
            QStringList iportRegRevereStrList ;
            QStringList iportRegResetStrList ;
            for(int i = 0 ; i < iportVec.count() ;i++)
            {
                QString iportWireName = pparentMoudle->getInstancePortMap(pitem->getInstanceName()).value(QString::fromAscii(iportVec.at(i)->m_pPortName));
                iportRegName.clear();
                iportRegCode.clear();
                iportRegName.append(tr("_EziDebug_%1_%2_r").arg(pchain->getChainName()).arg(QString::fromAscii(iportVec.at(i)->m_pPortName)));
 
                if(iportVec.at(i)->m_unBitwidth == 1)
                {
                    iportRegCode.append(tr("\n\t""reg %1 %2 ;").arg(iportRegName).arg(inoSynCode));
                    iaddedCodeList.append(tr("\\breg\\s+%1\\s*.*;").arg(iportRegName));
                }
                else
                {
                    iportRegCode.append(tr("\n\t""reg [%1:%2] %3 %4 ;").arg(iportVec.at(i)->m_unStartBit).arg(iportVec.at(i)->m_unEndBit).arg(iportRegName).arg(inoSynCode));
                    iaddedCodeList.append(tr("\\breg\\s*\\[\\s*%1\\s*:\\s*%2\\s*\\]\\s*%3\\s*.*;").arg(iportVec.at(i)->m_unStartBit).arg(iportVec.at(i)->m_unEndBit).arg(iportRegName));
                }
                iportRegEvaluationStrList.append(tr("%1 <= %2 ;").arg(iportRegName).arg(iportWireName));
                iportRegRevereStrList.append(tr("%1 <= ~%2 ;").arg(iportRegName).arg(iportRegName));
                iportRegResetStrList.append(tr("%1 <= 0 ;").arg(iportRegName));
                iaddedCode.append(iportRegCode);
 
                if(i == 0)
                {
                    iaddedBlockCodeList.append(tr("%1\\s*<=\\s*%2\\s*;").arg(iportRegName).arg(iportWireName));
                }
            }
 
            iblockCode.clear() ;
            if(pchain->getscaningPortClock().isEmpty())
            {
                if(pmodule->getClockSignal().count() > 1)
                {
                    qDebug() << "Error: There is two or more Clock Signal";
                    close();
                    return 1 ;
                }
 
                QString iscanningClock ;
                QMap<QString,QString> iparentClockMap = pparentMoudle->getClockSignal();
                QMap<QString,QString>::const_iterator iparentClockIter = iparentClockMap.constBegin() ;
                while(iparentClockIter != iparentClockMap.constEnd())
                {
                    iscanningClock = iparentClockIter.key();
                    ++iparentClockIter ;
                }
 
                iblockCode.append(tr("\n\n\t""always@(posedge %1 or negedge %2)").arg(iscanningClock).arg(iresetnWireName));
                iblockCode.append(tr("\n\tbegin"));
                iblockCode.append(tr("\n\t\t""if(!%1)").arg(iresetnWireName));
                iblockCode.append(tr("\n\t\t\t""begin"));
                iblockCode.append(tr("\n\t\t\t%1").arg(iportRegRevereStrList.join("\n\t\t\t"))) ;
                iblockCode.append(tr("\n\t\t\t""end"));
                iblockCode.append(tr("\n\t\t""else"));
                iblockCode.append(tr("\n\t\t\t""begin"));
                iblockCode.append(tr("\n\t\t\t%1").arg(iportRegEvaluationStrList.join("\n\t\t\t")));
                iblockCode.append(tr("\n\t\t\t""end"));
                iblockCode.append(tr("\n\tend"));
 
            }
            else
            {
 
                iblockCode.append(tr("\n\n\t""always@(posedge %1)").arg(pchain->getscaningPortClock()));
                iblockCode.append(tr("\n\t""begin"));
                iblockCode.append(tr("\n\t\t%1").arg(iportRegEvaluationStrList.join("\n\t\t")));
                iblockCode.append(tr("\n\t""end"));
 
            }
 
            iaddedCode.append(iblockCode);
 
 
            //7、加入 将 TDO 载入 reg 的代码
            // 找到时钟对应关系 , 定义有关 tdo 需要的 wire 和 生成 相关寄存器的语句
            // 并找到clock 和 reset 信号 的 时钟沿变化关系 定义相关的寄存器
            /*
              reg ......
              always@(posedge clock or negedge restn)
                if(!restn)
                    reg_n <= 0;
                else
                    reg_n <= wire tdo;
 
              always@(posedge clock or negedge restn)
                if(!restn)
                    reg_n <= 0;
                else
                    reg_n <= wire tdo;
            */
 
            //8、加入将端口保存的代码  在加入扫描链的界面 上 提供所有端口 和 clock 的对应关系
            // 根据 端口所在时钟个数 加入  并定义相关的寄存器  reg_n
            /*always@(posedge clock or negedge restn)
              if(!restn)
                  reg_n <= 0;
              else
                  reg_n <= wire tdo;
            */
 
 
            //9、在 endmodule 位置之前插入 timer 例化的代码 ;  不进行 例化名字 的重新改写,如果重复 直接报错 ,应该概率超级小
            // itoutCore
            /*
            itoutCore itoutCore_chainName_inst(
                    .clock(慢时钟名字),
                    .reset(module中复位信号名字),
                    .Tout_reg(wire_tout名)
                    );
            */
 
            QString itoutInstanceCode ;
            itoutInstanceCode.append("\n\n\t");
 
            itoutInstanceCode.append(EziDebugScanChain::getChainToutCore());
            QString itoutInstanceName(EziDebugScanChain::getChainToutCore() + tr("_%1_inst").arg(pchain->getChainName()));
 
            QString ireset = "1'b0";
            QString iclock ;
 
            QMap<QString,QString> iparentClockMap = pparentMoudle->getClockSignal();
            QMap<QString,QString>::const_iterator iparentClockIter = iparentClockMap.constBegin() ;
            while(iparentClockIter != iparentClockMap.constEnd())
            {
                iclock = iparentClockIter.key();
                ++iparentClockIter ;
            }
 
 
            if(pchain->getSlowClock().isEmpty())
            {
                if(iclockMap.count() > 1)
                {
 
                    qDebug() << "Error: There is two or more Clock Signal,Please Input the Tout Clock!";
                    close();
                    return 1 ;
                }
                else
                {
                    // .rstn_out (_EziDebug_chn_rstn_w ),
                    if(iclockMap.count() == 1)
                    {
 
                        itoutInstanceCode.append(tr(" ")+itoutInstanceName+tr("(\n\t\t"".clock(%1),\n\t\t"".reset(%2),\n\t\t"".rstn_out(%3),\n\t\t"".TOUT_reg(%4)\n\t);")\
                                             .arg(iclock).arg(ireset).arg(iresetnWireName).arg(itoutWireName));
 
 
                    }
                    else
                    {
                        qDebug() << "Error: There is no Clock Signal In moudle:" << pitem->getModuleName();
                        close();
                        return 1 ;
                    }
                }
            }
            else
            {
                itoutInstanceCode.append(tr(" ")+itoutInstanceName+tr("(\n\t\t"".clock(%1),\n\t\t"".reset(%2),\n\t\t"".rstn_out(%3),\n\t\t"".TOUT_reg(%4)\n\t);")\
                                         .arg(pchain->getSlowClock()).arg(ireset).arg(iresetnWireName).arg(itoutWireName));
            }
 
            iaddedCode.append(itoutInstanceCode) ;
 
            ifileData.insert(imodulePos.m_nendModuleKeyWordPos + noffSet ,iaddedCode);
            /*删除代码方法 itoutCore /s+ itoutInstanceName \s+ ( 任意字符 ) /s+ ;*/
            iaddedCodeList.append(EziDebugScanChain::getChainToutCore()+tr("\\s+")+itoutInstanceName+tr("\\(")+tr(".+")+tr("\\)")+tr("\\s*;"));
 
        }
        else
        {
            iinstancePosMap.remove(pitem->getInstanceName());
            delete pinstanceSt ;
            close();
            return 1 ;
        }
 
        //10、写入文件
 
        pchain->addToLineCodeMap(pitem->parent()->getModuleName(),iaddedCodeList);
        pchain->addToBlockCodeMap(pitem->parent()->getModuleName(),iaddedBlockCodeList);
 
        if(!open(QIODevice::WriteOnly|QIODevice::Text|QIODevice::Truncate))
        {
            qDebug() << "Cannot Open file for writing:" << qPrintable(this->errorString());
            return 1 ;
        }
 
        QTextStream iout(this);
 
        iout << ifileData  ;
        close();
 
        ilastModifedTime = ifileInfo.lastModified() ;
        modifyStoredTime(ilastModifedTime);
        // 释放内存
        iinstancePosMap.remove(pitem->getInstanceName());
        delete pinstanceSt ;
        return 0 ;
 
    }
    else if(InsertUserCore == type)
    {
        int nwireCount = pmodule->getEziDebugWireCounts(pchain->getChainName()) ;
        QStringList iaddedCodeList ;
        QStringList iaddedBlockCodeList ;
        QString iparentToutPort(tr("_EziDebug_%1_TOUT_reg").arg(pchain->getChainName())) ;
 
        struct SEARCH_STRING_STRUCTURE iModuleKeyWordSt ;
        iModuleKeyWordSt.m_etype = SearchModuleKeyWordPos ;
        iModuleKeyWordSt.m_icontent.m_imodulest.m_eportAnnounceFormat = NonAnsicFormat ;
        // 父节点的 的 module name
        strcpy(iModuleKeyWordSt.m_icontent.m_imodulest.m_amoduleName,pitem->getModuleName().toAscii().data());
        //  module 名
        int nmoduleKeyWordStartPos = 0 ;
        /*找到  定义本 module 的开始位置  */
        if(skipCommentaryFind(ifileData,0,iModuleKeyWordSt,nmoduleKeyWordStartPos))
        {
            close();
            return 1 ;
        }
 
        QString imodulePortCode ;
        // 判断这个  module 在本条扫描链 中 是否 被加入过了
        // 如果加过了,则直接跳到 加自定义 core 的地方 加代码
        if(!pmodule->getAddCodeFlag())
        {
            //  根据标准或者非标准 加入 本 moudle 的 新增端口  每个clock对应的(TDI TDO) 和 TOUT
            //clockname 为 module 里面的 clock 名字
            QMap<QString,QString>::const_iterator clockMapIterator = iclockMap.constBegin();
            imodulePortCode.append("\n\t\t") ;
            while(clockMapIterator != iclockMap.constEnd())
            {
                // 根据 module 里面多少个 时钟, 创建 多少个 和
                //  [bitwidth-1:0] _EziDebug_chainname_clockname_TDI_reg or _EziDebug_chainname_clockname_TDI_reg
                //  [bitwidth-1:0] _EziDebug_chainname_clockname_TDO_reg or _EziDebug_chainname_clockname_TDO_reg
                //  _EziDebug_chainname_TOUT_reg
 
                //  加入定义 线  tdo_wire 的代码  // 位宽、多少个 wire(clock 个数)
                // wire _EziDebug_chainName_tdo_wire序号[number:0] ;\n
 
                if(AnsicFormat == iModuleKeyWordSt.m_icontent.m_imodulest.m_eportAnnounceFormat)
                {
                    if((chainStructuremap.value(clockMapIterator.key())->m_untotalChainNumber) > 1)
                    {
                        QString iportName = tr(", input [%1:0] _EziDebug_%2_%3_TDI_reg ,\n\t""output [%4:0] _EziDebug_%5_%6_TDO_reg")\
                                .arg(chainStructuremap.value(clockMapIterator.key())->m_untotalChainNumber - 1).arg(pchain->getChainName()).arg(clockMapIterator.key())\
                                .arg(chainStructuremap.value(clockMapIterator.key())->m_untotalChainNumber - 1).arg(pchain->getChainName()).arg(clockMapIterator.key());
 
                        imodulePortCode.append(iportName);
                        //[ %1 : 0 ] _EziDebug_%2_%3_TDI_reg
                        iaddedCodeList.append(tr(",\\s*input\\s*\\[\\s*%1\\s*:\\s*0\\s*\\]\\s+_EziDebug_%2_%3_TDI_reg").arg(chainStructuremap.value(clockMapIterator.key())->m_untotalChainNumber - 1).arg(pchain->getChainName()).arg(clockMapIterator.key()));
                        //[ %1 : 0 ] _EziDebug_%2_%3_TDO_reg
                        iaddedCodeList.append(tr(",\\s*output\\s*\\[\\s*%1\\s*:\\s*0\\s*\\]\\s+_EziDebug_%2_%3_TDO_reg").arg(chainStructuremap.value(clockMapIterator.key())->m_untotalChainNumber - 1).arg(pchain->getChainName()).arg(clockMapIterator.key()));
                    }
                    else
                    {
                        imodulePortCode.append(tr(", input _EziDebug_%1_%2_TDI_reg ,\n\t""ouput_EziDebug_%3_%4_TDO_reg ,\n\t""input_EziDebug_%5_TOUT_reg")\
                                .arg(pchain->getChainName()).arg(clockMapIterator.key()).arg(pchain->getChainName()).arg(clockMapIterator.key()).arg(pchain->getChainName()));
                        iaddedCodeList.append(tr(",\\s*_EziDebug_%1_%2_TDI_reg\\s*").arg(pchain->getChainName()).arg(clockMapIterator.key()));
                        iaddedCodeList.append(tr(",\\s*_EziDebug_%1_%2_TDO_reg\\s*").arg(pchain->getChainName()).arg(clockMapIterator.key()));
                    }
                }
                else if(NonAnsicFormat == iModuleKeyWordSt.m_icontent.m_imodulest.m_eportAnnounceFormat)
                {
                    imodulePortCode.append(tr(",\n\t_EziDebug_%1_%2_TDI_reg ,\n\t""_EziDebug_%3_%4_TDO_reg")\
                            .arg(pchain->getChainName()).arg(clockMapIterator.key()).arg(pchain->getChainName()).arg(clockMapIterator.key()));
                    iaddedCodeList.append(tr(",\\s*_EziDebug_%1_%2_TDI_reg").arg(pchain->getChainName()).arg(clockMapIterator.key()));
                    iaddedCodeList.append(tr(",\\s*_EziDebug_%1_%2_TDO_reg").arg(pchain->getChainName()).arg(clockMapIterator.key()));
 
                }
                else
                {
                    close();
                    return 1 ;
                }
                /*构造字符串*/
                ++clockMapIterator ;
            }
 
            if(AnsicFormat == iModuleKeyWordSt.m_icontent.m_imodulest.m_eportAnnounceFormat)
            {
                imodulePortCode.append(tr(",\n\t""input _EziDebug_%1_rstn"",\n\t""input _EziDebug_%2_TOUT_reg").arg(pchain->getChainName()).arg(pchain->getChainName())) ;
                iaddedCodeList.append(tr(",\\s*input\\s+_EziDebug_%1_rstn").arg(pchain->getChainName()));
                iaddedCodeList.append(tr(",\\s*input\\s+_EziDebug_%2_TOUT_reg").arg(pchain->getChainName()));
            }
            else
            {
                imodulePortCode.append(tr(",\n\t_EziDebug_%1_rstn,\n\t""_EziDebug_%2_TOUT_reg").arg(pchain->getChainName()).arg(pchain->getChainName())) ;
                iaddedCodeList.append(tr(",\\s*_EziDebug_%1_rstn").arg(pchain->getChainName()));
                iaddedCodeList.append(tr(",\\s*_EziDebug_%1_TOUT_reg").arg(pchain->getChainName()));
            }
 
            ifileData.insert(nmoduleKeyWordStartPos,imodulePortCode);
        }
 
        /*1、END 插入端口声明代码*/
 
        struct SEARCH_MODULE_POS_STRUCTURE imodulePos ;
        strcpy(imodulePos.m_amoduleName,iModuleKeyWordSt.m_icontent.m_imodulest.m_amoduleName);
 
        imodulePos.m_nendModuleKeyWordPos = -1 ;
        /*根据 端口声明的方式  决定是否搜索 端口*/
        imodulePos.m_eportFormat = iModuleKeyWordSt.m_icontent.m_imodulest.m_eportAnnounceFormat ;
        imodulePos.m_nlastRegKeyWordPos = -1 ;
        imodulePos.m_nlastPortKeyWordPos = -1 ;
        imodulePos.m_nlastWireKeyWordPos = -1 ;
        imodulePos.m_nnextRightBracketPos = nmoduleKeyWordStartPos ;
 
        QMap<QString,SEARCH_INSTANCE_POS_STRUCTURE*> iinstancePosMap ;
        int  nnumberOfNoLibCore = 0 ;
 
        // 遍历 本节点下面 的所有子节点
        for(int count = 0 ; count< pitem->childCount() ;count++ )
        {
            EziDebugInstanceTreeItem* pchildItem =  pitem->child(count) ;
            EziDebugPrj *prj = const_cast<EziDebugPrj*>(EziDebugInstanceTreeItem::getProject()) ;
            EziDebugModule *pchildModule = prj->getPrjModuleMap().value(pchildItem->getModuleName()) ;
            if(!pchildModule->isLibaryCore())
            {
                struct SEARCH_INSTANCE_POS_STRUCTURE *pinstanceSt = (struct SEARCH_INSTANCE_POS_STRUCTURE *)operator new(sizeof(struct SEARCH_INSTANCE_POS_STRUCTURE)) ;
                strcpy(pinstanceSt->m_amoduleName,pchildItem->getModuleName().toAscii().data());
                strcpy(pinstanceSt->m_ainstanceName,pchildItem->getInstanceName().toAscii().data());
                pinstanceSt->m_einstanceFormat = NonStardardFormat ;
                pinstanceSt->m_nnextRightBracketPos = -1 ;
                iinstancePosMap.insert(pchildItem->getInstanceName(),pinstanceSt);
                nnumberOfNoLibCore++ ;
            }
        }
 
        QString ilastTdoWire ; // 保存上一个 tdo 用于 连接 两个 instance 之间 的 端口
        QString itdoWire ;
        imodulePortCode.clear();
 
        // 找到 lastreg 、lastwire
        if(matchingTargetString(ifileData,imodulePos,iinstancePosMap))
        {
            // 释放内存
            QMap<QString,SEARCH_INSTANCE_POS_STRUCTURE*>::iterator i = iinstancePosMap.begin();
            while(i != iinstancePosMap.end())
            {
                struct SEARCH_INSTANCE_POS_STRUCTURE *pinstanceSt = i.value();
                delete pinstanceSt ;
                ++i ;
            }
            iinstancePosMap.clear();
            close();
            return 1 ;
        }
 
 
        if(!pmodule->getAddCodeFlag())
        {
            /*根据需要来 插入 TDI、TOUT、TDO 端口定义 */
            if(NonAnsicFormat == iModuleKeyWordSt.m_icontent.m_imodulest.m_eportAnnounceFormat)
            {
                /*定义端口*/
                QMap<QString,QString>::const_iterator i = iclockMap.constBegin();
                while(i != iclockMap.constEnd())
                {
                    // 根据 module 里面多少个 时钟, 创建 多少个 和
                    //  input  [bitwidth-1:0] _EziDebug_clockname_TDI_reg ; or input _EziDebug_clockname_TDI_reg ;
                    //  output [bitwidth-1:0] _EziDebug_clockname_TDO_reg ; or output _EziDebug_clockname_TDO_reg ;
                    //  input  _EziDebug_TOUT_reg ;
 
                    if((chainStructuremap.value(i.key())->m_untotalChainNumber) > 1)
                    {
                        QString iportName = tr("\n\t""input [%1:0] _EziDebug_%2_%3_TDI_reg ;\n\t""output [%4:0] _EziDebug_%5_%6_TDO_reg ;")\
                                .arg(chainStructuremap.value(i.key())->m_untotalChainNumber - 1).arg(pchain->getChainName()).arg(i.key())\
                                .arg(chainStructuremap.value(i.key())->m_untotalChainNumber - 1).arg(pchain->getChainName()).arg(i.key());
 
                        imodulePortCode.append(iportName);
                        //input [ %1 : 0 ] _EziDebug_%2_%3_TDI_reg
                        iaddedCodeList.append(tr("\\binput\\s*\\[\\s*%1\\s*:\\s*0\\s*\\]\\s+_EziDebug_%2_%3_TDI_reg\\s*;").arg(chainStructuremap.value(i.key())->m_untotalChainNumber - 1).arg(pchain->getChainName()).arg(i.key()));
                        //output [ %1 : 0 ] _EziDebug_%2_%3_TDO_reg
                        iaddedCodeList.append(tr("\\boutput\\s*\\[\\s*%1\\s*:\\s*0\\s*\\]\\s+_EziDebug_%2_%3_TDO_reg\\s*;").arg(chainStructuremap.value(i.key())->m_untotalChainNumber - 1).arg(pchain->getChainName()).arg(i.key()));
                    }
                    else
                    {
                        QString iportName = tr("\n\t""input _EziDebug_%1_%2_TDI_reg ;\n\t""output _EziDebug_%3_%4_TDO_reg ;")\
                                .arg(pchain->getChainName()).arg(i.key())\
                                .arg(pchain->getChainName()).arg(i.key());
 
                        imodulePortCode.append(iportName);
                        //input _EziDebug_%1_%2_TDI_reg
                        iaddedCodeList.append(tr("\\binput\\s+_EziDebug_%1_%2_TDI_reg\\s*;").arg(pchain->getChainName()).arg(i.key()));
                        //output _EziDebug_%1_%2_TDO_reg
                        iaddedCodeList.append(tr("\\boutput\\s+_EziDebug_%1_%2_TDO_reg\\s*;").arg(pchain->getChainName()).arg(i.key()));
                    }
 
                    /*构造字符串*/
                    ++i ;
                }
                imodulePortCode.append(tr("\n\t""input _EziDebug_%1_TOUT_reg ;").arg(pchain->getChainName())) ;
                iaddedCodeList.append(tr("\\binput\\s+_EziDebug_%1_TOUT_reg\\s*;").arg(pchain->getChainName()));
 
                // _EziDebug_%1_rstn
                imodulePortCode.append(tr("\n\t""input _EziDebug_%1_rstn ;").arg(pchain->getChainName())) ;
                iaddedCodeList.append(tr("\\binput\\s+_EziDebug_%1_rstn\\s*;").arg(pchain->getChainName()));
 
                // 在最后一个端口声明之前加入  EziDebug 端口 TDI TDO TOUT 的声明
                ifileData.insert(imodulePos.m_nlastPortKeyWordPos ,imodulePortCode);
                noffSet += imodulePortCode.size() ;
            }
 
            QString itdoWireDefinitionCode ;
            QString iinstanceCode ;
 
            QString iclockString ;
            QString iresetString ;
            QString iresetRegStr ;
            QString ievaluateRegStr ;
            QString isysCoreCode ;
            QString iregDefinitionCode ;
            QString iinstanceExp ;
 
            int nnonCoreNum = 0 ;
            int nFirstnonCoreNum = 0 ;
 
            // 遍历 本节点下面 的所有子节点
            for(int i = 0 ; i< pitem->childCount() ;i++ )
            {
                int m = 0 ;
                EziDebugInstanceTreeItem* pchildItem =  pitem->child(i) ;
                EziDebugPrj *prj = const_cast<EziDebugPrj *>(EziDebugInstanceTreeItem::getProject()) ;
                EziDebugModule *pchildModule = prj->getPrjModuleMap().value(pchildItem->getModuleName()) ;
                QMap<QString,QString> ichildModulePortMap = pmodule->getInstancePortMap(pchildItem->getInstanceName()) ;
                itdoWireDefinitionCode.clear();
                iinstanceCode.clear();
                itdoWire.clear();
                iinstanceExp.clear();
                if(!pchildModule->isLibaryCore())
                {
                    nnonCoreNum++ ;
                    iinstanceCode.append("\n\t\t") ;
                    /*在子模块例化中添加 新增的EziDebug端口代码 需要子节点与父模块的时钟相同*/
                    QMap<QString,QString> ichildClockMap = pchildModule->getClockSignal();
                    if(!ichildClockMap.count())
                    {
                        continue ;
                    }
                    nFirstnonCoreNum++ ;
                    nwireCount++ ;
                    /*根据 非系统core 子例化 加入代码:定义 wire 的代码  用于连接 各个例化 端口、例化模块代码的 端口插入代码*/
                    struct SEARCH_INSTANCE_POS_STRUCTURE *pinstSt = iinstancePosMap.value(pchildItem->getInstanceName());
 
                    QMap<QString,QString>::const_iterator p = ichildClockMap.constBegin();
                    while(p != ichildClockMap.constEnd())
                    {
                        QString iparentTdiPort ;
                        QString iparentTdoPort ;
 
                        QString iparentClock = pitem->getModuleClockMap(pchildItem->getInstanceName()).key(p.key(),QString()) ;
                        if(iparentClock.isEmpty())
                        {
                            // 释放内存
                            QMap<QString,SEARCH_INSTANCE_POS_STRUCTURE*>::iterator i = iinstancePosMap.begin();
                            while(i != iinstancePosMap.end())
                            {
                                struct SEARCH_INSTANCE_POS_STRUCTURE *pinstanceSt = i.value();
                                delete pinstanceSt ;
                                ++i ;
                            }
                            iinstancePosMap.clear();
                            close();
                            return 1 ;
                        }
                        else
                        {
                            iparentTdiPort.append(tr("_EziDebug_%1_%2_TDI_reg").arg(pchain->getChainName()).arg(iparentClock));
                            iparentTdoPort.append(tr("_EziDebug_%1_%2_TDO_reg").arg(pchain->getChainName()).arg(iparentClock));
                        }
 
                        // 定义用于连接  例化新增端口的 wire
                        if((chainStructuremap.value(iparentClock)->m_untotalChainNumber) > 1)
                        {
                            /*1、加入 定义 wire TDO 根据不同的 clock 定义的代码*/
                            itdoWireDefinitionCode.append(tr("\n\t""wire [%1:0] _EziDebug_%2_%3_tdo%4 ;").arg(chainStructuremap.value(iparentClock)->m_untotalChainNumber-1).arg(pchain->getChainName()).arg(iparentClock).arg(nwireCount));
                            itdoWire.append(tr("_EziDebug_%1_%2_tdo%3").arg(pchain->getChainName()).arg(iparentClock).arg(nwireCount));
                            iaddedCodeList.append(tr("\\bwire\\s*") + tr("\\[\\s*%1\\s*:\\s*0\\s*\\]\\s*").arg(chainStructuremap.value(iparentClock)->m_untotalChainNumber-1) +tr("_EziDebug_%1_%2_tdo%3\\s*;").arg(pchain->getChainName()).arg(iparentClock).arg(nwireCount));
                        }
                        else
                        {
                            /*1、加入 定义 wire TDO 根据不同的 clock 定义的代码*/
                            itdoWireDefinitionCode.append(tr("\n\t""wire _EziDebug_%1_%2_tdo%3 ;").arg(pchain->getChainName()).arg(iparentClock).arg(nwireCount));
                            itdoWire.append(tr("_EziDebug_%1_%2_tdo%3").arg(pchain->getChainName()).arg(iparentClock).arg(nwireCount));
                            iaddedCodeList.append(tr("\\bwire\\s+") +tr("_EziDebug_%1_%2_tdo%3\\s*;").arg(pchain->getChainName()).arg(iparentClock).arg(nwireCount));
                        }
 
                        // 根据例化 书写格式  填入新增端口以及端口连接代码
                        if(StardardForamt == pinstSt->m_einstanceFormat)
                        {
 
                            /*判断 时钟 是否  对应  找到 并将 module 的 clock 的那个 TDI 与 端口 相连 */
                            // 第一个 instance 的 tdi 与 module 对应 clock 的 tdi 相连 , tdo 与 下一个 instance 相连 或者  本module 自定义的  core 相连
                            if(1 == nFirstnonCoreNum)
                            {
                                /*非最后1个 no libcore instance*/
                                // 第一个 instance 的 tdi 与 module 对应 clock 的 tdi 相连 , tdo 与 下一个 instance
                                QString iportName = tr(" ,\n\t""._EziDebug_%1_%2_TDI_reg(%3) ,\n\t""._EziDebug_%4_%5_TDO_reg(%6)")\
                                        .arg(pchain->getChainName()).arg(p.key()).arg(iparentTdiPort).arg(pchain->getChainName()).arg(p.key()).arg(itdoWire);
                                iinstanceCode.append(iportName);
 
 
                                iinstanceExp.append(tr("\\s*,\\s*._EziDebug_%1_%2_TDI_reg\\s*\\(\\s*%3\\s*\\)").arg(pchain->getChainName()).arg(p.key()).arg(iparentTdiPort));
                                iinstanceExp.append(tr("\\s*,\\s*._EziDebug_%1_%2_TDO_reg\\s*\\(\\s*%3\\s*\\)").arg(pchain->getChainName()).arg(p.key()).arg(itdoWire));
                            }
                            else
                            {
                                //第一个 instance 的 tdi 与 module 对应 clock 的 tdi 相连,本module 自定义的  core 相连
                                // 其余的 instance 的 tdi 与 上一个 instance 的 tdo 相连 , tdo 与 下一个  instacne 相连 或者 本 module  自定义的 core 相连
                                QString iportName = tr(" ,\n\t""._EziDebug_%1_%2_TDI_reg(%3) ,\n\t""._EziDebug_%4_%5_TDO_reg(%6)")\
                                        .arg(pchain->getChainName()).arg(p.key()).arg(ilastTdoWire).arg(pchain->getChainName()).arg(p.key()).arg(itdoWire);
                                iinstanceCode.append(iportName);
 
                                // TDI 和  上一个  例化的
                                iinstanceExp.append(tr("\\s*,\\s*._EziDebug_%1_%2_TDI_reg\\s*\\(\\s*%3\\s*\\)").arg(pchain->getChainName()).arg(p.key()).arg(ilastTdoWire));
                                iinstanceExp.append(tr("\\s*,\\s*._EziDebug_%1_%2_TDO_reg\\s*\\(\\s*%3\\s*\\)").arg(pchain->getChainName()).arg(p.key()).arg(itdoWire));
 
                            }
 
                        }
                        else if(NonStardardFormat == pinstSt->m_einstanceFormat)
                        {
 
                            // 第一个 instance 的 tdi 与 module 对应 clock 的 tdi 相连 , tdo 与 下一个 instance 相连 或者  本module 自定义的  core 相连
                            // 其余的 instance 的 tdi 与 上一个 instance 的 tdo 相连 , tdo 与 下一个  instacne 相连 或者 本 module  自定义的 core 相连
                            if(1 == nFirstnonCoreNum) // 原来 为 i ,本意为 第一个 非系统例化 i = 0 只能保证是第一个 例化(有可能为 第一个 为 系统例化  第二个为  非系统例化 但 第二个 的 tdi 需要 与 端口 tdi 相连)
                            {
                                QString iportName = tr(" , %1 , %2 ").arg(iparentTdiPort).arg(itdoWire) ;
                                iinstanceCode.append(iportName);
                                iportName.replace(" ","\\s*");
                                iinstanceExp.append(iportName);
                            }
                            else
                            {
                                QString iportName = tr(" , %1 , %2 ").arg(ilastTdoWire).arg(itdoWire) ;
                                iinstanceCode.append(iportName);
                                iportName.replace(" ","\\s*");
                                iinstanceExp.append(iportName);
                            }
                        }
                        else
                        {
                            // 释放内存
                            QMap<QString,SEARCH_INSTANCE_POS_STRUCTURE*>::iterator i = iinstancePosMap.begin();
                            while(i != iinstancePosMap.end())
                            {
                                struct SEARCH_INSTANCE_POS_STRUCTURE *pinstanceSt = i.value();
                                iinstancePosMap.remove(i.key());
                                delete pinstanceSt ;
                            }
                            close();
                            return 1 ;
                        }
 
                        /*当到了最后1个非系统例化时  保存当前的的最后 1 根 tdo wire ,它需要与后面添加 EziDebug 自定义例化的 tdi相连 */
                        if(nnonCoreNum == nnumberOfNoLibCore)
                        {
                            /*保存最后的 clock 与 wire名称 的对应关系*/
                            pmodule->AddToClockWireNameMap(pchain->getChainName(),iparentClock,itdoWire);
                        }
 
                        ++p ;
                        //num++;
                    }
 
                    if(StardardForamt == pinstSt->m_einstanceFormat)
                    {
                        iinstanceCode.append(tr(",\n\t""._EziDebug_%1_rstn(_EziDebug_%2_rstn)").arg(pchain->getChainName()).arg(pchain->getChainName())) ;
                        iinstanceExp.append(tr("\\s*,\\s*._EziDebug_%1_rstn\\s*\\(\\s*_EziDebug_%2_rstn\\s*\\)").arg(pchain->getChainName()).arg(pchain->getChainName()));
 
                        iinstanceCode.append(tr(",\n\t""._EziDebug_%1_TOUT_reg(%2)").arg(pchain->getChainName()).arg(iparentToutPort)) ;
                        iinstanceExp.append(tr("\\s*,\\s*._EziDebug_%1_TOUT_reg\\s*\\(\\s*%2\\s*\\)").arg(pchain->getChainName()).arg(iparentToutPort));
                    }
                    else
                    {
                        QString iportName = tr(", _EziDebug_%1_rstn , %2").arg(pchain->getChainName()).arg(iparentToutPort) ;
                        iinstanceCode.append(iportName) ;
                        iinstanceExp.append(tr("\\s*,\\s*_EziDebug_%1_rstn\\s*,\\s*%2").arg(pchain->getChainName()).arg(iparentToutPort));
                    }
 
 
                    iaddedCodeList.append(iinstanceExp);
 
                    ifileData.insert(pinstSt->m_nstartPos + noffSet,itdoWireDefinitionCode);
                    noffSet += itdoWireDefinitionCode.size() ;
                    ifileData.insert(pinstSt->m_nnextRightBracketPos + noffSet,iinstanceCode);
                    noffSet += iinstanceCode.size() ;
 
 
                    /*保存最后一根 Tdo 的 线 名称 */
 
 
                    // 记录上一次的一根线的名字,用于下一次的连接
                    ilastTdoWire = itdoWire ;
                }
                else
                {
                    QMap<QString,QString> iinstancePortMap = pmodule->getInstancePortMap(pchildItem->getInstanceName());
 
                    /*根据 系统core 子例化  加入代码:定义 寄存器 reg_n 代码、将输出端口信号载入寄存器代码  */
                    /*从module 中 获得 所有的 输出端口(位宽、大小端) 及其 时钟名 、时钟跳变方向、*/
                    QVector<EziDebugModule::PortStructure*> iportVec =  pchildModule->getPort(iprj,pchildItem->getInstanceName());
                    int nportCount = 0 ;
                    for(; nportCount < iportVec.count() ; nportCount++)
                    {
                        if((EziDebugModule::directionTypeOutput == iportVec.at(nportCount)->eDirectionType)||(EziDebugModule::directionTypeInoutput == iportVec.at(nportCount)->eDirectionType))
                        {
#if 0
                            QString iportName = iinstancePortMap.value(QString::fromAscii(iportVec.at(nportCount)->m_pPortName),QString());
                            if(iportName.isEmpty())
                            {
                                // 释放内存
                                QMap<QString,SEARCH_INSTANCE_POS_STRUCTURE*>::iterator j = iinstancePosMap.begin();
                                while(j != iinstancePosMap.end())
                                {
                                    struct SEARCH_INSTANCE_POS_STRUCTURE *pinstanceSt = j.value();
                                    iinstancePosMap.remove(j.key());
                                    delete pinstanceSt ;
                                }
                                goto ErrorHandle ;
                            }
#else
                            QString iportName = QString::fromAscii(iportVec.at(nportCount)->m_pPortName)   ;
                            QString icomPortName = pchildItem->getItemHierarchyName() + iportName ;
#endif
 
                            if(iportVec.at(nportCount)->m_unBitwidth > 1)
                            {
                                iregDefinitionCode.append(tr("\n\t""reg [%1:%2] _EziDebug_%3_%4_r %5 ;").arg(iportVec.at(nportCount)->m_unStartBit).arg(iportVec.at(nportCount)->m_unEndBit).arg(pchain->getChainName()).arg(QString::fromAscii(iportVec.at(nportCount)->m_pPortName)).arg(inoSynCode));
                                //isysCoreCode.append(iregDefinitionCode);
                                iaddedCodeList.append(tr("\\breg\\s*\\[\\s*%1\\s*:\\s*%2\\s*\\]\\s*_EziDebug_%3_%4_r.+;").arg(iportVec.at(nportCount)->m_unStartBit).arg(iportVec.at(nportCount)->m_unEndBit).arg(pchain->getChainName()).arg(QString::fromAscii(iportVec.at(nportCount)->m_pPortName)));
                            }
                            else
                            {
                                iregDefinitionCode.append(tr("\n\t""reg _EziDebug_%1_%2_r %3 ;").arg(pchain->getChainName()).arg(QString::fromAscii(iportVec.at(nportCount)->m_pPortName)).arg(inoSynCode));
                                //isysCoreCode.append(iregDefinitionCode);
                                iaddedCodeList.append(tr("\\breg\\s+_EziDebug_%1_%2_r\\s*.+;").arg(pchain->getChainName()).arg(QString::fromAscii(iportVec.at(nportCount)->m_pPortName)));
                            }
 
 
                            QString iregName(tr("_EziDebug_%1_%2_r").arg(pchain->getChainName()).arg(QString::fromAscii(iportVec.at(nportCount)->m_pPortName))) ;
 
 
                            QString iregWireName = ichildModulePortMap.value(QString::fromAscii(iportVec.at(nportCount)->m_pPortName),QString());
 
                            //qDebug() << "EziDebug info:sys core wire name:" << iregWireName ;
                            if((iregWireName.isEmpty()|(QRegExp(tr("^\\d+$")).exactMatch(iregWireName.toLower()))\
                                |(QRegExp(tr("^\\d+'[bhd][\\da-f]+$")).exactMatch(iregWireName.toLower()))\
                                |(QRegExp(tr("^`[ho][\\da-f]+$")).exactMatch(iregWireName.toLower()))
                                |(iregWireName.toLower()== "null")))
                            {
                                continue ;
                            }
 
                            QStringList iportList ;
                            iportList << pitem->getItemHierarchyName() << icomPortName  << iregName << QString::number(iportVec.at(nportCount)->m_unBitwidth)  ;
 
                            pchain->addToSyscoreOutputPortList(iportList.join(tr("#")));
 
 
                            //iresetRegStr.append(tr("\n\t\t%1 <= 0 ;").arg(iregName));
                            iresetRegStr.clear();
                            ievaluateRegStr.append(tr("\n\t\t%1 <= %2 ;").arg(iregName).arg(iregWireName));
 
 
                            if(m == 0)
                            {
                                iaddedBlockCodeList.append(tr("%1\\s*<=\\s*%2\\s*;").arg(iregName).arg(iregWireName));
                            }
                            m++ ;
 
                        }
                    }
                }
            }
 
            if(!ievaluateRegStr.isEmpty())
            {
                isysCoreCode.append(iregDefinitionCode);
                /*统一加入 寄存器 载入 代码块*/
 
                /*根据 pchain 中保存的  clock list 找到 与扫描端口的时钟 对应的本模块的时钟 */
                if(iclockMap.count() == 1)
                {
                    QMap<QString,QString>::const_iterator iclockIterator = iclockMap.constBegin();
                    while(iclockIterator != iclockMap.constEnd())
                    {
                        iclockString.append(tr("%1 %2").arg(QObject::tr("posedge")).arg(iclockIterator.key()));
                        ++iclockIterator ;
                    }
                }
                else
                {
                    close();
                    return 1 ;
                }
 
                QString iprocessCode ;
 
                iprocessCode.append((tr("\n\n\t""always@(%1)").arg(iclockString)));
                iprocessCode.append(tr("\n\t""begin"));
                iprocessCode.append(tr("%1").arg(ievaluateRegStr));
                iprocessCode.append(tr("\n\t""end"));
 
 
                /*保存删除代码信息*/
                isysCoreCode.append(iprocessCode);
            }
            /*写入文件*/
            ifileData.insert(imodulePos.m_nendModuleKeyWordPos + noffSet ,isysCoreCode);
            noffSet += isysCoreCode.size() ;
        }
 
 
        // 释放内存
        QMap<QString,SEARCH_INSTANCE_POS_STRUCTURE*>::iterator iinstanceIter = iinstancePosMap.begin();
        while(iinstanceIter != iinstancePosMap.end())
        {
            struct SEARCH_INSTANCE_POS_STRUCTURE *pinstanceSt = iinstanceIter.value();
            delete pinstanceSt ;
            ++iinstanceIter;
        }
        iinstancePosMap.clear();
 
#if 0
        if(fileName().endsWith("ifft.v"))
        {
            qDebug("add chain in ifft.v");
        }
#endif
        int nwireShiftRegNum = 0 ;
        int nlastChainStartNum = 0 ;
        int nlastChainEndNum = 0 ;
        int nchainStartNum = 0 ;
        int nchainEndNum = 0 ;
        int nusedNum = 0  ;
        QVector<EziDebugModule::RegStructure*> sregVec ;
        QVector<EziDebugModule::RegStructure*> vregVec ;
        QString ilastInput ;
 
        QString iusrCoreCode ;
 
        // 遍历所有时钟 去添加相应时钟的扫描链
        QMap<QString,QString>::const_iterator iclockIterator = iclockMap.constBegin();
        while(iclockIterator != iclockMap.constEnd())
        {
            EziDebugInstanceTreeItem::SCAN_CHAIN_STRUCTURE* pchainSt = chainStructuremap.value(iclockIterator.key()) ;
 
            int nSregNum = 0 ;
            int nVregNum = 0 ;
 
            // 已经添加的 EziDebug core 的个数
            int ninstNum = pmodule->getEziDebugCoreCounts(pchain->getChainName()) ;
            int nleftRegNum = 0 ;
            int nregBitCount = 0 ;
            int nleftBit = -1 ;
            int nlastStopNum =  0 ;
            int nRegNum = 0 ;
            bool isNeedAdded = false ;
            ilastInput.clear();
 
            if(!pmodule->getAllRegMap(iclockIterator.key(),sregVec,vregVec))
            {
                qDebug() << "EeziDebug Error: Insert Chain Error!";
                return 1 ;
            }
 
            // 没有寄存器 直接看 next clock 是否有 reg
            if((!sregVec.count())&&(!vregVec.count()))
            {
                // 不用加任何代码 ,不用记录当前的 链号
                ++iclockIterator ;
                continue ;
            }
 
            // 计算固定位宽所有寄存器的bit总合
            int nregCount = 0 ;
 
            if(pchainSt->m_unleftRegNumber == 0)
            {
               pchainSt->m_unleftRegNumber =  iprj->getMaxRegNumPerChain() ;
               pchainSt->m_uncurrentChainNumber++ ;
            }
 
            // 起始bit位
            nchainStartNum = pchainSt->m_uncurrentChainNumber ;
 
            // 获取 module在 chainxxx 的 加链情况 占用了 从 nlastChainStartNum 到 nlastChainEndNum 的链
            pmodule->getBitRangeInChain(pchain->getChainName(),iclockIterator.key(),&nlastChainStartNum ,&nlastChainEndNum);
 
 
            /*
                 判断当前module是否单独例化(只有静态寄存器)
                 YES
                 {
                    判断剩余的扫描链个数 是否够用,够用则在旧的扫描链上继续添加,
                    不够则新创建一条扫描链继续添加
                   (不够再添加新的扫描链 ,至到结束为止)(计算最后剩余的寄存器个数)
                 }
                 NO (可能同时存在 静态与动态的寄存器 添加方法是 先添加静态的寄存器 再添加动态的寄存器)
                 {
                    原则:由于多次例化,寄存器不能因为链的变化 在不同的例化中 放在了不同的链里面
                        if(静态+动态 < 剩余寄存器链个数)
                        {
                            if(这次添加扫描链时和上一次的链相同 )
                            {
                               则只记录寄存器位置信息 不添加任何
                            }
                            // 所有的里面放  计算剩余的 扫描链寄存器个数
                        }
                        else
                        {
                            // 从新的扫描链 开始添加
                        }
                 }
                 // 最终目的是保证代码的唯一性
            */
            if(!pmodule->getConstInstacedTimesPerChain(pchain->getChainName()))
            {
                qDebug() << "EziDebug Error: the module instance times error!";
                return 1 ;
            }
 
            if(pmodule->getConstInstacedTimesPerChain(pchain->getChainName()) == 1)
            {
AddReg:
                // 只存在静态的寄存器
                /*移位寄存器 赋值 代码*/
                QStringList iregNameList ;
                QVector<EziDebugModule::RegStructure*> iregVec = sregVec ;
                QStringList iregCombinationCode ;
 
 
                if(nleftBit != -1)
                {
                    int nlastLeftRegNum = qAbs(iregVec.at(nleftRegNum)->m_unEndBit - nleftBit) + 1 ;
 
                    QVector<EziDebugModule::RegStructure*> iregVec =  sregVec ;
                    // 剩余的个数
                    if(nlastLeftRegNum >= iprj->getMaxRegNumPerChain())
                    {
                        while(nlastLeftRegNum >= iprj->getMaxRegNumPerChain())
                        {
 
                            ninstNum++ ;
                            nwireCount++ ;
                            iregCombinationCode.clear();
                            iregNameList.clear();
 
                            // 定义 wire 连接 tdo 代码
                            QString iwireTdoName(tr("_EziDebug_%1_%2_tdo%3").arg(pchain->getChainName()).arg(iclockIterator.key()).arg(nwireCount));
                            QString iwireTdoDefinitionCode(tr("\n\n\t""wire ")+ iwireTdoName + tr(" ;")) ;
                            iusrCoreCode.append(iwireTdoDefinitionCode);
                            iaddedCodeList.append(tr("\\bwire\\s+_EziDebug_%1_%2_tdo%3\\s*;")\
                                                  .arg(pchain->getChainName()).arg(iclockIterator.key()).arg(nwireCount));
 
                            // 定义 wire 连接 移位寄存器 代码
                            QString iwireShiftRegDefinitionCode(tr("\n\t""wire ") + tr("[%1:0]").arg(iprj->getMaxRegNumPerChain()-1)+ tr("_EziDebug_%1_%2_sr%3")\
                                                                .arg(pchain->getChainName()).arg(iclockIterator.key()).arg(ninstNum) + tr(" ;"));
                            QString iwireSrName(tr("_EziDebug_%1_%2_sr%3").arg(pchain->getChainName()).arg(iclockIterator.key()).arg(ninstNum)) ;
 
                            iaddedCodeList.append(tr("\\bwire\\s*\\[\\s*%1:\\s*0\\s*\\]\\s*").arg(iprj->getMaxRegNumPerChain()-1)+tr("_EziDebug_%1_%2_sr%3\\s*;")\
                                                  .arg(pchain->getChainName()).arg(iclockIterator.key()).arg(ninstNum));
 
                            iusrCoreCode.append(iwireShiftRegDefinitionCode);
                            nwireShiftRegNum++ ;
 
                            /*移位寄存器 赋值 代码*/
                            // int nendBit = nleftBit + iprj->getMaxRegNumPerChain() -1;
                            int nendBit = 0 ;
                            if(iregVec.at(nleftRegNum)->m_unRegNum > 1)
                            {
                                if(iregVec.at(nleftRegNum)->m_eRegNumEndian == EziDebugModule::endianBig)
                                {
                                    /*高:低*/
                                    // iregVec.at(nleftRegNum)->m_unBitWidth-1
                                    nendBit = nleftBit + 1 - iprj->getMaxRegNumPerChain() ;
                                    iregNameList << constructChainRegString(iregVec.at(nleftRegNum) , nlastStopNum , nleftBit , nendBit , pitem);
 
                                    iregCombinationCode.append(QString::fromAscii(iregVec.at(nleftRegNum)->m_pRegName)+tr("[%1]").arg(iregVec.at(nleftRegNum)->m_unStartNum - nlastStopNum)+tr("[%1:%2]").arg(nleftBit).arg(nendBit));
 
                                    nleftBit = nendBit - 1 ;
                                }
                                else
                                {
                                    /*低:高*/
                                    nendBit = nleftBit -1 + iprj->getMaxRegNumPerChain() ;
                                    iregNameList << constructChainRegString(iregVec.at(nleftRegNum) , nlastStopNum , nleftBit , nendBit , pitem);
 
                                    iregCombinationCode.append(QString::fromAscii(iregVec.at(nleftRegNum)->m_pRegName)+tr("[%1]").arg(iregVec.at(nleftRegNum)->m_unStartNum + nlastStopNum)+tr("[%1:%2]").arg(nleftBit).arg(nendBit));
 
                                    nleftBit = nendBit + 1 ;
                                }
                            }
                            else
                            {
                                if(iregVec.at(nleftRegNum)->m_eRegNumEndian == EziDebugModule::endianBig)
                                {
                                    /*高:低*/
                                    nendBit = nleftBit + 1 - iprj->getMaxRegNumPerChain() ;
                                    iregNameList << constructChainRegString(iregVec.at(nleftRegNum) , nlastStopNum , nleftBit , nendBit , pitem);
 
                                    iregCombinationCode.append(QString::fromAscii(iregVec.at(nleftRegNum)->m_pRegName)+tr("[%1:%2]") \
                                                               .arg(nleftBit).arg(nendBit));
                                    nleftBit = nendBit - 1 ;
                                }
                                else
                                {
                                    /*低:高*/
                                    nendBit = nleftBit -1 + iprj->getMaxRegNumPerChain() ;
                                    iregNameList << constructChainRegString(iregVec.at(nleftRegNum) , nlastStopNum , nleftBit , nendBit , pitem);
 
                                    iregCombinationCode.append(QString::fromAscii(iregVec.at(nleftRegNum)->m_pRegName)+tr("[%1:%2]")\
                                                               .arg(nleftBit).arg(nendBit));
 
                                    nleftBit = nendBit + 1 ;
                                }
                            }
 
 
                            ichainClock = pchain->getChainClock(pitem->getInstanceName(),iclockIterator.key());
                            if(ichainClock.isEmpty())
                            {
                                qDebug() << "EziDebug Error: the top clock is not finded!" << __LINE__;
                                return 2 ;
                            }
 
                            pchain->addToRegChain(ichainClock ,pchainSt->m_uncurrentChainNumber ,iregNameList);
 
                            // 插入扫描链代码
                            QString iwireShiftRegEvaluateString ;
                            iwireShiftRegEvaluateString.append(tr("\n\t""assign %1 = {\n\t\t\t\t\t\t\t\t\t""%2""\n\t\t\t\t\t\t\t\t\t};").arg(iwireSrName).arg(iregCombinationCode.join(" ,\n\t\t\t\t\t\t\t\t\t")));
                            iaddedCodeList.append(tr("\\bassign\\s+%1.*;").arg(iwireSrName));
                            iusrCoreCode.append(iwireShiftRegEvaluateString);
 
                            /*自定义 core 例化代码 */
                            QString iusrCoreDefinitionCode ;
                            // QString iresetName = "1'b1";
                            // _EziDebug_chn_rstn
                            QString iresetName = tr("_EziDebug_%1_rstn").arg(pchain->getChainName());
                            QString iusrCoreTdi ;
                            if(nnumberOfNoLibCore != 0)
                            {
                                if((chainStructuremap.value(iclockIterator.key())->m_untotalChainNumber) > 1)
                                {
                                    iusrCoreTdi.append(tr("%1[%2]").arg(pmodule->getChainClockWireNameMap(pchain->getChainName(),iclockIterator.key())).arg(pchainSt->m_uncurrentChainNumber));
                                }
                                else
                                {
                                    iusrCoreTdi.append(tr("%1").arg(pmodule->getChainClockWireNameMap(pchain->getChainName(),iclockIterator.key())));
                                }
                            }
                            else
                            {
                                if((chainStructuremap.value(iclockIterator.key())->m_untotalChainNumber) > 1)
                                {
                                    iusrCoreTdi.append(tr("_EziDebug_%1_%2_TDI_reg[%3]").arg(pchain->getChainName()).arg(iclockIterator.key()).arg(pchainSt->m_uncurrentChainNumber));
                                }
                                else
                                {
                                    iusrCoreTdi.append(tr("_EziDebug_%1_%2_TDI_reg").arg(pchain->getChainName()).arg(iclockIterator.key()));
                                }
                            }
 
                            iusrCoreDefinitionCode.append(tr("\n\t")+ EziDebugScanChain::getChainRegCore() + tr(" %1_%2_inst%3(\n").arg(EziDebugScanChain::getChainRegCore()).arg(pchain->getChainName()).arg(ninstNum));
                            iusrCoreDefinitionCode.append(  tr("\t"".clock""\t(%1) ,\n").arg(iclockIterator.key()) \
                                                            + tr("\t"".resetn""\t(%1) ,\n").arg(iresetName) \
                                                            + tr("\t"".TDI_reg""\t(%1) ,\n").arg(iusrCoreTdi) \
                                                            + tr("\t"".TDO_reg""\t(%1) ,\n").arg(iwireTdoName) \
                                                            + tr("\t"".TOUT_reg""\t(%1) ,\n").arg(iparentToutPort) \
                                                            + tr("\t"".shift_reg""\t(%1) \n\t) ;").arg(iwireSrName));
 
                            /*加入 定义 userCore regWidth 限定的 语句代码*/
                            QString iparameterDefCode ;
                            iparameterDefCode.append(tr("\n\t""defparam %1_%2_inst%3.shift_width = %4 ;").arg(EziDebugScanChain::getChainRegCore()).arg(pchain->getChainName()).arg(ninstNum).arg(iprj->getMaxRegNumPerChain()));
                            iaddedCodeList.append(tr("\\bdefparam\\s+%1_%2_inst%3\\.shift_width\\s*=.*;").arg(EziDebugScanChain::getChainRegCore()).arg(pchain->getChainName()).arg(ninstNum));
                            iusrCoreCode.append(iparameterDefCode)  ;
 
                            iaddedCodeList.append(EziDebugScanChain::getChainRegCore() + tr("\\s+%1_%2_inst%3\\s*\\(.*\\)\\s*;").arg(EziDebugScanChain::getChainRegCore()).arg(pchain->getChainName()).arg(ninstNum));
 
                            iusrCoreCode.append(iusrCoreDefinitionCode);
 
 
                            /*module 端口连接代码*/
 
                            QString iportConnectCode ;
                            // condition (chain number > 1) is true
                            iportConnectCode.append(tr("\n\t""assign %1[%2] = %3 ;").arg(tr("_EziDebug_%1_%2_TDO_reg").arg(pchain->getChainName()).arg(iclockIterator.key()))\
                                                    .arg(pchainSt->m_uncurrentChainNumber).arg(iwireTdoName));
                            iaddedCodeList.append(tr("\\bassign\\s+%1\\s*\\[\\s*%2\\s*\\].*;").arg(tr("_EziDebug_%1_%2_TDO_reg").arg(pchain->getChainName()).arg(iclockIterator.key()))\
                                                  .arg(pchainSt->m_uncurrentChainNumber));
                            iusrCoreCode.append(iportConnectCode);
 
 
                            nlastLeftRegNum = nlastLeftRegNum - iprj->getMaxRegNumPerChain();
                            pchainSt->m_uncurrentChainNumber++ ;
                            pchainSt->m_unleftRegNumber = iprj->getMaxRegNumPerChain() ;
                        }
                    } // REG n 大于 maxregnum 的部分 添加完毕
 
                    //  REG n 剩余 的部分
                    iregCombinationCode.clear();
                    iregNameList.clear();
 
                    if(iregVec.at(nleftRegNum)->m_eRegBitWidthEndian == EziDebugModule::endianBig)
                    {
                        if((nleftBit - iregVec.at(nleftRegNum)->m_unEndBit) > 0)
                        {
                            pchainSt->m_unleftRegNumber -= (qAbs(nleftBit - iregVec.at(nleftRegNum)->m_unEndBit) + 1) ;
                            nregBitCount = (qAbs(nleftBit - iregVec.at(nleftRegNum)->m_unEndBit) + 1) ;
                            iregNameList << constructChainRegString(iregVec.at(nleftRegNum),nlastStopNum,nleftBit,iregVec.at(nleftRegNum)->m_unEndBit ,pitem);
 
                            iregCombinationCode.append(QString::fromAscii(iregVec.at(nleftRegNum)->m_pRegName) + QObject::tr("[%1][%2:%3]").arg(iregVec.at(nleftRegNum)->m_unStartNum - nlastStopNum).arg(nleftBit).arg(iregVec.at(nleftRegNum)->m_unEndBit));
                        }
                        else if((nleftBit - iregVec.at(nleftRegNum)->m_unEndBit) == 0)
                        {
                            pchainSt->m_unleftRegNumber -= (qAbs(nleftBit - iregVec.at(nleftRegNum)->m_unEndBit) + 1) ;
                            nregBitCount = (qAbs(nleftBit - iregVec.at(nleftRegNum)->m_unEndBit) + 1) ;
                            iregNameList << constructChainRegString(iregVec.at(nleftRegNum),nlastStopNum,nleftBit,iregVec.at(nleftRegNum)->m_unEndBit ,pitem);
 
                            iregCombinationCode.append(QString::fromAscii(iregVec.at(nleftRegNum)->m_pRegName)+QObject::tr("[%1][0]").arg(iregVec.at(nleftRegNum)->m_unStartNum - nlastStopNum));
                        }
                        else
                        {
                            // 上面已经加完了
                        }
 
                    }
                    else
                    {
                        if((iregVec.at(nleftRegNum)->m_unEndBit - nleftBit) > 0) // 剩大于1bit
                        {
                            pchainSt->m_unleftRegNumber -= (qAbs(nleftBit - iregVec.at(nleftRegNum)->m_unEndBit) + 1) ;
                            nregBitCount = (qAbs(nleftBit - iregVec.at(nleftRegNum)->m_unEndBit) + 1) ;
                            iregNameList << constructChainRegString(iregVec.at(nleftRegNum),nlastStopNum,nleftBit,iregVec.at(nleftRegNum)->m_unEndBit ,pitem);
 
                            iregCombinationCode.append(QString::fromAscii(iregVec.at(nleftRegNum)->m_pRegName) + QObject::tr("[%1][%2:%3]").arg(iregVec.at(nleftRegNum)->m_unStartNum + nlastStopNum).arg(nleftBit).arg(iregVec.at(nleftRegNum)->m_unEndBit));
                        }
                        else if((iregVec.at(nleftRegNum)->m_unEndBit - nleftBit) == 0) // 剩1bit
                        {
                            pchainSt->m_unleftRegNumber -= (qAbs(nleftBit - iregVec.at(nleftRegNum)->m_unEndBit) + 1) ;
                            nregBitCount = (qAbs(nleftBit - iregVec.at(nleftRegNum)->m_unEndBit) + 1) ;
                            iregNameList << constructChainRegString(iregVec.at(nleftRegNum),nlastStopNum,nleftBit,iregVec.at(nleftRegNum)->m_unEndBit ,pitem);
 
                            iregCombinationCode.append(QString::fromAscii(iregVec.at(nleftRegNum)->m_pRegName)+tr("[%1][0]").arg(iregVec.at(nleftRegNum)->m_unStartNum + nlastStopNum));
                        }
                        else
                        {
                            // 已经加完
                        }
                    }
 
 
 
                    if(iregVec.at(nleftRegNum)->m_unRegNum > 1)
                    {
                        nlastStopNum++ ;
                    }
                    else
                    {
                        nleftRegNum++ ;
                        nlastStopNum = 0 ;
                    }
 
                    nleftBit = -1 ;
                }
                else
                {
                    nregBitCount = 0 ;
                }
 
 
                for(; nleftRegNum < iregVec.count() ; nleftRegNum++)
                {
                    for(int m = nlastStopNum ; m < iregVec.at(nleftRegNum)->m_unRegNum; m++)
                    {
                        nregBitCount += iregVec.at(nleftRegNum)->m_unRegBitWidth ;
 
                        if(nregBitCount < pchainSt->m_unleftRegNumber)
                        {
                            /*数组情况下*/
                            // 够用继续添加
                            if(iregVec.at(nleftRegNum)->m_unRegNum > 1)
                            {
                                if(iregVec.at(nleftRegNum)->m_eRegNumEndian == EziDebugModule::endianBig)
                                {
                                    iregCombinationCode.append(QString::fromAscii(iregVec.at(nleftRegNum)->m_pRegName)+tr("[%1]").arg(iregVec.at(nleftRegNum)->m_unStartNum - m));
                                }
                                else
                                {
                                    iregCombinationCode.append(QString::fromAscii(iregVec.at(nleftRegNum)->m_pRegName)+tr("[%1]").arg(iregVec.at(nleftRegNum)->m_unStartNum + m));
                                }
                            }
                            else
                            {
                                iregCombinationCode.append(QString::fromAscii(iregVec.at(nleftRegNum)->m_pRegName));
                            }
 
                            iregNameList << constructChainRegString(iregVec.at(nleftRegNum),m,iregVec.at(nleftRegNum)->m_unStartBit,iregVec.at(nleftRegNum)->m_unEndBit ,pitem);
                        }
                        else if(nregBitCount == pchainSt->m_unleftRegNumber)
                        {
                            // 刚好满  跳出  下次新的扫描链继续 添加
                            if(iregVec.at(nleftRegNum)->m_unRegNum > 1)
                            {
                                if(iregVec.at(nleftRegNum)->m_eRegNumEndian == EziDebugModule::endianBig)
                                {
                                    iregCombinationCode.append(QString::fromAscii(iregVec.at(nleftRegNum)->m_pRegName)+tr("[%1]").arg(iregVec.at(nleftRegNum)->m_unStartNum - m));
                                }
                                else
                                {
                                    iregCombinationCode.append(QString::fromAscii(iregVec.at(nleftRegNum)->m_pRegName)+tr("[%1]").arg(iregVec.at(nleftRegNum)->m_unStartNum + m));
                                }
                            }
                            else
                            {
                                iregCombinationCode.append(QString::fromAscii(iregVec.at(nleftRegNum)->m_pRegName));
                            }
 
                            iregNameList << constructChainRegString(iregVec.at(nleftRegNum),m,iregVec.at(nleftRegNum)->m_unStartBit,iregVec.at(nleftRegNum)->m_unEndBit,pitem);
 
                            nlastStopNum = m ;
                            // nleftBit = -1 ;
                            nleftRegNum++ ;
                            isNeedAdded = true ;
 
 
                            goto WireShiftRegEvaluate0 ;
                        }
                        else
                        {
                            if(iregVec.at(nleftRegNum)->m_unRegNum > 1)
                            {
 
                                if(iregVec.at(nleftRegNum)->m_eRegNumEndian == EziDebugModule::endianBig)
                                {
                                    int nstartBit = iregVec.at(nleftRegNum)->m_unStartBit ;
                                    int nendBit = nregBitCount- pchainSt->m_unleftRegNumber + iregVec.at(nleftRegNum)->m_unStartBit + 1 - iregVec.at(nleftRegNum)->m_unRegBitWidth ;
                                    nleftBit = nendBit - 1 ;
                                    iregNameList << constructChainRegString(iregVec.at(nleftRegNum),m,nstartBit,nendBit,pitem);
 
                                    iregCombinationCode.append(QString::fromAscii(iregVec.at(nleftRegNum)->m_pRegName)+tr("[%1]").arg(iregVec.at(nleftRegNum)->m_unStartNum - m)+tr("[%1:%2]").arg(nstartBit).arg(nendBit));
                                }
                                else
                                {
                                    int nstartBit = iregVec.at(nleftRegNum)->m_unStartBit ;
                                    int nendBit = iregVec.at(nleftRegNum)->m_unRegBitWidth + iregVec.at(nleftRegNum)->m_unStartBit - 1 - (nregBitCount- pchainSt->m_unleftRegNumber) ;
                                    nleftBit = nendBit + 1 ;
                                    iregNameList << constructChainRegString(iregVec.at(nleftRegNum),m,nstartBit,nendBit,pitem);
 
                                    iregCombinationCode.append(QString::fromAscii(iregVec.at(nleftRegNum)->m_pRegName)+tr("[%1]").arg(iregVec.at(nleftRegNum)->m_unStartNum + m)+tr("[%1:%2]").arg(nstartBit).arg(nendBit));
                                }
                            }
                            else
                            {
                                if(iregVec.at(nleftRegNum)->m_eRegNumEndian == EziDebugModule::endianBig)
                                {
                                    int nstartBit = iregVec.at(nleftRegNum)->m_unStartBit ;
                                    int nendBit = nregBitCount- pchainSt->m_unleftRegNumber + iregVec.at(nleftRegNum)->m_unStartBit + 1 - iregVec.at(nleftRegNum)->m_unRegBitWidth ;
                                    nleftBit = nendBit - 1 ;
                                    iregNameList << constructChainRegString(iregVec.at(nleftRegNum),m,nstartBit,nendBit,pitem);
 
                                    iregCombinationCode.append(QString::fromAscii(iregVec.at(nleftRegNum)->m_pRegName)+tr("[%1:%2]") \
                                                               .arg(nstartBit).arg(nendBit));
                                }
                                else
                                {
                                    int nstartBit = iregVec.at(nleftRegNum)->m_unStartBit ;
                                    int nendBit = iregVec.at(nleftRegNum)->m_unRegBitWidth + iregVec.at(nleftRegNum)->m_unStartBit - 1 - (nregBitCount- pchainSt->m_unleftRegNumber) ;
                                    nleftBit = nendBit + 1 ;
                                    iregNameList << constructChainRegString(iregVec.at(nleftRegNum),m,nstartBit,nendBit,pitem);
 
                                    iregCombinationCode.append(QString::fromAscii(iregVec.at(nleftRegNum)->m_pRegName)+tr("[%1:%2]")\
                                                               .arg(nstartBit).arg(nendBit));
                                }
                            }
 
                            nlastStopNum = m ;
                            isNeedAdded = true ;
                            goto WireShiftRegEvaluate0 ;
                        }
                    }
                    nlastStopNum = 0 ;
                }
WireShiftRegEvaluate0:
 
 
 
                if(iregNameList.count())
                {
 
                    ichainClock = pchain->getChainClock(pitem->getInstanceName(),iclockIterator.key());
 
                    if(ichainClock.isEmpty())
                    {
                        return 2 ;
                    }
 
                    if(isNeedAdded == true)
                    {
                        nusedNum =  pchainSt->m_unleftRegNumber ;
                    }
                    else
                    {
                        nusedNum = nregBitCount ;
                    }
 
                    pchain->addToRegChain(ichainClock,pchainSt->m_uncurrentChainNumber,iregNameList);
 
                    nwireCount++ ;
                    // 定义 wire 连接 tdo 代码
                    QString iwireTdoName(tr("_EziDebug_%1_%2_tdo%3").arg(pchain->getChainName()).arg(iclockIterator.key()).arg(nwireCount));
                    QString iwireTdoDefinitionCode(tr("\n\n\t""wire ")+ iwireTdoName + tr(" ;")) ;
                    iusrCoreCode.append(iwireTdoDefinitionCode);
                    iaddedCodeList.append(tr("\\bwire\\s+_EziDebug_%1_%2_tdo%3\\s*;")\
                                          .arg(pchain->getChainName()).arg(iclockIterator.key()).arg(nwireCount));
 
                    // 定义 wire 连接 移位寄存器 代码
                    QString iwireShiftRegDefinitionCode(tr("\n\t""wire ") + tr("[%1:0] ").arg(nusedNum-1) + tr("_EziDebug_%1_%2_sr%3")\
                                                        .arg(pchain->getChainName()).arg(iclockIterator.key()).arg(nwireShiftRegNum) + tr(" ;"));
                    QString iwireSrName(tr("_EziDebug_%1_%2_sr%3").arg(pchain->getChainName()).arg(iclockIterator.key()).arg(nwireShiftRegNum)) ;
 
                    iaddedCodeList.append(tr("\\bwire\\s*\\[\\s*%1\\s*:\\s*0\\s*\\]\\s*").arg(nusedNum-1) + tr("_EziDebug_%1_%2_sr%3\\s*;")\
                                          .arg(pchain->getChainName()).arg(iclockIterator.key()).arg(nwireShiftRegNum));
 
                    iusrCoreCode.append(iwireShiftRegDefinitionCode);
                    nwireShiftRegNum++ ;
 
                    //pchain->addToRegChain(ichainClock,pchainSt->m_uncurrentChainNumber,iregNameList);
 
                    QString iwireShiftRegEvaluateString ;
                    iwireShiftRegEvaluateString.append(tr("\n\t""assign %1 = {\n\t\t\t\t\t\t\t\t\t""%2""\n\t\t\t\t\t\t\t\t\t};").arg(iwireSrName).arg(iregCombinationCode.join(" ,\n\t\t\t\t\t\t\t\t\t")));
                    iaddedCodeList.append(tr("\\bassign\\s+%1.*;").arg(iwireSrName));
                    iusrCoreCode.append(iwireShiftRegEvaluateString);
 
 
                    /*自定义 core 例化代码 */
                    QString iusrCoreDefinitionCode ;
                    //QString iresetName = "1'b1";
                    QString iresetName = tr("_EziDebug_%1_rstn").arg(pchain->getChainName());
 
 
                    QString iusrCoreTdi ;
                    if(nnumberOfNoLibCore != 0)
                    {
                        if((chainStructuremap.value(iclockIterator.key())->m_untotalChainNumber) > 1)
                        {
                            iusrCoreTdi.append(tr("%1[%2]").arg(pmodule->getChainClockWireNameMap(pchain->getChainName(),iclockIterator.key())).arg(pchainSt->m_uncurrentChainNumber));
                        }
                        else
                        {
                            iusrCoreTdi.append(tr("%1").arg(pmodule->getChainClockWireNameMap(pchain->getChainName(),iclockIterator.key())));
                        }
                    }
                    else
                    {
                        if((chainStructuremap.value(iclockIterator.key())->m_untotalChainNumber) > 1)
                        {
                            iusrCoreTdi.append(tr("_EziDebug_%1_%2_TDI_reg[%3]").arg(pchain->getChainName()).arg(iclockIterator.key()).arg(pchainSt->m_uncurrentChainNumber));
                        }
                        else
                        {
                            iusrCoreTdi.append(tr("_EziDebug_%1_%2_TDI_reg").arg(pchain->getChainName()).arg(iclockIterator.key()));
                        }
                    }
 
                    iusrCoreDefinitionCode.append(tr("\n\t")+ EziDebugScanChain::getChainRegCore() + tr(" %1_%2_inst%3(\n").arg(EziDebugScanChain::getChainRegCore()).arg(pchain->getChainName()).arg(ninstNum));
                    iusrCoreDefinitionCode.append(  tr("\t"".clock""\t(%1) ,\n").arg(iclockIterator.key()) \
                                                    + tr("\t"".resetn""\t(%1) ,\n").arg(iresetName) \
                                                    + tr("\t"".TDI_reg""\t(%1) ,\n").arg(iusrCoreTdi) \
                                                    + tr("\t"".TDO_reg""\t(%1) ,\n").arg(iwireTdoName) \
                                                    + tr("\t"".TOUT_reg""\t(%1) ,\n").arg(iparentToutPort) \
                                                    + tr("\t"".shift_reg""\t(%1) \n\t) ;").arg(iwireSrName));
 
 
                    /*加入 定义 userCore regWidth 限定的 语句代码*/
                    QString iparameterDefCode ;
                    iparameterDefCode.append(tr("\n\n\t""defparam %1_%2_inst%3.shift_width = %4 ;").arg(EziDebugScanChain::getChainRegCore()).arg(pchain->getChainName()).arg(ninstNum).arg(nusedNum));
                    iaddedCodeList.append(tr("\\bdefparam\\s+%1_%2_inst%3\\.shift_width\\s*=.*;").arg(EziDebugScanChain::getChainRegCore()).arg(pchain->getChainName()).arg(ninstNum));
 
                    iusrCoreCode.append(iparameterDefCode)  ;
                    iaddedCodeList.append(EziDebugScanChain::getChainRegCore() + tr("\\s+%1_%2_inst%3\\s*(.*)\\s*;").arg(EziDebugScanChain::getChainRegCore()).arg(pchain->getChainName()).arg(ninstNum));
 
                    iusrCoreCode.append(iusrCoreDefinitionCode);
 
                    /*module 端口连接代码*/
                    QString iportConnectCode ;
                    if((chainStructuremap.value(iclockIterator.key())->m_untotalChainNumber) > 1)
                    {
                        iportConnectCode.append(tr("\n\t""assign %1[%2] = %3 ;").arg(tr("_EziDebug_%1_%2_TDO_reg").arg(pchain->getChainName()).arg(iclockIterator.key()))\
                                                .arg(pchainSt->m_uncurrentChainNumber).arg(iwireTdoName));
                        iaddedCodeList.append(tr("\\bassign\\s+%1\\s*\\[\\s*%2\\s*\\].*;").arg(tr("_EziDebug_%1_%2_TDO_reg").arg(pchain->getChainName()).arg(iclockIterator.key()))\
                                              .arg(pchainSt->m_uncurrentChainNumber));
                    }
                    else
                    {
                        iportConnectCode.append(tr("\n\t""assign %1 = %2 ;").arg(tr("_EziDebug_%1_%2_TDO_reg").arg(pchain->getChainName()).arg(iclockIterator.key()))\
                                                .arg(iwireTdoName));
                        iaddedCodeList.append(tr("\\bassign\\s+%1\\s*=\\s*%2\\s*;").arg(tr("_EziDebug_%1_%2_TDO_reg").arg(pchain->getChainName()).arg(iclockIterator.key()))\
                                              .arg(iwireTdoName));
                    }
                    iusrCoreCode.append(iportConnectCode);
                }
 
 
                if(isNeedAdded == true)
                {
                    pchainSt->m_uncurrentChainNumber++ ;
                    pchainSt->m_unleftRegNumber = iprj->getMaxRegNumPerChain() ;
                    isNeedAdded = false ;
                }
                else
                {
                    pchainSt->m_unleftRegNumber -= nregBitCount ;
                }
 
                if(nleftRegNum != iregVec.count())
                {
                    goto AddReg ;
                }
 
            }
            else
            {
                // 肯定为多次例化的 模块
                for(;nregCount < sregVec.count(); nregCount++)
                {
                    EziDebugModule::RegStructure* preg =  sregVec.at(nregCount) ;
                    nSregNum += preg->m_unMaxBitWidth ;
                }
 
                nregCount = 0 ;
 
                for(;nregCount < vregVec.count();nregCount++)
                {
                    EziDebugModule::RegStructure* preg = vregVec.at(nregCount) ;
                    nVregNum += preg->m_unMaxBitWidth ;
                }
 
 
                //
                if((nSregNum + nVregNum) < pchainSt->m_unleftRegNumber)
                {
                    QStringList iregNameList ;
                    QStringList iregCombinationCode ;
 
 
                    QVector<EziDebugModule::RegStructure*> iregVec = sregVec ;
                    nleftRegNum = 0 ;
                    int nstaticRegBitSum = 0 ;
                    for(; nleftRegNum < iregVec.count() ; nleftRegNum++)
                    {
                        for(int m = 0 ; m < iregVec.at(nleftRegNum)->m_unRegNum ; m++)
                        {
                            EziDebugModule::RegStructure* preg = sregVec.at(nleftRegNum)  ;                    
 
                            nstaticRegBitSum += preg->m_unRegBitWidth ;
                            nRegNum += preg->m_unRegBitWidth ;
 
                            // reg pointer regnum  startbit  endbit  hiberarchyname
                            if(preg->m_eRegNumEndian)
                            {
                                iregNameList << constructChainRegString(preg,iregVec.at(nleftRegNum)->m_unStartNum - m , preg->m_unStartBit , preg->m_unEndBit ,pitem);
                                if(preg->m_unRegNum != 1)
                                {
                                    iregCombinationCode.append(QString::fromAscii(iregVec.at(nleftRegNum)->m_pRegName) + tr("[%1]")\
                                                               .arg(iregVec.at(nleftRegNum)->m_unStartNum - m));
                                }
                                else
                                {
                                    iregCombinationCode.append(QString::fromAscii(iregVec.at(nleftRegNum)->m_pRegName));
                                }
                            }
                            else
                            {
                                iregNameList << constructChainRegString(preg,iregVec.at(nleftRegNum)->m_unStartNum + m , preg->m_unStartBit , preg->m_unEndBit ,pitem);
                                if(preg->m_unRegNum != 1)
                                {
                                    iregCombinationCode.append(QString::fromAscii(iregVec.at(nleftRegNum)->m_pRegName)+tr("[%1]")\
                                                               .arg(iregVec.at(nleftRegNum)->m_unStartNum + m));
                                }
                                else
                                {
                                    iregCombinationCode.append(QString::fromAscii(iregVec.at(nleftRegNum)->m_pRegName));
                                }
                            }                    
 
                        }
                    }
 
                    QString ivarRegBitSum ;
                    if(nstaticRegBitSum)
                    {
                        ivarRegBitSum =  QString::number(nstaticRegBitSum) ;
                    }
                    nleftRegNum = 0 ;
 
                    iregVec = vregVec ;
 
                    for(; nleftRegNum < iregVec.count() ; nleftRegNum++)
                    {
                        EziDebugModule::RegStructure* pvarReg = iregVec.at(nleftRegNum) ;
                        // 确切地定值 有 instancereg 提供
                        EziDebugModule::RegStructure* pinstanceReg = pmodule->getInstanceReg(pitem->getInstanceName(),iclockIterator.key(),QString::fromAscii(pvarReg->m_pRegName));
                        nRegNum += pvarReg->m_unMaxBitWidth ;
                        // construct the bitwidth string
                        if(pinstanceReg->m_unRegNum == 1)
                        {
                            ivarRegBitSum.append(QObject::tr("+") + QString::fromAscii(pvarReg->m_pExpString));
                        }
                        else
                        {
                            ivarRegBitSum.append(QObject::tr("+") + QObject::tr("(%1)*%2").arg(QString::fromAscii(pvarReg->m_pExpString)).arg(pinstanceReg->m_unRegNum));
                        }
                         // iprefixStr
                        for(int m = 0 ; m < pinstanceReg->m_unRegNum ; m++)
                        {
 
                            if(pinstanceReg->m_eRegNumEndian == EziDebugModule::endianBig)
                            {
                                iregNameList << constructChainRegString(pinstanceReg,pinstanceReg->m_unStartNum - m , pinstanceReg->m_unStartBit , pinstanceReg->m_unEndBit ,pitem);
                                if(pinstanceReg->m_unRegNum != 1)
                                {
                                    iregCombinationCode.append(QString::fromAscii(iregVec.at(nleftRegNum)->m_pRegName) + tr("[%1]")\
                                                               .arg(iregVec.at(nleftRegNum)->m_unStartNum - m));
                                }
                                else
                                {
                                    iregCombinationCode.append(QString::fromAscii(iregVec.at(nleftRegNum)->m_pRegName));
                                }
                            }
                            else
                            {
                                iregNameList << constructChainRegString(pinstanceReg,pinstanceReg->m_unStartNum + m , pinstanceReg->m_unStartBit , pinstanceReg->m_unEndBit ,pitem);
                                if(pinstanceReg->m_unRegNum != 1)
                                {
                                    iregCombinationCode.append( QString::fromAscii(iregVec.at(nleftRegNum)->m_pRegName) + tr("[%1]")\
                                                               .arg(iregVec.at(nleftRegNum)->m_unStartNum - m));
                                }
                                else
                                {
                                    iregCombinationCode.append(QString::fromAscii(iregVec.at(nleftRegNum)->m_pRegName));
                                }
                            }
                        }
 
                    }
 
                    ichainClock = pchain->getChainClock(pitem->getInstanceName(),iclockIterator.key());
 
                    if(ichainClock.isEmpty())
                    {
                        return 2 ;
                    }
 
                    pchain->addToRegChain(ichainClock,pchainSt->m_uncurrentChainNumber,iregNameList);
 
 
                    // 不用添加 新的代码
                    pchainSt->m_unleftRegNumber = pchainSt->m_unleftRegNumber - nRegNum ;
 
                    if(nchainStartNum == nlastChainEndNum) // 不用添加 新的代码,都在同一条扫描链中 且 剩余链寄存器够用
                    {
                        ++iclockIterator ;
                        continue ;
                    }
 
                    // defparameter 和 定义移位寄存器宽度 都为 字符串类型 非完全数字(如果存在变化位宽的寄存器的话)
                    // 加入的 ezidebug core 的 tdi 根据 前面是否存在 非系统core 连接 模块端口的 tdi 或者 定义的
                    // 非系统core 的 最后一根tdo_wire
                    // ezidebug core 的tdo 根据是否为最后1次添加代码 与 lastwire 相连 或者 端口的 tdo 相连
                    // 连接 这次添加链的 起始bit 与 上一次最后bit 之间的 连接  assign
 
                    nwireCount++ ;
                    // 定义 wire 连接 tdo 代码
                    QString iwireTdoName(tr("_EziDebug_%1_%2_tdo%3").arg(pchain->getChainName()).arg(iclockIterator.key()).arg(nwireCount));
                    QString iwireTdoDefinitionCode(tr("\n\n\t""wire ")+ iwireTdoName + tr(" ;")) ;
                    iusrCoreCode.append(iwireTdoDefinitionCode);
                    iaddedCodeList.append(tr("\\bwire\\s+_EziDebug_%1_%2_tdo%3\\s*;")\
                                          .arg(pchain->getChainName()).arg(iclockIterator.key()).arg(nwireCount));
 
 
                    // 定义 wire 连接 移位寄存器 代码
                    QString iwireShiftRegDefinitionCode(tr("\n\t""wire ") + tr("[%1:0] ").arg(ivarRegBitSum + tr(" - 1")) + tr("_EziDebug_%1_%2_sr%3")\
                                                        .arg(pchain->getChainName()).arg(iclockIterator.key()).arg(nwireShiftRegNum) + tr(" ;"));
                    QString iwireSrName(tr("_EziDebug_%1_%2_sr%3").arg(pchain->getChainName()).arg(iclockIterator.key()).arg(nwireShiftRegNum)) ;
 
                    iaddedCodeList.append(tr("\\bwire\\s*\\[\\s*%1\\s*:\\s*0\\s*\\]\\s*").arg(ivarRegBitSum + tr(" - 1")) + tr("_EziDebug_%1_%2_sr%3\\s*;")\
                                          .arg(pchain->getChainName()).arg(iclockIterator.key()).arg(nwireShiftRegNum));
 
                    iusrCoreCode.append(iwireShiftRegDefinitionCode);
                    nwireShiftRegNum++ ;
 
                    //pchain->addToRegChain(ichainClock,pchainSt->m_uncurrentChainNumber,iregNameList);
 
                    QString iwireShiftRegEvaluateString ;
                    iwireShiftRegEvaluateString.append(tr("\n\t""assign %1 = {\n\t\t\t\t\t\t\t\t\t""%2""\n\t\t\t\t\t\t\t\t\t};").arg(iwireSrName).arg(iregCombinationCode.join(" ,\n\t\t\t\t\t\t\t\t\t")));
                    iaddedCodeList.append(tr("\\bassign\\s+%1.*;").arg(iwireSrName));
                    iusrCoreCode.append(iwireShiftRegEvaluateString);
 
 
                    /*自定义 core 例化代码 */
                    QString iusrCoreDefinitionCode ;
                    //QString iresetName = "1'b1";
                    QString iresetName = tr("_EziDebug_%1_rstn").arg(pchain->getChainName());
 
 
                    QString iusrCoreTdi ;
                    if(nnumberOfNoLibCore != 0)
                    {
                        if((chainStructuremap.value(iclockIterator.key())->m_untotalChainNumber) > 1)
                        {
                            iusrCoreTdi.append(tr("%1[%2]").arg(pmodule->getChainClockWireNameMap(pchain->getChainName(),iclockIterator.key())).arg(pchainSt->m_uncurrentChainNumber));
                        }
                        else
                        {
                            iusrCoreTdi.append(tr("%1").arg(pmodule->getChainClockWireNameMap(pchain->getChainName(),iclockIterator.key())));
                        }
                    }
                    else
                    {
                        if((chainStructuremap.value(iclockIterator.key())->m_untotalChainNumber) > 1)
                        {
                            iusrCoreTdi.append(tr("_EziDebug_%1_%2_TDI_reg[%3]").arg(pchain->getChainName()).arg(iclockIterator.key()).arg(pchainSt->m_uncurrentChainNumber));
                        }
                        else
                        {
                            iusrCoreTdi.append(tr("_EziDebug_%1_%2_TDI_reg").arg(pchain->getChainName()).arg(iclockIterator.key()));
                        }
                    }
 
                    iusrCoreDefinitionCode.append(tr("\n\t")+ EziDebugScanChain::getChainRegCore() + tr(" %1_%2_inst%3(\n").arg(EziDebugScanChain::getChainRegCore()).arg(pchain->getChainName()).arg(ninstNum));
                    iusrCoreDefinitionCode.append(  tr("\t"".clock""\t(%1) ,\n").arg(iclockIterator.key()) \
                                                    + tr("\t"".resetn""\t(%1) ,\n").arg(iresetName) \
                                                    + tr("\t"".TDI_reg""\t(%1) ,\n").arg(iusrCoreTdi) \
                                                    + tr("\t"".TDO_reg""\t(%1) ,\n").arg(iwireTdoName) \
                                                    + tr("\t"".TOUT_reg""\t(%1) ,\n").arg(iparentToutPort) \
                                                    + tr("\t"".shift_reg""\t(%1) \n\t) ;").arg(iwireSrName));
 
 
                    /*加入 定义 userCore regWidth 限定的 语句代码*/
                    QString iparameterDefCode ;
                    iparameterDefCode.append(tr("\n\n\t""defparam %1_%2_inst%3.shift_width = %4 ;").arg(EziDebugScanChain::getChainRegCore()).arg(pchain->getChainName()).arg(ninstNum).arg(ivarRegBitSum));
                    iaddedCodeList.append(tr("\\bdefparam\\s+%1_%2_inst%3\\.shift_width\\s*=.*;").arg(EziDebugScanChain::getChainRegCore()).arg(pchain->getChainName()).arg(ninstNum));
 
                    iusrCoreCode.append(iparameterDefCode)  ;
                    iaddedCodeList.append(EziDebugScanChain::getChainRegCore() + tr("\\s+%1_%2_inst%3\\s*(.*)\\s*;").arg(EziDebugScanChain::getChainRegCore()).arg(pchain->getChainName()).arg(ninstNum));
 
                    iusrCoreCode.append(iusrCoreDefinitionCode);
 
                    /*module 端口连接代码*/
                    QString iportConnectCode ;
                    if((chainStructuremap.value(iclockIterator.key())->m_untotalChainNumber) > 1)
                    {
                        iportConnectCode.append(tr("\n\t""assign %1[%2] = %3 ;").arg(tr("_EziDebug_%1_%2_TDO_reg").arg(pchain->getChainName()).arg(iclockIterator.key()))\
                                                .arg(pchainSt->m_uncurrentChainNumber).arg(iwireTdoName));
                        iaddedCodeList.append(tr("\\bassign\\s+%1\\s*\\[\\s*%2\\s*\\].*;").arg(tr("_EziDebug_%1_%2_TDO_reg").arg(pchain->getChainName()).arg(iclockIterator.key()))\
                                              .arg(pchainSt->m_uncurrentChainNumber));
                    }
                    else
                    {
                        iportConnectCode.append(tr("\n\t""assign %1 = %2 ;").arg(tr("_EziDebug_%1_%2_TDO_reg").arg(pchain->getChainName()).arg(iclockIterator.key()))\
                                                .arg(iwireTdoName));
                        iaddedCodeList.append(tr("\\bassign\\s+%1\\s*=\\s*%2\\s*;").arg(tr("_EziDebug_%1_%2_TDO_reg").arg(pchain->getChainName()).arg(iclockIterator.key()))\
                                              .arg(iwireTdoName));
                    }
                    iusrCoreCode.append(iportConnectCode);
                }
                else
                {
                    // 从新的扫描链 开始添加
                    pchainSt->m_uncurrentChainNumber++ ;
                    pchainSt->m_unleftRegNumber = iprj->getMaxRegNumPerChain() ;
 
AddReg1:
                    // 只存在静态的寄存器
                    /*移位寄存器 赋值 代码*/
                    QStringList iregNameList ;
                    QVector<EziDebugModule::RegStructure*> iregVec = sregVec ;
                    QStringList iregCombinationCode ;
 
 
                    if(nleftBit != -1)
                    {
                        int nlastLeftRegNum = qAbs(iregVec.at(nleftRegNum)->m_unEndBit - nleftBit) + 1 ;
 
                        QVector<EziDebugModule::RegStructure*> iregVec =  sregVec ;
                        // 剩余的个数
                        if(nlastLeftRegNum >= iprj->getMaxRegNumPerChain())
                        {
                            while(nlastLeftRegNum >= iprj->getMaxRegNumPerChain())
                            {
                                ninstNum++ ;
                                nwireCount++ ;
                                iregCombinationCode.clear();
                                iregNameList.clear();
                                // 定义 wire 连接 tdo 代码
                                QString iwireTdoName(tr("_EziDebug_%1_%2_tdo%3").arg(pchain->getChainName()).arg(iclockIterator.key()).arg(nwireCount));
                                QString iwireTdoDefinitionCode(tr("\n\n\t""wire ")+ iwireTdoName + tr(" ;")) ;
                                iusrCoreCode.append(iwireTdoDefinitionCode);
                                iaddedCodeList.append(tr("\\bwire\\s+_EziDebug_%1_%2_tdo%3\\s*;")\
                                                      .arg(pchain->getChainName()).arg(iclockIterator.key()).arg(nwireCount));
 
                                // 定义 wire 连接 移位寄存器 代码
                                QString iwireShiftRegDefinitionCode(tr("\n\t""wire ") + tr("[%1:0]").arg(iprj->getMaxRegNumPerChain()-1)+ tr("_EziDebug_%1_%2_sr%3")\
                                                                    .arg(pchain->getChainName()).arg(iclockIterator.key()).arg(ninstNum) + tr(" ;"));
                                QString iwireSrName(tr("_EziDebug_%1_%2_sr%3").arg(pchain->getChainName()).arg(iclockIterator.key()).arg(ninstNum)) ;
 
                                iaddedCodeList.append(tr("\\bwire\\s*\\[\\s*%1:\\s*0\\s*\\]\\s*").arg(iprj->getMaxRegNumPerChain()-1)+tr("_EziDebug_%1_%2_sr%3\\s*;")\
                                                      .arg(pchain->getChainName()).arg(iclockIterator.key()).arg(ninstNum));
 
                                iusrCoreCode.append(iwireShiftRegDefinitionCode);
                                nwireShiftRegNum++ ;
 
                                /*移位寄存器 赋值 代码*/
                                // int nendBit = nleftBit + iprj->getMaxRegNumPerChain() -1;
                                int nendBit = 0 ;
                                if(iregVec.at(nleftRegNum)->m_unRegNum > 1)
                                {
                                    if(iregVec.at(nleftRegNum)->m_eRegNumEndian == EziDebugModule::endianBig)
                                    {
                                        /*高:低*/
                                        // iregVec.at(nleftRegNum)->m_unBitWidth-1
                                        nendBit = nleftBit + 1 - iprj->getMaxRegNumPerChain() ;
                                        iregNameList << constructChainRegString(iregVec.at(nleftRegNum) , nlastStopNum , nleftBit , nendBit , pitem);
 
                                        iregCombinationCode.append(QString::fromAscii(iregVec.at(nleftRegNum)->m_pRegName)+tr("[%1]").arg(iregVec.at(nleftRegNum)->m_unStartNum - nlastStopNum)+tr("[%1:%2]").arg(nleftBit).arg(nendBit));
 
                                        nleftBit = nendBit - 1 ;
                                    }
                                    else
                                    {
                                        /*低:高*/
                                        nendBit = nleftBit -1 + iprj->getMaxRegNumPerChain() ;
                                        iregNameList << constructChainRegString(iregVec.at(nleftRegNum) , nlastStopNum , nleftBit , nendBit , pitem);
 
                                        iregCombinationCode.append(QString::fromAscii(iregVec.at(nleftRegNum)->m_pRegName)+tr("[%1]").arg(iregVec.at(nleftRegNum)->m_unStartNum + nlastStopNum)+tr("[%1:%2]").arg(nleftBit).arg(nendBit));
 
                                        nleftBit = nendBit + 1 ;
                                    }
                                }
                                else
                                {
                                    if(iregVec.at(nleftRegNum)->m_eRegNumEndian == EziDebugModule::endianBig)
                                    {
                                        /*高:低*/
                                        nendBit = nleftBit + 1 - iprj->getMaxRegNumPerChain() ;
                                        iregNameList << constructChainRegString(iregVec.at(nleftRegNum) , nlastStopNum , nleftBit , nendBit , pitem);
 
                                        iregCombinationCode.append(QString::fromAscii(iregVec.at(nleftRegNum)->m_pRegName)+tr("[%1:%2]") \
                                                                   .arg(nleftBit).arg(nendBit));
                                        nleftBit = nendBit - 1 ;
                                    }
                                    else
                                    {
                                        /*低:高*/
                                        nendBit = nleftBit -1 + iprj->getMaxRegNumPerChain() ;
                                        iregNameList << constructChainRegString(iregVec.at(nleftRegNum) , nlastStopNum , nleftBit , nendBit , pitem);
 
                                        iregCombinationCode.append(QString::fromAscii(iregVec.at(nleftRegNum)->m_pRegName)+tr("[%1:%2]")\
                                                                   .arg(nleftBit).arg(nendBit));
 
                                        nleftBit = nendBit + 1 ;
                                    }
                                }
 
                                ichainClock = pchain->getChainClock(pitem->getInstanceName(),iclockIterator.key());
                                if(ichainClock.isEmpty())
                                {
                                     // ichainClock = iclockIterator.key() ;
                                    return 2 ;
                                }
 
                                pchain->addToRegChain(ichainClock ,pchainSt->m_uncurrentChainNumber ,iregNameList);
 
                                QString iwireShiftRegEvaluateString ;
                                iwireShiftRegEvaluateString.append(tr("\n\t""assign %1 = {\n\t\t\t\t\t\t\t\t\t""%2""\n\t\t\t\t\t\t\t\t\t};").arg(iwireSrName).arg(iregCombinationCode.join(" ,\n\t\t\t\t\t\t\t\t\t")));
                                iaddedCodeList.append(tr("\\bassign\\s+%1.*;").arg(iwireSrName));
                                iusrCoreCode.append(iwireShiftRegEvaluateString);
 
                                /*自定义 core 例化代码 */
                                QString iusrCoreDefinitionCode ;
                                //QString iresetName = "1'b1";
                                QString iresetName = tr("_EziDebug_%1_rstn").arg(pchain->getChainName());
 
                                QString iusrCoreTdi ;
                                if(nnumberOfNoLibCore != 0)
                                {
                                    if((chainStructuremap.value(iclockIterator.key())->m_untotalChainNumber) > 1)
                                    {
                                        iusrCoreTdi.append(tr("%1[%2]").arg(pmodule->getChainClockWireNameMap(pchain->getChainName(),iclockIterator.key())).arg(pchainSt->m_uncurrentChainNumber));
                                    }
                                    else
                                    {
                                        iusrCoreTdi.append(tr("%1").arg(pmodule->getChainClockWireNameMap(pchain->getChainName(),iclockIterator.key())));
                                    }
                                }
                                else
                                {
                                    if((chainStructuremap.value(iclockIterator.key())->m_untotalChainNumber) > 1)
                                    {
                                        iusrCoreTdi.append(tr("_EziDebug_%1_%2_TDI_reg[%3]").arg(pchain->getChainName()).arg(iclockIterator.key()).arg(pchainSt->m_uncurrentChainNumber));
                                    }
                                    else
                                    {
                                        iusrCoreTdi.append(tr("_EziDebug_%1_%2_TDI_reg").arg(pchain->getChainName()).arg(iclockIterator.key()));
                                    }
                                }
 
                                iusrCoreDefinitionCode.append(tr("\n\t")+ EziDebugScanChain::getChainRegCore() + tr(" %1_%2_inst%3(\n").arg(EziDebugScanChain::getChainRegCore()).arg(pchain->getChainName()).arg(ninstNum));
                                iusrCoreDefinitionCode.append(  tr("\t"".clock""\t(%1) ,\n").arg(iclockIterator.key()) \
                                                                + tr("\t"".resetn""\t(%1) ,\n").arg(iresetName) \
                                                                + tr("\t"".TDI_reg""\t(%1) ,\n").arg(iusrCoreTdi) \
                                                                + tr("\t"".TDO_reg""\t(%1) ,\n").arg(iwireTdoName) \
                                                                + tr("\t"".TOUT_reg""\t(%1) ,\n").arg(iparentToutPort) \
                                                                + tr("\t"".shift_reg""\t(%1) \n\t) ;").arg(iwireSrName));
 
                                /*加入 定义 userCore regWidth 限定的 语句代码*/
                                QString iparameterDefCode ;
                                iparameterDefCode.append(tr("\n\n\t""defparam %1_%2_inst%3.shift_width = %4 ;").arg(EziDebugScanChain::getChainRegCore()).arg(pchain->getChainName()).arg(ninstNum).arg(iprj->getMaxRegNumPerChain()));
                                iaddedCodeList.append(tr("\\bdefparam\\s+%1_%2_inst%3\\.shift_width\\s*=.*;").arg(EziDebugScanChain::getChainRegCore()).arg(pchain->getChainName()).arg(ninstNum));
                                iusrCoreCode.append(iparameterDefCode)  ;
 
                                iaddedCodeList.append(EziDebugScanChain::getChainRegCore() + tr("\\s+%1_%2_inst%3\\s*\\(.*\\)\\s*;").arg(EziDebugScanChain::getChainRegCore()).arg(pchain->getChainName()).arg(ninstNum));
 
                                iusrCoreCode.append(iusrCoreDefinitionCode);
 
 
                                /*module 端口连接代码*/
                                QString iportConnectCode ;
                                iportConnectCode.append(tr("\n\t""assign %1[%2] = %3 ;").arg(tr("_EziDebug_%1_%2_TDO_reg").arg(pchain->getChainName()).arg(iclockIterator.key()))\
                                                        .arg(pchainSt->m_uncurrentChainNumber).arg(iwireTdoName));
                                iaddedCodeList.append(tr("\\bassign\\s+%1\\s*\\[\\s*%2\\s*\\].*;").arg(tr("_EziDebug_%1_%2_TDO_reg").arg(pchain->getChainName()).arg(iclockIterator.key()))\
                                                      .arg(pchainSt->m_uncurrentChainNumber));
                                iusrCoreCode.append(iportConnectCode);
 
 
                                nlastLeftRegNum = nlastLeftRegNum - iprj->getMaxRegNumPerChain();
                                pchainSt->m_uncurrentChainNumber++ ;
                                pchainSt->m_unleftRegNumber = iprj->getMaxRegNumPerChain() ;
                            }
                        }
 
                        // 将剩余的寄存器加入到链中
                        iregCombinationCode.clear();
                        iregNameList.clear();
#if 1
                        if(iregVec.at(nleftRegNum)->m_eRegBitWidthEndian == EziDebugModule::endianBig)
                        {
                            if((nleftBit - iregVec.at(nleftRegNum)->m_unEndBit) > 0)
                            {
                                pchainSt->m_unleftRegNumber -= (qAbs(nleftBit - iregVec.at(nleftRegNum)->m_unEndBit) + 1) ;
                                nregBitCount = (qAbs(nleftBit - iregVec.at(nleftRegNum)->m_unEndBit) + 1) ;
                                iregNameList << constructChainRegString(iregVec.at(nleftRegNum),nlastStopNum,nleftBit,iregVec.at(nleftRegNum)->m_unEndBit ,pitem);
 
                                iregCombinationCode.append(QString::fromAscii(iregVec.at(nleftRegNum)->m_pRegName)+tr("[%1][%2:%3]").arg(iregVec.at(nleftRegNum)->m_unStartNum - nlastStopNum).arg(nleftBit).arg(iregVec.at(nleftRegNum)->m_unEndBit));
                            }
                            else if((nleftBit - iregVec.at(nleftRegNum)->m_unEndBit) == 0)
                            {
                                pchainSt->m_unleftRegNumber -= (qAbs(nleftBit - iregVec.at(nleftRegNum)->m_unEndBit) + 1) ;
                                nregBitCount = (qAbs(nleftBit - iregVec.at(nleftRegNum)->m_unEndBit) + 1) ;
                                iregNameList << constructChainRegString(iregVec.at(nleftRegNum),nlastStopNum,nleftBit,iregVec.at(nleftRegNum)->m_unEndBit ,pitem);
 
                                iregCombinationCode.append(QString::fromAscii(iregVec.at(nleftRegNum)->m_pRegName)+tr("[%1][0]").arg(iregVec.at(nleftRegNum)->m_unStartNum - nlastStopNum));
                            }
                            else
                            {
                                // 上面已经加完了
                            }
 
                        }
                        else
                        {
                            if((iregVec.at(nleftRegNum)->m_unEndBit - nleftBit) > 0)
                            {
                                pchainSt->m_unleftRegNumber -= (qAbs(nleftBit - iregVec.at(nleftRegNum)->m_unEndBit) + 1) ;
                                nregBitCount = (qAbs(nleftBit - iregVec.at(nleftRegNum)->m_unEndBit) + 1) ;
                                iregNameList << constructChainRegString(iregVec.at(nleftRegNum),nlastStopNum,nleftBit,iregVec.at(nleftRegNum)->m_unEndBit ,pitem);
 
                                iregCombinationCode.append(QString::fromAscii(iregVec.at(nleftRegNum)->m_pRegName)+tr("[%1][%2:%3]").arg(iregVec.at(nleftRegNum)->m_unStartNum + nlastStopNum).arg(nleftBit).arg(iregVec.at(nleftRegNum)->m_unEndBit));
                            }
                            else if((iregVec.at(nleftRegNum)->m_unEndBit - nleftBit) == 0)
                            {
                                pchainSt->m_unleftRegNumber -= (qAbs(nleftBit - iregVec.at(nleftRegNum)->m_unEndBit) + 1) ;
                                nregBitCount = (qAbs(nleftBit - iregVec.at(nleftRegNum)->m_unEndBit) + 1) ;
                                iregNameList << constructChainRegString(iregVec.at(nleftRegNum),nlastStopNum,nleftBit,iregVec.at(nleftRegNum)->m_unEndBit ,pitem);
 
                                iregCombinationCode.append(QString::fromAscii(iregVec.at(nleftRegNum)->m_pRegName)+tr("[%1][0]").arg(iregVec.at(nleftRegNum)->m_unStartNum + nlastStopNum));
                            }
                            else
                            {
                                // 已经加完
                            }
                        }
#endif
 
 
                        if(iregVec.at(nleftRegNum)->m_unRegNum > 1)
                        {
                            nlastStopNum++ ;
                        }
                        else
                        {
                            nleftRegNum++ ;
                            nlastStopNum = 0 ;
                        }
 
                        nleftBit = -1 ;
                    }
                    else
                    {
                        nregBitCount = 0 ;
                    }
 
 
                    for(; nleftRegNum < iregVec.count() ; nleftRegNum++)
                    {
                        for(int m = nlastStopNum ; m < iregVec.at(nleftRegNum)->m_unRegNum; m++)
                        {
                            nregBitCount += iregVec.at(nleftRegNum)->m_unRegBitWidth ;
 
                            if(nregBitCount < pchainSt->m_unleftRegNumber)
                            {
                                /*数组情况下*/
                                // 够用继续添加
                                if(iregVec.at(nleftRegNum)->m_unRegNum > 1)
                                {
                                    if(iregVec.at(nleftRegNum)->m_eRegNumEndian == EziDebugModule::endianBig)
                                    {
                                        iregCombinationCode.append(QString::fromAscii(iregVec.at(nleftRegNum)->m_pRegName)+tr("[%1]").arg(iregVec.at(nleftRegNum)->m_unStartNum - m));
                                    }
                                    else
                                    {
                                        iregCombinationCode.append(QString::fromAscii(iregVec.at(nleftRegNum)->m_pRegName)+tr("[%1]").arg(iregVec.at(nleftRegNum)->m_unStartNum + m));
                                    }
                                }
                                else
                                {
                                    iregCombinationCode.append(QString::fromAscii(iregVec.at(nleftRegNum)->m_pRegName));
                                }
 
                                iregNameList << constructChainRegString(iregVec.at(nleftRegNum),m,iregVec.at(nleftRegNum)->m_unStartBit,iregVec.at(nleftRegNum)->m_unEndBit,pitem);
                            }
                            else if(nregBitCount == pchainSt->m_unleftRegNumber)
                            {
                                // 刚好满  跳出  下次新的扫描链继续 添加
                                if(iregVec.at(nleftRegNum)->m_unRegNum > 1)
                                {
                                    if(iregVec.at(nleftRegNum)->m_eRegNumEndian == EziDebugModule::endianBig)
                                    {
                                        iregCombinationCode.append(QString::fromAscii(iregVec.at(nleftRegNum)->m_pRegName)+tr("[%1]").arg(iregVec.at(nleftRegNum)->m_unStartNum - m));
                                    }
                                    else
                                    {
                                        iregCombinationCode.append(QString::fromAscii(iregVec.at(nleftRegNum)->m_pRegName)+tr("[%1]").arg(iregVec.at(nleftRegNum)->m_unStartNum + m));
                                    }
                                }
                                else
                                {
                                    iregCombinationCode.append(QString::fromAscii(iregVec.at(nleftRegNum)->m_pRegName));
                                }
 
                                iregNameList << constructChainRegString(iregVec.at(nleftRegNum),m,iregVec.at(nleftRegNum)->m_unStartBit,iregVec.at(nleftRegNum)->m_unEndBit,pitem);
 
                                nlastStopNum = m ;
                                // nleftBit = -1 ;
                                nleftRegNum++ ;
                                isNeedAdded = true ;
 
                                goto WireShiftRegEvaluate1 ;
                            }
                            else
                            {
                                if(iregVec.at(nleftRegNum)->m_unRegNum > 1)
                                {
                                    if(iregVec.at(nleftRegNum)->m_eRegNumEndian == EziDebugModule::endianBig)
                                    {
                                        int nstartBit = iregVec.at(nleftRegNum)->m_unStartBit ;
                                        int nendBit = nregBitCount- pchainSt->m_unleftRegNumber + iregVec.at(nleftRegNum)->m_unStartBit + 1 - iregVec.at(nleftRegNum)->m_unRegBitWidth ;
                                        nleftBit = nendBit - 1 ;
                                        iregNameList << constructChainRegString(iregVec.at(nleftRegNum),m,nstartBit,nendBit,pitem);
 
                                        iregCombinationCode.append(QString::fromAscii(iregVec.at(nleftRegNum)->m_pRegName)+tr("[%1]").arg(iregVec.at(nleftRegNum)->m_unStartNum - m)+tr("[%1:%2]").arg(nstartBit).arg(nendBit));
                                    }
                                    else
                                    {
                                        int nstartBit = iregVec.at(nleftRegNum)->m_unStartBit ;
                                        int nendBit = iregVec.at(nleftRegNum)->m_unRegBitWidth + iregVec.at(nleftRegNum)->m_unStartBit - 1 - (nregBitCount- pchainSt->m_unleftRegNumber) ;
                                        nleftBit = nendBit + 1 ;
                                        iregNameList << constructChainRegString(iregVec.at(nleftRegNum),m,nstartBit,nendBit,pitem);
 
                                        iregCombinationCode.append(QString::fromAscii(iregVec.at(nleftRegNum)->m_pRegName)+tr("[%1]").arg(iregVec.at(nleftRegNum)->m_unStartNum + m)+tr("[%1:%2]").arg(nstartBit).arg(nendBit));
                                    }
                                }
                                else
                                {
                                    if(iregVec.at(nleftRegNum)->m_eRegNumEndian == EziDebugModule::endianBig)
                                    {
                                        int nstartBit = iregVec.at(nleftRegNum)->m_unStartBit ;
                                        int nendBit = nregBitCount- pchainSt->m_unleftRegNumber + iregVec.at(nleftRegNum)->m_unStartBit + 1 - iregVec.at(nleftRegNum)->m_unRegBitWidth ;
                                        nleftBit = nendBit - 1 ;
                                        iregNameList << constructChainRegString(iregVec.at(nleftRegNum),m,nstartBit,nendBit,pitem);
 
                                        iregCombinationCode.append(QString::fromAscii(iregVec.at(nleftRegNum)->m_pRegName)+tr("[%1:%2]") \
                                                                   .arg(nstartBit).arg(nendBit));
                                    }
                                    else
                                    {
                                        int nstartBit = iregVec.at(nleftRegNum)->m_unStartBit ;
                                        int nendBit = iregVec.at(nleftRegNum)->m_unRegBitWidth + iregVec.at(nleftRegNum)->m_unStartBit - 1 - (nregBitCount- pchainSt->m_unleftRegNumber) ;
                                        nleftBit = nendBit + 1 ;
                                        iregNameList << constructChainRegString(iregVec.at(nleftRegNum),m,nstartBit,nendBit,pitem);
 
                                        iregCombinationCode.append(QString::fromAscii(iregVec.at(nleftRegNum)->m_pRegName)+tr("[%1:%2]")\
                                                                   .arg(nstartBit).arg(nendBit));
                                    }
                                }
 
                                nlastStopNum = m ;
                                isNeedAdded = true ;
                                goto WireShiftRegEvaluate1 ;
                            }
                        }
                        nlastStopNum = 0 ;
                    }
WireShiftRegEvaluate1:
 
                    if(isNeedAdded == true)
                    {
                        nusedNum =  pchainSt->m_unleftRegNumber ;
                    }
                    else
                    {
                        nusedNum = nregBitCount ;
                    }
 
                    // 没加完继续加
                    if(nleftRegNum != iregVec.count())
                    {
                        // 有寄存器
                        if(iregNameList.count())
                        {
 
                            ichainClock = pchain->getChainClock(pitem->getInstanceName(),iclockIterator.key());
 
                            if(ichainClock.isEmpty())
                            {
                                return 2 ;
                            }
 
                            pchain->addToRegChain(ichainClock,pchainSt->m_uncurrentChainNumber,iregNameList);
 
                            nwireCount++ ;
                            // 定义 wire 连接 tdo 代码
                            QString iwireTdoName(tr("_EziDebug_%1_%2_tdo%3").arg(pchain->getChainName()).arg(iclockIterator.key()).arg(nwireCount));
                            QString iwireTdoDefinitionCode(tr("\n\n\t""wire ")+ iwireTdoName + tr(" ;")) ;
                            iusrCoreCode.append(iwireTdoDefinitionCode);
                            iaddedCodeList.append(tr("\\bwire\\s+_EziDebug_%1_%2_tdo%3\\s*;")\
                                                  .arg(pchain->getChainName()).arg(iclockIterator.key()).arg(nwireCount));
 
 
                            // 定义 wire 连接 移位寄存器 代码
                            QString iwireShiftRegDefinitionCode(tr("\n\t""wire ") + tr("[%1:0] ").arg(nusedNum - 1) + tr("_EziDebug_%1_%2_sr%3")\
                                                                .arg(pchain->getChainName()).arg(iclockIterator.key()).arg(nwireShiftRegNum) + tr(" ;"));
                            QString iwireSrName(tr("_EziDebug_%1_%2_sr%3").arg(pchain->getChainName()).arg(iclockIterator.key()).arg(nwireShiftRegNum)) ;
 
                            iaddedCodeList.append(tr("\\bwire\\s*\\[\\s*%1\\s*:\\s*0\\s*\\]\\s*").arg(nusedNum - 1) + tr("_EziDebug_%1_%2_sr%3\\s*;")\
                                                  .arg(pchain->getChainName()).arg(iclockIterator.key()).arg(nwireShiftRegNum));
 
                            iusrCoreCode.append(iwireShiftRegDefinitionCode);
                            nwireShiftRegNum++ ;
 
                            //pchain->addToRegChain(ichainClock,pchainSt->m_uncurrentChainNumber,iregNameList);
 
                            QString iwireShiftRegEvaluateString ;
                            iwireShiftRegEvaluateString.append(tr("\n\t""assign %1 = {\n\t\t\t\t\t\t\t\t\t""%2""\n\t\t\t\t\t\t\t\t\t};").arg(iwireSrName).arg(iregCombinationCode.join(" ,\n\t\t\t\t\t\t\t\t\t")));
                            iaddedCodeList.append(tr("\\bassign\\s+%1\\s*=.*;").arg(iwireSrName));
                            iusrCoreCode.append(iwireShiftRegEvaluateString);
 
 
                            /*自定义 core 例化代码 */
                            QString iusrCoreDefinitionCode ;
                            //QString iresetName = "1'b1";
                            QString iresetName = tr("_EziDebug_%1_rstn").arg(pchain->getChainName());
 
 
                            QString iusrCoreTdi ;
                            if(nnumberOfNoLibCore != 0)
                            {
                                if((chainStructuremap.value(iclockIterator.key())->m_untotalChainNumber) > 1)
                                {
                                    iusrCoreTdi.append(tr("%1[%2]").arg(pmodule->getChainClockWireNameMap(pchain->getChainName(),iclockIterator.key())).arg(pchainSt->m_uncurrentChainNumber));
                                }
                                else
                                {
                                    iusrCoreTdi.append(tr("%1").arg(pmodule->getChainClockWireNameMap(pchain->getChainName(),iclockIterator.key())));
                                }
                            }
                            else
                            {
                                if((chainStructuremap.value(iclockIterator.key())->m_untotalChainNumber) > 1)
                                {
                                    iusrCoreTdi.append(tr("_EziDebug_%1_%2_TDI_reg[%3]").arg(pchain->getChainName()).arg(iclockIterator.key()).arg(pchainSt->m_uncurrentChainNumber));
                                }
                                else
                                {
                                    iusrCoreTdi.append(tr("_EziDebug_%1_%2_TDI_reg").arg(pchain->getChainName()).arg(iclockIterator.key()));
                                }
                            }
 
                            iusrCoreDefinitionCode.append(tr("\n\n\t")+EziDebugScanChain::getChainRegCore() + tr(" %1_%2_inst%3(\n").arg(EziDebugScanChain::getChainRegCore()).arg(pchain->getChainName()).arg(ninstNum));
                            iusrCoreDefinitionCode.append(  tr("\t\t"".clock""\t(%1) ,\n").arg(iclockIterator.key()) \
                                                            + tr("\t\t"".resetn""\t(%1) ,\n").arg(iresetName) \
                                                            + tr("\t\t"".TDI_reg""\t(%1) ,\n").arg(iusrCoreTdi) \
                                                            + tr("\t\t"".TDO_reg""\t(%1) ,\n").arg(iwireTdoName) \
                                                            + tr("\t\t"".TOUT_reg""\t(%1) ,\n").arg(iparentToutPort) \
                                                            + tr("\t\t"".shift_reg""\t(%1) \n\t) ;").arg(iwireSrName));
 
 
                            /*加入 定义 userCore regWidth 限定的 语句代码*/
                            QString iparameterDefCode ;
                            iparameterDefCode.append(tr("\n\n\t""defparam %1_%2_inst%3.shift_width = %4 ;").arg(EziDebugScanChain::getChainRegCore()).arg(pchain->getChainName()).arg(ninstNum).arg(nusedNum));
                            iaddedCodeList.append(tr("\\bdefparam\\s+%1_%2_inst%3\\.shift_width\\s*=.*;").arg(EziDebugScanChain::getChainRegCore()).arg(pchain->getChainName()).arg(ninstNum));
 
                            iusrCoreCode.append(iparameterDefCode)  ;
                            iaddedCodeList.append(EziDebugScanChain::getChainRegCore() + tr("\\s+%1_%2_inst%3\\s*(.*)\\s*;").arg(EziDebugScanChain::getChainRegCore()).arg(pchain->getChainName()).arg(ninstNum));
 
                            iusrCoreCode.append(iusrCoreDefinitionCode);
 
                            /*module 端口连接代码*/
                            QString iportConnectCode ;
                            if((chainStructuremap.value(iclockIterator.key())->m_untotalChainNumber) > 1)
                            {
                                iportConnectCode.append(tr("\n\n\t""assign %1[%2] = %3 ;").arg(tr("_EziDebug_%1_%2_TDO_reg").arg(pchain->getChainName()).arg(iclockIterator.key()))\
                                                        .arg(pchainSt->m_uncurrentChainNumber).arg(iwireTdoName));
                                iaddedCodeList.append(tr("\\bassign\\s+%1\\s*\\[\\s*%2\\s*\\].*;").arg(tr("_EziDebug_%1_%2_TDO_reg").arg(pchain->getChainName()).arg(iclockIterator.key()))\
                                                      .arg(pchainSt->m_uncurrentChainNumber));
                            }
                            else
                            {
                                iportConnectCode.append(tr("\n\n\t""assign %1 = %2 ;").arg(tr("_EziDebug_%1_%2_TDO_reg").arg(pchain->getChainName()).arg(iclockIterator.key()))\
                                                        .arg(iwireTdoName));
                                iaddedCodeList.append(tr("\\bassign\\s+%1\\s*=\\s*%2\\s*;").arg(tr("_EziDebug_%1_%2_TDO_reg").arg(pchain->getChainName()).arg(iclockIterator.key()))\
                                                      .arg(iwireTdoName));
                            }
                            iusrCoreCode.append(iportConnectCode);
                        }
 
                        pchainSt->m_uncurrentChainNumber++ ;
                        pchainSt->m_unleftRegNumber = iprj->getMaxRegNumPerChain() ;
                        isNeedAdded = false ;
                        goto AddReg ;
                    }
                    else
                    {
                        pchainSt->m_unleftRegNumber -= nregBitCount ;
                    }
#if 0
                    if(!sregVec.count())
                    {
                        pchainSt->m_uncurrentChainNumber++ ;
                        pchainSt->m_unleftRegNumber = iprj->getMaxRegNumPerChain() ;
                    }
#endif
 
                    // 添加动态寄存器
                    QString ivarRegSumStr ;
                    int nregNumCount = 0 ;
                    nleftRegNum = 0 ;
 
AddVReg:
                    if(nregBitCount != 0)
                    {
                        ivarRegSumStr = QString::number(nregBitCount) ;
                    }
                    else
                    {
                        ivarRegSumStr.clear();
                        iregCombinationCode.clear();
                    }
 
                    for(;nleftRegNum < vregVec.count();nleftRegNum++)
                    {
                        // 还要考虑 regnum  记录添加到了 哪个 寄存器
                        EziDebugModule::RegStructure* preg = vregVec.at(nleftRegNum) ;
                        EziDebugModule::RegStructure* pinstancereg = pmodule->getInstanceReg(pitem->getInstanceName(),iclockIterator.key(),QString::fromAscii(preg->m_pRegName));
 
                        if(preg->m_unMaxBitWidth < pchainSt->m_unleftRegNumber)
                        {
                            pchainSt->m_unleftRegNumber -= preg->m_unMaxBitWidth ;
 
                            if(pinstancereg->m_unRegNum == 1)
                            {
                                if(!ivarRegSumStr.isEmpty())
                                {
                                    ivarRegSumStr.append(QObject::tr("+") + QString::fromAscii(preg->m_pExpString));
                                }
                                else
                                {
                                    ivarRegSumStr.append(QString::fromAscii(preg->m_pExpString));
                                }
 
                                iregNameList << constructChainRegString(pinstancereg , 0 ,pinstancereg->m_unStartBit , pinstancereg->m_unEndBit , pitem);
 
                                iregCombinationCode.append(QString::fromAscii(preg->m_pRegName));
                            }
                            else if(pinstancereg->m_unRegNum > 1)
                            {
                                if(!ivarRegSumStr.isEmpty())
                                {
                                    ivarRegSumStr.append(QObject::tr("+") + QString::fromAscii(preg->m_pExpString) + QObject::tr("*") + QString::number(pinstancereg->m_unRegNum));
                                }
                                else
                                {
                                    ivarRegSumStr.append(QString::fromAscii(preg->m_pExpString) + QObject::tr("*") + QString::number(pinstancereg->m_unRegNum));
                                }
 
                                for( ; nregNumCount < pinstancereg->m_unRegNum ; nregNumCount++ )
                                {
                                    QString iregNumStr ;
                                    if(pinstancereg->m_eRegNumEndian == EziDebugModule::endianBig)
                                    {
                                        iregNumStr = QString::number(pinstancereg->m_unStartNum - nregNumCount) ;
                                    }
                                    else
                                    {
                                        iregNumStr = QString::number(pinstancereg->m_unStartNum + nregNumCount) ;
                                    }
                                    iregNameList << constructChainRegString(pinstancereg , nregNumCount ,pinstancereg->m_unStartBit , pinstancereg->m_unEndBit , pitem);
 
                                    iregCombinationCode.append(QObject::tr("%1[%2]").arg(QString::fromAscii(pinstancereg->m_pRegName)).arg(iregNumStr)) ;
                                }
                            }
                        }
                        else
                        {
                            // 跳出添加链
                            break ;
                        }
                    }
 
                    // 添加扫描链
                    ichainClock = pchain->getChainClock(pitem->getInstanceName(),iclockIterator.key());
                    if(ichainClock.isEmpty())
                    {
                        ichainClock = iclockIterator.key() ;
                    }
 
                    pchain->addToRegChain(ichainClock ,pchainSt->m_uncurrentChainNumber ,iregNameList);
 
 
                    nwireCount++ ;
                    // 定义 wire 连接 tdo 代码
                    QString iwireTdoName(tr("_EziDebug_%1_%2_tdo%3").arg(pchain->getChainName()).arg(iclockIterator.key()).arg(nwireCount));
                    QString iwireTdoDefinitionCode(tr("\n\n\t""wire ")+ iwireTdoName + tr(" ;")) ;
                    iusrCoreCode.append(iwireTdoDefinitionCode);
                    iaddedCodeList.append(tr("\\bwire\\s+_EziDebug_%1_%2_tdo%3\\s*;")\
                                          .arg(pchain->getChainName()).arg(iclockIterator.key()).arg(nwireCount));
 
 
                    // 定义 wire 连接 移位寄存器 代码
                    QString iwireShiftRegDefinitionCode(tr("\n\t""wire ") + tr("[%1:0] ").arg(ivarRegSumStr + tr(" - 1")) + tr("_EziDebug_%1_%2_sr%3")\
                                                        .arg(pchain->getChainName()).arg(iclockIterator.key()).arg(nwireShiftRegNum) + tr(" ;"));
                    QString iwireSrName(tr("_EziDebug_%1_%2_sr%3").arg(pchain->getChainName()).arg(iclockIterator.key()).arg(nwireShiftRegNum)) ;
 
                    iaddedCodeList.append(tr("\\bwire\\s*\\[\\s*%1\\s*:\\s*0\\s*\\]\\s*").arg(ivarRegSumStr + tr(" - 1")) + tr("_EziDebug_%1_%2_sr%3\\s*;")\
                                          .arg(pchain->getChainName()).arg(iclockIterator.key()).arg(nwireShiftRegNum));
 
                    iusrCoreCode.append(iwireShiftRegDefinitionCode);
                    nwireShiftRegNum++ ;
 
                    QString iwireShiftRegEvaluateString ;
                    iwireShiftRegEvaluateString.append(tr("\n\t""assign %1 = {\n\t\t\t\t\t\t\t\t\t""%2""\n\t\t\t\t\t\t\t\t\t};").arg(iwireSrName).arg(iregCombinationCode.join(" ,\n\t\t\t\t\t\t\t\t\t")));
                    iaddedCodeList.append(tr("\\bassign\\s+%1.*;").arg(iwireSrName));
                    iusrCoreCode.append(iwireShiftRegEvaluateString);
 
                    /*自定义 core 例化代码 */
                    QString iusrCoreDefinitionCode ;
                    //QString iresetName ;
                    QString iresetName = tr("_EziDebug_%1_rstn").arg(pchain->getChainName());
 
                    QString iusrCoreTdi ;
                    if(nnumberOfNoLibCore != 0)
                    {
                        if((chainStructuremap.value(iclockIterator.key())->m_untotalChainNumber) > 1)
                        {
                            iusrCoreTdi.append(tr("%1[%2]").arg(pmodule->getChainClockWireNameMap(pchain->getChainName(),iclockIterator.key())).arg(pchainSt->m_uncurrentChainNumber));
                        }
                        else
                        {
                            iusrCoreTdi.append(tr("%1").arg(pmodule->getChainClockWireNameMap(pchain->getChainName(),iclockIterator.key())));
                        }
                    }
                    else
                    {
                        if((chainStructuremap.value(iclockIterator.key())->m_untotalChainNumber) > 1)
                        {
                            iusrCoreTdi.append(tr("_EziDebug_%1_%2_TDI_reg[%3]").arg(pchain->getChainName()).arg(iclockIterator.key()).arg(pchainSt->m_uncurrentChainNumber));
                        }
                        else
                        {
                            iusrCoreTdi.append(tr("_EziDebug_%1_%2_TDI_reg").arg(pchain->getChainName()).arg(iclockIterator.key()));
                        }
                    }
 
                    iusrCoreDefinitionCode.append(tr("\n\t")+ EziDebugScanChain::getChainRegCore() + tr(" %1_%2_inst%3(\n").arg(EziDebugScanChain::getChainRegCore()).arg(pchain->getChainName()).arg(ninstNum));
                    iusrCoreDefinitionCode.append(  tr("\t"".clock""\t(%1) ,\n").arg(iclockIterator.key()) \
                                                    + tr("\t"".resetn""\t(%1) ,\n").arg(iresetName) \
                                                    + tr("\t"".TDI_reg""\t(%1) ,\n").arg(iusrCoreTdi) \
                                                    + tr("\t"".TDO_reg""\t(%1) ,\n").arg(iwireTdoName) \
                                                    + tr("\t"".TOUT_reg""\t(%1) ,\n").arg(iparentToutPort) \
                                                    + tr("\t"".shift_reg""\t(%1) \n\t) ;").arg(iwireSrName));
 
                    /*加入 定义 userCore regWidth 限定的 语句代码*/
                    QString iparameterDefCode ;
                    iparameterDefCode.append(tr("\n\n\t""defparam %1_%2_inst%3.shift_width = %4 ;").arg(EziDebugScanChain::getChainRegCore()).arg(pchain->getChainName()).arg(ninstNum).arg(ivarRegSumStr));
                    iaddedCodeList.append(tr("\\bdefparam\\s+%1_%2_inst%3\\.shift_width\\s*=.*;").arg(EziDebugScanChain::getChainRegCore()).arg(pchain->getChainName()).arg(ninstNum));
                    iusrCoreCode.append(iparameterDefCode)  ;
 
                    iaddedCodeList.append(EziDebugScanChain::getChainRegCore() + tr("\\s+%1_%2_inst%3\\s*\\(.*\\)\\s*;").arg(EziDebugScanChain::getChainRegCore()).arg(pchain->getChainName()).arg(ninstNum));
 
                    iusrCoreCode.append(iusrCoreDefinitionCode);
 
 
                    /*module 端口连接代码*/
                    QString iportConnectCode ;
                    iportConnectCode.append(tr("\n\t""assign %1[%2] = %3 ;").arg(tr("_EziDebug_%1_%2_TDO_reg").arg(pchain->getChainName()).arg(iclockIterator.key()))\
                                            .arg(pchainSt->m_uncurrentChainNumber).arg(iwireTdoName));
                    iaddedCodeList.append(tr("\\bassign\\s+%1\\s*\\[\\s*%2\\s*\\].*;").arg(tr("_EziDebug_%1_%2_TDO_reg").arg(pchain->getChainName()).arg(iclockIterator.key()))\
                                          .arg(pchainSt->m_uncurrentChainNumber));
                    iusrCoreCode.append(iportConnectCode);
 
                    ivarRegSumStr.clear();
 
                    if(iregNameList.count())
                    {
                        // 将第一部分的寄存器 最后一次的 regbitcount 记录下来
                        // 转换为 QString 类型
 
                        if(nleftRegNum != vregVec.count())
                        {
                            // 还有寄存器
                            pchainSt->m_uncurrentChainNumber++ ;
                            pchainSt->m_unleftRegNumber = iprj->getMaxRegNumPerChain() ;
                            goto AddVReg ;
                        }
                    }
                }
 
            }
            // 根据 要例化 数目 创建 例化 ,并创建 wire_tdo 信号 、移位寄存器 、
            if(fileName().endsWith("fft_ram_256x17.v"))
            {
                qDebug("add chain in fft_ram_256x17.v");
            }
            QString ilastPortConnect ;
            nchainEndNum = pchainSt->m_uncurrentChainNumber ;
 
            // 上一次链结束 到 这一次链开始 的 端口连接
            ilastInput.clear();
            if(nnumberOfNoLibCore != 0)
            {
                // 用 lastwire
                ilastInput = pmodule->getChainClockWireNameMap(pchain->getChainName(),iclockIterator.key()) ;
            }
            else
            {
                // 用 tdi
                ilastInput = tr("_EziDebug_%1_%2_TDI_reg").arg(pchain->getChainName()).arg(iclockIterator.key()) ;
            }
 
            // 不在同一条链上,且不是从0条链开始加
            if((nlastChainEndNum != nchainStartNum)&&(nchainStartNum != 0))
            {
                int nstartBit = 0 ;
 
                nstartBit = nlastChainEndNum + 1;
 
 
                if((nchainStartNum - nlastChainEndNum) > 2)
                {
                    ilastPortConnect.append(tr("\n\t""assign %1[%2:%3] = %4[%5:%6] ;").arg(tr("_EziDebug_%1_%2_TDO_reg").arg(pchain->getChainName()).arg(iclockIterator.key()))\
                                            .arg(nchainStartNum-1).arg(nstartBit).arg(ilastInput).arg(nchainStartNum-1).arg(nstartBit));
                    iusrCoreCode.append(ilastPortConnect);
                    iaddedCodeList.append(tr("\\bassign\\s+%1\\s*\\[\\s*%2\\s*:\\s*%3\\s*\\]\\s*=\\s*%4\\[\\s*%5\\s*:\\s*%6\\s*\\]\\s*;")
                                          .arg(tr("_EziDebug_%1_%2_TDO_reg").arg(pchain->getChainName()).arg(iclockIterator.key()))\
                                                                                      .arg(nchainStartNum-1).arg(nstartBit).arg(ilastInput).arg(nchainStartNum-1).arg(nstartBit));
                }
                else
                {
                    ilastPortConnect.append(tr("\n\t""assign %1[%2] = %3[%4] ;").arg(tr("_EziDebug_%1_%2_TDO_reg").arg(pchain->getChainName()).arg(iclockIterator.key()))\
                                            .arg(nstartBit)\
                                            .arg(ilastInput)\
                                            .arg(nstartBit));
                    iusrCoreCode.append(ilastPortConnect);
                    iaddedCodeList.append(tr("\\bassign\\s+%1\\s*\\[\\s*%2\\s*\\]\\s*=\\s*%3\\s*\\[\\s*%4\\s*\\]\\s*;")\
                                          .arg(tr("_EziDebug_%1_%2_TDO_reg")\
                                          .arg(pchain->getChainName())\
                                          .arg(iclockIterator.key()))\
                                          .arg(nstartBit)\
                                          .arg(ilastInput)\
                                          .arg(nstartBit));
                }
            }
 
            pmodule->setBitRangeInChain(pchain->getChainName(),iclockIterator.key(),nchainStartNum ,nchainEndNum);
            pmodule->setEziDebugCoreCounts(pchain->getChainName(),ninstNum);
            ++iclockIterator ;
        }
 
            pmodule->setEziDebugWireCounts(pchain->getChainName(),nwireCount);
 
        /*
                自定义core 的例化代码
                1、  _EziDebugScanChainReg + 例化名(
                    .clock      (module中的各个clock)  ,
                    .resetn     (module中的复位信号)  ,
                    .TDI_reg    (非系统core 的 最后一个 wire_tdo)  ,
                    .TDO_reg    (自定义的 wire_tdo  )  ,
                    .TOUT_reg   (module端口的 tout  )  ,
                    .shift_reg  (自定义的 shift_reg )
                 );
            */
        int ntimesPerChain = pmodule->getInstancedTimesPerChain(pchain->getChainName()) ;
        if(1 == ntimesPerChain)
        {
            iclockIterator = iclockMap.constBegin();
            while(iclockIterator != iclockMap.constEnd())
            {
                EziDebugInstanceTreeItem::SCAN_CHAIN_STRUCTURE* pchainSt = chainStructuremap.value(iclockIterator.key()) ;
                QString ilastInput ;
                QString ilastPortConnect ;
                if(nnumberOfNoLibCore != 0)
                {
                    // 用 lastwire
                    ilastInput = pmodule->getChainClockWireNameMap(pchain->getChainName(),iclockIterator.key()) ;
 
                }
                else
                {
                    // 用 tdi
                    ilastInput = tr("_EziDebug_%1_%2_TDI_reg").arg(pchain->getChainName()).arg(iclockIterator.key()) ;
                }
 
                // 这次最后1bit wire
                pmodule->getBitRangeInChain(pchain->getChainName(),iclockIterator.key(),&nlastChainStartNum ,&nlastChainEndNum);
 
                int nbitNum = 0 ;
 
                // 端口连接不完全
                if(nlastChainEndNum != (pchainSt->m_untotalChainNumber-1))
                {
                    if((pchainSt->m_untotalChainNumber - nlastChainEndNum) > 2)
                    {
                        if( -1 == nlastChainEndNum)
                        {
                            // 没加过自定义core
                            nbitNum  = 0 ;
                        }
                        else
                        {
                            nbitNum = nlastChainEndNum + 1 ;
                        }
 
                        ilastPortConnect.append(tr("\n\t""assign %1[%2:%3] = %4[%5:%6] ;").arg(tr("_EziDebug_%1_%2_TDO_reg").arg(pchain->getChainName()).arg(iclockIterator.key()))\
                                                .arg(pchainSt->m_untotalChainNumber-1).arg(nbitNum).arg(ilastInput).arg(pchainSt->m_untotalChainNumber-1).arg(nbitNum));
                        iusrCoreCode.append(ilastPortConnect);
                        iaddedCodeList.append(tr("\\bassign\\s+")+tr("%1\\s*\\[\\s*%2\\s*:\\s*%3\\s*\\]\\s*=\\s*%4\\s*\\[\\s*%5\\s*:\\s*%6\\s*\\]\\s*;") \
                                              .arg(tr("_EziDebug_%1_%2_TDO_reg").arg(pchain->getChainName()).arg(iclockIterator.key()))\
                                              .arg(pchainSt->m_untotalChainNumber-1)\
                                              .arg(nbitNum).arg(ilastInput).arg(pchainSt->m_untotalChainNumber-1).arg(nbitNum)
                                              );
                    }
                    else
                    {
 
                        if(nlastChainEndNum == -1) // module无寄存器 无插入链代码  直接透传
                        {
                            ilastPortConnect.append(tr("\n\t""assign %1 = %2 ;").arg(tr("_EziDebug_%1_%2_TDO_reg").arg(pchain->getChainName()).arg(iclockIterator.key()))\
                                                    .arg(ilastInput));
                            iusrCoreCode.append(ilastPortConnect);
                            iaddedCodeList.append(tr("\\bassign\\s+")+tr("%1\\s*=\\s*%2\\s*;") \
                                                  .arg(tr("_EziDebug_%1_%2_TDO_reg").arg(pchain->getChainName()).arg(iclockIterator.key()))\
                                                  .arg(ilastInput));
                        }
                        else
                        {
                            ilastPortConnect.append(tr("\n\t""assign %1[%2] = %3[%4] ;").arg(tr("_EziDebug_%1_%2_TDO_reg").arg(pchain->getChainName()).arg(iclockIterator.key())).arg(pchainSt->m_untotalChainNumber-1)\
                                                    .arg(ilastInput).arg(pchainSt->m_untotalChainNumber-1));
                            iusrCoreCode.append(ilastPortConnect);
                            iaddedCodeList.append(tr("\\bassign\\s+")+tr("%1\\s*\\[\\s*%2\\s*\\]\\s*=\\s*%3\\s*\\[\\s*%4\\s*\\]\\s*;") \
                                                  .arg(tr("_EziDebug_%1_%2_TDO_reg").arg(pchain->getChainName()).arg(iclockIterator.key()))\
                                                  .arg(pchainSt->m_untotalChainNumber-1)\
                                                  .arg(ilastInput).arg(pchainSt->m_untotalChainNumber-1)
                                                  );
                        }
                    }
                }
 
                ++iclockIterator ;
            }
        }
        else
        {
            ntimesPerChain-- ;
            pmodule->setInstancedTimesPerChain(pchain->getChainName(),ntimesPerChain);
        }
 
        pchain->addToLineCodeMap(pmodule->getModuleName(),iaddedCodeList);
        pchain->addToBlockCodeMap(pmodule->getModuleName(),iaddedBlockCodeList);
        /*插入到字符串中*/
 
        ifileData.insert(imodulePos.m_nendModuleKeyWordPos + noffSet ,iusrCoreCode);
 
        if(!open(QIODevice::WriteOnly|QIODevice::Text|QIODevice::Truncate))
        {
            qDebug() << "Cannot Open file for writing:" << qPrintable(this->errorString());
            return 1 ;
        }
 
        QTextStream iout(this);
        /*写入文件 */
        iout <<  ifileData ;
 
        // 记录已经加入了 一系列 用户 core 代码
        pmodule->setAddCodeFlag(true);      
 
        close();
        ilastModifedTime = ifileInfo.lastModified() ;
        modifyStoredTime(ilastModifedTime);
        return 0 ;
    }
    else
    {
        goto ErrorHandle ;
    }
 
 
ErrorHandle:
 
    /*关闭文件*/
    close();
    return 1 ;
 
}
 
int  EziDebugVlgFile::skipCommentaryFind(const QString &rangestring,int startpos ,SEARCH_STRING_STRUCTURE &stringtype,int &targetpos)
{
    int ncommentaryEnd = startpos ;
    int isNoCommentary = 0 ;
 
    int  nfindPosOther = 0 ;
    int  nfindPos = 0 ;
    int  noffset = 0 ;
    int  nleftBracketPos = 0 ;
    int  nstartPos = 0 ;
 
    QString imoduleName(tr("No Name")) ;
    QString ikeyWord(tr("No Name"));
    QRegExp ifindExp(tr(" ")) ;
    QRegExp ifindExpOther(tr(" ")) ;
 
 
    QString ipartString ;
 
    if(stringtype.m_etype == SearchModuleKeyWordPos)
    {
        ikeyWord = tr("module");
        imoduleName = QString::fromAscii(stringtype.m_icontent.m_imodulest.m_amoduleName);
        ifindExpOther.setPattern(tr("\\b")+ikeyWord+tr("\\b"));
        ifindExp.setPattern(tr("\\b")+ikeyWord+(tr("\\s+"))+imoduleName);
    }
    else if(stringtype.m_etype == SearchLeftBracketPos)
    {
        ifindExp.setPattern(tr("\\("));
    }
    else if(stringtype.m_etype == SearchSemicolonPos)
    {
        ifindExp.setPattern(tr(";"));
    }
    else
    {
        return 1 ;
    }
 
    while(1)
    {
        nstartPos = ncommentaryEnd ;
        ipartString = getNoCommentaryString(rangestring,ncommentaryEnd,isNoCommentary) ;
        /*封装成1个函数 用于得到   输入为 上一个注释的结束、下一个注释的开始  输出为 一个无注释的字符串*/
        /* 先扫描 module + module 名 并获得相应位置 */
        /*1、如果没有扫到  直到字符串结束 ;如果最后也没有 就返回错误 ;如果成功就继续下一步 */
        // while 循环
        /*2、接着扫描所有 reg、port、wire、endmodule、instance*/
 
        /*3、遇到匹配的就 保存相应的字符串的位置 例如 遇到 "reg"  关键字时,从reg 下一个字符 获得 无注释字符串
          查找 紧接着的 ; ,查找直到  最后1段无注释代码 也没有则 退出并返回错误,
         并且重新 从匹配到的字符串后面 重新得到 下一个无注释字符串
        然后继续扫描下个可能匹配的字符,直到遇到endmode 关键字 就退出 或者 最后1段无注释代码 匹配完成之后退出
        当进行匹配 instance 时 分别构造正则表达式,进行匹配,如果匹配到 instance , 退出条件为最后1段无注释代码
        */
 
FindString:
 
        if(SearchModuleKeyWordPos == stringtype.m_etype)
        {
            nfindPosOther = ipartString.indexOf(ifindExpOther) ;
            nfindPos = ipartString.indexOf(ifindExp) ;
            noffset = nstartPos + nfindPos + ifindExp.capturedTexts().at(0).count() ;
 
 
            if(NO_STRING_FINDED == nfindPos)
            {
                if(NO_STRING_FINDED == nfindPosOther)
                {
                    /*在无注释情况下查找的*/
                    if(NO_COMMENTARY == isNoCommentary)
                    {
                        return 1 ;
                    }
//                    isNeededFindFlag = true ;
                    /*继续下一轮查找*/
                    continue ;
                }
                else
                {
                    noffset = nstartPos + nfindPosOther + ifindExpOther.capturedTexts().count();
 
                    struct SEARCH_STRING_STRUCTURE inextFindSemicolon ;
                    inextFindSemicolon.m_etype =  SearchSemicolonPos ;
                    inextFindSemicolon.m_icontent.m_nreserved = 0 ;
                    int nSemicolonPos = 0 ;
                    /*查找 下一个有效的 ";" 字符 */
                    if(!skipCommentaryFind(rangestring,noffset,inextFindSemicolon,nSemicolonPos))
                    {
                        /*截取从 module 名字出现的位置  到 ;所有的字符*/
                        QString itruncateString  = rangestring.mid(nfindPosOther,nSemicolonPos-nfindPosOther-1);
                        PORT_ANNOUNCE_FORMAT iportAnnounceformat = NonAnsicFormat ;
                        int  nrelativeRightBracketPos = 0 ;
                        int  nresult = 0 ;
                        /*判断这段字符是否 匹配 module + module名  并判断是否为规范的port声明*/
                        nresult =isModuleDefinition(itruncateString,imoduleName,iportAnnounceformat,nrelativeRightBracketPos) ;
                        if(!nresult)
                        {
                            // 保存相应的位置  以及  类型信息
                            /*找到 module */
                            stringtype.m_icontent.m_imodulest.m_eportAnnounceFormat = iportAnnounceformat ;
                            /*计算 ")" 绝对位置*/
                            targetpos = nrelativeRightBracketPos + nfindPosOther ;
                            int nlastNoblankChar = rangestring.lastIndexOf(QRegExp("\\S"),(targetpos-1));
                            targetpos = nlastNoblankChar +1 ;
                            return 0 ;
                        }
                        else if(1 == nresult)
                        {
//                          isNeededFindFlag = true ;
                            /*继续下一轮查找*/
                            continue;
                        }
                        else
                        {
                           return 1 ;
                        }
 
                    }
                    else
                    {
                        return 1 ;
                    }
                }
            }// if(NO_STRING_FINDED == nfindPos)
 
            SEARCH_STRING_STRUCTURE inextFind ;
            inextFind.m_etype = SearchLeftBracketPos ;
            inextFind.m_icontent.m_nreserved = 0 ;
 
            int nleftBracketPos = 0 ;
            if(!skipCommentaryFind(rangestring,noffset,inextFind,nleftBracketPos))
            {
                /*查找 与之对应的 下一个 ")"*/
                struct  SEARCH_MODULE_STRUCTURE imoduleSt ;
                imoduleSt.m_eportAnnounceFormat = NonAnsicFormat ;
                strcpy(imoduleSt.m_amoduleName,imoduleName.toAscii().data());
                struct  SEARCH_STRING_STRUCTURE inextFindRightBracket ;
                inextFindRightBracket.m_etype = SearchModuleKeyWordPos ;
                inextFindRightBracket.m_icontent.m_imodulest = imoduleSt ;
                int nrightBracketPos = noffset ;
                qDebug() << rangestring.mid(nleftBracketPos+1,100);
                if(!findOppositeBracket(rangestring,nleftBracketPos+1,inextFindRightBracket,nrightBracketPos))
                {
                    targetpos = nrightBracketPos ;
                    int nlastNoblankChar = rangestring.lastIndexOf(QRegExp("\\S"),(targetpos-1));
                    targetpos = nlastNoblankChar + 1 ;
                    /*接着返回 module 端口的书写类型 是否为标准 */
                    stringtype.m_icontent.m_imodulest.m_eportAnnounceFormat =  \
                            inextFindRightBracket.m_icontent.m_imodulest.m_eportAnnounceFormat ;
                    // 保存相应的位置  以及  类型信息
                   return 0 ;
                }
                else
                {
                    return 1 ;
                }
            }
            else
            {
                return 1 ;
            }
        } //if(SearchModuleKeyWordPos == stringtype.m_etype)
        else if(stringtype.m_etype == SearchLeftBracketPos)
        {
            nleftBracketPos = ipartString.indexOf(ifindExp) ;
 
            if(NO_STRING_FINDED == nleftBracketPos)
            {
                /*在字符串无注释情况下查找的*/
                if(NO_COMMENTARY == isNoCommentary)
                {
                    return 1 ;
                }
                continue ;
            }
            else
            {
                nleftBracketPos += nstartPos ;
                targetpos = nleftBracketPos ;
                return 0 ;
            }
        }
        else if(stringtype.m_etype == SearchSemicolonPos)
        {
            int nBackToBackSemicolonPos = 0 ;
            nBackToBackSemicolonPos = ipartString.indexOf(ifindExp) ;
            if(NO_STRING_FINDED == nBackToBackSemicolonPos)
            {
                /*在字符串无注释情况下查找的*/
                if(NO_COMMENTARY == isNoCommentary)
                {
                    return 1 ;
                }
                continue ;
            }
            else
            {
                nBackToBackSemicolonPos += nstartPos ;
                targetpos = nBackToBackSemicolonPos ;
                return 0 ;
            }
        }
        else if(stringtype.m_etype == SearchRightBracketPos)
        {
            // do nothing
        }
        else
        {
            return 1 ;
        }
 
        if(1 == isNoCommentary)
        {
            goto FindString ;
        }
 
      } // while(1)
 
 
      return 0 ;
    }
 
int EziDebugVlgFile::matchingTargetString(const QString &rangestring ,SEARCH_MODULE_POS_STRUCTURE &modulepos ,QMap<QString,SEARCH_INSTANCE_POS_STRUCTURE*> &instanceposmap)
{
    // 传入的是 无注释的字符串
    /*port(output input)*/
    QString ipartString ;
    QString imoduleName ;
    QString iinstanceName ;
 
    int ncommentaryEnd = modulepos.m_nnextRightBracketPos + 1;
    int isNoCommentary = 0 ;
    int nlastRegtKeyWordPos = -1 ;
    int nlastWireKeyWordPos = -1 ;
    int nendmoduleKeyWordPos = -1 ;
 
    int  nfindPosOther = 0 ;
    int  nfindPos = 0 ;
    int  noffset = 0 ;
    int  nsaveStartPos = 0 ;
    int  nendInsertPos = 0 ;
    int  nendLastChar = 0 ;
    int  nannounceInsertPos  = 0 ;
 
    bool ismoduleEnd = false ;
    QRegExp ifindOutputPortExp(tr("\\b") + tr("output") +tr("\\b")) ;
    QRegExp ifindInputPortPortExpOther(tr("\\b") + tr("input") +tr("\\b")) ;
    /*reg*/
    QRegExp ifindRegExp(tr("\\b") + tr("reg") +tr("\\b"));
    /*wire*/
    QRegExp ifindWireExp(tr("\\b") + tr("wire") +tr("\\b"));
    /*endmodule*/
    QRegExp ifindEndmoduleExp(tr("\\b") + tr("endmodule") +tr("\\b"));
 
    QRegExp ifindInstanceExp(tr(" "));
    QRegExp ifindInstanceExpOther(tr(" "));
 
 
    while(1)
    {
        nsaveStartPos = ncommentaryEnd ;
        ipartString = getNoCommentaryString(rangestring,ncommentaryEnd,isNoCommentary) ;
 
        nendmoduleKeyWordPos = ipartString.indexOf(ifindEndmoduleExp);
        if(nendmoduleKeyWordPos != -1)
        {
            /*保存相应位置*/
            // endmodule 关键字不能为 顶头字符串,否则从 最后查找
            if(nendmoduleKeyWordPos)
            {
                if(ipartString.lastIndexOf(QRegExp(tr("\\S")),nendmoduleKeyWordPos -1) != -1)
                {
                    nendInsertPos = nsaveStartPos + ipartString.lastIndexOf(QRegExp(tr("\\S")),nendmoduleKeyWordPos -1) ;
                }
            }
 
            modulepos.m_nendModuleKeyWordPos = nendInsertPos + 1;
 
            ismoduleEnd = true ;
        }
        else
        {
            if(-1 != ipartString.lastIndexOf(QRegExp(tr("\\S"))))
            {
                qDebug() << ipartString ;
                nendInsertPos = nsaveStartPos + ipartString.lastIndexOf(QRegExp(tr("\\S"))) ;
            }
        }
 
        // 非标准则进行扫描 最后个端口位置
        if(NonAnsicFormat == modulepos.m_eportFormat)
        {
            if(ipartString.contains(ifindOutputPortExp)||ipartString.contains(ifindInputPortPortExpOther))
            {
                int nlastPortKeyWordPos = 0 ;
                int noutputKeyWordPos = ipartString.lastIndexOf(ifindOutputPortExp,nendmoduleKeyWordPos) ;
                int ninputKeyWordPos = ipartString.lastIndexOf(ifindInputPortPortExpOther,nendmoduleKeyWordPos) ;
 
 
                if(-1 == ninputKeyWordPos)
                {
                    nlastPortKeyWordPos = nsaveStartPos + noutputKeyWordPos ;
                }
                else if(-1 == noutputKeyWordPos)
                {
                    nlastPortKeyWordPos = nsaveStartPos + ninputKeyWordPos ;
                }
                else
                {
                    if(noutputKeyWordPos > ninputKeyWordPos)
                    {
                        nlastPortKeyWordPos = nsaveStartPos + noutputKeyWordPos ;
                    }
                    else
                    {
                        nlastPortKeyWordPos = nsaveStartPos + ninputKeyWordPos ;
                    }
                }
 
                /*保存相应位置*/
                /*找到 紧接着的 ";" */
                struct SEARCH_STRING_STRUCTURE inextFind ;
                inextFind.m_etype = SearchSemicolonPos ;
                inextFind.m_icontent.m_nreserved = 0 ;
                int  nsemicolonPos = 0 ;
                if(!skipCommentaryFind(rangestring , nlastPortKeyWordPos , inextFind , nsemicolonPos))
                {
                    // 然后保存 继续下一个判断
                    modulepos.m_nlastPortKeyWordPos = nsemicolonPos + 1;
                }
                else
                {
                    return 1 ;
                }
            }
        }
 
 
        QMap<QString,SEARCH_INSTANCE_POS_STRUCTURE*>::iterator i = instanceposmap.begin();
        while (i != instanceposmap.end())
        {
            struct SEARCH_INSTANCE_POS_STRUCTURE *pinstance = i.value() ;
            imoduleName = QString::fromAscii(pinstance->m_amoduleName);
            iinstanceName = QString::fromAscii(pinstance->m_ainstanceName) ;
            ifindInstanceExp.setPattern(tr("\\b")+ imoduleName + tr("\\s+") + iinstanceName +tr("\\b"));
            ifindInstanceExpOther.setPattern(tr("\\b")+imoduleName+tr("\\b"));
 
            /*搜索 例化模块 出现的位置*/
            /*判断例化的类型 并返回紧接着的与第一次出现 "(" 相对应的 ")" 的位置 */
            nfindPosOther = ipartString.indexOf(ifindInstanceExpOther) ;
            nfindPos = ipartString.indexOf(ifindInstanceExp) ;
            noffset = nsaveStartPos + nfindPos + ifindInstanceExp.capturedTexts().at(0).count() ;
 
            if(NO_STRING_FINDED == nfindPos)
            {
                if(NO_STRING_FINDED == nfindPosOther)
                {
                    /*在无注释情况下查找的*/
                    if(NO_COMMENTARY == isNoCommentary)
                    {
                        return 1 ;
                    }
                    /*继续下一轮查找 1 个 例化 */
                    i++ ;
                    continue ;
                }
                else
                {
                    noffset = nsaveStartPos + nfindPosOther + ifindInstanceExpOther.capturedTexts().count() ;
                    /*查找紧接着的左括号 */
                    /*查找与左括号对应的 右括号 */
                    /*返回找到的位置 如果错误则 返回*/
                    struct SEARCH_STRING_STRUCTURE inextFindSemicolon ;
                    inextFindSemicolon.m_etype = SearchSemicolonPos ;
                    inextFindSemicolon.m_icontent.m_nreserved = 0 ;
 
                    int nrightSemicolonPos = 0 ;
                    /*查找 下一个有效的 ";" 字符 */
                    if(!skipCommentaryFind(rangestring,noffset,inextFindSemicolon,nrightSemicolonPos))
                    {
                        /*截取从 module 名字出现的位置  到 ;所有的字符*/
                        QString itruncateString  = rangestring.mid(nfindPosOther,nrightSemicolonPos-nfindPosOther +1);
                        INSTANCE_FORMAT iinstance_format = NonStardardFormat ;
                        int nresult = 0 ;
                        int nrelativeRightBracketPos = 0 ;
                        nresult = isModuleInstance(itruncateString,imoduleName,iinstanceName,iinstance_format,nrelativeRightBracketPos) ;
 
                        if(rangestring.lastIndexOf(QRegExp(tr("\\S")),(nsaveStartPos + nfindPosOther -1)) != -1)
                        {
                            nannounceInsertPos = rangestring.lastIndexOf(QRegExp(tr("\\S")),(nsaveStartPos + nfindPosOther -1)) ;
                        }
 
                        /*判断这段字符是否 匹配 module名+例化名  并判断是否为规范的端口连接*/
                        if(!nresult)
                        {
                            /*找到 module 保存信息*/
                            pinstance->m_nnextRightBracketPos = nrelativeRightBracketPos +  nfindPosOther ;
                            pinstance->m_nstartPos  = nannounceInsertPos + 1 ;
                            pinstance->m_einstanceFormat = iinstance_format ;
                            i++ ;
                            continue ;
                        }
                        else if(1 == nresult)
                        {
//                          isNeededFindFlag = true ;
                            /*继续下一轮查找*/
                            i++ ;
                            continue ;
                        }
                        else
                        {
                            return 1 ;
                        }
                    }
                    else
                    {
                        return 1 ;
                    }
                }
            }
 
            struct SEARCH_STRING_STRUCTURE inextFind ;
            inextFind.m_etype = SearchLeftBracketPos ;
            inextFind.m_icontent.m_eInstanceFormat = NonStardardFormat ;
 
            if(rangestring.lastIndexOf(QRegExp(tr("\\S")),(nsaveStartPos + nfindPos -1)) != -1)
            {
                nannounceInsertPos = rangestring.lastIndexOf(QRegExp(tr("\\S")),(nsaveStartPos + nfindPos -1)) ;
            }
 
            int nleftBracketPos = 0 ;
//          QString itest1 = rangestring.mid(noffset);
//          qDebug() << itest1 ;
            if(!skipCommentaryFind(rangestring,noffset,inextFind,nleftBracketPos))
            {
                /*查找 与之对应的 下一个 ")"*/
                struct SEARCH_STRING_STRUCTURE inextFindRightBracket ;
                inextFindRightBracket.m_etype = SearchInstancePos ;
                inextFindRightBracket.m_icontent.m_eInstanceFormat = NonStardardFormat ;
 
                int nrightBracketPos = 0 ;
                if(!findOppositeBracket(rangestring,nleftBracketPos+1,inextFindRightBracket,nrightBracketPos))
                {
                      QString itest2 = rangestring.mid(noffset,nrightBracketPos - nleftBracketPos - 1);
                      QString itest3 = rangestring.mid(nannounceInsertPos , nrightBracketPos - nannounceInsertPos - 1);
                      pinstance->m_nnextRightBracketPos = nrightBracketPos ;
                      pinstance->m_nstartPos  = nannounceInsertPos + 1 ;
                      pinstance->m_einstanceFormat = inextFindRightBracket.m_icontent.m_eInstanceFormat ;
 
                      /*接着返回 module 端口的书写类型 是否为标准 */
//                    stringtype.m_isearchContent.m_iinstanceStructure.m_einstanceFormat =  \
//                            inextFindRightBracket.m_isearchContent.m_iinstanceStructure.m_einstanceFormat ;
                      ++i ;
                      continue ;
                }
                else
                {
                    return 1 ;
                }
            }
            else
            {
                return 1 ;
            }
 
            ++i;
        }
 
        if(ismoduleEnd)
        {
            return 0 ;
        }
 
        // 正常时扫描到 endmodule 关键字 再退出 ,不应该在无注释下 没扫描到  endmodule 退出
        if(isNoCommentary)
        {
            return 1 ;
        }
    }
}
 
 
 
int EziDebugVlgFile::findOppositeBracket(const QString &rangestring,int startpos ,SEARCH_STRING_STRUCTURE &stringtype,int &targetpos)
{
    int ncommentaryBegin = 0 ;
    int ncommentaryEnd   = startpos ;
    QString ipartString ;
    QString inoCommentaryStr ;
    QString icheckString ;
    QString itestString ;
 
    int commentaryBegin_row  = 0 ; // 行注释开始
    int commentaryBegin_sec  = 0 ; // 段注释开始
    int scanPos = startpos ;
    int nsavePos = 0 ;
    int nstartBracketPos = 0 ;
 
    //bool isNeededFindFlag = 0 ;
    int  nappearanceCount = 1 ;
    int  nleftBracketPos = 0 ;
    int  nrightBracketPos = 0 ;
    //inoCommentaryStr = replaceCommentaryByBlank(rangestring) ;
//    QFile itest("d:/save.txt") ;
//    itest.open(QIODevice::WriteOnly|QIODevice::Truncate);
 
//    QTextStream iout(&itest) ;
//    iout << inoCommentaryStr ;
//    int Pos1 = rangestring.indexOf("ifft_airif_rdctrl");
//    int Pos2 = inoCommentaryStr.indexOf("ifft_airif_rdctrl");
 
    while(1)
    {
        // 查找下一个 注释的开始位置
        commentaryBegin_row = rangestring.indexOf(tr("//"),scanPos) ;
        commentaryBegin_sec = rangestring.indexOf(tr("/*"),scanPos) ;
 
        if((commentaryBegin_row == -1)&&(commentaryBegin_sec == -1))
        {
            /*没有注释了 从scanPos 截取剩余所有的字符串 */
            ipartString = rangestring.mid(ncommentaryEnd) ;
            nsavePos = ncommentaryEnd ;
            ncommentaryEnd = NO_COMMENTARY ;
        }
        else if(commentaryBegin_row == -1)
        {
            /*下一个注释开始位置为 */
            ncommentaryBegin = commentaryBegin_sec ;
            ipartString = rangestring.mid(ncommentaryEnd,ncommentaryBegin-ncommentaryEnd) ;
            nsavePos = ncommentaryEnd ;
            // 下一个注释结束位置 */
            ncommentaryEnd = rangestring.indexOf(tr("*/"),ncommentaryBegin) ;
 
            if(ncommentaryEnd == -1)
            {
                return 1;
            }
            scanPos = ncommentaryEnd + 2 ;
        }
        else if(commentaryBegin_sec == -1)
        {
            /*下一个注释开始位置为 */
            ncommentaryBegin = commentaryBegin_row ;
            ipartString = rangestring.mid(ncommentaryEnd,ncommentaryBegin-ncommentaryEnd) ;
 
            nsavePos = ncommentaryEnd ;
            ncommentaryEnd = rangestring.indexOf(tr("\n"),ncommentaryBegin) ;
            if(ncommentaryEnd == -1)
            {
                return 1;
            }
            scanPos = ncommentaryEnd + 1;
        }
        else
        {
            if(commentaryBegin_row < commentaryBegin_sec)
            {
                ncommentaryBegin = commentaryBegin_row ;
                ipartString = rangestring.mid(ncommentaryEnd,ncommentaryBegin-ncommentaryEnd) ;
                nsavePos = ncommentaryEnd ;
                ncommentaryEnd = rangestring.indexOf(tr("\n"),ncommentaryBegin) ;
                if(ncommentaryEnd == -1)
                {
                    return 1 ;
                }
                scanPos = ncommentaryEnd + 1;
            }
            else
            {
                ncommentaryBegin = commentaryBegin_sec ;
                ipartString = rangestring.mid(ncommentaryEnd,ncommentaryBegin-ncommentaryEnd) ;
                nsavePos = ncommentaryEnd ;
                ncommentaryEnd = rangestring.indexOf(tr("*/"),ncommentaryBegin) ;
                if(ncommentaryEnd == -1)
                {
                    return 1;
                }
                scanPos = ncommentaryEnd + 2 ;
            }
        }
 
        //int  nstartPos = startpos ;
 
        /*从这段无注释的代码中 找对应的括号的位置*/
 
        /*如果这段无注释 代码 包含 "output" 或者 "input "关键字,则为*/
 
        if(-1 == nsavePos)
        {
            return 1 ;
        }
 
 
        qDebug() << ipartString ;
        nstartBracketPos = 0 ;
        while(1)
        {
            /*是否存在 左括号 和 右括号*/
            nleftBracketPos = ipartString.indexOf("(",nstartBracketPos);
            nrightBracketPos = ipartString.indexOf(")",nstartBracketPos);
 
            if((NO_STRING_FINDED == nleftBracketPos)&&(NO_STRING_FINDED == nrightBracketPos))
            {
                break ;
            }
            else if(NO_STRING_FINDED == nleftBracketPos)
            {
                /*只有 ")"*/
                nappearanceCount-- ;
                if(0 == nappearanceCount)
                {
                    goto CheckType ;
                }
                nstartBracketPos = nrightBracketPos + 1 ;
            }
            else if(NO_STRING_FINDED == nrightBracketPos)
            {
                /*只有 "("*/
                nstartBracketPos = nleftBracketPos + 1 ;
                nappearanceCount++ ;
            }
            else
            {
                if(nleftBracketPos < nrightBracketPos)
                {
                    /*遇到 "("*/
                    nappearanceCount++ ;
                    nstartBracketPos = nleftBracketPos + 1 ;
                }
                else
                {
                    /*遇到 ")"*/
                    nappearanceCount-- ;
 
                    if(0 == nappearanceCount)
                    {
 
                        goto CheckType ;
                    }
                    nstartBracketPos = nrightBracketPos + 1 ;
                }
            }
        }
    }
 
CheckType:
        qDebug() << rangestring.mid(nsavePos,nrightBracketPos);
        targetpos = nsavePos + nrightBracketPos ;
        int n = targetpos - startpos + 1 ;
        icheckString = rangestring.mid(startpos , n );
        qDebug() << "origin string! "<<icheckString ;
        icheckString = replaceCommentaryByBlank(icheckString);
        qDebug() << "port string! "<<icheckString ;
 
        //itestString = rangestring.mid(scanPos ,targetpos - scanPos + 1 );
        if(SearchModuleKeyWordPos == stringtype.m_etype)
        {
            if(icheckString.contains("input",Qt::CaseInsensitive)||icheckString.contains("output",Qt::CaseInsensitive))
            {
                stringtype.m_icontent.m_imodulest.m_eportAnnounceFormat = AnsicFormat ;
            }
        }
        else if(SearchInstancePos == stringtype.m_etype)
        {
            // .mc_ul_start       ( mc_ul_start       ),
            // 标准的 查找 上一个 ")"
            if(icheckString.contains(QRegExp(tr(".")+ tr("\\s*\\w+") + tr("\\s*\\(")+ tr(".*") + tr("\\)"))))
            {
                stringtype.m_icontent.m_eInstanceFormat = StardardForamt ;
                targetpos = ipartString.lastIndexOf(')',nrightBracketPos-1);
                if(-1 == targetpos)
                {
                   return 1 ;
                }
                targetpos = nsavePos + targetpos + 1 ;
            }
            else
            {
                // 非标准的 查找 上一个 非空白字符
                targetpos = ipartString.lastIndexOf(QRegExp(tr("\\S")),nrightBracketPos-1);
                if(-1 == targetpos)
                {
                   return 1 ;
                }
                targetpos = nsavePos + targetpos + 1 ;
            }
        }
        else
        {
            return 1 ;
        }
 
    return 0 ;
}
 
 
QString EziDebugVlgFile::getNoCommentaryString(const QString &rangestring,int &lastcommentaryend ,int &nocommontaryflag)
{
    int commentaryBegin_row = 0 ;
    int commentaryBegin_sec = 0 ;
    int scanPos = lastcommentaryend ;
    int ncommentaryEnd = 0 ;
    int ncommentaryBegin = 0 ;
    QString ipartString ;
    // 查找下一个 注释的开始位置
 
    if(lastcommentaryend == -1)
    {
        /*全是注释  返回空字符串*/
        ipartString.clear();
        return ipartString ;
    }
 
    commentaryBegin_row = rangestring.indexOf(tr("//"),scanPos) ;
    commentaryBegin_sec = rangestring.indexOf(tr("/*"),scanPos) ;
 
    if((commentaryBegin_row == -1)&&(commentaryBegin_sec == -1))
    {
        ipartString = rangestring.mid(scanPos) ;
        /*没有注释了 从scanPos 截取剩余所有的字符串 */
        ncommentaryEnd = -1 ;
        // 最后一次扫描 的起始位置  就无注释
        lastcommentaryend =  scanPos ;
        nocommontaryflag = true ;
    }
    else if(commentaryBegin_row == -1)
    {
        /*下一个注释开始位置为 */
        ncommentaryBegin = commentaryBegin_sec ;
        ipartString = rangestring.mid(scanPos,ncommentaryBegin-scanPos) ;
 
        // 下一个注释结束位置 */
        ncommentaryEnd = rangestring.indexOf(tr("*/"),ncommentaryBegin) ;
        if(ncommentaryEnd == -1)
        {
            // 接下来都是注释
            lastcommentaryend = -1 ;
            return ipartString ;
        }
        lastcommentaryend = ncommentaryEnd  + 2;
    }
    else if(commentaryBegin_sec == -1)
    {
        /*下一个注释开始位置为 // */
        ncommentaryBegin = commentaryBegin_row ;
        ipartString = rangestring.mid(scanPos,ncommentaryBegin-scanPos) ;
 
 
        ncommentaryEnd = rangestring.indexOf(tr("\n"),ncommentaryBegin + 2);
        if(ncommentaryEnd == -1)
        {
            // 接下来都是注释
            lastcommentaryend = -1 ;
            return ipartString ;
        }
        lastcommentaryend =  ncommentaryEnd + 1;
    }
    else
    {
        if(commentaryBegin_row < commentaryBegin_sec)
        {
            ncommentaryBegin = commentaryBegin_row ;
            ipartString = rangestring.mid(scanPos,ncommentaryBegin-scanPos) ;
 
            ncommentaryEnd = rangestring.indexOf(tr("\n"),ncommentaryBegin) ;
            if(ncommentaryEnd == -1)
            {
                // 接下来都是注释
                lastcommentaryend = -1 ;
                return ipartString ;
            }
            lastcommentaryend =  ncommentaryEnd + 1 ;
        }
        else
        {
            ncommentaryBegin = commentaryBegin_sec ;
            ipartString = rangestring.mid(scanPos,ncommentaryBegin-scanPos) ;
 
            ncommentaryEnd = rangestring.indexOf(tr("*/"),ncommentaryBegin) ;
            if(ncommentaryEnd == -1)
            {
                // 接下来都是注释
                lastcommentaryend = -1 ;
                return ipartString ;
 
            }
            lastcommentaryend =  ncommentaryEnd + 2 ;
        }
    }
    return  ipartString ;
}
 
 
 
QString EziDebugVlgFile::replaceCommentaryByBlank(const QString &rangestring)
{
    QString data = rangestring ;
    int commentaryBegin_row = 0 ; // 行注释开始
    int commentaryBegin_sec = 0 ; // 段注释开始
    int commentaryEnd_row = 0 ;  // 行注释结束
    int commentaryEnd_sec = 0 ;  // 段注释结束
    int nstartPos = 0 ;
 
    commentaryBegin_row =  data.indexOf(tr("//"),nstartPos);
    commentaryBegin_sec =  data.indexOf(tr("/*"),nstartPos);
    while((commentaryBegin_row != -1)||(commentaryBegin_sec != -1))
    {
        if(commentaryBegin_row == -1)
        {
            commentaryEnd_sec = data.indexOf(tr("*/"), commentaryBegin_sec);
            data.replace(commentaryBegin_sec,commentaryEnd_sec - commentaryBegin_sec + 2,tr(" ").repeated(commentaryEnd_sec - commentaryBegin_sec + 2));
            commentaryBegin_sec =  data.indexOf(tr("/*"), commentaryBegin_sec);
        }
        else if(commentaryBegin_sec == -1)
        {
            commentaryEnd_row = data.indexOf(tr("\n"), commentaryBegin_row);
            if(commentaryEnd_row == -1)
            {
                int ncharPos = data.lastIndexOf(QRegExp(".*")) ;
                data.replace(commentaryBegin_row , ncharPos - commentaryBegin_row + 1,tr(" ").repeated(ncharPos - commentaryBegin_row + 1));
            }
            else
            {
                data.replace(commentaryBegin_row,commentaryEnd_row - commentaryBegin_row,tr(" ").repeated(commentaryEnd_row - commentaryBegin_row));
            }
            commentaryBegin_row =  data.indexOf(tr("//"), commentaryBegin_row);
 
        }
        else
        {
            /*行注释开始 在 段注释开始 之前*/
            if( commentaryBegin_row < commentaryBegin_sec )
            {
                /*删除行注释表示符开始后的一行字符*/
                commentaryEnd_row = data.indexOf(tr("\n"), commentaryBegin_row);
                if(commentaryEnd_row == -1)
                {
                    int ncharPos = data.lastIndexOf(QRegExp(".*")) ;
                    data.replace(commentaryBegin_row , ncharPos - commentaryBegin_row + 1,tr(" ").repeated(ncharPos - commentaryBegin_row + 1));
                }
                else
                {
                    data.replace(commentaryBegin_row,commentaryEnd_row - commentaryBegin_row,tr(" ").repeated(commentaryEnd_row - commentaryBegin_row));
                }
                commentaryBegin_sec =  data.indexOf(tr("/*"), commentaryBegin_row);
                commentaryBegin_row =  data.indexOf(tr("//"), commentaryBegin_row);
            }
            /*段注释开始 在 行注释开始 之前*/
            else
            {
                commentaryEnd_sec = data.indexOf(tr("*/"), commentaryBegin_sec);
                data.replace(commentaryBegin_sec,commentaryEnd_sec - commentaryBegin_sec + 2,tr(" ").repeated(commentaryEnd_sec - commentaryBegin_sec + 2));
                commentaryBegin_row =  data.indexOf(tr("//"), commentaryBegin_sec);
                commentaryBegin_sec =  data.indexOf(tr("/*"), commentaryBegin_sec);
            }
        }
 
    }
    return data ;
}
 
int EziDebugVlgFile::isModuleInstance(const QString &rangestring,const QString &modulename , const QString& instancename,INSTANCE_FORMAT &type ,int &targetpos)
{
    QString data = replaceCommentaryByBlank(rangestring);
 
    QRegExp ifindExp(tr("\\b")+ modulename + tr("\\s+") + instancename +tr("\\b")) ;
 
    if(NO_STRING_FINDED == data.indexOf(ifindExp))
    {
        return 1 ;
    }
 
    /*找到接着的 "("*/
    struct SEARCH_STRING_STRUCTURE ifindLeftBracket ;
    ifindLeftBracket.m_etype = SearchLeftBracketPos ;
    ifindLeftBracket.m_icontent.m_nreserved = 0  ;
 
    int nleftBracketPos = 0 ;
    if(!skipCommentaryFind(rangestring,0,ifindLeftBracket,nleftBracketPos))
    {
        struct SEARCH_STRING_STRUCTURE ifindRightBracket ;
        ifindRightBracket.m_etype = SearchInstancePos ;
        ifindRightBracket.m_icontent.m_eInstanceFormat = NonStardardFormat ;
 
        int nrightBracketPos = 0 ;
        if(!findOppositeBracket(rangestring,nleftBracketPos+1,ifindRightBracket,nrightBracketPos))
        {
            targetpos = nrightBracketPos ;
            type = ifindRightBracket.m_icontent.m_eInstanceFormat ;
            return 0 ;
        }
        else
        {
            return 2 ;
        }
    }
    else
    {
        return 2 ;
    }
}
 
 
int EziDebugVlgFile::isModuleDefinition(const QString &rangestring,const QString &modulename ,PORT_ANNOUNCE_FORMAT &type,int &targetpos)
{
    QString data = replaceCommentaryByBlank(rangestring);
 
    QRegExp ifindExp(tr("\\b")+ modulename + tr("\\b")) ;
 
    if(NO_STRING_FINDED == data.indexOf(ifindExp))
    {
        return 1 ;
    }
 
    /*找到接着的 "("*/
    struct SEARCH_STRING_STRUCTURE ifindLeftBracket ;
    ifindLeftBracket.m_etype = SearchLeftBracketPos ;
    ifindLeftBracket.m_icontent.m_nreserved = 0 ;
 
    int nleftBracketPos = 0 ;
    if(!skipCommentaryFind(rangestring,0,ifindLeftBracket,nleftBracketPos))
    {
        struct  SEARCH_MODULE_STRUCTURE imoduleSt ;
        struct SEARCH_STRING_STRUCTURE ifindRightBracket ;
        ifindRightBracket.m_etype = SearchRightBracketPos ;
        imoduleSt.m_eportAnnounceFormat = NonAnsicFormat ;
        strcpy(imoduleSt.m_amoduleName,modulename.toAscii().data());
        ifindRightBracket.m_icontent.m_imodulest = imoduleSt ;
 
 
        int nrightBracketPos = 0 ;
        if(!findOppositeBracket(rangestring,nleftBracketPos+1,ifindRightBracket,nrightBracketPos))
        {
            targetpos = nrightBracketPos ;
            type = ifindRightBracket.m_icontent.m_imodulest.m_eportAnnounceFormat ;
            return 0 ;
        }
        else
        {
            return 2 ;
        }
    }
    else
    {
        return 2 ;
    }
 
//    // 存在 output 或者 input 关键字
//    ifindExp.setPattern(tr("\\b") + tr("output") + tr("\\b"));
//    QRegExp ifindExpOther(tr("\\b") + tr("input") + tr("\\b"));
 
//    if(data.contains(ifindExp)||data.contains(ifindExpOther))
//    {
//        type = AnsicFormat ;
//    }
//    else
//    {
//        type = NonAnsicFormat ;
//    }
 
}
 
int EziDebugVlgFile::isStringReiteration(const QString &poolstring ,const QString& string)
{
    if(poolstring.contains(QRegExp(tr("\b")+string + tr("\b"))))
    {
        return 0 ;
    }
    return 1 ;
}
 
QString  EziDebugVlgFile::constructChainRegString(EziDebugModule::RegStructure* reg, int regnum , int startbit ,int endbit ,EziDebugInstanceTreeItem *item)
{
    QString iregName ;
    QString istartBit ;
    QString iendBit ;
    QString imoduleName = QString::fromAscii(reg->m_pMouduleName);
    QStringList ifullNameList ;
    QString ibitWitdth = QString::fromAscii(reg->m_pExpString);
 
    QString istartRegNum = QString::number(reg->m_unStartNum);
    QString iendRegNum = QString::number(reg->m_unEndNum);
 
    QString ihiberarchyname = item->getItemHierarchyName() ;
    QString iinstanceName = item->getInstanceName() ;
 
    QString iregNum = QString::fromAscii(reg->m_pregNum);
    QString iclockName = QString::fromAscii(reg->m_pclockName);
 
    QString iresult ;
    if(!reg)
    {
        return QString();
    }
    else
    {
        // 寄存器名 包括数组时 使用  aaa[m]
        if(reg->m_unRegNum != 1)
        {
            iregName.append(tr("%1[%2]").arg(QString::fromAscii(reg->m_pRegName)).arg(regnum));
        }
        else
        {
            iregName.append(tr("%1").arg(QString::fromAscii(reg->m_pRegName)));
        }
 
        // 开始位
        istartBit.append(QString::number(startbit));
        // 结束位
        iendBit.append(QString::number(endbit));
 
    }
 
    ifullNameList << imoduleName << iinstanceName << iclockName << ihiberarchyname << iregName << istartBit << iendBit << ibitWitdth << istartRegNum  << iendRegNum << iregNum   ;
    iresult = ifullNameList.join(tr("#")) ;
    return (iresult) ;
}
 
 
int EziDebugVlgFile::scanFile(EziDebugPrj* prj,EziDebugPrj::SCAN_TYPE type,QList<EziDebugPrj::LOG_FILE_INFO*> &addedinfolist,QList<EziDebugPrj::LOG_FILE_INFO*> &deletedinfolist)
{
    qDebug() << "verilog file scanfile!" << fileName();
    bool echainExistFlag = false ;
    int i = 0 ;
    QString ifileName = fileName() ;
    EziDebugModule *poldModule  = NULL ;
    EziDebugVlgFile *poldFile = NULL ;
    QDir icurrentDir = prj->getCurrentDir() ;
    QString irelativeFileName = icurrentDir.relativeFilePath(this->fileName()) ;
    QStringList ieziPort ;
    QFileInfo ifileInfo(this->fileName()) ;
    QStringList ichangedchainList ;
    QStringList icheckChainList ;
    int nresult = 0 ;
 
    QDateTime ilastModifedTime = ifileInfo.lastModified() ;
 
 
    QMap<QString,QString> iclockMap ;
    QMap<QString,QString> iresetMap ;
 
 
    poldFile = prj->getPrjVlgFileMap().value(irelativeFileName ,NULL);
 
    if(poldFile)
    {
        for( ; i < poldFile->getModuleList().count();i++)
        {
            EziDebugModule *pmodule = prj->getPrjModuleMap().value(poldFile->getModuleList().at(i),NULL) ;
            if(pmodule)
            {
                QString imoduleName = pmodule->getModuleName() ;
                struct EziDebugPrj::LOG_FILE_INFO* pdelmoduleInfo = new EziDebugPrj::LOG_FILE_INFO ;
                pdelmoduleInfo->etype = EziDebugPrj::infoTypeModuleStructure ;
                pdelmoduleInfo->pinfo = NULL ;
                qstrcpy(pdelmoduleInfo->ainfoName,imoduleName.toAscii().data());
                deletedinfolist.append(pdelmoduleInfo);
            }
        }
    }
 
#if 1
    if(fileName().endsWith("SspTxFIFO.v"))
    {
        qDebug() << "SspTxFIFO.v";
    }
#endif
 
    // 清空原文件的  modulelist
    clearModuleList();
 
    unModuCnt = 0  ;
    unMacroCnt = 0 ;
 
    //  memset((void*)module_tab,0,MAX_T_LEN*sizeof(struct Module_Mem)) ;
    //  memset((void*)macro_table,0,MAX_T_LEN*sizeof(struct macro_Mem)) ;
 
    inst_map.clear();
    iinstNameList.clear();
 
    reg_scan reg_search ;
 
    memset((void*)buffer,0,sizeof(buffer)) ;
 
    //qDebug()  <<  ifileName.toAscii().data() ;
    if(reg_search.LoadVeriFile(buffer,ifileName.toAscii().data()))
    {
        reg_search.prog = buffer ;
        try
        {
            reg_search.ScanPre();
            reg_search.Interp();
        }
        catch (InterpExc &except)
        {
            qDebug() << "EziDebug file parse Error!" ;
            return 1 ;
        }
    }
    else
    {
        qDebug() << "EziDebug Error: read file error!" ;
        return 1 ;
    }
 
 
    //qDebug() << "Find Module Number:"  << mod_count;
 
    for(i = 0 ; i < unModuCnt ;i++)
    {    	
        QString imoduleName = QString::fromAscii(ModuleTab[i].cModuleName) ;
        EziDebugModule *pmodule = new EziDebugModule(imoduleName) ;
        if(!pmodule)
        {
            qDebug() << "There is not memory left!"  ;
            return 1 ;
        }
 
        //qDebug() << "GET A Module!"  << module_tab[i].inst_map.count() ;
 
        QMap<QString,QMap<QString,QString> > iinstMap = inst_map ;
        int ninstanceCount = 0 ;
        for( ; ninstanceCount < iinstNameList.count() ;ninstanceCount++)
        {
            QString iinst = iinstNameList.at(ninstanceCount) ;
            QString iinstanceName = iinst.split('#').at(1) ;
 
            qDebug() << __LINE__  << "EziDebug instance:" << iinst;
 
            if(QRegExp(QObject::tr("_EziDebug_\\w+")).exactMatch(iinstanceName))
            {
                //ieziInstList.append(iinst.split('#').at(1));
 
                //echainExistFlag = true ;
                continue ;
            }
 
            pmodule->m_iinstanceNameList << iinst.replace("#",":");
            pmodule->m_iinstancePortMap.insert(iinstanceName,iinstMap.value(iinstNameList.at(ninstanceCount)));
        }
 
 
        for(int m = 0 ; m< ModuleTab[i].unParaCnt ;m++)
        {
            pmodule->addToParameterMap(QString::fromAscii(ModuleTab[i].ParaTab[m].cParaName),\
                                       ModuleTab[i].ParaTab[m].iParaVal);
 
        }
 
        // 向文件中添加 defparameter 信息
        QMap<QString,QString>::const_iterator idefParamIter = def_map.constBegin() ;
        while(idefParamIter != def_map.constEnd())
        {
             // <inst_name.para_name,para_value>
            QString icombName = idefParamIter.key() ;
            if(!icombName.contains("."))
            {
                qDebug() << "EziDebug Error: scan file Error , parameter pattern error!"  ;
                return 1 ;
            }
            QString iinstanceName = icombName.split(".").at(0) ;
 
            if(QRegExp(QObject::tr("_EziDebug_\\w+")).exactMatch(iinstanceName))
            {
                ++idefParamIter ;
                continue ;
            }
 
            QString iparamterStr = icombName.split(".").at(1) ;
            QString iparamterVal = idefParamIter.value() ;
 
            addToDefParameterMap(iinstanceName,iparamterStr,iparamterVal);
            ++idefParamIter ;
        }
 
        int j = 0 ;
        // 向文件中添加 define  信息
        for(; j < unMacroCnt ; j++)
        {
           addToMacroMap(QString::fromAscii(MacroTab[j].cMacroName),MacroTab[j].iMacroVal);
        }
 
        for(j = 0 ;j < ModuleTab[i].unRegCnt ; j++)
        {
            QString iedge ;
 
            if(QRegExp(QObject::tr("_EziDebug_\\w+")).exactMatch(QString::fromAscii(ModuleTab[i].RegTab[j].cRegName)))
            {
                // 提示 文件中包含有EziDebug添加的代码  是否进行删除
 
                // 删除指针
                //echainExistFlag = true ;
                continue ;
            }
 
            if(QString::fromAscii(ModuleTab[i].RegTab[j].ClkAttri.cClkName).isEmpty())
            {
                continue ;
            }
 
            if(ModuleTab[i].RegTab[j].IsFlag == 0)
            {
                continue ;
            }
 
            struct EziDebugModule::RegStructure * preg = new EziDebugModule::RegStructure ;
 
 
            memset((char*)preg,0,sizeof(struct EziDebugModule::RegStructure));
 
 
            qstrcpy(preg->m_pRegName,ModuleTab[i].RegTab[j].cRegName) ;
 
            if(ModuleTab[i].RegTab[j].iRegWidth.size() >= 64)
            {
                qDebug() << "EziDebug Error: the reg number string is too long!";
                continue ;
            }
 
            if(ModuleTab[i].RegTab[j].iRegCnt.isEmpty())
            {
                qstrcpy(preg->m_pregNum,"1") ;
            }
            else
            {
                qstrcpy(preg->m_pregNum,ModuleTab[i].RegTab[j].iRegCnt.toAscii().constData());
            }
 
 
            if(ModuleTab[i].RegTab[j].iRegWidth.count() >= 64 )
            {
                qDebug() << "EziDebug Error: the reg width string is too long!";
                continue ;
            }
 
            qstrcpy(preg->m_pExpString , ModuleTab[i].RegTab[j].iRegWidth.toAscii().constData());
 
 
            //  初始化寄存器数据
            preg->m_unStartNum = 0 ;
            preg->m_unEndNum = 0 ;
            preg->m_unRegNum = 0 ;
 
            preg->m_unStartBit = 0 ;
            preg->m_unEndBit = 0 ;
            preg->m_unRegBitWidth = 0 ;
 
 
            preg->m_unMaxRegNum = 0 ;
            preg->m_eRegNumEndian = EziDebugModule::endianOther ;
            preg->m_eRegNumType = EziDebugModule::attributeOther ;
            preg->m_unMaxBitWidth = 0 ;
            preg->m_eRegBitWidthEndian = EziDebugModule::endianOther ;
            preg->m_eRegBitWidthType = EziDebugModule::attributeOther ;
 
 
            qstrcpy(preg->m_pclockName,ModuleTab[i].RegTab[j].ClkAttri.cClkName);
 
 
            if(ModuleTab[i].RegTab[j].ClkAttri.eClkEdge == POSE)
            {
                iedge = QObject::tr("posedge");
                preg->m_eedge =  EziDebugModule::signalPosEdge ;
            }
            else if(ModuleTab[i].RegTab[j].ClkAttri.eClkEdge == NEGE)
            {
                iedge = QObject::tr("negedge");
                preg->m_eedge =  EziDebugModule::signalNegEdge ;
            }
            else if(ModuleTab[i].RegTab[j].ClkAttri.eClkEdge == LOW)
            {
                iedge = QObject::tr("low");
                preg->m_eedge =  EziDebugModule::signalLow ;
            }
            else if(ModuleTab[i].RegTab[j].ClkAttri.eClkEdge == HIGH)
            {
                iedge = QObject::tr("high");
                preg->m_eedge =  EziDebugModule::signalHigh ;
            }
            else
            {
                iedge = QObject::tr("posedge");
                preg->m_eedge =  EziDebugModule::signalPosEdge ;
            }
 
            if(QString::fromAscii(ModuleTab[i].RegTab[j].ClkAttri.cClkName).isEmpty())
            {
                qDebug() << "no clock " << preg->m_pRegName;
            }
 
            iclockMap.insert(QString::fromAscii(ModuleTab[i].RegTab[j].ClkAttri.cClkName),\
                             iedge);
 
            if(ModuleTab[i].RegTab[j].RstAttri.eRstEdge == POSE)
            {
                iedge = QObject::tr("posedge");
            }
            else if(ModuleTab[i].RegTab[j].RstAttri.eRstEdge == NEGE)
            {
                iedge = QObject::tr("negedge");
            }
            else
            {
                iedge = QObject::tr("posedge");
            }
 
 
            qstrcpy(preg->m_pMouduleName,ModuleTab[i].cModuleName) ;
 
            preg->m_unStartNum = 0 ;
 
            if(!QString::fromAscii(ModuleTab[i].RegTab[j].RstAttri.cRstName).isEmpty())
            {
                iresetMap.insert(QString::fromAscii(ModuleTab[i].RegTab[j].RstAttri.cRstName),\
                                 iedge);
            }
 
            QString iclockName = QString::fromAscii(preg->m_pclockName);
 
            // 全部加入 到固定位宽 , 待生成树状节点时,划分出来 非固定位宽
            pmodule->AddToRegMap(iclockName ,preg);
 
        }
 
        pmodule->m_iclockMap = iclockMap ;
 
        pmodule->m_iresetMap = iresetMap ;
 
        QVector<EziDebugModule::PortStructure*> iportVec ;
 
        //qDebug() << "scan port !"  ;
        int k = 0 ;
        for(; k < ModuleTab[i].unIOCnt ; k++)
        {
            // 暂时修改
            if(QRegExp(QObject::tr("_EziDebug_\\w+")).exactMatch(QString::fromAscii(ModuleTab[i].IOTab[k].cIOName)))
            {
                QString ieziPortName = QString::fromAscii(ModuleTab[i].IOTab[k].cIOName) ;
                ieziPort <<  ieziPortName ;
 
                echainExistFlag = true ;
                // 提示 文件中包含有EziDebug添加的代码  是否进行删除
                continue ;
 
            }
 
            struct EziDebugModule::PortStructure * pport = new EziDebugModule::PortStructure ;
 
            memset((char*)pport,0,sizeof(struct EziDebugModule::PortStructure)) ;
 
            qstrcpy(pport->m_pPortName,ModuleTab[i].IOTab[k].cIOName);
 
            pport->m_unStartBit = 0 ;
            pport->m_unBitwidth = 0 ;
            pport->m_unEndBit = 0 ;
            pport->m_eEndian  = EziDebugModule::endianOther ;
 
            if(ModuleTab[i].IOTab[k].iIOWidth.size() >= 64)
            {
                qDebug() << "EziDebug Error: the reg width string is too long!";
                continue ;
            }
 
            qstrcpy(pport->m_pBitWidth,ModuleTab[i].IOTab[k].iIOWidth.toAscii().constData()) ;
 
            if(ModuleTab[i].IOTab[k].eIOAttri == IO_INPUT)
            {
                pport->eDirectionType = EziDebugModule::directionTypeInput ;
            }
            else if(ModuleTab[i].IOTab[k].eIOAttri == IO_OUTPUT)
            {
                pport->eDirectionType = EziDebugModule::directionTypeOutput ;
            }
            else if(ModuleTab[i].IOTab[k].eIOAttri == IO_INOUT)
            {
                pport->eDirectionType = EziDebugModule::directionTypeInoutput ;
            }
            else
            {
                pport->eDirectionType = EziDebugModule::directionTypeInoutput ;
            }
 
            qstrcpy(pport->m_pModuleName,ModuleTab[i].cModuleName);
 
            iportVec.append(pport);
 
        }
 
        pmodule->m_iportVec = iportVec ;
 
        // QDir(工程路径). relativeFilePath(完整的文件路径) 得到文件相对路径
        pmodule->m_ilocatedFile = prj->getCurrentDir().relativeFilePath(fileName());
 
        // bool m_isLibaryCore ;
        pmodule->m_isLibaryCore |= ModuleTab[i].nIPCore ;
 
        if(this->isLibaryFile())
        {
            pmodule->m_isLibaryCore = true ;
        }
 
        qDebug() << "add to moudle list" << imoduleName << __FILE__ << __LINE__;
 
        // 加入 module map
        qDebug() << "Add to moudle map" << imoduleName << pmodule << __FILE__ << __LINE__;
 
 
        poldModule = prj->getPrjModuleMap().value(imoduleName,NULL) ;
 
        // 扫描完成后再 提示 信息 扫描链被破坏  是否重新添加链
#if 0
        if(pmodule->getModuleName() == "ifft")
        {
            qDebug() << "ifft" ;
        }
#endif
        addToModuleList(imoduleName);
        prj->addToModuleMap(imoduleName,pmodule);
 
        if(echainExistFlag)
        {
            /*
                1、无log文件,打开工程进行更新扫描
                  无对比对象,不进行对比
                2、有log文件,打开工程进行更新扫描
                  更扫描链进行对比,来判断是否 链被破坏
                3、在已打开工程进行更新
                  直接跟 已经记录的 module 进行对比
                  注:2013.3.26  由于parameter存在 可能 跟原module相比  会出错,以后均采用根据
                  扫描链的信息进行比较
            */
            // 根据log文件 进行对比
            if(true == prj->getLogFileExistFlag())
            {
                for(int i = 0 ; i < ieziPort.count() ; i++)
                {
                    QString iportName = ieziPort.at(i) ;
                    if(iportName.split('_',QString::SkipEmptyParts).count() >= 4)
                    {
                        QString ichainName = iportName.split('_',QString::SkipEmptyParts).at(1) ;
                        // prj->addToCheckedChainList(ichainName);
                        if(!icheckChainList.contains(ichainName))
                        {
                            icheckChainList.append(ichainName);
                            EziDebugScanChain* pchain = prj->getScanChainInfo().value(ichainName ,NULL) ;
                            if(pchain)
                            {
                                if(!pmodule->isChainCompleted(pchain))
                                {
                                    ichangedchainList.append(ichainName);                                    
                                    prj->addToDestroyedChainList(ichainName);
                                }
                            }
                            else
                            {
                                // log 文件被破坏(并非log文件本身格式问题,而是代码中的链 log文件中不存在)
                                prj->setLogfileDestroyedFlag(true);
                            }
                        }
                    }
                }
 
            }
 
        }
    }
 
    // 有哪些module、
    // 遍历扫描链代码 如果扫描链包括这个module 然后检测  line_code block_code 是否存在
    // All code in this file
    // QStringList icodeList ;
    QStringList ichainNameList ;
    for(int nmoduleNum = 0 ; nmoduleNum < this->getModuleList().count() ;nmoduleNum++)
    {
        QString imoduleName = this->getModuleList().at(nmoduleNum) ;
        QMap<QString,EziDebugScanChain*> iscanChainMap = prj->getScanChainInfo() ;
        QMap<QString,EziDebugScanChain*>::const_iterator iscanchainIter = iscanChainMap.constBegin() ;
        while(iscanchainIter != iscanChainMap.constEnd())
        {
            EziDebugScanChain* pchain = iscanchainIter.value() ;
            QString ichainName = iscanchainIter.key() ;
            if(pchain->getLineCode().contains(imoduleName))
            {
                if(!ichainNameList.contains(ichainName))
                {
                    ichainNameList.append(ichainName);
                }
            }
 
            if(pchain->getBlockCode().contains(imoduleName))
            {
                if(!ichainNameList.contains(ichainName))
                {
                    ichainNameList.append(ichainName);
                }
            }
            ++iscanchainIter ;
        }
 
        if((nresult = checkedEziDebugCodeExist(prj,imoduleName,ichainNameList)) != 0)
        {
            return nresult ;
        }
    }
 
 
//    // 如果在扫描被修改的文件, 则更新 相关的 module 对象
//    if(!(this->getLastStoredTime().isNull()))
//    {
//        // 更改的文件
//        if(isModifedRecently())
//        {
//            // 文件被改动 更新 相关的 module 对象
 
//            // 将文件 与 module 挂在 删除的链表上
////            struct EziDebugPrj::LOG_FILE_INFO* pdelFileInfo = new EziDebugPrj::LOG_FILE_INFO ;
////            pdelFileInfo->etype = EziDebugPrj::infoTypeFileInfo ;
////            pdelFileInfo->pinfo = NULL ;
////            memcpy(pdelFileInfo->ainfoName,this->fileName().toAscii(),this->fileName().size()+1);
////            deletedinfolist.append(pdelFileInfo);
 
////            for(int i = 0 ; i < getModuleList().count();i++)
////            {
////                EziDebugModule *pmodule = prj->getPrjModuleMap().value(getModuleList().at(i),NULL) ;
////                if(!pmodule)
////                {
////                    struct EziDebugPrj::LOG_FILE_INFO* pdelmoduleInfo = new EziDebugPrj::LOG_FILE_INFO ;
 
////                    pdelmoduleInfo->etype = EziDebugPrj::infoTypeModuleStructure ;
////                    pdelmoduleInfo->pinfo = NULL ;
////                    memcpy(pdelmoduleInfo->ainfoName,pmodule->getModuleName().toAscii(),pmodule->getModuleName().size()+1);
////                    deletedinfolist.append(pdelmoduleInfo);
////                }
////            }
 
//            // 将更改后的文件 与 新的module 挂在 添加的链表上 需要重新添加
//            struct EziDebugPrj::LOG_FILE_INFO* paddFileInfo = new EziDebugPrj::LOG_FILE_INFO ;
//            paddFileInfo->etype = EziDebugPrj::infoTypeFileInfo ;
//            paddFileInfo->pinfo = this ;
//            memcpy(paddFileInfo->ainfoName,this->fileName().toAscii(),this->fileName().size()+1);
//            addedinfolist.append(paddFileInfo);
 
//            for(int i = 0 ; i < getModuleList().count();i++)
//            {
//                EziDebugModule *pmodule = prj->getPrjModuleMap().value(getModuleList().at(i),NULL) ;
//                if(pmodule)
//                {
//                    struct EziDebugPrj::LOG_FILE_INFO* paddModuleInfo = new EziDebugPrj::LOG_FILE_INFO ;
//                    paddModuleInfo->etype = EziDebugPrj::infoTypeModuleStructure ;
//                    paddModuleInfo->pinfo = pmodule ;
//                    memcpy(paddModuleInfo->ainfoName,pmodule->getModuleName().toAscii(),pmodule->getModuleName().size()+1);
//                    addedinfolist.append(paddModuleInfo);
//                }
//                else
//                {
//                    return 1 ;
//                }
//            }
//        }
//    }
//    else
//    {
        // 将最新扫描过的 信息 保存
 
 
        qDebug() << " !!module count !!"<< getModuleList().count();
        for(i = 0 ; i < getModuleList().count();i++)
        {
            EziDebugModule *pmodule = prj->getPrjModuleMap().value(getModuleList().at(i),NULL) ;
            if(pmodule)
            {   
                qDebug() << " add module info " ;
                struct EziDebugPrj::LOG_FILE_INFO* paddModuleInfo = new EziDebugPrj::LOG_FILE_INFO ;
                paddModuleInfo->etype = EziDebugPrj::infoTypeModuleStructure ;
                paddModuleInfo->pinfo = pmodule ;
                memcpy(paddModuleInfo->ainfoName,pmodule->getModuleName().toAscii().data(),pmodule->getModuleName().size()+1);
                addedinfolist.append(paddModuleInfo);
            }
            else
            {
                return 1 ;
            }
        }
//    }
    //qDebug() << addedinfolist.count() <<  deletedinfolist.count();
    // 更改文件扫描时间
    modifyStoredTime(ilastModifedTime);
 
    return 0 ;
}
 
int EziDebugVlgFile::checkedEziDebugCodeExist(EziDebugPrj* prj ,QString imoduleName ,QStringList &chainnamelist)
{
    QMap<QString,EziDebugScanChain*> ichainMap = prj->getScanChainInfo() ;
    QMap<QString,int> ilinesearchposMap ;
    QMap<QString,int> iblocksearchposMap ;
    QMap<QString,QStringList> ichainLineCodeMap ;
    QMap<QString,QStringList> ichainBlockCodeMap ;
    QStringList idestroyChainList ;
    QStringList icheckChainList ;
    QList<int>  iposList ;
 
    if(!open(QIODevice::ReadOnly | QIODevice::Text))
    {
        // 向用户输出  文件打不开
        qDebug() << errorString() << fileName() ;
        return 1 ;
    }
 
    QTextStream iin(this);
    QString ifileContent = iin.readAll();
    QString inoCommentaryStr = replaceCommentaryByBlank(ifileContent) ;
    QRegExp imoduleStartExp(tr("module\\s+%1").arg(imoduleName)) ;
    int nstartPos = inoCommentaryStr.indexOf(imoduleStartExp);
    if(-1 == nstartPos)
    {
        qDebug() << "EziDebug Error: parse file error ,please check the file!";
        return -2 ;
    }
    int nendPos = inoCommentaryStr.indexOf("endmodule",nstartPos);
    if(-1 == nendPos)
    {
        qDebug() << "EziDebug Error: parse file error ,please check the file!";
        return -2 ;
    }
    QString icheckStr = inoCommentaryStr.mid(nstartPos,nendPos-1);
    // 关闭
    close();
 
    for(int nchainNum = 0 ; nchainNum < chainnamelist.count() ; nchainNum++)
    {
        QString ichainName = chainnamelist.at(nchainNum) ;
        EziDebugScanChain * pchain = ichainMap.value(ichainName,NULL);
        if(pchain)
        {
            QMap<QString,QStringList> icodeListMap = pchain->getLineCode() ;
            QStringList icodeList ;
            icodeList = icodeListMap.value(imoduleName,icodeList) ;
            if(icodeList.count())
            {
                ichainLineCodeMap.insert(ichainName,icodeList);
            }
 
            icodeList.clear();
            icodeListMap = pchain->getBlockCode();
            icodeList = icodeListMap.value(imoduleName,icodeList);
            if(icodeList.count())
            {
                ichainBlockCodeMap.insert(ichainName,icodeList) ;
            }
        }
        else
        {
            qDebug() << "NULL Pointer!" << ichainName << "is not exist!";
            return -1 ;
        }
    }
 
    // linecode
    QMap<QString ,QStringList>::const_iterator icodeIter = ichainLineCodeMap.constBegin() ;
    while(icodeIter != ichainLineCodeMap.constEnd())
    {
        int ncodeNum = 0 ;
        QString chainname = icodeIter.key() ;
        QStringList icode = icodeIter.value() ;
        iposList.clear();
        EziDebugScanChain * pchain = ichainMap.value(chainname);
        int nsearchPos = 0 ;
        for(;ncodeNum < icode.count();ncodeNum++)
        {
            QString isearchLineStr = icode.at(ncodeNum) ;
            if(-1 != (nsearchPos = icheckStr.indexOf(QRegExp(isearchLineStr))))
            {
                ilinesearchposMap.insert(isearchLineStr ,nsearchPos);
                iposList.append(nsearchPos);
            }
            else
            {
                qDebug() <<"EziDebug Warning:"<< isearchLineStr << "is not finded!";
                if(!idestroyChainList.contains(chainname))
                {
                    idestroyChainList.append(chainname);
                }
                break ;
            }
        }
 
        // check code sequence
        if(ncodeNum == icode.count())
        {
            QSet<int> isimplifiedSet = iposList.toSet();
            if(isimplifiedSet.count() == iposList.count())
            {
                 QStringList inewCodeList ;
                 qSort(iposList.begin(), iposList.end(), qLess<int>());
                 for(int ncodeNum = 0 ; ncodeNum < iposList.count() ; ncodeNum++)
                 {
                    int npos = iposList.at(ncodeNum) ;
                    QString icodeStr = ilinesearchposMap.key(npos) ;
                    inewCodeList.append(icodeStr);
                 }
 
                 if(inewCodeList != icode)
                 {
                    pchain->replaceLineCodeMap(imoduleName,inewCodeList);
                    prj->addToCheckedChainList(chainname);
                 }
            }
            else
            {
                qDebug() << "Please remove the repeated code !";
                for(int i = 0 ; i < icode.count() ; i++)
                {
                    qDebug() << icode.at(i) << endl ;
                }
                return -2 ;
            }
 
        }
        ilinesearchposMap.clear();
        ++icodeIter ;
    }
 
 
    // blockcode
    icodeIter = ichainBlockCodeMap.constBegin() ;
    while(icodeIter != ichainBlockCodeMap.constEnd())
    {
        int ncodeNum = 0 ;
        iposList.clear();
        QString chainname = icodeIter.key() ;
        QStringList icode = icodeIter.value() ;
        EziDebugScanChain * pchain = ichainMap.value(chainname);
        // the code in icode is from little to big
        int nsearchPos = 0 ;
        for(;ncodeNum < icode.count();ncodeNum++)
        {
            QString isearchLineStr = icode.at(ncodeNum) ;
            if(-1 != (nsearchPos = icheckStr.indexOf(QRegExp(isearchLineStr))))
            {
                iblocksearchposMap.insert(isearchLineStr ,nsearchPos);
                iposList.append(nsearchPos);
            }
            else
            {
                qDebug() <<"EziDebug Warning:"<< isearchLineStr << "is not finded!";
                if(!idestroyChainList.contains(chainname))
                {
                    idestroyChainList.append(chainname);
                }
                break ;
            }
        }
 
        // check code sequence
        if(ncodeNum == icode.count())
        {
            QSet<int> isimplifiedSet = iposList.toSet();
            if(isimplifiedSet.count() == iposList.count())
            {
                 QStringList inewCodeList ;
                 qSort(iposList.begin(), iposList.end(), qLess<int>());
                 for(int ncodeNum = 0 ; ncodeNum < iposList.count() ; ncodeNum++)
                 {
                    int npos = iposList.at(ncodeNum) ;
                    QString icodeStr = iblocksearchposMap.key(npos) ;
                    inewCodeList.append(icodeStr);
                 }
 
                 if(inewCodeList != icode)
                 {
                    pchain->replaceBlockCodeMap(imoduleName,inewCodeList);
 
                    prj->addToCheckedChainList(chainname);
                 }
            }
            else
            {
                qDebug() << "Please remove the repeated code !\n";
                for(int i = 0 ; i < icode.count() ; i++)
                {
                    qDebug() << icode.at(i) << endl ;
                }
                return -2 ;
            }
        }
        iblocksearchposMap.clear();
        ++icodeIter ;
    }
 
    // check the destroyed chain!
    for(int nchaincount = 0 ; nchaincount < idestroyChainList.count() ;nchaincount++)
    {
        QString ichainName = idestroyChainList.at(nchaincount) ;
        qDebug()  << "EziDebug Error:" << ichainName << "is destroyed!" << "checkedEziDebugCodeExist !";
        prj->addToDestroyedChainList(ichainName);
    }
 
    return 0 ;
}
 
int EziDebugVlgFile::createUserCoreFile(EziDebugPrj* prj)
{
    if(!prj)
        return 1 ;
    QString iregModuleName(tr("_EziDebug_ScnReg")) ;
    QString itimerName(tr("_EziDebug_TOUT_m"));
 
 
    QFileInfo iPrjFileInfo(prj->getPrjName());
    /*创建新的文件夹  并 创建自己的core文件*/
    QDir idirPrj(iPrjFileInfo.absolutePath());
    QString inewDirName = iPrjFileInfo.absolutePath() + tr("/") + tr("EziDebug_1.0") ;
    QDir idir(inewDirName);
    QTime icurrentTime = QTime::currentTime() ;
 
    if(idir.exists())
    {
        qDebug() <<  "There is already exist folder!" << inewDirName ;
        // 检测 文件是否存在
        if(idir.exists("_EziDebug_ScanChainReg.v"))
        {
            if(idir.exists("_EziDebug_TOUT_m.v"))
            {
               EziDebugScanChain::saveEziDebugAddedInfo(iregModuleName,itimerName,QObject::tr("/EziDebug_1.0"));
               // 重新创建 tout 文件
               QString ifileToutName(tr("_EziDebug_TOUT_m.v"));
               QFile itoutfile(inewDirName + tr("/") + ifileToutName);
               if(!itoutfile.open(QIODevice::WriteOnly|QIODevice::Text|QIODevice::Truncate))
               {
                    /*在文本栏 提示插入链错误 无法创建文件 文件无法打开*/
                    return 1 ;
               }
 
 
               /*写入 tout 文件*/
               QTextStream itoutStream(&itoutfile);
 
               itoutStream <<"module ";
 
               /*写入module名字*/
               itoutStream << itimerName;
               itoutStream << g_ptoutfileContentFirst ;
               itoutStream << prj->getMaxRegNumPerChain() << ";" ;
               itoutStream << g_ptoutfileContentSecond ;
 
               itoutfile.close();
               return 0 ;
            }
        }
        // 重新创建 文件
        idir.remove("_EziDebug_ScanChainReg.v") ;
        idir.remove("_EziDebug_TOUT_m.v");
    }
    else
    {
        idirPrj.mkdir(tr("EziDebug_1.0"));
    }
 
    QString ifileRegName(tr("_EziDebug_ScanChainReg.v")) ;
    QString ifileToutName(tr("_EziDebug_TOUT_m.v"));
    QStringList ifileList = prj->getFileNameList();
 
    for (int i = 0; i < ifileList.size(); ++i)
    {
       QFileInfo ifileInfo(prj->getCurrentDir(),ifileList.at(i));
       if(ifileInfo.fileName() == ifileRegName)
       {
           ifileRegName = tr("_EziDebug_ScanChainReg")+tr("_")+ icurrentTime.toString("hh_mm_ss") + tr(".v") ;
           if(ifileInfo.fileName() == ifileRegName)
           {
                /*在文本栏 提示插入链错误  无法创建文件  文件名重复*/
               qDebug() << "EziDebug encounter error,Please ensure your fileName is right" << ifileRegName ;
               return 1 ;
           }
       }
 
 
       if(ifileInfo.fileName() == ifileToutName)
       {
           ifileToutName = tr("_EziDebug_TOUT_m")+tr("_")+ icurrentTime.toString("hh_mm_ss") + tr(".v") ;
           if(ifileInfo.fileName() == ifileToutName)
           {
                /*在文本栏 提示插入链错误  无法创建文件  文件名重复*/
               qDebug() << "EziDebug encounter error,Please ensure your fileName is right" << ifileToutName ;
               return 1 ;
           }
       }
    }
 
#if 0
    /*检查module名字是否存在重复*/
    QMap<QString,EziDebugModule*>::const_iterator i = prj->getPrjModuleMap().constBegin();
    while (i != prj->getPrjModuleMap().constEnd())
    {
 
    }
 #endif
 
    QFile itoutfile(inewDirName + tr("/") + ifileToutName);
    if(!itoutfile.open(QIODevice::WriteOnly|QIODevice::Text|QIODevice::Truncate))
    {
         /*在文本栏 提示插入链错误 无法创建文件 文件无法打开*/
         return 1 ;
    }
 
 
    /*写入 tout 文件*/
    QTextStream itoutStream(&itoutfile);
 
    itoutStream <<"module ";
 
    /*写入module名字*/
    itoutStream << itimerName;
    itoutStream << g_ptoutfileContentFirst ;
    itoutStream << prj->getMaxRegNumPerChain() << ";" ;
    itoutStream << g_ptoutfileContentSecond ;
 
    itoutfile.close();
 
 
    QFile iscanRegfile(inewDirName + tr("/") + ifileRegName);
    if(!iscanRegfile.open(QIODevice::WriteOnly|QIODevice::Text|QIODevice::Append))
    {
         /*在文本栏 提示插入链错误 无法创建文件 文件无法打开*/
         return 1 ;
    }
    /*写入 ScanReg 文件*/
    QTextStream iscanRegout(&iscanRegfile);
 
    iscanRegout <<"module ";
 
    /*写入module名字*/
    iscanRegout << iregModuleName ;
    iscanRegout << g_pScanRegfileContentFirst ;
    iscanRegout << g_pScanRegfileContentSecond ;
 
    iscanRegfile.close();
 
    EziDebugScanChain::saveEziDebugAddedInfo(iregModuleName,itimerName,QObject::tr("/EziDebug_1.0"));
 
    return 0 ;
}
 
int EziDebugVlgFile::caculateExpression(QString string)
{
    return 0 ;
}
 
void EziDebugVlgFile::addToMacroMap(const QString &macrostring , const QString &macrovalue)
{
    m_imacro.insert(macrostring,macrovalue) ;
}
 
void EziDebugVlgFile::addToDefParameterMap(const QString &instancename ,const QString &parameter ,const QString &value)
{
    QMap<QString,QString> iparameterMap ;
    iparameterMap = m_idefparameter.value(instancename ,iparameterMap) ;
    iparameterMap.insert(parameter,value);
    m_idefparameter.insert(instancename,iparameterMap) ;
}
 
const QMap<QString,QString> & EziDebugVlgFile::getMacroMap(void) const
{
    return m_imacro ;
}
 
const QMap<QString,QMap<QString,QString> > & EziDebugVlgFile::getDefParamMap(void) const
{
    return m_idefparameter ;
}
 
 
#if 0
bool EziDebugVlgFile::isLibaryFile()
{
    return 0 ;
}
#endif
 
 
int  EziDebugVlgFile::deleteEziDebugCode(void)
{
    // 只读方式 打开文件
    QString ifileContent ;
    QString inewContent ;
    //QString ikeyWords ;
    int nkeyWordsPos = 0 ;
    QList<int> iposList ;
    QMap<int,int> ideleteCodePosMap ;
 
    //QRegExp ieziDebugFlagExp(QObject::tr("\\b_EziDebug_\\w+\\b"));
    QRegExp ieziDebugFlagWithEnterExp(QObject::tr("\\s*\\b_EziDebug_\\w+\\b"));
    QRegExp ikeyWordsExp(QObject::tr("\\s*\\b[a-z]+\\b"));
    //QRegExp ikeyWordsWithEnterExp(QObject::tr("\\s*\\b\\w+\\b"));
 
 
 
    /*
        _EziDebug_ScnReg _EziDebug_ScnReg_chn_inst0(
        .clock	(HCLK) ,
        .resetn	(_EziDebug_chn_rstn) ,
        .TDI_reg	(_EziDebug_chn_HCLK_TDI_reg) ,
        .TDO_reg	(_EziDebug_chn_HCLK_tdo1) ,
        .TOUT_reg	(_EziDebug_chn_TOUT_reg) ,
        .shift_reg	(_EziDebug_chn_HCLK_sr0)
        )
    */
    QRegExp ieziDebugScnInstExp(QObject::tr("\\s*_EziDebug_ScnReg\\s+_EziDebug_ScnReg_chn\\d*_inst\\d*\\s*\\(.+\\)\\s*"));
 
 
    QRegExp ieziDebugToutInstExp(QObject::tr("\\s*_EziDebug_TOUT_m\\s+_EziDebug_TOUT_m_chn\\d*_inst\\d*\\s*\\(.+\\)\\s*"));
    //_EziDebug_TOUT_m _EziDebug_TOUT_m_chn_inst
 
    int npostion = 0 ;
    if(!open(QIODevice::ReadOnly | QIODevice::Text))
    {
        // 向用户输出  文件打不开
        qDebug() << errorString() << fileName() ;
        return 1 ;
    }
    // 全部读出
    QTextStream iin(this);
    ifileContent = iin.readAll();
    // 关闭
    close();
 
    // 替换所有注释为  空格
    inewContent = replaceCommentaryByBlank(ifileContent);
    qDebug() << "EziDebug info: start file---" << fileName();
    if(fileName().endsWith("fft_ram_256x17.v"))
    {
        qDebug() << "EziDebug Info : halt Point!";
    }
 
     qDebug() << fileName() ;
 
    // 查找 以 "_EziDebug" 开头的字符串
    while((npostion = ieziDebugFlagWithEnterExp.indexIn(inewContent,npostion)) != -1)
    {
        // EziDebug 自定义 core 的例化
        int nnextSemicolonPos = inewContent.indexOf(';',npostion + ieziDebugFlagWithEnterExp.matchedLength()) ;
        QString itruncateStr = inewContent.mid(npostion , (nnextSemicolonPos - npostion));
        qDebug() << "test string!" << itruncateStr  << ieziDebugScnInstExp.exactMatch(itruncateStr) << ieziDebugToutInstExp.exactMatch(itruncateStr) ;
 
        int nin = ieziDebugScnInstExp.indexIn(itruncateStr) ;
        qDebug() << nin <<  ieziDebugScnInstExp.matchedLength() << ieziDebugScnInstExp.capturedTexts().at(0);
 
        if(ieziDebugScnInstExp.exactMatch(itruncateStr)||ieziDebugToutInstExp.exactMatch(itruncateStr))
        {
            iposList.append(npostion);
            ideleteCodePosMap.insert(npostion,(nnextSemicolonPos - npostion + 1));
            qDebug() << " instance match!" <<  ifileContent.mid(npostion ,(nnextSemicolonPos - npostion + 1)) ;
 
            npostion = nnextSemicolonPos + 1 ;
        }
        else
        {
            if(QRegExp(QObject::tr("\\s*\\b_EziDebug\\w+\\s*<=.*")).exactMatch(itruncateStr))
            {
                // 寻找 always
                int nalwaysPos = inewContent.lastIndexOf(QRegExp(QObject::tr("\\balways\\b")),npostion);
                int nlastNoneblankCharPos = inewContent.lastIndexOf(QRegExp(QObject::tr("\\S")),nalwaysPos);
                if(nlastNoneblankCharPos != -1)
                {
                    // nalwaysPos   =  nlastNoneblankCharPos + 1 ;
                    nalwaysPos   =  nlastNoneblankCharPos ;
                }
                int nfirstBeginPos = inewContent.indexOf(QRegExp(QObject::tr("\\bbegin\\b")),nalwaysPos);
                /*查找匹配的  end*/
                QRegExp iwordsExp(QObject::tr("\\b\\w+\\b"));
                int nmatch = 1 ;
                int nendPos = 0 ;
                int nbeginPos = nfirstBeginPos + 5 ;
 
                while((nbeginPos = iwordsExp.indexIn(ifileContent,nbeginPos)) != -1)
                {
                    if(iwordsExp.capturedTexts().at(0) == "begin")
                    {
                        nmatch++ ;
                    }
                    else if(iwordsExp.capturedTexts().at(0) == "end")
                    {
                        nmatch-- ;
                        if(0 == nmatch)
                        {
                            nendPos = nbeginPos ;
                            break ;
                        }
                    }
                    else
                    {
                        // do nothing
                    }
                    nbeginPos = nbeginPos + iwordsExp.matchedLength();
                }
 
                if(nmatch != 0)
                {
                    return 1 ;
                }
 
                iposList.append(nalwaysPos);
                ideleteCodePosMap.insert(nalwaysPos,(nendPos - nalwaysPos + 3));
 
                qDebug()<< "1" << ifileContent.mid(nalwaysPos ,(nendPos - nalwaysPos + 3)) ;
 
                npostion = nendPos + 3 ;
            }
            else
            {
                // 查找最近的单词
                nkeyWordsPos = ikeyWordsExp.lastIndexIn(inewContent,npostion) ;
                QString ikeyWord = ikeyWordsExp.capturedTexts().at(0) ;
                // 最近的 ','
                int nlastCommaPos = inewContent.lastIndexOf(',',npostion);
 
                if(nlastCommaPos > nkeyWordsPos)
                {
                    // 是否包含 '.'
                    /*只能是 例化 中加入 的端口连接 */
                    // 标准的 ,.(),.(),.()
                    // 截取 上一个 逗号 之间的 字符 看是否包含 ".( 字符"
                    QString ipartStr = inewContent.mid((nlastCommaPos+1) , (npostion - nlastCommaPos -1));
                    if(QRegExp(QObject::tr("\\s*\\.")).exactMatch(ipartStr))
                    {
                        // 删除上一个逗号 到 下一个 ) 之间字符串
                        int nnextRightBracketPos = inewContent.indexOf(')',npostion);
                        iposList.append(nlastCommaPos);
                        ideleteCodePosMap.insert(nlastCommaPos,(nnextRightBracketPos - nlastCommaPos + 1));
                        qDebug()<< "2" << ifileContent.mid(nlastCommaPos ,(nnextRightBracketPos - nlastCommaPos + 1)) ;
 
                        npostion = nnextRightBracketPos + 1 ;
                    }
                    else
                    {
                        // 删除上一个逗号 到 本字符串结束
                        iposList.append(nlastCommaPos);
                        ideleteCodePosMap.insert(nlastCommaPos,(npostion + ieziDebugFlagWithEnterExp.matchedLength()- nlastCommaPos));
                        qDebug()<< "3" << ifileContent.mid(nlastCommaPos ,(npostion + ieziDebugFlagWithEnterExp.matchedLength()- nlastCommaPos)) ;
 
                        npostion =  npostion + ieziDebugFlagWithEnterExp.matchedLength() ;
                    }
                }
                else
                {
                    if(ikeyWordsExp.capturedTexts().at(0).contains(QRegExp(QObject::tr("\\binput\\b"))))
                    {
                        int nlastCommaPos = inewContent.lastIndexOf(',',npostion);
                        int nlastSemicolon = inewContent.lastIndexOf(';',npostion);
                        int nnextSemicolon = inewContent.indexOf(';',npostion);
 
                        if(nlastCommaPos > nlastSemicolon)
                        {
                            // 端口声明
                            iposList.append(nlastCommaPos);
                            ideleteCodePosMap.insert(nlastCommaPos,(npostion + ieziDebugFlagWithEnterExp.matchedLength() - nlastCommaPos));
                            qDebug() << "4" << ifileContent.mid(nlastCommaPos ,(npostion + ieziDebugFlagWithEnterExp.matchedLength() - nlastCommaPos)) ;
 
                            npostion = npostion + ieziDebugFlagWithEnterExp.matchedLength() ;
                        }
                        else
                        {
                            nkeyWordsPos = inewContent.lastIndexOf(QRegExp(QObject::tr("\\S")),nkeyWordsPos-1) + 1 ;
                            iposList.append(nkeyWordsPos);
                            ideleteCodePosMap.insert(nkeyWordsPos,(nnextSemicolon - nkeyWordsPos + 1));
                            qDebug() << "5" << ifileContent.mid(nkeyWordsPos ,(nnextSemicolon - nkeyWordsPos + 1)) ;
 
                            npostion = nnextSemicolon + 1 ;
                        }
                    }
                    else if(ikeyWordsExp.capturedTexts().at(0).contains(QRegExp(QObject::tr("\\boutput\\b"))))
                    {
                        int nlastCommaPos = inewContent.lastIndexOf(',',npostion);
                        int nlastSemicolon = inewContent.lastIndexOf(';',npostion);
                        int nnextSemicolon = inewContent.indexOf(';',npostion);
 
                        if(nlastCommaPos > nlastSemicolon)
                        {
                            iposList.append(nlastCommaPos);
                            ideleteCodePosMap.insert(nlastCommaPos,(npostion + ieziDebugFlagWithEnterExp.matchedLength() - nlastCommaPos));
                            qDebug() << "6" << ifileContent.mid(nlastCommaPos ,(npostion + ieziDebugFlagWithEnterExp.matchedLength() - nlastCommaPos)) ;
 
                            npostion = npostion + ieziDebugFlagWithEnterExp.matchedLength() ;
                        }
                        else
                        {
                            nkeyWordsPos = inewContent.lastIndexOf(QRegExp(QObject::tr("\\S")),nkeyWordsPos-1) + 1 ;
                            iposList.append(nkeyWordsPos);
                            ideleteCodePosMap.insert(nkeyWordsPos,(nnextSemicolon - nkeyWordsPos + 1));
                            qDebug() << "7" << ifileContent.mid(nkeyWordsPos ,(nnextSemicolon - nkeyWordsPos + 1)) ;
                            npostion = nnextSemicolon + 1 ;
                        }
                    }
                    else if(ikeyWordsExp.capturedTexts().at(0).contains(QRegExp(QObject::tr("\\breg\\b"))))
                    {
                        int nnextSemicolon = inewContent.indexOf(';',npostion);
                        nkeyWordsPos = inewContent.lastIndexOf(QRegExp(QObject::tr("\\S")),nkeyWordsPos-1) + 1 ;
                        iposList.append(nkeyWordsPos);
                        ideleteCodePosMap.insert(nkeyWordsPos,(nnextSemicolon - nkeyWordsPos + 1));
                        qDebug() << "8" << ifileContent.mid(nkeyWordsPos ,(nnextSemicolon - nkeyWordsPos + 1)) ;
                        npostion = nnextSemicolon + 1;
                    }
                    else if(ikeyWordsExp.capturedTexts().at(0).contains(QRegExp(QObject::tr("\\bwire\\b"))))
                    {
                        int nnextSemicolon = inewContent.indexOf(';',npostion);
                        nkeyWordsPos = inewContent.lastIndexOf(QRegExp(QObject::tr("\\S")),nkeyWordsPos-1) + 1 ;
                        iposList.append(nkeyWordsPos);
                        ideleteCodePosMap.insert(nkeyWordsPos,(nnextSemicolon - nkeyWordsPos + 1));
                        qDebug() << "9" << ifileContent.mid(nkeyWordsPos ,(nnextSemicolon - nkeyWordsPos + 1)) ;
                        npostion = nnextSemicolon + 1;
                    }
                    else if(ikeyWordsExp.capturedTexts().at(0).contains(QRegExp(QObject::tr("\\bdefparam\\b"))))
                    {
                        int nnextSemicolon = inewContent.indexOf(';',npostion);
                        nkeyWordsPos = inewContent.lastIndexOf(QRegExp(QObject::tr("\\S")),nkeyWordsPos-1) + 1 ;
                        iposList.append(nkeyWordsPos);
                        ideleteCodePosMap.insert(nkeyWordsPos,(nnextSemicolon - nkeyWordsPos + 1));
                        qDebug() << "10" << ifileContent.mid(nkeyWordsPos ,(nnextSemicolon - nkeyWordsPos + 1)) ;
                        npostion = nnextSemicolon + 1;
                    }
                    else if(ikeyWordsExp.capturedTexts().at(0).contains(QRegExp(QObject::tr("\\bassign\\b"))))
                    {
                        int nnextSemicolon = inewContent.indexOf(';',npostion);
                        nkeyWordsPos = inewContent.lastIndexOf(QRegExp(QObject::tr("\\S")),nkeyWordsPos-1) + 1 ;
                        iposList.append(nkeyWordsPos);
                        ideleteCodePosMap.insert(nkeyWordsPos,(nnextSemicolon - nkeyWordsPos + 1));
                        qDebug() << "11" << ifileContent.mid(nkeyWordsPos ,(nnextSemicolon - nkeyWordsPos + 1)) ;
                        npostion = nnextSemicolon + 1;
                    }
                    else
                    {
                        // do nothing
                        npostion = npostion + ikeyWordsExp.matchedLength();
                    }
                }
            }
        }
    }
 
    // from big to small
    qSort(iposList.begin(), iposList.end(), qGreater<int>());
 
    // j < iposList.count()
    for(int j = 0 ; j < iposList.count() ; j++)
    {
        int nstartPos = iposList.at(j) ;
        int nlength = ideleteCodePosMap.value(nstartPos , 0) ;
        ifileContent.replace(nstartPos , nlength ,"");
    }
 
 
    if(!open(QIODevice::WriteOnly | QIODevice::Truncate))
    {
        // 向用户输出  文件打不开
        qDebug() << "EziDebug Error:" << errorString() << ":" << fileName() ;
        return 1 ;
    }
 
    qDebug() << "EziDebug info: finish file---" << fileName();
    // 全部写入
    QTextStream iout(this);
    iout << ifileContent ;
    close() ;
 
    QFileInfo ifileInfo(fileName()) ;
    this->modifyStoredTime(ifileInfo.lastModified()) ;
 
    return 0 ;
}
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.