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

Subversion Repositories ezidebug

[/] [ezidebug/] [trunk/] [EziDebug_src/] [ezidebugprj.cpp] - Blame information for rev 4

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 EziDebug
#include <QString>
2
#include <QDir>
3
#include <QMap>
4
#include <QStringList>
5
#include <QXmlStreamReader>
6
#include <QtXml>
7
#include <QFileInfo>
8
#include <string.h>
9
#include <QMessageBox>
10
#include <QDebug>
11
 
12
 
13
#include "UpdateDetectThread.h"
14
#include "ezidebugprj.h"
15
#include "ezidebugmodule.h"
16
#include "ezidebugvlgfile.h"
17
#include "ezidebugvhdlfile.h"
18
#include "ezidebugscanchain.h"
19
#include "ezidebuginstancetreeitem.h"
20
#include <algorithm>
21
 
22
 
23
char *month[13] = {"", "Jan" ,"Feb" , "Mar" , "Apr" , "May" , "Jun" , "Jul" , "Aug" , "Sep" \
24
                    "Oct" , "Nov" , "Dec" } ;
25
 
26
 
27
char *day[8] = {"", "Mon" , "Tue" , "Wed" , "Thu" , "Fri" , "Sat" , "Sun"} ;
28
 
29
 
30
 
31
 
32
 
33
EziDebugPrj::EziDebugPrj(int maxregnum , QString projectdir , TOOL tool , QObject * parent)\
34
    : QObject(parent) ,m_iprjPath(QDir(projectdir)),m_nmaxRegNumInChain(maxregnum),m_eusedTool(tool)
35
{
36
    m_pthread  = new UpdateDetectThread(this,NULL);
37
    m_headItem = NULL ;
38
    m_pLastOperateChain = NULL ;
39
    m_pLastOperteTreeItem = NULL ;
40
    m_elastOperation = OperateTypeNone ;
41
    m_isLogFileExist = false ;
42
    m_ipermettedMaxRegNum = 0 ;
43
    m_imaxRegWidth = 0 ;
44
    m_isUpdated = false ;
45
    m_isLogFileDestroyed = false ;
46
}
47
 
48
EziDebugPrj::~EziDebugPrj()
49
{
50
    // 注::工程指针 析构时 其他对象不能使用
51
    qDebug() << "Attention : Begin to destruct EziDebugPrj object!";
52
 
53
    if(m_pthread->isRunning())
54
    {
55
        m_pthread->quit();
56
        m_pthread->wait();
57
    }
58
    delete m_pthread ;
59
 
60
    if(EziDebugScanChain::getUserDir().toLower() != "no dir")
61
    {
62
        QDir idir(m_iprjPath.absolutePath() + EziDebugScanChain::getUserDir());
63
 
64
        idir.setFilter(QDir::Files);
65
        QFileInfoList iinfolist = idir.entryInfoList();
66
        for(int i = 0; i < iinfolist.size(); ++i)
67
        {
68
            QFileInfo fileInfo = iinfolist.at(i);
69
            QString ifileName = fileInfo.fileName() ;
70
            if(!(fileInfo.fileName().endsWith(".v")||fileInfo.fileName().endsWith(".vhd")))
71
            {
72
                idir.remove(ifileName);
73
            }
74
        }
75
    }
76
 
77
    // verilog file 指针析构
78
    QMap<QString,EziDebugVlgFile*>::iterator i =  m_ivlgFileMap.begin() ;
79
    while(i != m_ivlgFileMap.end())
80
    {
81
       EziDebugVlgFile* pfile = m_ivlgFileMap.value(i.key());
82
       if(pfile)
83
       {
84
           delete pfile ;
85
       }
86
       ++i ;
87
    }
88
    m_ivlgFileMap.clear() ;
89
 
90
    // vhdl file 指针析构
91
    QMap<QString,EziDebugVhdlFile*>::iterator j =  m_ivhdlFileMap.begin() ;
92
    while(j != m_ivhdlFileMap.end())
93
    {
94
       EziDebugVhdlFile* pfile = m_ivhdlFileMap.value(j.key());
95
       if(pfile)
96
       {
97
           delete pfile ;
98
       }
99
       ++j ;
100
    }
101
    m_ivhdlFileMap.clear() ;
102
 
103
    // module 析构
104
    QMap<QString,EziDebugModule*>::iterator k =  m_imoduleMap.begin() ;
105
    while(k != m_imoduleMap.end())
106
    {
107
       EziDebugModule* pmodule = m_imoduleMap.value(k.key());
108
       if(pmodule)
109
       {
110
           delete pmodule ;
111
       }
112
       ++k ;
113
    }
114
    m_imoduleMap.clear() ;
115
 
116
 
117
    // treeitemmap 析构
118
//    QMap<QString,EziDebugInstanceTreeItem*>::iterator itreeItemIterator =  m_ichainTreeItemMap.begin() ;
119
//    while(itreeItemIterator != m_ichainTreeItemMap.end())
120
//    {
121
//       EziDebugInstanceTreeItem* pitem = m_ichainTreeItemMap.value(itreeItemIterator.key());
122
//       if(!pitem)
123
//       {
124
//           delete pitem ;
125
//       }
126
//       ++itreeItemIterator ;
127
//    }
128
    m_ichainTreeItemMap.clear() ;
129
 
130
    // backup TreeItemMap 析构
131
//    QMap<QString,EziDebugInstanceTreeItem*>::iterator ibakTreeItemIterator =  m_ibackupChainTreeItemMap.begin() ;
132
//    while(ibakTreeItemIterator != m_ibackupChainTreeItemMap.end())
133
//    {
134
//       EziDebugInstanceTreeItem* pitem = m_ibackupChainTreeItemMap.value(ibakTreeItemIterator.key());
135
//       if(!pitem)
136
//       {
137
//           delete pitem ;
138
//       }
139
//       ++ibakTreeItemIterator ;
140
//    }
141
    m_ibackupChainTreeItemMap.clear() ;
142
 
143
    // m_ichainInfoMap 析构
144
    QMap<QString,EziDebugScanChain*>::iterator ichainIterator =  m_ichainInfoMap.begin() ;
145
    while(ichainIterator != m_ichainInfoMap.end())
146
    {
147
        // LastOperateChain 析构
148
       EziDebugScanChain* pitem = m_ichainInfoMap.value(ichainIterator.key());
149
       if(pitem)
150
       {
151
           if(pitem == m_pLastOperateChain)
152
           {
153
               m_pLastOperateChain = NULL ;
154
           }
155
           delete pitem ;
156
       }
157
       ++ichainIterator ;
158
    }
159
    m_ichainInfoMap.clear() ;
160
 
161
    // backupchaininfo 析构
162
    QMap<QString,EziDebugScanChain*>::iterator ibakChainIterator =  m_ibackupChainInfoMap.begin() ;
163
    while(ibakChainIterator != m_ibackupChainInfoMap.end())
164
    {
165
       EziDebugScanChain* pitem = m_ibackupChainInfoMap.value(ibakChainIterator.key());
166
       if(pitem)
167
       {
168
           delete pitem ;
169
       }
170
       ++ibakChainIterator ;
171
    }
172
 
173
    m_ibackupChainInfoMap.clear() ;
174
 
175
    m_iqueryTreeItemMap.clear();
176
    m_ibackupQueryTreeItemMap.clear();
177
 
178
    if(m_pLastOperateChain)
179
        delete m_pLastOperateChain ;
180
 
181
    // LastOperteTreeItem 析构
182
//    if(!m_pLastOperteTreeItem)
183
    m_pLastOperteTreeItem = NULL ;
184
 
185
}
186
 
187
 
188
const EziDebugPrj::TOOL &EziDebugPrj::getToolType(void) const
189
{
190
    return  m_eusedTool ;
191
}
192
 
193
const QDir &EziDebugPrj::getCurrentDir(void) const
194
{
195
    return m_iprjPath ;
196
}
197
 
198
bool EziDebugPrj::getSoftwareXilinxErrCheckedFlag(void)
199
{
200
    return m_isDisXilinxErrChecked ;
201
}
202
QString EziDebugPrj::getTopModule(void)
203
{
204
    return m_itopModule ;
205
}
206
 
207
UpdateDetectThread *EziDebugPrj::getThread(void) const
208
{
209
    return m_pthread ;
210
}
211
 
212
bool EziDebugPrj::getLogFileExistFlag(void)
213
{
214
    return m_isLogFileExist ;
215
}
216
 
217
const QMap<QString,EziDebugScanChain*> &EziDebugPrj::getScanChainInfo(void) const
218
{
219
    return m_ichainInfoMap ;
220
}
221
 
222
const QMap<QString,EziDebugInstanceTreeItem*> &EziDebugPrj::getChainTreeItemMap(void) const
223
{
224
    return m_ichainTreeItemMap ;
225
}
226
 
227
const QMap<QString,EziDebugInstanceTreeItem*> &EziDebugPrj::getBackupChainTreeItemMap(void) const
228
{
229
   return m_ibackupChainTreeItemMap ;
230
}
231
 
232
const QMap<QString,EziDebugScanChain*> &EziDebugPrj::getBackupChainMap(void) const
233
{
234
   return m_ibackupChainInfoMap ;
235
}
236
 
237
const QStringList &EziDebugPrj::getPrjCodeFileNameList(void) const
238
{
239
    return m_iCodefileNameList ;
240
}
241
 
242
const QStringList &EziDebugPrj::getUpdateFileList(FILE_UPDATE_TYPE fileupdatetype) const
243
{
244
    if(fileupdatetype == addedUpdateFileType)
245
    {
246
        return m_iupdateAddedFileList ;
247
    }
248
    else if(fileupdatetype == deletedUpdateFileType)
249
    {
250
        return m_iupdateDeletedFileList ;
251
    }
252
    else
253
    {
254
        return m_iupdateChangedFileList ;
255
    }
256
}
257
const QStringList &EziDebugPrj::getFileNameList(void) const
258
{
259
    return m_iCodefileNameList ;
260
}
261
 
262
const QString &EziDebugPrj::getPrjName(void) const
263
{
264
    return  m_iprjName ;
265
}
266
 
267
EziDebugPrj::OPERATE_TYPE EziDebugPrj::getLastOperation(void)
268
{
269
    return m_elastOperation ;
270
}
271
 
272
int EziDebugPrj::getPermittedRegNum(void)
273
{
274
    return m_ipermettedMaxRegNum ;
275
}
276
 
277
EziDebugScanChain* EziDebugPrj::getLastOperateChain(void)
278
{
279
    return m_pLastOperateChain ;
280
}
281
 
282
int EziDebugPrj::eliminateLastOperation(void)
283
{
284
    QString ieziDebugFileSuffix ;
285
 
286
    /*对上一步操作进行善后*/
287
    if(m_elastOperation == OperateTypeAddScanChain)
288
    {
289
        if(!m_pLastOperateChain)
290
        {
291
            qDebug() << "Error:Last Operation chain is NULL Pointer!";
292
            return 1 ;
293
        }
294
        ieziDebugFileSuffix = QObject::tr(".add.%1").arg(m_pLastOperateChain->getChainName());
295
        QStringList iscanFileList = m_pLastOperateChain->getScanedFileList() ;
296
        for(int i = 0 ; i < iscanFileList.count();i++)
297
        {
298
            // 获取备份的文件名全称
299
            QFileInfo ifileInfo(iscanFileList.at(i));
300
 
301
 
302
 
303
            QString ibackupFileName = m_iprjPath.absolutePath() \
304
                    + EziDebugScanChain::getUserDir() + QObject::tr("/") + ifileInfo.fileName() \
305
                    + ieziDebugFileSuffix;
306
            QFile ibackupFile(ibackupFileName) ;
307
 
308
            // 删除上一步操作备份的文件
309
            ibackupFile.remove();
310
        }
311
        // 清空所有上次备份
312
        m_elastOperation = OperateTypeNone ;
313
        m_pLastOperateChain = NULL ;
314
        m_pLastOperteTreeItem = NULL ;
315
    }
316
    else if(m_elastOperation == OperateTypeDelSingleScanChain)
317
    {
318
        // 释放
319
        if(!m_pLastOperateChain)
320
        {
321
            qDebug() << "Error:Last Operation chain is NULL Pointer!";
322
            return 1 ;
323
        }
324
        ieziDebugFileSuffix = QObject::tr(".delete.%1").arg(m_pLastOperateChain->getChainName());
325
 
326
        QStringList iscanFileList = m_pLastOperateChain->getScanedFileList() ;
327
        for(int i = 0 ; i < iscanFileList.count();i++)
328
        {
329
            // 获取备份的文件名全称
330
            QFileInfo ifileInfo(iscanFileList.at(i));
331
 
332
 
333
 
334
            QString ibackupFileName = m_iprjPath.absolutePath() \
335
                    + EziDebugScanChain::getUserDir() + QObject::tr("/") + ifileInfo.fileName() \
336
                    + ieziDebugFileSuffix ;
337
            QFile ibackupFile(ibackupFileName) ;
338
 
339
            // 删除上一步操作备份的文件
340
            ibackupFile.remove();
341
        }
342
 
343
        delete m_pLastOperateChain ;
344
        // 清空所有上次备份
345
        //updateOperation(OperateTypeNone , NULL , NULL);
346
        m_elastOperation = OperateTypeNone ;
347
        m_pLastOperateChain = NULL ;
348
        m_pLastOperteTreeItem = NULL ;
349
    }
350
    else if(m_elastOperation == OperateTypeDelAllScanChain)
351
    {
352
        ieziDebugFileSuffix = QObject::tr(".deleteall");
353
 
354
        // 将所有 扫描立链指针内存 释放
355
        QMap<QString,EziDebugScanChain*>::const_iterator i = m_ibackupChainInfoMap.constBegin() ;
356
        while(i !=  m_ibackupChainInfoMap.constEnd())
357
        {
358
           EziDebugScanChain* pchain =  i.value();
359
           if(!pchain)
360
           {
361
               qDebug() << "Error: The chain Pointer is NULL !";
362
               ++i ;
363
               continue ;
364
           }
365
 
366
           QStringList iscanFileList = pchain->getScanedFileList() ;
367
           for(int j = 0 ; j < iscanFileList.count();j++)
368
           {
369
               // 获取备份的文件名全称
370
               QFileInfo ifileInfo(iscanFileList.at(j));
371
 
372
               QString ibackupFileName = m_iprjPath.absolutePath() \
373
                       + EziDebugScanChain::getUserDir()+ QObject::tr("/") +ifileInfo.fileName() \
374
                       + ieziDebugFileSuffix ;
375
               QFile ibackupFile(ibackupFileName) ;
376
 
377
               // 删除上一步操作备份的文件
378
               ibackupFile.remove();
379
           }
380
 
381
           delete pchain ;
382
           pchain = NULL ;
383
           ++i ;
384
        }
385
        // 清空所有上次备份
386
        updateOperation(OperateTypeNone , NULL , NULL);
387
    }
388
    else if(m_elastOperation == OperateTypeNone)
389
    {
390
        return 0 ;
391
    }
392
    else
393
    {
394
        qDebug() << "Error:Last Operation Type is Wrong!";
395
        return 1 ;
396
    }
397
 
398
    return 0 ;
399
 
400
}
401
 
402
EziDebugInstanceTreeItem* EziDebugPrj::getLastOperateTreeItem(void)
403
{
404
    return  m_pLastOperteTreeItem ;
405
}
406
 
407
const QMap<QString,EziDebugModule*> &EziDebugPrj::getPrjModuleMap(void) const
408
{
409
    return m_imoduleMap ;
410
}
411
 
412
const QMap<QString,EziDebugVlgFile*> &EziDebugPrj::getPrjVlgFileMap(void) const
413
{
414
    return m_ivlgFileMap ;
415
}
416
 
417
const QMap<QString,EziDebugVhdlFile*> &EziDebugPrj::getPrjVhdlFileMap(void) const
418
{
419
    return m_ivhdlFileMap ;
420
}
421
 
422
int  EziDebugPrj::eliminateFile(const QString &filename,QList<LOG_FILE_INFO*> &infolist)
423
{
424
    if(filename.endsWith(".v"))
425
    {
426
        EziDebugVlgFile* pfile = m_ivlgFileMap.value(filename);
427
        if(pfile)
428
        {
429
            struct LOG_FILE_INFO* pinfo = new LOG_FILE_INFO ;
430
            pinfo->etype = infoTypeFileInfo ;
431
            pinfo->pinfo = NULL ;
432
            memcpy(pinfo->ainfoName,pfile->fileName().toAscii().data(),pfile->fileName().size()+1);
433
            infolist.append(pinfo);
434
            QStringList imoduleList = pfile->getModuleList();
435
            for(int i = 0 ; i < imoduleList.count();i++)
436
            {
437
                EziDebugModule *pmodule = m_imoduleMap.value(imoduleList.at(i),NULL) ;
438
                if(!pmodule)
439
                {
440
                    struct LOG_FILE_INFO* pinfo = new LOG_FILE_INFO ;
441
                    pinfo->etype = infoTypeModuleStructure ;
442
                    pinfo->pinfo = NULL ;
443
                    memcpy(pinfo->ainfoName,pmodule->getModuleName().toAscii().data(),pmodule->getModuleName().size()+1);
444
                    infolist.append(pinfo);
445
                }
446
                m_imoduleMap.remove(imoduleList.at(i));
447
                delete pmodule ;
448
            }
449
        }
450
        m_ivlgFileMap.remove(filename);
451
        delete pfile ;
452
    }
453
    else if(filename.endsWith(".vhd"))
454
    {
455
        EziDebugVhdlFile* pfile = m_ivhdlFileMap.value(filename);
456
        if(!pfile)
457
            delete pfile ;
458
        m_ivhdlFileMap.remove(filename);
459
    }
460
    else
461
    {
462
        return 1 ;
463
    }
464
    return 0 ;
465
}
466
 
467
int  EziDebugPrj::addFile(const QString &filename ,SCAN_TYPE type,QList<LOG_FILE_INFO*> &infolist)
468
{
469
    QList<LOG_FILE_INFO*> ideletedinfoList ;
470
    if(filename.endsWith(".v"))
471
    {
472
        QFileInfo ifileInfo(m_iprjPath,filename);
473
        EziDebugVlgFile* pfile = new EziDebugVlgFile(ifileInfo.absoluteDir().absolutePath() + QObject::tr("'/") + ifileInfo.fileName()) ;
474
        if(!pfile->scanFile(this,type,infolist,ideletedinfoList))
475
        {
476
            m_ivlgFileMap.insert(filename,pfile) ;
477
        }
478
        else
479
        {
480
            // 删除所有 list 节点
481
            return  1 ;
482
        }
483
    }
484
    else if(filename.endsWith(".vhd"))
485
    {
486
//        EziDebugVhdlFile* pfile = new EziDebugVhdlFile(filename) ;
487
//        if(!pfile->scanFile(this,type))
488
//        {
489
//             m_ivhdlFileMap.insert(filename,pfile);
490
//        }
491
//        else
492
//        {
493
 
494
//        }
495
    }
496
    else
497
    {
498
        return 1 ;
499
    }
500
 
501
    return 0 ;
502
}
503
 
504
void  EziDebugPrj::addToModuleMap(const QString &modoule,EziDebugModule *pmodule)
505
{
506
    EziDebugModule *poriginModule  = m_imoduleMap.value(modoule,NULL) ;
507
 
508
    if(!poriginModule)
509
    {
510
        m_imoduleMap.insert(modoule,pmodule);
511
    }
512
    else
513
    {
514
        qDebug() << "Info: There is already existing this module:" << modoule \
515
                 << "Ready to delete it!";
516
        m_imoduleMap.remove(modoule) ;
517
        delete poriginModule ;
518
        m_imoduleMap.insert(modoule,pmodule);
519
    }
520
    return ;
521
}
522
 
523
void  EziDebugPrj::addToDestroyedChainList(const QString& chainname)
524
{
525
    if(!m_idestroyedChain.contains(chainname))
526
    {
527
        m_idestroyedChain.append(chainname);
528
    }
529
}
530
 
531
void  EziDebugPrj::addToCheckedChainList(const QString& chainname)
532
{
533
    if(!m_icheckedChain.contains(chainname))
534
    {
535
        m_icheckedChain.append(chainname);
536
    }
537
}
538
 
539
void  EziDebugPrj::clearupDestroyedChainList(void)
540
{
541
    m_idestroyedChain.clear();
542
}
543
 
544
void  EziDebugPrj::clearupCheckedChainList(void)
545
{
546
    m_icheckedChain.clear();
547
}
548
 
549
QStringList  EziDebugPrj::checkChainExist(void)
550
{
551
    QStringList iunexistChain ;
552
    QMap<QString,EziDebugScanChain*>::const_iterator ichainIter = m_ichainInfoMap.constBegin() ;
553
 
554
    while(ichainIter != m_ichainInfoMap.constEnd())
555
    {
556
        QString ichainName = ichainIter.key() ;
557
 
558
        m_idestroyedChain.append(ichainName);
559
        ++ichainIter ;
560
    }
561
    m_icheckedChain.clear();
562
    return iunexistChain ;
563
}
564
 
565
 
566
const QStringList &EziDebugPrj::getDestroyedChainList(void) const
567
{
568
    return m_idestroyedChain ;
569
}
570
 
571
const QStringList &EziDebugPrj::getCheckedChainList(void) const
572
{
573
    return m_icheckedChain ;
574
}
575
 
576
QStringList EziDebugPrj::deleteDestroyedChain(QList<LOG_FILE_INFO*> &addedinfoList,QList<LOG_FILE_INFO*> &deletedinfoList)
577
{
578
    QString ieziDebugFileSuffix ;
579
    QStringList iundelChainList ;
580
 
581
    for(int i = 0 ; i < m_idestroyedChain.count() ; i++)
582
    {
583
        QString ichainName =  m_idestroyedChain.at(i)  ;
584
        EziDebugScanChain* pchain = m_ichainInfoMap.value(ichainName , NULL);
585
        if(!pchain)
586
        {
587
            continue ;
588
        }
589
        ieziDebugFileSuffix = QObject::tr(".delete.%1").arg(ichainName);
590
 
591
        EziDebugInstanceTreeItem* pitem = m_ichainTreeItemMap.value(ichainName , NULL);
592
 
593
        if(pitem)
594
        {
595
            if(pitem->deleteScanChain(OperateTypeDelSingleScanChain))
596
            {
597
                // 恢复文件
598
 
599
                /*读取删除链 已经扫描过的文件,从已经备份的文件进行恢复*/
600
                for(int i = 0 ; i < pchain->getScanedFileList().count();i++)
601
                {
602
                    // 获取备份的文件名全称
603
                    QString ifileName = pchain->getScanedFileList().at(i) ;
604
                    QFileInfo ifileInfo(pchain->getScanedFileList().at(i));
605
 
606
                    QString ibackupFileName = this->getCurrentDir().absolutePath() \
607
                            + EziDebugScanChain::getUserDir() + tr("/") + ifileInfo.fileName() \
608
                            + ieziDebugFileSuffix;
609
                    QFile ibackupFile(ibackupFileName) ;
610
 
611
                    QFileInfo ibakfileInfo(ibackupFileName);
612
                    QDateTime idateTime = ibakfileInfo.lastModified();
613
 
614
                    QString irelativeName = m_iprjPath.relativeFilePath(ifileName) ;
615
 
616
                    // 恢复 源文件
617
                    if(ibakfileInfo.exists())
618
                    {
619
                        if(ifileName.endsWith(".v"))
620
                        {
621
                            m_ivlgFileMap.value(irelativeName)->remove();
622
                            ibackupFile.copy(ifileName);
623
                            m_ivlgFileMap.value(irelativeName)->modifyStoredTime(idateTime);
624
                        }
625
                        else if(ifileName.endsWith(".vhd"))
626
                        {
627
                            m_ivhdlFileMap.value(irelativeName)->remove();
628
                            ibackupFile.copy(ifileName);
629
                            m_ivhdlFileMap.value(irelativeName)->modifyStoredTime(idateTime);
630
                        }
631
                        else
632
                        {
633
                            // do nothing
634
                        }
635
                        // 删除备份文件
636
                        ibackupFile.remove();
637
                    }
638
                }
639
                // 错误 这条链没有被删除 ,检查文件是否编译通过
640
                iundelChainList << ichainName ;
641
                continue ;
642
            }
643
 
644
            m_ichainInfoMap.remove(ichainName) ;
645
            m_ichainTreeItemMap.remove(ichainName) ;
646
            m_iqueryTreeItemMap.remove(pitem->getNameData());
647
 
648
            if(m_pLastOperateChain)
649
            {
650
                if(m_pLastOperateChain->getChainName() == ichainName)
651
                {
652
                    m_pLastOperateChain = NULL ;
653
                    m_pLastOperteTreeItem = NULL ;
654
                    m_elastOperation = OperateTypeNone ;
655
                }
656
            }
657
 
658
 
659
            pitem->setScanChainInfo(NULL);
660
 
661
            // 删除备份文件
662
            QStringList iscanFileList = pchain->getScanedFileList();
663
            for(int i = 0 ; i < iscanFileList.count(); i++)
664
            {
665
                QString ifileName = iscanFileList.at(i) ;
666
                QString irelativeName = m_iprjPath.relativeFilePath(ifileName) ;
667
                QFileInfo ifileInfo(ifileName);
668
                QDateTime idateTime = ifileInfo.lastModified();
669
 
670
                QFile ibakFile(ifileName + ieziDebugFileSuffix) ;
671
                if(ibakFile.exists())
672
                {
673
                    ibakFile.remove();
674
                }
675
 
676
                // 更改文件时间
677
                if(ifileName.endsWith(".v"))
678
                {
679
                    m_ivlgFileMap.value(irelativeName)->modifyStoredTime(idateTime);
680
 
681
                    EziDebugVlgFile* pfile = m_ivlgFileMap.value(irelativeName) ;
682
 
683
                    EziDebugPrj::LOG_FILE_INFO* pdelFileInfo = new EziDebugPrj::LOG_FILE_INFO ;
684
                    pdelFileInfo->etype = EziDebugPrj::infoTypeFileInfo ;
685
                    pdelFileInfo->pinfo = NULL ;
686
                    memcpy(pdelFileInfo->ainfoName , irelativeName.toAscii().data() , irelativeName.size()+1);
687
                    deletedinfoList.append(pdelFileInfo);
688
 
689
                    struct EziDebugPrj::LOG_FILE_INFO* paddFileInfo = new EziDebugPrj::LOG_FILE_INFO ;
690
                    paddFileInfo->etype = EziDebugPrj::infoTypeFileInfo ;
691
                    paddFileInfo->pinfo = pfile ;
692
                    memcpy(paddFileInfo->ainfoName , irelativeName.toAscii().data(), irelativeName.size()+1);
693
                    addedinfoList.append(paddFileInfo);
694
 
695
                }
696
                else if(ifileName.endsWith(".vhd"))
697
                {
698
                    m_ivhdlFileMap.value(irelativeName)->modifyStoredTime(idateTime);
699
 
700
                    EziDebugVhdlFile* pfile = m_ivhdlFileMap.value(irelativeName) ;
701
                    EziDebugPrj::LOG_FILE_INFO* pdelFileInfo = new EziDebugPrj::LOG_FILE_INFO ;
702
                    pdelFileInfo->etype = EziDebugPrj::infoTypeFileInfo ;
703
                    pdelFileInfo->pinfo = NULL ;
704
                    memcpy(pdelFileInfo->ainfoName , irelativeName.toAscii().data() , irelativeName.size()+1);
705
                    deletedinfoList.append(pdelFileInfo);
706
 
707
                    struct EziDebugPrj::LOG_FILE_INFO* paddFileInfo = new EziDebugPrj::LOG_FILE_INFO ;
708
                    paddFileInfo->etype = EziDebugPrj::infoTypeFileInfo ;
709
                    paddFileInfo->pinfo = pfile ;
710
                    memcpy(paddFileInfo->ainfoName , irelativeName.toAscii().data(), irelativeName.size()+1);
711
                    addedinfoList.append(paddFileInfo);
712
                }
713
                else
714
                {
715
                    // do nothing
716
                    continue ;
717
                }
718
 
719
            }
720
 
721
            // 删除链指针
722
            delete pchain ;
723
        }
724
    }
725
    // 删除破坏掉的链,下次接着扫描链是否被破坏
726
    m_idestroyedChain.clear() ;
727
    return iundelChainList ;
728
}
729
 
730
 
731
bool EziDebugPrj::isPrjFileExist(void)
732
{
733
    QStringList inameFilter ;
734
    QStringList ifileList ;
735
 
736
    if(ToolQuartus == m_eusedTool)
737
    {
738
        inameFilter.append("*.qsf");
739
    }
740
    else if(ToolIse == m_eusedTool)
741
    {
742
        // 版本 10.1
743
        inameFilter.append("*.restore");
744
        // 版本 14.4
745
        inameFilter.append("*.xise");
746
    }
747
    else
748
    {
749
        /*do nothing*/
750
        qDebug() << "Is there other tool in the world ?" ;
751
        return 0 ;
752
    }
753
    ifileList = m_iprjPath.entryList(inameFilter,QDir::Files) ;
754
    if(!ifileList.count())
755
    {
756 4 EziDebug
        //qDebug() << "Please Check the path \""<< m_iprjPath.absolutePath() <<"\" to verify the " << inameFilter.at(0) << "file exist !";
757
        QMessageBox::warning(NULL, QObject::tr("EziDebug"),QObject::tr("Please Check the path \n \"%1\" \n to verify the %2 file exist!").arg(m_iprjPath.absolutePath()) \
758
                             .arg(inameFilter.at(0))) ;
759
        //  .arg(inameFilter.at(0))));
760 2 EziDebug
        return 0 ;
761
    }
762
    else if(ifileList.count() > 1)
763
    {
764
        qDebug() << "Please Delete the unnecessary file " << inameFilter.at(0) ;
765 4 EziDebug
                QMessageBox::warning(NULL, QObject::tr("EziDebug"),QObject::tr("Please delete the unnecessary \"%1\"file!").arg(inameFilter.at(0)));
766 2 EziDebug
        return 0 ;
767
    }
768
    else
769
    {
770
        m_iprjName = const_cast<QString&>(ifileList.at(0));
771
        m_iprjName = m_iprjPath.absoluteFilePath(m_iprjName);
772
        qDebug() << "isPrjFileExist" << m_iprjName ;
773
        return 1 ;
774
    }
775
}
776
 
777
void EziDebugPrj::preModifyPrjFile(void)
778
{
779
    QString itrueStr = "true" ;
780
    QString ifalseStr = "false" ;
781
    if((ToolIse == m_eusedTool)&&(m_itoolSoftwareVersion == "10.x"))
782
    {
783
        // m_isXilinxErrChecked 如果为true 才进行修改  否则保持不变
784
 
785
        QFile iprjFile(m_iprjName);
786
        QString iline;
787
 
788
        if(!iprjFile.open(QIODevice::ReadOnly|QIODevice::Text))
789
        {
790
            qDebug() << "Cannot Open file for reading:" << qPrintable(iprjFile.errorString());
791
            return  ;
792
        }
793
 
794
        QTextStream iinStream(&iprjFile) ;
795
        iline = iinStream.readAll() ;
796
        int nKeyWordsPos = iline.indexOf("PROP_xstEquivRegRemoval") ;
797
        int ntrueBoolValue = iline.indexOf(itrueStr,nKeyWordsPos) ;
798
        int nfalseBoolValue = iline.indexOf(ifalseStr,nKeyWordsPos);
799
        if(ntrueBoolValue < nfalseBoolValue)
800
        {
801
            if(m_isDisXilinxErrChecked)
802
            {
803
                // 改为 false
804
                iline.replace(ntrueBoolValue,itrueStr.size(),ifalseStr);
805
            }
806
            else
807
            {
808
                // 改为 true
809
                iprjFile.close();
810
                return ;
811
            }
812
        }
813
        else
814
        {
815
            if(m_isDisXilinxErrChecked)
816
            {
817
                // 改为 false
818
                iprjFile.close();
819
                return ;
820
            }
821
            else
822
            {
823
                // 改为 true
824
                iline.replace(nfalseBoolValue,ifalseStr.size(),itrueStr);
825
            }
826
        }
827
 
828
        iprjFile.close();
829
 
830
        if(!iprjFile.open(QIODevice::WriteOnly|QIODevice::Text))
831
        {
832
            qDebug() << "Cannot Open file for reading:" << qPrintable(iprjFile.errorString());
833
            return  ;
834
        }
835
 
836
        QTextStream ioutStream(&iprjFile) ;
837
        ioutStream << iline ;
838
        iprjFile.close();
839
    }
840
}
841
int EziDebugPrj::parseQuartusPrjFile(QMap<QString,EziDebugVlgFile*> &vlgFileMap ,QMap<QString,EziDebugVhdlFile*> &vhdlFileMap)
842
{
843
    QFile iprjFile(m_iprjName);
844
    if(!iprjFile.open(QIODevice::ReadOnly|QIODevice::Text))
845
    {
846
        qDebug() << "Cannot Open file for reading:" << qPrintable(iprjFile.errorString());
847
        return 1 ;
848
    }
849
    QTextStream iinStream(&iprjFile) ;
850
    while(!iinStream.atEnd())
851
    {
852
        QString iline = iinStream.readLine();
853
 
854
        if(iline.contains(QRegExp("\\bLAST_QUARTUS_VERSION\\b")))
855
        {
856
            QStringList ifileds = iline.split(QRegExp("\\s+"));
857
            if(ifileds.size()!=4)
858
            {
859
                qDebug()<< "the project file has problem!" ;
860
                break;
861
            }
862
            else
863
            {
864
                if(ifileds.at(2) == "LAST_QUARTUS_VERSION")
865
                {
866
                    m_itoolSoftwareVersion =  ifileds.at(3) ;
867
                }
868
                else
869
                {
870
                    qDebug()<< "the project file has problem!" ;
871
                    break;
872
                }
873
            }
874
        }
875
 
876
        if(iline.contains(QRegExp("\\bVERILOG_FILE\\b")))
877
        {
878
            QStringList ifileds = iline.split(QRegExp("\\s+"));
879
            if(ifileds.size()!=4)
880
            {
881
                qDebug()<< "the project file has problem!" ;
882
                break;
883
            }
884
            else
885
            {
886
                if(ifileds.at(2) == "VERILOG_FILE")
887
                {
888
                    QString  ifileName = ifileds.at(3) ;
889
                    // 转换成绝对路径
890
                    if(!(ifileName.endsWith("_EziDebug_ScanChainReg.v")||ifileName.endsWith("_EziDebug_TOUT_m.v")))
891
                    {
892
                        QFileInfo ifileinfo(m_iprjPath,ifileName);
893
 
894
                        if(ifileinfo.exists())
895
                        {
896
                            EziDebugVlgFile *ifileObj = new EziDebugVlgFile(ifileinfo.absoluteDir().absolutePath()+ QObject::tr("/") + ifileinfo.fileName());
897
                            vlgFileMap.insert(ifileName,ifileObj);
898
                            m_iCodefileNameList.append(ifileName);
899
                        }
900
                    }
901
//                  vlgfilemap.insert(ifileName,ifileObj);
902
                }
903
                else
904
                {
905
                    qDebug()<< "the project file has problem!" ;
906
                    break;
907
                }
908
            }
909
        }
910
 
911
        if(iline.contains(QRegExp("\\bVHDL_FILE\\b")))
912
        {
913
            QStringList ifileds = iline.split(QRegExp("\\s+"));
914
            if(ifileds.size()!=4)
915
            {
916
                qDebug()<< "the project file has problem!" ;
917
                break;
918
            }
919
            else
920
            {
921
                if(ifileds.at(2) == "VHDL_FILE")
922
                {
923
                    QString  ifileName = ifileds.at(3) ;
924
                    // 转换成绝对路径
925
                    QFileInfo ifileinfo(m_iprjPath,ifileName);
926
                    if(ifileinfo.exists())
927
                    {
928
                        EziDebugVhdlFile *ifileObj = new EziDebugVhdlFile(ifileinfo.absoluteDir().absolutePath()+ QObject::tr("/") + ifileinfo.fileName());
929
                        vhdlFileMap.insert(ifileName,ifileObj);
930
                        m_iCodefileNameList.append(ifileName);
931
                    }
932
//                  vhdlfilemap.insert(ifileName,ifileObj);
933
                }
934
                else
935
                {
936
                    qDebug()<< "the project file has problem!" ;
937
                    break;
938
                }
939
            }
940
        }
941
 
942
        if(iline.contains(QRegExp("\\bTOP_LEVEL_ENTITY\\b")))
943
        {
944
            QStringList ifileds = iline.split(QRegExp("\\s+"));
945
            if(ifileds.size()!=4)
946
            {
947
                qDebug()<< "the project file has problem!" ;
948
                break;
949
            }
950
            else
951
            {
952
                if(ifileds.at(2) == "TOP_LEVEL_ENTITY")
953
                {
954
                    m_itopModule = ifileds.at(3) ;
955
                }
956
                else
957
                {
958
                    qDebug()<< "the project file has problem!" ;
959
                    break;
960
                }
961
            }
962
        }
963
 
964
        if(iline.contains(QRegExp("\\bSIGNALTAP_FILE\\b")))
965
        {
966
            QStringList ifileds = iline.split(QRegExp("\\s+"));
967
            if(ifileds.size()!=4)
968
            {
969
                qDebug()<< "the project file has problem!" ;
970
                break;
971
            }
972
            else
973
            {
974
                if(ifileds.at(2) == "SIGNALTAP_FILE")
975
                {
976
                    m_iwaveFileList << ifileds.at(3) ;
977
                }
978
                else
979
                {
980
                    qDebug()<< "the project file has problem!" ;
981
                    break;
982
                }
983
            }
984
        }
985
 
986
    }
987
    return 0 ;
988
}
989
 
990
int EziDebugPrj::parseQuartusPrjFile(QStringList &filelist)
991
{
992
    QFile iprjFile(m_iprjName);
993
    if(!iprjFile.open(QIODevice::ReadOnly|QIODevice::Text))
994
    {
995
        qDebug() << "Cannot Open file for reading:" << qPrintable(iprjFile.errorString());
996
        return 1 ;
997
    }
998
    QTextStream iinStream(&iprjFile) ;
999
    while(!iinStream.atEnd())
1000
    {
1001
        QString iline = iinStream.readLine();
1002
        if(iline.contains(QRegExp("\\bVERILOG_FILE\\b")))
1003
        {
1004
            QStringList ifileds = iline.split(QRegExp("\\s+"));
1005
            if(ifileds.size()!=4)
1006
            {
1007
                qDebug()<< "the project file has problem!" ;
1008
                break;
1009
            }
1010
            else
1011
            {
1012
                if(ifileds.at(2) == "VERILOG_FILE")
1013
                {
1014
                    QString  ifileName = ifileds.at(3) ;
1015
                    QFileInfo ifileinfo(m_iprjPath,ifileName);
1016
 
1017
                    if(!(ifileName.endsWith("_EziDebug_ScanChainReg.v")||ifileName.endsWith("_EziDebug_TOUT_m.v")))
1018
                    {
1019
                        if(ifileinfo.exists())
1020
                        {
1021
                            filelist.append(ifileName);
1022
                        }
1023
                    }
1024
//                  vlgfilemap.insert(ifileName,ifileObj);
1025
                }
1026
                else
1027
                {
1028
                    qDebug()<< "the project file has problem!" ;
1029
                    break;
1030
                }
1031
            }
1032
        }
1033
        if(iline.contains(QRegExp("\\bVHDL_FILE\\b")))
1034
        {
1035
            QStringList ifileds = iline.split(QRegExp("\\s+"));
1036
            if(ifileds.size()!=4)
1037
            {
1038
                qDebug()<< "the project file has problem!" ;
1039
                break;
1040
            }
1041
            else
1042
            {
1043
                if(ifileds.at(2) == "VHDL_FILE")
1044
                {
1045
                    QString  ifileName = ifileds.at(3) ;
1046
                    QFileInfo ifileinfo(m_iprjPath,ifileName);
1047
                    if(ifileinfo.exists())
1048
                    {
1049
                        filelist.append(ifileName);
1050
                    }
1051
//                  vhdlfilemap.insert(ifileName,ifileObj);
1052
                }
1053
                else
1054
                {
1055
                    qDebug()<< "the project file has problem!" ;
1056
                    break;
1057
                }
1058
            }
1059
        }
1060
// 暂时去掉  暂不考虑 topmodule 被修改了 ,作为遗留问题跟踪
1061
//        if(iline.contains(QRegExp("\\bTOP_LEVEL_ENTITY\\b")))
1062
//        {
1063
//            QStringList ifileds = iline.split(QRegExp("\\s+"));
1064
//            if(ifileds.size()!=4)
1065
//            {
1066
//                qDebug()<< "the project file has problem!" ;
1067
//                break;
1068
//            }
1069
//            else
1070
//            {
1071
//                if(ifileds.at(2) == "TOP_LEVEL_ENTITY")
1072
//                {
1073
//                    topmodue = ifileds.at(3) ;
1074
//                }
1075
//                else
1076
//                {
1077
//                    qDebug()<< "the project file has problem!" ;
1078
//                    break;
1079
//                }
1080
//            }
1081
//        }
1082
 
1083
    }
1084
    iprjFile.close();
1085
    return 0 ;
1086
}
1087
 
1088
int EziDebugPrj::parseIsePrjFile(QMap<QString,EziDebugVlgFile*> &vlgFileMap ,QMap<QString,EziDebugVhdlFile*> &vhdlFileMap)
1089
{
1090
    qDebug() << "parseIsePrjFile " << __LINE__ ;
1091
    QFile iprjFile(m_iprjName);
1092
    QString iLangType ;
1093
    QString ifileInfo ;
1094
    QString iprjInfo ;
1095
    QString iProcessInfo ;
1096
    QStringList ifileInfoList ;
1097
    QStringList iProcessInfoList ;
1098
    if(!iprjFile.open(QIODevice::ReadOnly|QIODevice::Text))
1099
    {
1100
        qDebug() << "Cannot Open file for reading:" << qPrintable(iprjFile.errorString());
1101
        return 1 ;
1102
    }
1103
    QTextStream iinStream(&iprjFile) ;
1104
    QString iline = iinStream.readAll();
1105
    int nstartPos = 0 ;
1106
    int npositionOfProjectSetting = 0 ;
1107
    int npositionOfFileKeyWord = 0 ;
1108
    int npositionOfFileLeftBracket = 0 ;
1109
    int npositionOfFileRightBracket = 0 ;
1110
    int npositionOfProcessKeyWord = 0 ;
1111
    int npositionOfProcessLeftBracket = 0 ;
1112
    int npositionOfProcessRightBracket = 0 ;
1113
 
1114
    //m_iprjName
1115
    //  查找所有 代码文件
1116
    if(m_iprjName.endsWith(".restore",Qt::CaseSensitive))
1117
    {
1118
        m_itoolSoftwareVersion = "10.x" ;
1119
        npositionOfProjectSetting = iline.indexOf(QRegExp("\\bset\\s+project_settings\\b"),0);
1120
        if(npositionOfProjectSetting != -1 )
1121
        {
1122
            npositionOfFileLeftBracket = iline.indexOf("{",npositionOfProjectSetting,Qt::CaseSensitive);
1123
            if(npositionOfFileLeftBracket != -1 )
1124
            {
1125
               npositionOfFileRightBracket = iline.indexOf("}",npositionOfFileLeftBracket,Qt::CaseSensitive);
1126
               if(npositionOfFileRightBracket != -1)
1127
               {
1128
                   iprjInfo = iline.mid(npositionOfFileLeftBracket+1,npositionOfFileRightBracket-npositionOfFileLeftBracket-1);
1129
                   QRegExp iLangExp("\"\\s*PROP_PreferredLanguage\"\\s*");
1130
                   int nKeyOfLang = iLangExp.indexIn(iprjInfo,0);
1131
                   if(nKeyOfLang != -1)
1132
                   {
1133
                       int nlen = iLangExp.matchedLength();
1134
                       int nFirstQuote = iprjInfo.indexOf("\"" ,nKeyOfLang + nlen );
1135
                       int nSecondQuote = iprjInfo.indexOf("\"",nFirstQuote + 1);
1136
                       m_icoreLangType = iprjInfo.mid(nFirstQuote + 1 ,nSecondQuote - nFirstQuote - 1) ;
1137
                   }
1138
                   else
1139
                   {
1140
                       iprjFile.close();
1141
 
1142
                       return 1 ;
1143
                   }
1144
               }
1145
            }
1146
            else
1147
            {
1148
                qDebug() << "The project File error :The left bracket is not exist!" ;
1149
                iprjFile.close();
1150
 
1151
                return 1 ;
1152
            }
1153
        }
1154
        else
1155
        {
1156
            iprjFile.close();
1157
 
1158
            return 1 ;
1159
        }
1160
 
1161
        nstartPos = npositionOfFileRightBracket + 1 ;
1162
 
1163
        //  搜索代码文件
1164
        npositionOfFileKeyWord = iline.indexOf(QRegExp("\\bset\\s+user_files\\b"),nstartPos);
1165
        if(npositionOfFileKeyWord != -1)
1166
        {
1167
            npositionOfFileLeftBracket = iline.indexOf("{",npositionOfFileKeyWord,Qt::CaseSensitive);
1168
            if( npositionOfFileLeftBracket != -1)
1169
            {
1170
                npositionOfFileRightBracket = iline.indexOf("}",npositionOfFileKeyWord,Qt::CaseSensitive);
1171
                if(npositionOfFileRightBracket != -1)
1172
                {
1173
                    ifileInfo = iline.mid(npositionOfFileLeftBracket+1,npositionOfFileRightBracket-npositionOfFileLeftBracket-1);
1174
                    ifileInfoList = ifileInfo.split("\"",QString::KeepEmptyParts);
1175
                    QStringList::const_iterator constIterator ;
1176
                    for (constIterator = ifileInfoList.constBegin(); constIterator != ifileInfoList.constEnd();++constIterator)
1177
                    {
1178
                        QString ifileName = (*constIterator) ;
1179
                        if(ifileName.endsWith(".vhd", Qt::CaseSensitive))
1180
                        {
1181
                            // 转换成绝对路径
1182
                            QFileInfo ifileinfo(m_iprjPath,*constIterator);
1183
                            EziDebugVhdlFile* pvhdlFileObj = new EziDebugVhdlFile(ifileinfo.absoluteDir().absolutePath()+ QObject::tr("/") + ifileinfo.fileName());
1184
                            qDebug() << const_cast<QString&>(*constIterator);
1185
                            if(!(ifileName.endsWith("_EziDebug_ScanChainReg.vhd")||ifileName.endsWith("_EziDebug_TOUT_m.vhd")))
1186
                            {
1187
                                vhdlFileMap.insert(ifileName,pvhdlFileObj);
1188
                                m_iCodefileNameList.append(ifileName);
1189
                            }
1190
//                          vhdlfilemap.insert((*constIterator),pvhdlFileObj);
1191
                        }
1192
                        else if(ifileName.endsWith(".v", Qt::CaseSensitive))
1193
                        {
1194
                            QFileInfo ifileinfo(m_iprjPath,*constIterator);
1195
                            EziDebugVlgFile* pvlgFileObj = new EziDebugVlgFile(ifileinfo.absoluteDir().absolutePath()+ QObject::tr("/") + ifileinfo.fileName());
1196
                            qDebug() << const_cast<QString&>(*constIterator);
1197
                            if(!(ifileName.endsWith("_EziDebug_ScanChainReg.v")||ifileName.endsWith("_EziDebug_TOUT_m.v")))
1198
                            {
1199
                                vlgFileMap.insert((*constIterator),pvlgFileObj);
1200
                                m_iCodefileNameList.append((*constIterator));
1201
                            }
1202
//                            vlgfilemap.insert((*constIterator),pvlgFileObj);
1203
                        }
1204
                        else if(ifileName.endsWith(".xco", Qt::CaseSensitive))
1205
                        {
1206
#if 1
1207
                            QString iHdlFileName ;
1208
                            QString iCompleteRelativeHdlFileName = *constIterator ;
1209
 
1210
                            QFileInfo ifileinfo(m_iprjPath,*constIterator);
1211
                            iHdlFileName = ifileinfo.fileName();
1212
 
1213
                            qDebug() << const_cast<QString&>(*constIterator);
1214
                            if(m_icoreLangType == "Verilog")
1215
                            {
1216
                                iHdlFileName.replace(".xco",".v");
1217
                                iCompleteRelativeHdlFileName.replace(".xco",".v");
1218
                                // 用绝对路径构造
1219
                                EziDebugVlgFile* pvlgFileObj = new EziDebugVlgFile(ifileinfo.absoluteDir().absolutePath()+ QObject::tr("/") + iHdlFileName);
1220
                                pvlgFileObj->setLibaryFlag(true);
1221
                                vlgFileMap.insert(iCompleteRelativeHdlFileName,pvlgFileObj);
1222
                                m_iCodefileNameList.append(iCompleteRelativeHdlFileName);
1223
                            }
1224
                            else
1225
                            {
1226
                                // 用绝对路径构造
1227
                                iHdlFileName.replace(".xco",".vhd");
1228
                                iCompleteRelativeHdlFileName.replace(".xco",".vhd") ;
1229
                                EziDebugVhdlFile* pvhdlFileObj = new EziDebugVhdlFile(ifileinfo.absoluteDir().absolutePath()+ QObject::tr("/") + iHdlFileName);
1230
                                pvhdlFileObj->setLibaryFlag(true);
1231
                                vhdlFileMap.insert(iCompleteRelativeHdlFileName,pvhdlFileObj);
1232
                                m_iCodefileNameList.append(iCompleteRelativeHdlFileName);
1233
                            }
1234
#endif
1235
                        }
1236
                    }
1237
                }
1238
                else
1239
                {
1240
                    qDebug() << "the setting file has some problem!" ;
1241
                    iprjFile.close();
1242
                    return 1 ;
1243
                }
1244
            }
1245
            else
1246
            {
1247
                qDebug() << "There is leftbracket after \"set user_files\" !";
1248
                iprjFile.close();
1249
                return 1 ;
1250
            }
1251
        }
1252
        else
1253
        {
1254
            qDebug() << "There is leftbracket after \"set user_files\" !";
1255
            iprjFile.close();
1256
            return 1 ;
1257
        }
1258
 
1259
 
1260
        nstartPos =  npositionOfFileRightBracket + 1;
1261
        npositionOfProcessKeyWord = iline.indexOf(QRegExp("\\bset\\s+process_props\\b"),nstartPos);
1262
 
1263
        npositionOfProcessLeftBracket = iline.indexOf("{",npositionOfProcessKeyWord,Qt::CaseSensitive);
1264
        if( npositionOfProcessLeftBracket != -1)
1265
        {
1266
            npositionOfProcessRightBracket = iline.indexOf("}",npositionOfProcessKeyWord,Qt::CaseSensitive);
1267
            if(npositionOfProcessRightBracket != -1)
1268
            {
1269
                iProcessInfo = iline.mid(npositionOfProcessLeftBracket+1,npositionOfProcessRightBracket-npositionOfFileLeftBracket-1);
1270
                iProcessInfoList = iProcessInfo.split("\"",QString::SkipEmptyParts);
1271
                QStringList::const_iterator constIterator ;
1272
                for (constIterator = iProcessInfoList.constBegin(); constIterator != iProcessInfoList.constEnd();++constIterator)
1273
                {
1274
                    if((*constIterator)== "PROP_SynthTop")
1275
                    {
1276
                        constIterator += 2 ;
1277
                        qDebug() << "detect top key word!" ;
1278
                        if(((*constIterator).contains("Module"),Qt::CaseSensitive)||((*constIterator).contains("Architecture"),Qt::CaseSensitive))
1279
                        {
1280
                            QString itopmodule = *constIterator ;
1281
 
1282
                            QStringList itopModuleList = itopmodule.split("|");
1283
                            m_itopModule = itopModuleList.at(1);
1284
                            qDebug() << m_itopModule ;
1285
                        }
1286
                        else
1287
                        {
1288
                            qDebug() << "parseIsePrjFile error!";
1289
                            iprjFile.close();
1290
                            return 1 ;
1291
                        }
1292
                    }
1293
                }
1294
            }
1295
            else
1296
            {
1297
                qDebug() << "the setting file has some problem!" ;
1298
                iprjFile.close();
1299
                return 1 ;
1300
            }
1301
        }
1302
        else
1303
        {
1304
            qDebug() << "There is leftbracket after \"set user_files\" !";
1305
            iprjFile.close();
1306
            return 1 ;
1307
        }
1308
 
1309
    }
1310
    else if(m_iprjName.endsWith(".xise",Qt::CaseSensitive))
1311
    {
1312
        QDomDocument idomDocument ;
1313
        QString iErrorStr ;
1314
        int nErrorLine ;
1315
        int nErrorColumn = 0 ;
1316
        if (!idomDocument.setContent(&iprjFile, true, &iErrorStr, &nErrorLine, &nErrorColumn))
1317
        {
1318
            qDebug() << tr("Parse error at line %1, column %2:\n%3").arg(nErrorLine)\
1319
                        .arg(nErrorColumn).arg(iErrorStr) ;
1320
            return 1 ;
1321
        }
1322
 
1323
        QDomElement root = idomDocument.documentElement();
1324
        if(root.tagName() == "project")
1325
        {
1326
            //  获取工程设置的代码语言  以及  获取 topmodule
1327
            QDomElement iPrjProperties = root.firstChildElement("properties");
1328
            if(!iPrjProperties.isNull())
1329
            {
1330
                QDomElement iPrjProperty = iPrjProperties.firstChildElement("property");
1331
                while(!iPrjProperty.isNull())
1332
                {
1333
                    if(iPrjProperty.attribute("xil_pn:name") == "Implementation Top")
1334
                    {
1335
                        m_itopModule = iPrjProperty.attribute("xil_pn:value") ;
1336
                    }
1337
 
1338
                    if(iPrjProperty.attribute("xil_pn:name") == "Preferred Language")
1339
                    {
1340
                        m_icoreLangType = iPrjProperty.attribute("xil_pn:value");
1341
                        break ;
1342
                    }
1343
                    iPrjProperty =  iPrjProperties.nextSiblingElement("property") ;
1344
                }
1345
            }
1346
            else
1347
            {
1348
                qDebug() << "The project file parse error!";
1349
                iprjFile.close();
1350
                return 1 ;
1351
            }
1352
 
1353
            if(m_itopModule.isEmpty())
1354
            {
1355
                qDebug() << "The project file parse error: NO Topmodule!";
1356
                iprjFile.close();
1357
                return 1 ;
1358
            }
1359
 
1360
            if(iLangType.isEmpty())
1361
            {
1362
                qDebug() << "The project file parse error: NO Language Type!";
1363
                iprjFile.close();
1364
                return 1 ;
1365
            }
1366
 
1367
            QDomElement ifilesChild = root.firstChildElement("files");
1368
            if(!ifilesChild.isNull())
1369
            {
1370
                QDomElement ifileChild = ifilesChild.firstChildElement("file");
1371
 
1372
                while(!ifileChild.isNull())
1373
                {
1374
                    // 相对路径
1375
                    QString ifileName = ifileChild.attribute("xil_pn:name") ;
1376
                    if(ifileName.endsWith(".v"))
1377
                    {
1378
                        QFileInfo ifileinfo(m_iprjPath,ifileName);
1379
                        EziDebugVlgFile* pvlgFileObj = new EziDebugVlgFile(ifileinfo.absoluteDir().absolutePath()+ QObject::tr("/") + ifileinfo.fileName());
1380
                        qDebug() << ifileName ;
1381
                        if(!(ifileName.endsWith("_EziDebug_ScanChainReg.v")||ifileName.endsWith("_EziDebug_TOUT_m.v")))
1382
                        {
1383
                            vlgFileMap.insert(ifileName,pvlgFileObj);
1384
                            m_iCodefileNameList.append(ifileName);
1385
                        }
1386
 
1387
                    }
1388
                    else if(ifileName.endsWith(".vhd"))
1389
                    {
1390
                        QFileInfo ifileinfo(m_iprjPath,ifileName);
1391
                        EziDebugVhdlFile* pvhdlFileObj = new EziDebugVhdlFile(ifileinfo.absoluteDir().absolutePath()+ QObject::tr("/") + ifileinfo.fileName());
1392
                        qDebug() << ifileName ;
1393
                        if(!(ifileName.endsWith("_EziDebug_ScanChainReg.vhd")||ifileName.endsWith("_EziDebug_TOUT_m.vhd")))
1394
                        {
1395
                            vhdlFileMap.insert(ifileName,pvhdlFileObj);
1396
                            m_iCodefileNameList.append(ifileName);
1397
                        }
1398
                    }
1399
                    else if(ifileName.endsWith(".xco"))
1400
                    {
1401
                        if(iLangType == "Verilog")
1402
                        {
1403
                            ifileName.replace(".xco",".v") ;
1404
                            QFileInfo ifileinfo(m_iprjPath,ifileName);
1405
                            EziDebugVlgFile* pvlgFileObj = new EziDebugVlgFile(ifileinfo.absoluteDir().absolutePath()+ QObject::tr("/") + ifileinfo.fileName());
1406
                            qDebug() << ifileName ;
1407
 
1408
                            vlgFileMap.insert(ifileName,pvlgFileObj);
1409
                            m_iCodefileNameList.append(ifileName);
1410
                        }
1411
                        else
1412
                        {
1413
                            ifileName.replace(".xco",".vhd") ;
1414
                            QFileInfo ifileinfo(m_iprjPath,ifileName);
1415
                            EziDebugVhdlFile* pvhdlFileObj = new EziDebugVhdlFile(ifileinfo.absoluteDir().absolutePath()+ QObject::tr("/") + ifileinfo.fileName());
1416
                            qDebug() << ifileName ;
1417
 
1418
                            vhdlFileMap.insert(ifileName,pvhdlFileObj);
1419
                            m_iCodefileNameList.append(ifileName);
1420
                        }
1421
                    }
1422
 
1423
                    ifileChild = ifilesChild.nextSiblingElement("file");
1424
                }
1425
            }
1426
            else
1427
            {
1428
                iprjFile.close();
1429
                return 1 ;
1430
            }
1431
            m_itoolSoftwareVersion = "14.x" ;
1432
        }
1433
    }
1434
 
1435
    iprjFile.close();
1436
    return 0 ;
1437
}
1438
 
1439
int EziDebugPrj::parseIsePrjFile(QStringList &filelist)
1440
{
1441
    qDebug() << "parseIsePrjFile " << __LINE__ ;
1442
    QFile iprjFile(m_iprjName);
1443
    QString ifileInfo ;
1444
    QString iPrjInfo ;
1445
    QString iPreferLang ;
1446
    //QString iProcessInfo ;
1447
    QStringList ifileInfoList ;
1448
    QStringList iPrjInfoList ;
1449
    //QStringList iProcessInfoList ;
1450
    if(!iprjFile.open(QIODevice::ReadOnly|QIODevice::Text))
1451
    {
1452
        qDebug() << "Cannot Open file for reading:" << qPrintable(iprjFile.errorString());
1453
        return 1 ;
1454
    }
1455
    QTextStream iinStream(&iprjFile) ;
1456
    QString iline = iinStream.readAll();
1457
    //int searchPosition = 0 ;
1458
    int npositionOfFileKeyWord = 0 ;
1459
    int npositionOfFileLeftBracket = 0 ;
1460
    int npositionOfFileRightBracket = 0 ;
1461
    int npositionOfPrjKeyWord = 0 ;
1462
//  int npositionOfProcessLeftBracket = 0 ;
1463
//  int npositionOfProcessRightBracket = 0 ;
1464
 
1465
    if(m_itoolSoftwareVersion.isEmpty())
1466
    {
1467
        if(m_iprjName.endsWith(".restore",Qt::CaseSensitive))
1468
        {
1469
            m_itoolSoftwareVersion = "10.x" ;
1470
        }
1471
        else if(m_iprjName.endsWith(".xise",Qt::CaseSensitive))
1472
        {
1473
            m_itoolSoftwareVersion = "14.x" ;
1474
        }
1475
        else
1476
        {
1477
            qDebug("EziDebug Error: the version of software that opened the project is confused!");
1478
            return 1 ;
1479
        }
1480
    }
1481
 
1482
    if(m_itoolSoftwareVersion == "10.x")
1483
    {
1484
        npositionOfPrjKeyWord  = iline.indexOf(QRegExp("\\bset\\s+project_settings\\b"),0);
1485
        if(npositionOfPrjKeyWord != -1)
1486
        {
1487
            npositionOfFileLeftBracket = iline.indexOf("{" , npositionOfPrjKeyWord , Qt::CaseSensitive);
1488
            if( npositionOfFileLeftBracket != -1)
1489
            {
1490
                npositionOfFileRightBracket = iline.indexOf("}",npositionOfFileLeftBracket,Qt::CaseSensitive);
1491
                if(npositionOfFileRightBracket != -1)
1492
                {
1493
                    iPrjInfo = iline.mid(npositionOfFileLeftBracket+1,npositionOfFileRightBracket-npositionOfFileLeftBracket-1);
1494
                    iPrjInfoList = iPrjInfo.split("\"",QString::SkipEmptyParts);
1495
                    QStringList::ConstIterator iprjIter = iPrjInfoList.constBegin();
1496
                    while(iprjIter != iPrjInfoList.constEnd())
1497
                    {
1498
                       QString iKeyWords = *iprjIter ;
1499
                       if(iKeyWords == "PROP_PreferredLanguage")
1500
                       {
1501
                            iprjIter += 2 ;
1502
                            iPreferLang = *iprjIter ;
1503
                            break ;
1504
                       }
1505
                       ++iprjIter ;
1506
                    }
1507
                }
1508
                else
1509
                {
1510
                    iprjFile.close();
1511
                    qDebug() << "The Prject file parse failed!";
1512
                    return 1 ;
1513
                }
1514
            }
1515
            else
1516
            {
1517
                iprjFile.close();
1518
                qDebug() << "The Prject file parse failed!";
1519
                return 1 ;
1520
            }
1521
        }
1522
        else
1523
        {
1524
            iprjFile.close();
1525
            qDebug() << "The Prject file parse failed!";
1526
            return 1 ;
1527
        }
1528
 
1529
        npositionOfFileKeyWord = iline.indexOf(QRegExp("\\bset\\s+user_files\\b"),0);
1530
        if(npositionOfFileKeyWord != -1)
1531
        {
1532
            npositionOfFileLeftBracket = iline.indexOf("{" , npositionOfFileKeyWord , Qt::CaseSensitive);
1533
            if( npositionOfFileLeftBracket != -1)
1534
            {
1535
                npositionOfFileRightBracket = iline.indexOf("}",npositionOfFileLeftBracket,Qt::CaseSensitive);
1536
                if(npositionOfFileRightBracket != -1)
1537
                {
1538
                    //searchPosition = npositionOfFileRightBracket ;
1539
                    ifileInfo = iline.mid(npositionOfFileLeftBracket+1,npositionOfFileRightBracket-npositionOfFileLeftBracket-1);
1540
 
1541
                    ifileInfoList = ifileInfo.split("\"",QString::SkipEmptyParts);
1542
                    QStringList::const_iterator constIterator ;
1543
                    for (constIterator = ifileInfoList.constBegin(); constIterator != ifileInfoList.constEnd();++constIterator)
1544
                    {
1545
                        QString ifileName = (*constIterator) ;
1546
 
1547
                        if(ifileName.endsWith(".vhd", Qt::CaseSensitive))
1548
                        {
1549
                            qDebug() << const_cast<QString&>(*constIterator);
1550
                            if(!(ifileName.endsWith("_EziDebug_ScanChainReg.vhd")||ifileName.endsWith("_EziDebug_TOUT_m.vhd")))
1551
                            {
1552
                                filelist.append(ifileName);
1553
                            }
1554
//                          vhdlfilemap.insert((*constIterator),pvhdlFileObj);
1555
                        }
1556
                        else if(ifileName.endsWith(".v", Qt::CaseSensitive))
1557
                        {
1558
                            qDebug() << const_cast<QString&>(*constIterator);
1559
                            if(!(ifileName.endsWith("_EziDebug_ScanChainReg.v")||ifileName.endsWith("_EziDebug_TOUT_m.v")))
1560
                            {
1561
                                filelist.append(ifileName);
1562
                            }
1563
//                          vlgfilemap.insert((*constIterator),pvlgFileObj);
1564
                        }
1565
                        else if(ifileName.endsWith(".xco",Qt::CaseSensitive))
1566
                        {
1567
                            if(iPreferLang == "Verilog")
1568
                            {
1569
                                ifileName.replace(".xco",".v");
1570
                                filelist.append(ifileName);
1571
                            }
1572
                            else
1573
                            {
1574
                                ifileName.replace(".xco",".vhd");
1575
                                filelist.append(ifileName);
1576
                            }
1577
                        }
1578
                    }
1579
                }
1580
                else
1581
                {
1582
                    qDebug() << "the setting file has some problem!" ;
1583
                    iprjFile.close();
1584
                    return 1 ;
1585
                }
1586
            }
1587
            else
1588
            {
1589
                qDebug() << "There is leftbracket after \"set user_files\" !";
1590
                iprjFile.close();
1591
                return 1 ;
1592
            }
1593
        }
1594
        else
1595
        {
1596
            iprjFile.close();
1597
            return 1 ;
1598
        }
1599
    }
1600
    else if(m_itoolSoftwareVersion == "14.x")
1601
    {
1602
        QDomDocument idomDocument ;
1603
        QString iErrorStr ;
1604
        int nErrorLine ;
1605
        int nErrorColumn = 0 ;
1606
        if (!idomDocument.setContent(&iprjFile, true, &iErrorStr, &nErrorLine, &nErrorColumn))
1607
        {
1608
            qDebug() << tr("Parse error at line %1, column %2:\n%3").arg(nErrorLine)\
1609
                        .arg(nErrorColumn).arg(iErrorStr) ;
1610
            return 1 ;
1611
        }
1612
 
1613
        QDomElement root = idomDocument.documentElement();
1614
        if(root.tagName() == "project")
1615
        {
1616
            QDomElement ifilesChild = root.firstChildElement("files");
1617
            if(!ifilesChild.isNull())
1618
            {
1619
                QDomElement ifileChild = ifilesChild.firstChildElement("file");
1620
 
1621
                while(!ifileChild.isNull())
1622
                {
1623
                    // 相对路径
1624
                    QString ifileName = ifileChild.attribute("xil_pn:name") ;
1625
                    if(ifileName.endsWith(".v"))
1626
                    {
1627
                        if(!(ifileName.endsWith("_EziDebug_ScanChainReg.v")||ifileName.endsWith("_EziDebug_TOUT_m.v")))
1628
                        {
1629
                            filelist.append(ifileName);
1630
                        }
1631
                    }
1632
                    else if(ifileName.endsWith(".vhd"))
1633
                    {
1634
                        if(!(ifileName.endsWith("_EziDebug_ScanChainReg.vhd")||ifileName.endsWith("_EziDebug_TOUT_m.vhd")))
1635
                        {
1636
                           filelist.append(ifileName);
1637
                        }
1638
                    }
1639
                    else if(ifileName.endsWith(".xco"))
1640
                    {
1641
                        if(m_icoreLangType == "Verilog")
1642
                        {
1643
                            ifileName.replace(".xco",".v") ;
1644
                            filelist.append(ifileName);
1645
                        }
1646
                        else
1647
                        {
1648
                            ifileName.replace(".xco",".vhd") ;
1649
                            filelist.append(ifileName);
1650
                        }
1651
                    }
1652
                    ifileChild = ifilesChild.nextSiblingElement("file");
1653
                }
1654
            }
1655
            else
1656
            {
1657
                qDebug() << "The project file parse failed: NO root element!";
1658
                iprjFile.close();
1659
                return 1 ;
1660
            }
1661
        }
1662
    }
1663
 
1664
    iprjFile.close();
1665
    return 0 ;
1666
}
1667
 
1668
void EziDebugPrj::deleteAllEziDebugCode(const QMap<QString,EziDebugVlgFile*> &vlgFileMap ,const QMap<QString,EziDebugVhdlFile*> &vhdlFileMap)
1669
{
1670
    QMap<QString,EziDebugVlgFile*>::const_iterator i = vlgFileMap.constBegin() ;
1671
    while(i != vlgFileMap.constEnd())
1672
    {
1673
        EziDebugVlgFile* pfile =   i.value();
1674
        pfile->deleteEziDebugCode();
1675
        ++i;
1676
    }
1677
 
1678
    QMap<QString,EziDebugVhdlFile*>::const_iterator j = vhdlFileMap.constBegin() ;
1679
    while(j != vhdlFileMap.constEnd())
1680
    {
1681
        EziDebugVhdlFile* pfile =   j.value();
1682
        pfile->deleteEziDebugCode();
1683
        ++j;
1684
    }
1685
}
1686
 
1687
 
1688
int EziDebugPrj::domParseFileInfoElement(const QDomElement &element, char readflag)
1689
{
1690
    /*子节点数目是否为零*/
1691
    if(!(element.childNodes().count()))
1692
    {
1693
        qDebug() << "domParseFileInfoElement Error:There is no fileinfo!";
1694
        return 0 ;
1695
    }
1696
 
1697
    QDomNode ichild = element.firstChild();
1698
    /*扫描子节点 ,是否存在下一个子节点*/
1699
    while (!ichild.isNull())
1700
    {
1701
        if (ichild.toElement().tagName() == "file")
1702
        {
1703
            if(domParseFileStructure(ichild.toElement(),readflag))
1704
            {
1705
                qDebug() << "domParseFileInfoElement Error :fileinfo format is not right!";
1706
                return 1 ;
1707
            }
1708
        }
1709
        else
1710
        {
1711
            qDebug() << "Info:There is no file element in the log file!";
1712
            return 0 ;
1713
        }
1714
        ichild = ichild.nextSibling();
1715
    }
1716
    return 0 ;
1717
}
1718
 
1719
int EziDebugPrj::domParseFileStructure(const QDomElement &element, char readflag)
1720
{
1721
    QString  ifileName ;
1722
    QDateTime idateTime ;
1723
    QDate idate ;
1724
    QTime itime ;
1725
    QStringList imoduleList ;
1726
 
1727
    if(element.attribute("file_name").isEmpty())
1728
    {
1729
        return 1 ;
1730
    }
1731
 
1732
    if(element.attribute("modified_date").isEmpty())
1733
    {
1734
        return 1 ;
1735
    }
1736
 
1737
    if(element.attribute("modified_time").isEmpty())
1738
    {
1739
        return 1 ;
1740
    }
1741
 
1742
//    if(element.attribute("module_array").isEmpty())
1743
//    {
1744
//        return 1 ;
1745
//    }
1746
 
1747
    if(element.attribute("macro").isEmpty())
1748
    {
1749
        return 1 ;
1750
    }
1751
 
1752
    if(element.attribute("defparameter").isEmpty())
1753
    {
1754
        return 1 ;
1755
    }
1756
 
1757
    ifileName = element.attribute("file_name");
1758
    imoduleList = element.attribute("module_array").split(QRegExp("\\s+"));
1759
    QStringList idateList = element.attribute("modified_date").split("/") ;
1760
    QStringList itimeList = element.attribute("modified_time").split(":") ;
1761
 
1762
    idate = QDate(idateList.at(2).toInt(),idateList.at(0).toInt(),idateList.at(1).toInt()) ;
1763
    itime = QTime(itimeList.at(0).toInt(),itimeList.at(1).toInt(),itimeList.at(2).toInt()) ;
1764
 
1765
    idateTime = QDateTime(idate,itime) ;
1766
 
1767
    if((ifileName.endsWith(".v",Qt::CaseSensitive)))
1768
    {
1769
        if(readflag&READ_FILE_INFO)
1770
        {
1771
            /*创建文件对象指针 并加入工程对象的文件map中*/
1772
            QFileInfo ifileinfo(m_iprjPath,ifileName);
1773
            QString ifileFullName = ifileinfo.absoluteDir().absolutePath()+ QObject::tr("/") + ifileinfo.fileName() ;
1774
            EziDebugVlgFile * pvlgFileObj = new EziDebugVlgFile(ifileFullName,idateTime,imoduleList);
1775
 
1776
            if(element.attribute("macro").compare("No Macro"))
1777
            {
1778
                QStringList imacroList = element.attribute("macro").split("$$") ;
1779
                int nmacroCount = 0 ;
1780
                for(;nmacroCount < imacroList.count();nmacroCount++)
1781
                {
1782
                    QString imacroStr = imacroList.at(nmacroCount).split("::").at(0) ;
1783
                    QString imacroVal = imacroList.at(nmacroCount).split("::").at(1) ;
1784
                    pvlgFileObj->addToMacroMap(imacroStr , imacroVal);
1785
                }
1786
 
1787
            }
1788
 
1789
            if(element.attribute("defparameter").compare("No Defparam"))
1790
            {
1791
                QStringList idefParmeterList = element.attribute("defparameter").split("$$") ;
1792
                int ndefparameterCount = 0 ;
1793
                for(;ndefparameterCount < idefParmeterList.count();ndefparameterCount++)
1794
                {
1795
                    QString icomDefParaStr = idefParmeterList.at(ndefparameterCount).split("::").at(0) ;
1796
                    QString idefParaVal = idefParmeterList.at(ndefparameterCount).split("::").at(1) ;
1797
                    QString iinstanceName = icomDefParaStr.split(".").at(0) ;
1798
                    QString idefParaStr = icomDefParaStr.split(".").at(1) ;
1799
                    pvlgFileObj->addToDefParameterMap(iinstanceName ,idefParaStr ,idefParaVal);
1800
                }
1801
            }
1802
 
1803
            m_ivlgFileMap.insert(ifileName,pvlgFileObj);
1804
            m_iCodefileNameList << ifileName ;
1805
        }
1806
    }
1807
    else if((ifileName.endsWith(".vhd",Qt::CaseSensitive)))
1808
    {
1809
        /*创建文件对象指针 并加入工程对象的文件map中*/
1810
        if(readflag&READ_FILE_INFO)
1811
        {
1812
            QFileInfo ifileinfo(m_iprjPath,ifileName);
1813
            QString ifileFullName = ifileinfo.absoluteDir().absolutePath()+ QObject::tr("/") + ifileinfo.fileName() ;
1814
            EziDebugVhdlFile * pvlgFileObj = new EziDebugVhdlFile(ifileFullName,idateTime,imoduleList);
1815
            m_ivhdlFileMap.insert(ifileName,pvlgFileObj);
1816
            m_iCodefileNameList << ifileName ;
1817
        }
1818
    }
1819
    else
1820
    {
1821
        qDebug() << "domParseFileStructure Error:The log file format is not right(the source code file type is not right)!";
1822
        return 1 ;
1823
    }
1824
    return 0 ;
1825
}
1826
 
1827
int EziDebugPrj::domParseModuleInfoElement(const QDomElement &element, char readflag)
1828
{
1829
    QString imoduleName ;
1830
    EziDebugModule *pmoduleObj = NULL ;
1831
    /*子节点数目是否为零*/
1832
    if(!(element.childNodes().count()))
1833
    {
1834
        qDebug() << "Info:There is no module info in the log file!";
1835
        return 0 ;
1836
    }
1837
 
1838
    // 存在 module 则检查 topmodule
1839
    if(element.attribute("topmodule").isEmpty())
1840
    {
1841
        qDebug() << "domParseEziDebugElement Error:There is no topmodule!" ;
1842
        return 1 ;
1843
    }
1844
    else
1845
    {
1846
        if(element.attribute("topmodule").toLower() != "no module")
1847
        {
1848
            m_itopModule =  element.attribute("topmodule") ;
1849
        }
1850
    }
1851
 
1852
    QDomNode ichild = element.firstChild();
1853
    /*扫描子节点 ,是否存在下一个子节点*/
1854
    while (!ichild.isNull())
1855
    {
1856
        if (ichild.toElement().tagName() == "module")
1857
        {
1858
            if(ichild.toElement().attribute("module_name").isEmpty())
1859
            {
1860
                return 1 ;
1861
            }
1862
 
1863
//            if(ichild.toElement().attribute("appearance_count").isEmpty())
1864
//            {
1865
//                return 1 ;
1866
//            }
1867
 
1868
//            if(QRegExp("^\\d+$").exactMatch(ichild.toElement().attribute("appearance_count")))
1869
//            {
1870
//                return 1 ;
1871
//            }
1872
 
1873
            if(ichild.toElement().attribute("lib_core").isEmpty())
1874
            {
1875
                return 1 ;
1876
            }
1877
 
1878
            if(!QRegExp("^\\d+$").exactMatch(ichild.toElement().attribute("lib_core")))
1879
            {
1880
                return 1 ;
1881
            }
1882
 
1883
            if(ichild.toElement().attribute("file_name").isEmpty())
1884
            {
1885
                return 1 ;
1886
            }
1887
 
1888
            if(ichild.toElement().attribute("instance_array").isEmpty())
1889
            {
1890
                return 1 ;
1891
            }
1892
 
1893
            if(ichild.toElement().attribute("reset_signal").isEmpty())
1894
            {
1895
                return 1 ;
1896
            }
1897
 
1898
            if(ichild.toElement().attribute("parameter").isEmpty())
1899
            {
1900
                return 1 ;
1901
            }
1902
 
1903
            if(readflag&READ_MODULE_INFO)
1904
            {
1905
                imoduleName = ichild.toElement().attribute("module_name") ;
1906
                qDebug() << "Test module" <<imoduleName ;
1907
                pmoduleObj = new EziDebugModule(imoduleName) ;
1908
                if(!pmoduleObj)
1909
                {
1910
                    qDebug() << "Error: domParseModuleInfoElement :There is no memory left !" ;
1911
                    return 1 ;
1912
                }
1913
 
1914
                pmoduleObj->m_isLibaryCore = ichild.toElement().attribute("lib_core").toInt() ;
1915
                //pmoduleObj->m_ninstanceTimes = ichild.toElement().attribute("appearance_count").toInt();
1916
                pmoduleObj->m_ilocatedFile = ichild.toElement().attribute("file_name") ;
1917
 
1918
                if(!(ichild.toElement().attribute("instance_array").toLower() == "no instance"))
1919
                {
1920
                    pmoduleObj->m_iinstanceNameList = ichild.toElement().attribute("instance_array").split("|") ;
1921
                }
1922
 
1923
                if(ichild.toElement().attribute("reset_signal").compare("No Reset Signal"))
1924
                {
1925
 
1926
                    pmoduleObj->m_iresetMap.insert(ichild.toElement().attribute("reset_signal").split(":").at(0),\
1927
                                                   ichild.toElement().attribute("reset_signal").split(":").at(1));
1928
                }
1929
 
1930
                if(ichild.toElement().attribute("parameter").compare("No Parameter"))
1931
                {
1932
                    QStringList iparameterList = ichild.toElement().attribute("parameter").split("$$") ;
1933
                    int nparameterCount = 0 ;
1934
                    for( ; nparameterCount < iparameterList.count() ;nparameterCount++)
1935
                    {
1936
                        QString iparameterStr = iparameterList.at(nparameterCount).split("::").at(0) ;
1937
                        QString iparameterVal = iparameterList.at(nparameterCount).split("::").at(1) ;
1938
                        pmoduleObj->m_iparameter.insert(iparameterStr,iparameterVal) ;
1939
                    }
1940
                }
1941
            }
1942
 
1943
 
1944
 
1945
            /*解析module 结构*/
1946
            if(domParseModuleStructure(ichild.toElement() , readflag , pmoduleObj))
1947
            {
1948
                qDebug() << "domParseFileInfoElement Error :moduleinfo format is not right!";
1949
                return 1 ;
1950
            }
1951
 
1952
            if(pmoduleObj)
1953
            {
1954
                m_imoduleMap.insert(pmoduleObj->getModuleName(),pmoduleObj);
1955
            }
1956
 
1957
        }
1958
        else
1959
        {
1960
            qDebug() << "domParseFileInfoElement Error : There is strange element in the file!";
1961
            return 1 ;
1962
        }
1963
        ichild = ichild.nextSibling();
1964
    }
1965
    return 0 ;
1966
}
1967
 
1968
int EziDebugPrj::domParseModuleStructure(const QDomElement &element,char readflag,EziDebugModule* module)
1969
{
1970
    /*子节点数目是否为零*/
1971
    int emoduleStructureExistFlag = 0 ;
1972
    if(element.childNodes().count() != 4)
1973
    {
1974
        qDebug() << "domParseFileInfoElement Error:module format is not right!";
1975
        return 1 ;
1976
    }
1977
    QDomNode ichild = element.firstChild();
1978
    /*扫描子节点 ,是否存在下一个子节点*/
1979
    while (!ichild.isNull())
1980
    {
1981
        if (ichild.toElement().tagName() == "clock_description")
1982
        {
1983
            emoduleStructureExistFlag |= MODULE_STRUCTURE_CLOCK_DESCRIPTION ;
1984
            if(domParseClockDescriptionElement(ichild.toElement() , readflag , module))
1985
            {
1986
                qDebug() << "domParseModuleStructure Error :moduleinfo format is not right!";
1987
                return 1 ;
1988
            }
1989
        }
1990
        else if(ichild.toElement().tagName() == "reg_description")
1991
        {
1992
            emoduleStructureExistFlag |= MODULE_STRUCTURE_REG_DESCRIPTION ;
1993
            if(domParseRegDescriptionElement(ichild.toElement() , readflag , module))
1994
            {
1995
                qDebug() << "domParseModuleStructure Error :reginfo format is not right!";
1996
                return 1 ;
1997
            }
1998
        }
1999
        else if(ichild.toElement().tagName() == "port_description")
2000
        {
2001
            emoduleStructureExistFlag |= MODULE_STRUCTURE_PORT_DESCRIPTION ;
2002
            if(domParsePortDescriptionElement(ichild.toElement() , readflag ,module))
2003
            {
2004
                qDebug() << "domParseModuleStructure Error :portinfo format is not right!";
2005
                return 1 ;
2006
            }
2007
        }
2008
        else if(ichild.toElement().tagName() == "instance_port_map_description")
2009
        {
2010
            emoduleStructureExistFlag |= MODULE_STRUCTURE_INSTANCE_PORT_MAP_DESCRIPTION ;
2011
            if(domParseInstancePortMapDescriptionElement(ichild.toElement() , readflag ,module))
2012
            {
2013
                qDebug() << "domParseModuleStructure Error :portmap format is not right!";
2014
                return 1 ;
2015
            }
2016
        }
2017
        else
2018
        {
2019
            qDebug() << "domParseModuleStructure Error : There is strange element in the file!";
2020
            return 1 ;
2021
        }
2022
        ichild = ichild.nextSibling();
2023
    }
2024
 
2025
    if((emoduleStructureExistFlag&MODULE_STRUCTURE_ALL_DESCRIPTION) == MODULE_STRUCTURE_ALL_DESCRIPTION )
2026
    {
2027
        return 0 ;
2028
    }
2029
    else
2030
    {
2031
        return 1 ;
2032
    }
2033
 
2034
}
2035
 
2036
 
2037
int EziDebugPrj::domParseClockDescriptionElement(const QDomElement &element, char readflag, EziDebugModule* module)
2038
{
2039
    /*子节点数目是否为零*/
2040
    if(!(element.childNodes().count()))
2041
    {
2042
        qDebug() << "EziDebug Info: There is no clockinfo " << (module? (QObject::tr("in module:%1").arg(module->getModuleName())):"");
2043
        return 0 ;
2044
    }
2045
    QDomNode ichild = element.firstChild();
2046
    /*扫描子节点 ,是否存在下一个子节点*/
2047
    while (!ichild.isNull())
2048
    {
2049
        if (ichild.toElement().tagName() == "clock")
2050
        {
2051
 
2052
            if(ichild.toElement().attribute("clock_name").isEmpty())
2053
            {
2054
                return 1 ;
2055
            }
2056
 
2057
            if(ichild.toElement().attribute("polarity").isEmpty())
2058
            {
2059
                return 1 ;
2060
            }
2061
 
2062
            if(!((ichild.toElement().attribute("polarity").toLower() == "posedge") \
2063
                 || (ichild.toElement().attribute("polarity").toLower() == "negedge")))
2064
            {
2065
                return 1 ;
2066
            }
2067
 
2068
            if(readflag & READ_MODULE_INFO)
2069
            {
2070
                if(module)
2071
                {
2072
                    QString iclockName  = ichild.toElement().attribute("clock_name");
2073
                    module->m_iclockMap.insert(iclockName,ichild.toElement().attribute("polarity"));
2074
                }
2075
                else
2076
                {
2077
                    qDebug() << "domParseClockDescriptionElement: NULL Pointer!";
2078
                    return 1 ;
2079
                }
2080
            }
2081
 
2082
        }
2083
        else
2084
        {
2085
            qDebug() << "domParseFileInfoElement Error : There is strange element in the file!";
2086
            return 1 ;
2087
        }
2088
        ichild = ichild.nextSibling();
2089
    }
2090
    return 0 ;
2091
}
2092
 
2093
int EziDebugPrj::domParseClockStructure(const QDomElement &element, char readflag , EziDebugModule* module)
2094
{
2095
    return 0 ;
2096
}
2097
 
2098
 
2099
int EziDebugPrj::domParseRegDescriptionElement(const QDomElement &element ,char readflag, EziDebugModule* module)
2100
{
2101
    /*子节点数目是否为零*/
2102
    if(!(element.childNodes().count()))
2103
    {
2104
        qDebug() << "EziDebug Info:There is no reginfo in the module " << (module ? module->getModuleName() : "") << "!";
2105
        return 0 ;
2106
    }
2107
    QDomNode ichild = element.firstChild();
2108
    /*扫描子节点 ,是否存在下一个子节点*/
2109
    while (!ichild.isNull())
2110
    {
2111
        if (ichild.toElement().tagName() == "reg")
2112
        {
2113
            if(ichild.toElement().attribute("module_name").isEmpty())
2114
            {
2115
                return 1 ;
2116
            }
2117
 
2118
            if(ichild.toElement().attribute("locate_clock").isEmpty())
2119
            {
2120
                return 1 ;
2121
            }
2122
 
2123
            if(ichild.toElement().attribute("reg_name").isEmpty())
2124
            {
2125
                return 1 ;
2126
            }
2127
 
2128
            if(ichild.toElement().attribute("bitwidth").isEmpty())
2129
            {
2130
                return 1 ;
2131
            }
2132
 
2133
            if(ichild.toElement().attribute("regnum").isEmpty())
2134
            {
2135
                return 1 ;
2136
            }
2137
#if 0
2138
            if(ichild.toElement().attribute("endian").isEmpty())
2139
            {
2140
                return 1 ;
2141
            }
2142
#endif
2143
 
2144
            if(ichild.toElement().attribute("polarity").isEmpty())
2145
            {
2146
                return 1 ;
2147
            }
2148
 
2149
            if(!((ichild.toElement().attribute("polarity").toLower() == "posedge") \
2150
                 || (ichild.toElement().attribute("polarity").toLower() == "negedge") \
2151
                 || (ichild.toElement().attribute("polarity").toLower() == "low") \
2152
                 || (ichild.toElement().attribute("polarity").toLower() == "high")))
2153
            {
2154
                return 1 ;
2155
            }
2156
#if 0
2157
            if(!((ichild.toElement().attribute("endian") == "0")\
2158
                 ||(ichild.toElement().attribute("endian") == "1")))
2159
            {
2160
                return 1 ;
2161
            }
2162
#endif
2163
 
2164
            if(readflag & READ_MODULE_INFO)
2165
            {
2166
                if(module)
2167
                {
2168
                    EziDebugModule::RegStructure * preg= new EziDebugModule::RegStructure ;
2169
//                  preg->m_isEndian     = ichild.toElement().attribute("endian").toInt();
2170
 
2171
//                  preg->m_pMouduleName = (char*)malloc(ichild.toElement().attribute("module_name").size()+1);
2172
                    memcpy(preg->m_pMouduleName,ichild.toElement().attribute("module_name").toAscii().data(),ichild.toElement().attribute("module_name").size()+1);
2173
 
2174
//                  preg->m_pRegName =  (char*)malloc(ichild.toElement().attribute("reg_name").size()+1);
2175
                    memcpy(preg->m_pRegName,ichild.toElement().attribute("reg_name").toAscii().data(),ichild.toElement().attribute("reg_name").size()+1);
2176
 
2177
                    memset(preg->m_pExpString,0,64) ;
2178
                    if(ichild.toElement().attribute("bitwidth").size() <= 63)
2179
                    {
2180
                        qstrcpy(preg->m_pExpString,ichild.toElement().attribute("bitwidth").toAscii().constData());
2181
                    }
2182
 
2183
                    memset(preg->m_pregNum,0,64) ;
2184
                    if(ichild.toElement().attribute("regnum").size() <= 63)
2185
                    {
2186
                        qstrcpy(preg->m_pregNum ,ichild.toElement().attribute("regnum").toAscii().constData()) ;
2187
                    }
2188
 
2189
 
2190
                    if(ichild.toElement().attribute("polarity").toLower() == "posedge")
2191
                    {
2192
                        preg->m_eedge = EziDebugModule::signalPosEdge ;
2193
                    }
2194
                    else if(ichild.toElement().attribute("polarity").toLower() == "negedge")
2195
                    {
2196
                        preg->m_eedge = EziDebugModule::signalNegEdge ;
2197
                    }
2198
                    else if(ichild.toElement().attribute("polarity").toLower() == "low")
2199
                    {
2200
                        preg->m_eedge = EziDebugModule::signalLow ;
2201
                    }
2202
                    else
2203
                    {
2204
                        preg->m_eedge = EziDebugModule::signalHigh ;
2205
                    }
2206
 
2207
                    QString iclockName   = ichild.toElement().attribute("locate_clock");
2208
                    qstrcpy(preg->m_pclockName,iclockName.toAscii().data());
2209
                    QVector<EziDebugModule::RegStructure*> iregStructureVec = module->m_iregMap.value(iclockName) ;
2210
                    iregStructureVec.append(preg);
2211
                    module->m_iregMap.insert(iclockName,iregStructureVec);
2212
                }
2213
                else
2214
                {
2215
                    qDebug() << "domParseRegDescriptionElement Error: NULL Pointer!";
2216
                    return 1 ;
2217
                }
2218
            }
2219
        }
2220
        else
2221
        {
2222
            qDebug() << "domParseRegDescriptionElement Error : There is strange element in the file!";
2223
            return 1 ;
2224
        }
2225
        ichild = ichild.nextSibling();
2226
    }
2227
    return 0 ;
2228
}
2229
 
2230
int EziDebugPrj::domParseRegStructure(const QDomElement &element , char readflag , EziDebugModule* module)
2231
{
2232
    return 0 ;
2233
}
2234
 
2235
int EziDebugPrj::domParsePortDescriptionElement(const QDomElement &element ,char readflag, EziDebugModule* module)
2236
{
2237
    /*子节点数目是否为零*/
2238
    if(!(element.childNodes().count()))
2239
    {
2240
        qDebug() << "domParsePortDescriptionElement Error:There is no port!";
2241
        return 1 ;
2242
    }
2243
    QDomNode ichild = element.firstChild();
2244
    /*扫描子节点 ,是否存在下一个子节点*/
2245
    while (!ichild.isNull())
2246
    {
2247
        if (ichild.toElement().tagName() == "port")
2248
        {
2249
            if(ichild.toElement().attribute("port_name").isEmpty())
2250
            {
2251
                return 1 ;
2252
            }
2253
 
2254
            if(ichild.toElement().attribute("module_name").isEmpty())
2255
            {
2256
                return 1 ;
2257
            }
2258
 
2259
            if(ichild.toElement().attribute("direction_type").isEmpty())
2260
            {
2261
                return 1 ;
2262
            }
2263
 
2264
            if(ichild.toElement().attribute("bitwidth").isEmpty())
2265
            {
2266
                return 1 ;
2267
            }
2268
 
2269
#if 0
2270
            if(ichild.toElement().attribute("endian").isEmpty())
2271
            {
2272
                return 1 ;
2273
            }
2274
 
2275
 
2276
            if(!((ichild.toElement().attribute("endian").toLower() == "little")\
2277
                 ||(ichild.toElement().attribute("endian").toLower()== "big")))
2278
            {
2279
                return 1 ;
2280
            }
2281
#endif
2282
 
2283
            if(!((ichild.toElement().attribute("direction_type").toLower() == "in")\
2284
                 ||(ichild.toElement().attribute("direction_type").toLower() == "out")\
2285
                 ||(ichild.toElement().attribute("direction_type").toLower() == "inout")))
2286
            {
2287
                return 1 ;
2288
            }
2289
 
2290
            if(readflag & READ_MODULE_INFO)
2291
            {
2292
                if(module)
2293
                {
2294
                    EziDebugModule::PortStructure * pport= new EziDebugModule::PortStructure ;
2295
 
2296
                    // pport->m_isEndian     = (ichild.toElement().attribute("endian").toLower() == "big");
2297
 
2298
                    //pport->m_pModuleName     = (char*)malloc(ichild.toElement().attribute("module_name").size()+1);
2299
                    memcpy(pport->m_pModuleName,ichild.toElement().attribute("module_name").toAscii().data(),ichild.toElement().attribute("module_name").size()+1);
2300
 
2301
                    //pport->m_pPortName     = (char*)malloc(ichild.toElement().attribute("port_name").size()+1);
2302
                    memcpy(pport->m_pPortName,ichild.toElement().attribute("port_name").toAscii().data(),ichild.toElement().attribute("port_name").size()+1);
2303
 
2304
                    if(ichild.toElement().attribute("direction_type").toLower() == "in")
2305
                    {
2306
                        pport->eDirectionType =  EziDebugModule::directionTypeInput ;
2307
                    }
2308
                    else if(ichild.toElement().attribute("direction_type").toLower() == "out")
2309
                    {
2310
                         pport->eDirectionType =  EziDebugModule::directionTypeOutput ;
2311
                    }
2312
                    else
2313
                    {
2314
                         pport->eDirectionType =  EziDebugModule::directionTypeInoutput ;
2315
                    }
2316
 
2317
                    memset(pport->m_pBitWidth,0,64) ;
2318
                    if(ichild.toElement().attribute("bitwidth").size() <= 63)
2319
                    {
2320
                        qstrcpy(pport->m_pBitWidth ,ichild.toElement().attribute("bitwidth").toAscii().constData());
2321
                    }
2322
 
2323
                    if(pport)
2324
                    {
2325
                        module->m_iportVec.append(pport);
2326
                    }
2327
                    else
2328
                    {
2329
                        return 1 ;
2330
                    }
2331
                }
2332
                else
2333
                {
2334
                    qDebug() << "readPortStructure: NULL Pointer!";
2335
                    return 1 ;
2336
                }
2337
            }
2338
        }
2339
        else
2340
        {
2341
            qDebug() << "domParsePortDescriptionElement Error : There is strange element in the file!";
2342
            return 1 ;
2343
        }
2344
        ichild = ichild.nextSibling();
2345
    }
2346
    return 0 ;
2347
}
2348
 
2349
int EziDebugPrj::domParseInstancePortMapDescriptionElement(const QDomElement &element,char readflag, EziDebugModule* module)
2350
{
2351
    /*子节点数目是否为零*/
2352
    if(!(element.childNodes().count()))
2353
    {
2354
        qDebug() << "EziDebug Info:There is no instance port map !";
2355
        return 0 ;
2356
    }
2357
    QDomNode ichild = element.firstChild();
2358
    /*扫描子节点 ,是否存在下一个子节点*/
2359
    while (!ichild.isNull())
2360
    {
2361
        if (ichild.toElement().tagName() == "instance")
2362
        {
2363
            if(ichild.toElement().attribute("instance_name").isEmpty())
2364
            {
2365
                return 1 ;
2366
            }
2367
 
2368
            if(ichild.toElement().attribute("port_map").isEmpty())
2369
            {
2370
                return 1 ;
2371
            }
2372
        }
2373
 
2374
        if(readflag & READ_MODULE_INFO)
2375
        {
2376
            if(module)
2377
            {
2378
               int i = 0 ;
2379
               QString iinstanceName = ichild.toElement().attribute("instance_name") ;
2380
               QMap<QString,QString> iportMap ;
2381
               QString iportMapStr = ichild.toElement().attribute("port_map") ;
2382
               QStringList iportMapList = iportMapStr.split('#');
2383
               for(;i < iportMapList.count() ;i++)
2384
               {
2385
                   iportMap.insert(iportMapList.at(i).split('@').at(0),iportMapList.at(i).split('@').at(1));
2386
               }
2387
               module->m_iinstancePortMap.insert(iinstanceName,iportMap) ;
2388
            }
2389
            else
2390
            {
2391
                qDebug() << "domParsePortDescriptionElement Error : The pmodule is NULL pointer!";
2392
                return 1 ;
2393
            }
2394
        }
2395
        ichild = ichild.nextSibling();
2396
    }
2397
    return 0 ;
2398
}
2399
 
2400
int EziDebugPrj::domParsePortStructure(const QDomElement &element, char readflag , EziDebugModule* module)
2401
{
2402
    return 0 ;
2403
}
2404
 
2405
int EziDebugPrj::domParseScanChainInfoElement(const QDomElement &element,char readflag)
2406
{
2407
    QString ichainName ;
2408
    QString iscanRegCore ;
2409
    QString itoutCore ;
2410
    QString iuserDir ;
2411
    EziDebugScanChain *pchainObj = NULL ;
2412
 
2413
    if(element.attribute("scanreg_core_name").toLower() != "no core")
2414
    {
2415
        iscanRegCore = element.attribute("scanreg_core_name");
2416
    }
2417
    else
2418
    {
2419
        iscanRegCore = "No Core";
2420
    }
2421
 
2422
    if(element.attribute("tout_core_name").toLower() != "no core")
2423
    {
2424
        itoutCore = element.attribute("tout_core_name");
2425
    }
2426
    else
2427
    {
2428
        itoutCore = "No Core" ;
2429
    }
2430
 
2431
    if(element.attribute("user_dir").toLower() != "no dir")
2432
    {
2433
        iuserDir = element.attribute("user_dir");
2434
    }
2435
    else
2436
    {
2437
        iuserDir = "No Dir" ;
2438
    }
2439
 
2440
    EziDebugScanChain::saveEziDebugAddedInfo(iscanRegCore , itoutCore , iuserDir) ;
2441
 
2442
    /*子节点数目是否为零*/
2443
    if(!(element.childNodes().count()))
2444
    {
2445
        qDebug() << "EziDebug Info: There is no Scan chain infomation!";
2446
        return 0 ;
2447
    }
2448
 
2449
 
2450
    QDomNode ichild = element.firstChild();
2451
    /*扫描子节点 ,是否存在下一个子节点*/
2452
    while (!ichild.isNull())
2453
    {
2454
        if (ichild.toElement().tagName() == "chain")
2455
        {
2456
            if(ichild.toElement().attribute("chain_name").isEmpty())
2457
            {
2458
                return 1 ;
2459
            }
2460
 
2461
//            if(ichild.toElement().attribute("instance_list").isEmpty())
2462
//            {
2463
//                return 1 ;
2464
//            }
2465
            if(ichild.toElement().attribute("scaned_file_list").isEmpty())
2466
 
2467
            {
2468
                return 1 ;
2469
            }
2470
 
2471
            if(ichild.toElement().attribute("system_output").isEmpty())
2472
            {
2473
                return 1 ;
2474
            }
2475
 
2476
            ichainName = ichild.toElement().attribute("chain_name") ;
2477
 
2478
            if(readflag&READ_CHAIN_INFO)
2479
            {
2480
                pchainObj = new EziDebugScanChain(ichainName) ;
2481
                if(!pchainObj)
2482
                {
2483
                    qDebug() << "Error: domParseScanChainInfoElement :There is no memory left !" ;
2484
                    return 1 ;
2485
                }
2486
                pchainObj->m_iinstanceItemList = ichild.toElement().attribute("instance_list").split("|") ;
2487
                pchainObj->m_iscanedFileNameList = ichild.toElement().attribute("scaned_file_list").split("|") ;
2488
                if(ichild.toElement().attribute("system_output")!= "No Sysoutput")
2489
                {
2490
                    pchainObj->m_isysCoreOutputPortList = ichild.toElement().attribute("system_output").split("@") ;
2491
                }
2492
            }
2493
 
2494
           //
2495
            /*解析扫描链结构*/
2496
            if(domParseScanChainStructure(ichild.toElement() , readflag , pchainObj))
2497
            {
2498
                qDebug() << "domParseScanChainInfoElement Error :chaininfo format is not right!";
2499
                return 1 ;
2500
            }
2501
        }
2502
        else
2503
        {
2504
            qDebug() << "domParseScanChainInfoElement Error : There is strange element in the file!";
2505
            return 1 ;
2506
        }
2507
        ichild = ichild.nextSibling();
2508
    }
2509
    return 0 ;
2510
}
2511
 
2512
int EziDebugPrj::domParseScanChainStructure(const QDomElement &element,char readflag, EziDebugScanChain *chain)
2513
{
2514
    /*子节点数目是否为零*/
2515
    int echainStructureExistFlag = 0 ;
2516
    if(element.childNodes().count() != 2)
2517
    {
2518
        qDebug() << "domParseScanChainStructure Error:There is no fileinfo!";
2519
        return 1 ;
2520
    }
2521
    QDomNode ichild = element.firstChild();
2522
    /*扫描子节点 ,是否存在下一个子节点*/
2523
    while (!ichild.isNull())
2524
    {
2525
        if (ichild.toElement().tagName() == "reglist_description")
2526
        {
2527
            echainStructureExistFlag |= SCAN_CHAIN_STRUCTURE_REGLIST_DESCRIPTION ;
2528
            if(domParseReglistDescriptionElement(ichild.toElement() , readflag , chain))
2529
            {
2530
                qDebug() << "domParseScanChainStructure Error :fileinfo format is not right!";
2531
                return 1 ;
2532
            }
2533
        }
2534
        else if(ichild.toElement().tagName() == "code_description")
2535
        {
2536
            echainStructureExistFlag |= SCAN_CHAIN_STRUCTURE_CODE_DESCRIPTION ;
2537
            if(domParseCodeDescriptionElement(ichild.toElement() , readflag , chain))
2538
            {
2539
                qDebug() << "domParseScanChainStructure Error :reginfo format is not right!";
2540
                return 1 ;
2541
            }
2542
        }
2543
        else
2544
        {
2545
            qDebug() << "domParseScanChainStructure Error : There is strange element in the file!";
2546
            return 1 ;
2547
        }
2548
        ichild = ichild.nextSibling();
2549
    }
2550
 
2551
    if((echainStructureExistFlag&SCAN_CHAIN_STRUCTURE_ALL_DESCRIPTION) == SCAN_CHAIN_STRUCTURE_ALL_DESCRIPTION )
2552
    {
2553
        if(readflag&READ_CHAIN_INFO)
2554
        {
2555
            m_ichainInfoMap.insert(chain->m_iChainName,chain);
2556
        }
2557
        return 0 ;
2558
    }
2559
    else
2560
    {
2561
        return 1 ;
2562
    }
2563
 
2564
    return 0 ;
2565
}
2566
 
2567
int EziDebugPrj::domParseReglistDescriptionElement(const QDomElement &element,char readflag, EziDebugScanChain *chain)
2568
{
2569
    QVector<QStringList> iregListVec ;
2570
 
2571
    /*子节点数目是否为零*/
2572
    if(!(element.childNodes().count()))
2573
    {
2574
        qDebug() << "domParseReglistDescriptionElement Error:There is no fileinfo!";
2575
        return 1 ;
2576
    }
2577
    QDomNode ichild = element.firstChild();
2578
    /*扫描子节点 ,是否存在下一个子节点*/
2579
    while (!ichild.isNull())
2580
    {
2581
        if(ichild.toElement().tagName() == "regchain")
2582
        {
2583
            if(ichild.toElement().attribute("reglist").isEmpty())
2584
            {
2585
                return 1 ;
2586
            }
2587
 
2588
            if(ichild.toElement().attribute("insertclock").isEmpty())
2589
            {
2590
                return 1 ;
2591
            }
2592
 
2593
            if(readflag&READ_CHAIN_INFO)
2594
            {
2595
                if(chain)
2596
                {
2597
                   QString iinsertClock = ichild.toElement().attribute("insertclock") ;
2598
 
2599
                   int nregCount = ichild.toElement().attribute("regcount").toInt();
2600
 
2601
                   chain->m_nregCountMap.insert(iinsertClock,nregCount);
2602
 
2603
                   QStringList ireglist = ichild.toElement().attribute("reglist").split("@") ;
2604
 
2605
                   iregListVec.append(ireglist);
2606
 
2607
                   chain->m_iregChainStructure.insert(iinsertClock,iregListVec) ;
2608
                }
2609
                else
2610
                {
2611
                    return 1 ;
2612
                }
2613
            }
2614
 
2615
        }
2616
        else
2617
        {
2618
            qDebug() << "domParseReglistStructure Error : There is unknown element in the EziDebug file!";
2619
            return 1 ;
2620
        }
2621
        ichild = ichild.nextSibling();
2622
    }
2623
    return 0 ;
2624
}
2625
 
2626
//int EziDebugPrj::domParseReglistStructure(const QDomElement &element,char readflag, EziDebugScanChain *chain)
2627
//{
2628
//    /*子节点数目是否为零*/
2629
//    if(!(element.childNodes().count()))
2630
//    {
2631
//        qDebug() << "domParseReglistStructure Error:There is no fileinfo!";
2632
//        return 1 ;
2633
//    }
2634
//    QDomNode ichild = element.firstChild();
2635
//    /*扫描子节点 ,是否存在下一个子节点*/
2636
//    while (!ichild.isNull())
2637
//    {
2638
//        if(ichild.toElement().tagName() == "regchain")
2639
//        {
2640
//            if(ichild.toElement().attribute("reglist").isEmpty())
2641
//            {
2642
//                return 1 ;
2643
//            }
2644
 
2645
//            if(readflag&READ_CHAIN_INFO)
2646
//            {
2647
//                if(chain)
2648
//                {
2649
//                   QStringList ireglist = ichild.toElement().attribute("reglist").split("|") ;
2650
//                   QList<EziDebugScanChain::RegListStructure*> itempRegList ;
2651
//                   for (int i = 0; i < ireglist.size(); i++)
2652
//                   {
2653
//                       QStringList isinglereglist = ireglist.at(i).split("%") ;
2654
//                       EziDebugScanChain::RegListStructure* preg = new  EziDebugScanChain::RegListStructure ;
2655
//                       preg->m_pnamehiberarchy =  (char*)malloc(isinglereglist.at(0).size()+1);
2656
//                       memcpy(preg->m_pnamehiberarchy,isinglereglist.at(0).toAscii().data(),isinglereglist.at(0).size()+1);
2657
 
2658
//                       preg->m_pregName = (char*)malloc(isinglereglist.at(1).size()+1) ;
2659
//                       memcpy(preg->m_pregName,isinglereglist.at(1).toAscii().data(),isinglereglist.at(1).size()+1);
2660
 
2661
//                       preg->m_pclock = (char*)malloc(isinglereglist.at(2).size()+1);
2662
//                       memcpy(preg->m_pclock,isinglereglist.at(2).toAscii().data(),isinglereglist.at(2).size()+1);
2663
 
2664
//                       preg->m_nbitwidth = isinglereglist.at(3).toInt();
2665
//                       preg->m_nstartbit = isinglereglist.at(4).toInt();
2666
//                       preg->m_nendbit = isinglereglist.at(5).toInt();
2667
 
2668
//                       itempRegList.append(preg);
2669
//                       chain->m_iregChainStructure.append(itempRegList);
2670
//                   }
2671
//                }
2672
//                else
2673
//                {
2674
//                    return 1 ;
2675
//                }
2676
//            }
2677
 
2678
//        }
2679
//        else
2680
//        {
2681
//            qDebug() << "domParseReglistStructure Error : There is unknown element in the EziDebug file!";
2682
//            return 1 ;
2683
//        }
2684
//        ichild = ichild.nextSibling();
2685
//    }
2686
//    return 0 ;
2687
//}
2688
 
2689
int EziDebugPrj::domParseCodeDescriptionElement(const QDomElement &element,char readflag, EziDebugScanChain *chain)
2690
{
2691
    if(!(element.childNodes().count()))
2692
    {
2693
        qDebug() << "domParseCodeDescriptionElement Error:There is no codedescription int ScanChain infomation!";
2694
        return 1 ;
2695
    }
2696
    QDomNode ichild = element.firstChild();
2697
    /*扫描子节点 ,是否存在下一个子节点*/
2698
    while (!ichild.isNull())
2699
    {
2700
        if (ichild.toElement().tagName() == "added_code")
2701
        {
2702
            if(ichild.toElement().attribute("module_name").isEmpty())
2703
            {
2704
                return 1 ;
2705
            }
2706
 
2707
            if(ichild.toElement().attribute("user_line_code").isEmpty())
2708
            {
2709
                return 1 ;
2710
            }
2711
 
2712
            if(ichild.toElement().attribute("user_block_code").isEmpty())
2713
            {
2714
                return 1 ;
2715
            }
2716
 
2717
 
2718
            if(readflag&READ_CHAIN_INFO)
2719
            {
2720
                if(chain)
2721
                {
2722
                    chain->m_icodeMap.insert(ichild.toElement().attribute("module_name"),ichild.toElement().attribute("user_line_code").split("#"));
2723
                    if(ichild.toElement().attribute("user_block_code").toLower() != "no code")
2724
                    {
2725
                        chain->m_iblockCodeMap.insert(ichild.toElement().attribute("module_name"),ichild.toElement().attribute("user_block_code").split("#"));
2726
                    }
2727
                }
2728
                else
2729
                {
2730
                    return 1 ;
2731
                }
2732
            }
2733
 
2734
        }
2735
        else
2736
        {
2737
            qDebug() << "domParseCodeStructure Error : There is unknown element in the EziDebug file!";
2738
            return 1 ;
2739
        }
2740
        ichild = ichild.nextSibling();
2741
    }
2742
    return 0 ;
2743
}
2744
 
2745
 
2746
//int EziDebugPrj::domParseCodeStructure(const QDomElement &element,char readflag ,EziDebugScanChain * chain)
2747
//{
2748
//    /*子节点数目是否为零*/
2749
//    if(!(element.childNodes().count()))
2750
//    {
2751
//        qDebug() << "domParseScanChainStructure Error:There is no fileinfo!";
2752
//        return 1 ;
2753
//    }
2754
//    QDomNode ichild = element.firstChild();
2755
//    /*扫描子节点 ,是否存在下一个子节点*/
2756
//    while (!ichild.isNull())
2757
//    {
2758
//        if (ichild.toElement().tagName() == "added_code")
2759
//        {
2760
//            if(ichild.toElement().attribute("module_name").isEmpty())
2761
//            {
2762
//                return 1 ;
2763
//            }
2764
 
2765
//            if(ichild.toElement().attribute("user_code").isEmpty())
2766
//            {
2767
//                return 1 ;
2768
//            }
2769
 
2770
//            if(ichild.toElement().attribute("user_core_code").isEmpty())
2771
//            {
2772
//                return 1 ;
2773
//            }
2774
 
2775
//            if(readflag&READ_CHAIN_INFO)
2776
//            {
2777
//                if(chain)
2778
//                {
2779
//                    chain->m_icodeMap.insert(ichild.toElement().attribute("module_name"),ichild.toElement().attribute("user_code").split("#"));
2780
//                    chain->m_iuserDefineCoreMap.insert(ichild.toElement().attribute("module_name"),ichild.toElement().attribute("user_core_code"));
2781
//                }
2782
//                else
2783
//                {
2784
//                    return 1 ;
2785
//                }
2786
//            }
2787
 
2788
//        }
2789
//        else
2790
//        {
2791
//            qDebug() << "domParseCodeStructure Error : There is unknown element in the EziDebug file!";
2792
//            return 1 ;
2793
//        }
2794
//        ichild = ichild.nextSibling();
2795
//    }
2796
//    return 0 ;
2797
//}
2798
 
2799
 
2800
// 读取log文件中的 有关文件的信息
2801
int EziDebugPrj::readFileInfo(char readflag)
2802
{
2803
    // 过程中只能遇到三种类型的 xml 标签
2804
    bool  isFileInfoExist = 0 ;
2805
    /*读取下一个有效的开始 标签*/
2806
    m_ireader.readNext();
2807
    while(!m_ireader.atEnd())
2808
    {
2809
        if(m_ireader.isStartElement())
2810
        {
2811
            if(m_ireader.name() == "FILE_INFO")
2812
            {
2813
                /*do nothing! 继续读取 文件信息*/
2814
                isFileInfoExist = 1 ;
2815
 
2816
                if(readFileStructure(readflag))
2817
                    return 1 ;
2818
                m_ireader.readNext();
2819
            }
2820
            else
2821
            {
2822
                qDebug() << "the log file is not complete!";
2823
                return 1 ;
2824
            }
2825
        }
2826
        else if(m_ireader.isCharacters())
2827
        {
2828
            QRegExp icomExp("\\s+");
2829
            if(icomExp.exactMatch(m_ireader.text().toString()))
2830
            {
2831
                m_ireader.readNext();
2832
            }
2833
            else
2834
            {
2835
                qDebug() << "the log file's format is not right!";
2836
                return 1 ;
2837
            }
2838
        }
2839
        else if(m_ireader.isEndElement())
2840
        {
2841
            if(m_ireader.name()== "FILE_INFO")
2842
            {
2843
                /*存在 FILE_INFO 标签*/
2844
                if(isFileInfoExist)
2845
                {
2846
                    return 0 ;
2847
                }
2848
                else
2849
                {
2850
                    /*不存在 FILE_INFO 开始标签*/
2851
                    qDebug() << "There is not label \"FILE_INFO\"'s StartElement !" ;
2852
                    return 1 ;
2853
                }
2854
            }
2855
            else
2856
            {
2857
                qDebug() << "readFileInfo: The log file is not complete!" ;
2858
                return 1 ;
2859
            }
2860
        }
2861
        else
2862
        {
2863
            qDebug() << "readFileInfo: the log file format is not right!";
2864
            return 1 ;
2865
        }
2866
    }
2867
    return 0 ;
2868
}
2869
 
2870
 
2871
int EziDebugPrj::readFileStructure(char readflag)
2872
{
2873
    // 过程中只能遇到三种类型的 xml 标签
2874
    QString  ifileName ;
2875
    QDateTime idateTime ;
2876
    QDate idate ;
2877
    QTime itime ;
2878
    QStringList imoduleList ;
2879
    bool  isFileStructureInfoExist = 0 ;
2880
    int   nfileStructureInfoCount = 0 ;
2881
 
2882
    /*读取下一个有效的开始 标签*/
2883
    m_ireader.readNext();
2884
    while(!m_ireader.atEnd())
2885
    {
2886
        if(m_ireader.isStartElement())
2887
        {
2888
            if(m_ireader.name() == "file")
2889
            {
2890
                isFileStructureInfoExist = 1 ;
2891
                nfileStructureInfoCount++ ;
2892
                if(m_ireader.attributes().value("filename").isEmpty())
2893
                {
2894
                    return 1 ;
2895
                }
2896
 
2897
                if(m_ireader.attributes().value("modify_date").isEmpty())
2898
                {
2899
                    return 1 ;
2900
                }
2901
 
2902
                if(m_ireader.attributes().value("modify_time").isEmpty())
2903
                {
2904
                    return 1 ;
2905
                }
2906
 
2907
                if(m_ireader.attributes().value("module_array").isEmpty())
2908
                {
2909
                    return 1 ;
2910
                }
2911
 
2912
                ifileName = m_ireader.attributes().value("filename").toString();
2913
                imoduleList = m_ireader.attributes().value("filename").toString().split(QRegExp("\\s+"));
2914
                QStringList idateList = m_ireader.attributes().value("modify_date").toString().split("/") ;
2915
                QStringList itimeList = m_ireader.attributes().value("modify_time").toString().split(":") ;
2916
 
2917
                idate = QDate(idateList.at(2).toInt(),idateList.at(0).toInt(),idateList.at(1).toInt()) ;
2918
                itime = QTime(itimeList.at(0).toInt(),itimeList.at(1).toInt(),itimeList.at(2).toInt()) ;
2919
 
2920
                idateTime = QDateTime(idate,itime) ;
2921
                if((ifileName.endsWith(".v",Qt::CaseSensitive))&&(readflag|READ_FILE_INFO))
2922
                {
2923
                    /*创建文件对象指针 并加入工程对象的文件map中*/
2924
                    EziDebugVlgFile * pvlgFileObj = new EziDebugVlgFile(ifileName,idateTime,imoduleList);
2925
                    m_ivlgFileMap.insert(ifileName,pvlgFileObj);
2926
                    m_ireader.readNext() ;
2927
                }
2928
                else if((ifileName.endsWith(".vhd",Qt::CaseSensitive))&&(readflag|READ_FILE_INFO))
2929
                {
2930
                    /*创建文件对象指针 并加入工程对象的文件map中*/
2931
                    EziDebugVhdlFile * pvlgFileObj = new EziDebugVhdlFile(ifileName,idateTime,imoduleList);
2932
                    m_ivhdlFileMap.insert(ifileName,pvlgFileObj);
2933
                    m_ireader.readNext() ;
2934
                }
2935
                else
2936
                {
2937
                    qDebug() << "The log file format is not right(the source code file type is not right)!";
2938
                    return 1 ;
2939
                }
2940
            }
2941
            else
2942
            {
2943
                qDebug() << "the log file is not complete!";
2944
                return 1 ;
2945
            }
2946
        }
2947
        else if(m_ireader.isEndElement())
2948
        {
2949
            if(m_ireader.name() == "file")
2950
            {
2951
                if(1 == isFileStructureInfoExist)
2952
                {
2953
                    m_ireader.readNext();
2954
                    isFileStructureInfoExist = 0 ;
2955
                }
2956
                else
2957
                {
2958
                    qDebug() << "The Label File Has No endElement!" ;
2959
                    return 1 ;
2960
                }
2961
            }
2962
            else if(m_ireader.name() == "FILE_INFO")
2963
            {
2964
                if(!nfileStructureInfoCount)
2965
                {
2966
                    qDebug() << "there is not file info exist!" ;
2967
                    return 1 ;
2968
                }
2969
                else
2970
                {
2971
                    return 0 ;
2972
                }
2973
            }
2974
            else
2975
            {
2976
                qDebug() << "end element is not completed";
2977
                return 1 ;
2978
            }
2979
        }
2980
        else if(m_ireader.isCharacters())
2981
        {
2982
            QRegExp icomExp("\\s+");
2983
            if(icomExp.exactMatch(m_ireader.text().toString()))
2984
            {
2985
                m_ireader.readNext();
2986
            }
2987
            else
2988
            {
2989
                qDebug() << "the log file's format is not right!";
2990
                return 1 ;
2991
            }
2992
        }
2993
        else
2994
        {
2995
            qDebug() << "the log file is not right!";
2996
            return 1 ;
2997
        }
2998
    }
2999
    return 0 ;
3000
}
3001
 
3002
int EziDebugPrj::readModuleInfo(char readflag)
3003
{
3004
    // 过程中只能遇到三种类型的 xml 标签
3005
    bool  isModuleInfoExist = 0 ;
3006
 
3007
    /*读取下一个有效的开始 标签*/
3008
    m_ireader.readNext();
3009
    while(!m_ireader.atEnd())
3010
    {
3011
        if(m_ireader.isStartElement())
3012
        {
3013
            if(m_ireader.name() == "MODULE_INFO")
3014
            {
3015
                /*继续读取 文件信息*/
3016
                isModuleInfoExist = 1 ;
3017
                /*读取topmodule信息*/
3018
                if(m_ireader.attributes().value("topmodule").isEmpty())
3019
                {
3020
                    qDebug()<< "readModuleInfo: There is no top Module in the log file! ";
3021
                    return 1 ;
3022
                }
3023
                else
3024
                {
3025
                    // 从默认路径下恢复 数据结构时  需要topmodule ,正常流程下 topmodule 会一致么 ?
3026
                    if(m_ireader.attributes().value("topmodule").toString() != m_itopModule)
3027
                    {
3028
                        //重新设置topmodule
3029
                        qDebug()<< "readModuleInfo: The topmodule in log file is not agree with QSF file";
3030
                        return 1 ;
3031
                    }
3032
                }
3033
                if(readModuleStructure(readflag))
3034
                    return 1 ;
3035
                m_ireader.readNext();
3036
            }
3037
            else
3038
            {
3039
                qDebug() << "the log file is not complete!";
3040
                return 1 ;
3041
            }
3042
        }
3043
        else if(m_ireader.isCharacters())
3044
        {
3045
            QRegExp icomExp("\\s+");
3046
            if(icomExp.exactMatch(m_ireader.text().toString()))
3047
            {
3048
                m_ireader.readNext();
3049
            }
3050
            else
3051
            {
3052
                qDebug() << "the log file's format is not right!";
3053
                return 1 ;
3054
            }
3055
        }
3056
        else if(m_ireader.isEndElement())
3057
        {
3058
            if(m_ireader.name()== "MODULE_INFO")
3059
            {
3060
                /*存在 MODULE_INFO 标签*/
3061
                if(isModuleInfoExist)
3062
                {
3063
                    return 0 ;
3064
                }
3065
                else
3066
                {
3067
                    /*不存在 MODULE_INFO 开始标签*/
3068
                    qDebug() << "The Label \"MODULE_INFO\" Has no StartElement !" ;
3069
                    return 1 ;
3070
                }
3071
            }
3072
            else
3073
            {
3074
                qDebug() << "readModuleInfo: The log file is not complete!" ;
3075
                return 1 ;
3076
            }
3077
        }
3078
        else
3079
        {
3080
            qDebug() << "readModuleInfo: the log file format is not right!";
3081
            return 1 ;
3082
        }
3083
    }
3084
    return 0 ;
3085
}
3086
 
3087
int EziDebugPrj::readModuleStructure(char readflag)
3088
{
3089
    // 过程中只能遇到三种类型的 xml 标签
3090
    QString imoduleName ;
3091
 
3092
//    QStringList iclockNameList ;
3093
 
3094
//    EziDebugModule::RegStructure* preg ;
3095
//    EziDebugModule::PortStructure *pport ;
3096
 
3097
    EziDebugModule * pmoduleObj = NULL ;
3098
 
3099
    bool  isModuleStructureInfoExist = 0 ;
3100
    int   nModuleStructureInfoCount = 0 ;
3101
 
3102
 
3103
    /*读取下一个有效的开始 标签*/
3104
    m_ireader.readNext();
3105
    while(!m_ireader.atEnd())
3106
    {
3107
        if(m_ireader.isStartElement())
3108
        {
3109
            if(m_ireader.name() == "module")
3110
            {
3111
                isModuleStructureInfoExist = 1 ;
3112
                nModuleStructureInfoCount++ ;
3113
 
3114
                if(m_ireader.attributes().value("name").isEmpty())
3115
                {
3116
                    return 1 ;
3117
                }
3118
 
3119
                /*
3120
                if(m_ireader.attributes().value("appearance_count").isEmpty())
3121
                {
3122
                    return 1 ;
3123
                }
3124
                */
3125
                if(m_ireader.attributes().value("lib_core").isEmpty())
3126
                {
3127
                    return 1 ;
3128
                }
3129
 
3130
                if(m_ireader.attributes().value("file_name").isEmpty())
3131
                {
3132
                    return 1 ;
3133
                }
3134
 
3135
                if(m_ireader.attributes().value("array_name").isEmpty())
3136
                {
3137
                    return 1 ;
3138
                }
3139
 
3140
                if(readflag & READ_MODULE_INFO)
3141
                {
3142
                    /*创建module对象指针 并加入工程对象的module map中*/
3143
                    imoduleName = m_ireader.attributes().value("name").toString();
3144
 
3145
                    EziDebugModule *ptempModuleObj = new EziDebugModule(imoduleName);
3146
                    if(!ptempModuleObj)
3147
                        return 1 ;
3148
                    pmoduleObj = ptempModuleObj ;
3149
 
3150
                    m_imoduleMap.insert(imoduleName,ptempModuleObj);
3151
                    ptempModuleObj->m_imoduleName       = m_ireader.attributes().value("name").toString();
3152
                    //ptempModuleObj->m_ninstanceTimes   = static_cast<bool>(m_ireader.attributes().value("appearance_count").toString().toInt()) ;
3153
                    ptempModuleObj->m_isLibaryCore      = (m_ireader.attributes().value("lib_core").toString().toLower() == "yes") ;
3154
                    ptempModuleObj->m_ilocatedFile      = m_ireader.attributes().value("file_name").toString() ;
3155
                    ptempModuleObj->m_iinstanceNameList = m_ireader.attributes().value("file_name").toString().split("|");
3156
 
3157
                }
3158
 
3159
                if(!readClockDescription(readflag , pmoduleObj))
3160
                {
3161
                    if(!readRegDescription(readflag , pmoduleObj))
3162
                    {
3163
                        if(!readPortDescription(readflag , pmoduleObj))
3164
                        {
3165
                            m_ireader.readNext();
3166
                        }
3167
                        else
3168
                        {
3169
                            if(pmoduleObj)
3170
                            {
3171
                                delete pmoduleObj ;
3172
                                pmoduleObj = NULL ;
3173
                                qDebug() << "after readPortDescription ,There is no memory left !";
3174
                                return 1 ;
3175
                            }
3176
                        }
3177
                    }
3178
                    else
3179
                    {
3180
                        if(pmoduleObj)
3181
                        {
3182
                            delete pmoduleObj ;
3183
                            pmoduleObj = NULL ;
3184
                            qDebug() << "after readRegDescription ,There is no memory left !";
3185
                            return 1 ;
3186
                        }
3187
                    }
3188
                }
3189
                else
3190
                {
3191
                    if(pmoduleObj)
3192
                    {
3193
                        delete pmoduleObj ;
3194
                        pmoduleObj = NULL ;
3195
                        qDebug() << "after readClockDescription ,There is no memory left !";
3196
                        return 1 ;
3197
                    }
3198
 
3199
                }
3200
            }
3201
            else
3202
            {
3203
                qDebug() << "readModuleStructure:The Label module is not complete!";
3204
                return 1 ;
3205
            }
3206
        }
3207
        else if(m_ireader.isEndElement())
3208
        {
3209
            if(m_ireader.name() == "module")
3210
            {
3211
                if(1 == isModuleStructureInfoExist)
3212
                {
3213
                    m_ireader.readNext();
3214
                    isModuleStructureInfoExist = 0 ;
3215
                }
3216
                else
3217
                {
3218
                    qDebug() << "readModuleStructure:The Label File Has No endElement!" ;
3219
                    return 1 ;
3220
                }
3221
            }
3222
            else if(m_ireader.name() == "FILE_INFO")
3223
            {
3224
                if(!isModuleStructureInfoExist)
3225
                {
3226
                    qDebug() << "readModuleStructure:there is not file info exist!" ;
3227
                    return 1 ;
3228
                }
3229
                else
3230
                {
3231
                    return 0 ;
3232
                }
3233
            }
3234
            else
3235
            {
3236
                qDebug() << "readModuleStructure:end element is not completed";
3237
                return 1 ;
3238
            }
3239
        }
3240
        else if(m_ireader.isCharacters())
3241
        {
3242
            QRegExp icomExp("\\s+");
3243
            if(icomExp.exactMatch(m_ireader.text().toString()))
3244
            {
3245
                m_ireader.readNext();
3246
            }
3247
            else
3248
            {
3249
                qDebug() << "readModuleStructure:the log file's format is not right!";
3250
                return 1 ;
3251
            }
3252
        }
3253
        else
3254
        {
3255
            qDebug() << "readModuleStructure:the log file is not right!";
3256
            return 1 ;
3257
        }
3258
    }
3259
    return 0 ;
3260
}
3261
 
3262
int EziDebugPrj::readClockDescription(char readflag, EziDebugModule* module)
3263
{
3264
    bool  isClockDescriptionMarkExist = 0 ;
3265
    /*读取下一个有效的开始 标签*/
3266
    m_ireader.readNext();
3267
    while(!m_ireader.atEnd())
3268
    {
3269
        if(m_ireader.isStartElement())
3270
        {
3271
            if(m_ireader.name() == "clock_description")
3272
            {
3273
                isClockDescriptionMarkExist = 1 ;
3274
                if(readClockStructure(readflag,module))
3275
                {
3276
                    qDebug() << "readClockDescription: ClockStructure has some problem!";
3277
                    return 1 ;
3278
                }
3279
            }
3280
        }
3281
        else if(m_ireader.isEndElement())
3282
        {
3283
            if(m_ireader.name() == "clock_description")
3284
            {
3285
                if(1 == isClockDescriptionMarkExist)
3286
                {
3287
                    return 0 ;
3288
                }
3289
                else
3290
                {
3291
                    qDebug() << "readClockDescription:The Label clock_description Has No StartElement!" ;
3292
                    return 1 ;
3293
                }
3294
            }
3295
            else
3296
            {
3297
                qDebug() << "readClockDescription:The Label clock_description Has No EndElement!";
3298
                return 1 ;
3299
            }
3300
        }
3301
        else if(m_ireader.isCharacters())
3302
        {
3303
            QRegExp icomExp("\\s+");
3304
            if(icomExp.exactMatch(m_ireader.text().toString()))
3305
            {
3306
                m_ireader.readNext();
3307
            }
3308
            else
3309
            {
3310
                qDebug() << "readClockDescription:the log file's format is not right!";
3311
                return 1 ;
3312
            }
3313
        }
3314
        else
3315
        {
3316
            qDebug() << "readClockDescription:the log file is not right!";
3317
            return 1 ;
3318
        }
3319
    }
3320
    return 0 ;
3321
}
3322
 
3323
int EziDebugPrj::readClockStructure(char readflag, EziDebugModule* module)
3324
{
3325
    // 过程中只能遇到三种类型的 xml 标签
3326
    bool  isClockStructureInfoExist = 0 ;
3327
    int   nclockStructureInfoCount = 0 ;
3328
    /*读取下一个有效的开始 标签*/
3329
    m_ireader.readNext();
3330
    while(!m_ireader.atEnd())
3331
    {
3332
        if(m_ireader.isStartElement())
3333
        {
3334
            if(m_ireader.name() == "clock")
3335
            {
3336
                isClockStructureInfoExist = 1 ;
3337
                nclockStructureInfoCount++ ;
3338
 
3339
                if(m_ireader.attributes().value("clock_name").isEmpty())
3340
                {
3341
                    return 1 ;
3342
                }
3343
 
3344
                if(m_ireader.attributes().value("polarity").isEmpty())
3345
                {
3346
                    return 1 ;
3347
                }
3348
 
3349
                if(!(m_ireader.attributes().value("polarity").toString().toLower().compare("posedge")\
3350
                     &m_ireader.attributes().value("polarity").toString().toLower().compare("negedge")))
3351
                {
3352
                    return 1 ;
3353
                }
3354
 
3355
                if(readflag & READ_MODULE_INFO)
3356
                {
3357
                    if(module)
3358
                    {
3359
 
3360
                        QString iclockName  = m_ireader.attributes().value("clock_name").toString();
3361
                        module->m_iclockMap.insert(iclockName,m_ireader.attributes().value("polarity").toString());
3362
                    }
3363
                    else
3364
                    {
3365
                        qDebug() << "readClockStructure: NULL Pointer!";
3366
                        return 1 ;
3367
                    }
3368
 
3369
                }
3370
                m_ireader.readNext();
3371
            }
3372
            else
3373
            {
3374
                qDebug() << "the log file is not complete!";
3375
                return 1 ;
3376
            }
3377
        }
3378
        else if(m_ireader.isEndElement())
3379
        {
3380
            if(m_ireader.name() == "clock")
3381
            {
3382
                if(1 == isClockStructureInfoExist)
3383
                {
3384
                    m_ireader.readNext();
3385
                    isClockStructureInfoExist = 0 ;
3386
                }
3387
                else
3388
                {
3389
                    qDebug() << "The Label clock Has No StartElement!" ;
3390
                    return 1 ;
3391
                }
3392
            }
3393
            else if(m_ireader.name() == "clock_description")
3394
            {
3395
                if(!nclockStructureInfoCount)
3396
                {
3397
                    qDebug() << "there is not clock structure info exist!" ;
3398
                    return 1 ;
3399
                }
3400
                else
3401
                {
3402
                    return 0 ;
3403
                }
3404
            }
3405
            else
3406
            {
3407
                qDebug() << "end element is not completed";
3408
                return 1 ;
3409
            }
3410
        }
3411
        else if(m_ireader.isCharacters())
3412
        {
3413
            QRegExp icomExp("\\s+");
3414
            if(icomExp.exactMatch(m_ireader.text().toString()))
3415
            {
3416
                m_ireader.readNext();
3417
            }
3418
            else
3419
            {
3420
                qDebug() << "the log file's format is not right!";
3421
                return 1 ;
3422
            }
3423
        }
3424
        else
3425
        {
3426
            qDebug() << "the log file is not right!";
3427
            return 1 ;
3428
        }
3429
    }
3430
    return 0 ;
3431
}
3432
 
3433
int EziDebugPrj::readRegDescription(char readflag , EziDebugModule* module)
3434
{
3435
    bool  isRegDescriptionMarkExist = 0 ;
3436
    /*读取下一个有效的开始 标签*/
3437
    m_ireader.readNext();
3438
    while(!m_ireader.atEnd())
3439
    {
3440
        if(m_ireader.isStartElement())
3441
        {
3442
            if(m_ireader.name() == "reg_description")
3443
            {
3444
                isRegDescriptionMarkExist = 1 ;
3445
                if(readRegStructure(readflag,module))
3446
                {
3447
                    qDebug() << "readRegDescription: readRegStructure has some problem!";
3448
                    return 1 ;
3449
                }
3450
            }
3451
        }
3452
        else if(m_ireader.isEndElement())
3453
        {
3454
            if(m_ireader.name() == "reg_description")
3455
            {
3456
                if(1 == isRegDescriptionMarkExist)
3457
                {
3458
                    return 0 ;
3459
                }
3460
                else
3461
                {
3462
                    qDebug() << "readRegDescription:The Label reg_description Has No StartElement!" ;
3463
                    return 1 ;
3464
                }
3465
            }
3466
            else
3467
            {
3468
                qDebug() << "readRegDescription:The Label reg_description Has No EndElement!";
3469
                return 1 ;
3470
            }
3471
        }
3472
        else if(m_ireader.isCharacters())
3473
        {
3474
            QRegExp icomExp("\\s+");
3475
            if(icomExp.exactMatch(m_ireader.text().toString()))
3476
            {
3477
                m_ireader.readNext();
3478
            }
3479
            else
3480
            {
3481
                qDebug() << "readClockDescription:the log file's format is not right!";
3482
                return 1 ;
3483
            }
3484
        }
3485
        else
3486
        {
3487
            qDebug() << "readClockDescription:the log file is not right!";
3488
            return 1 ;
3489
        }
3490
    }
3491
    return 0 ;
3492
}
3493
 
3494
int EziDebugPrj::readRegStructure(char readflag , EziDebugModule* module)
3495
{
3496
    // 过程中只能遇到三种类型的 xml 标签
3497
    bool  isRegStructureInfoExist = 0 ;
3498
    int   nregStructureInfoCount = 0 ;
3499
    /*读取下一个有效的开始 标签*/
3500
    m_ireader.readNext();
3501
    while(!m_ireader.atEnd())
3502
    {
3503
        if(m_ireader.isStartElement())
3504
        {
3505
            if(m_ireader.name() == "reg")
3506
            {
3507
                isRegStructureInfoExist = 1 ;
3508
                nregStructureInfoCount++ ;
3509
 
3510
                if(m_ireader.attributes().value("module_name").isEmpty())
3511
                {
3512
                    return 1 ;
3513
                }
3514
 
3515
                if(m_ireader.attributes().value("locate_clock").isEmpty())
3516
                {
3517
                    return 1 ;
3518
                }
3519
 
3520
                if(m_ireader.attributes().value("reg_name").isEmpty())
3521
                {
3522
                    return 1 ;
3523
                }
3524
 
3525
                if(m_ireader.attributes().value("bitwidth").isEmpty())
3526
                {
3527
                    return 1 ;
3528
                }
3529
 
3530
                if(m_ireader.attributes().value("regnum").isEmpty())
3531
                {
3532
                    return 1 ;
3533
                }
3534
 
3535
                if(m_ireader.attributes().value("endian").isEmpty())
3536
                {
3537
                    return 1 ;
3538
                }
3539
 
3540
                if(!(m_ireader.attributes().value("endian").toString().toLower().compare("little")\
3541
                     &m_ireader.attributes().value("endian").toString().toLower().compare("big")))
3542
                {
3543
                    return 1 ;
3544
                }
3545
 
3546
                if(readflag & READ_MODULE_INFO)
3547
                {
3548
                    if(module)
3549
                    {
3550
                        EziDebugModule::RegStructure * preg= new EziDebugModule::RegStructure ;
3551
//                      preg->m_isEndian     = static_cast<bool>(m_ireader.attributes().value("endian").toString().toLower().compare("little"));
3552
 
3553
                        memcpy(preg->m_pMouduleName,m_ireader.attributes().value("module_name").toString().toAscii().data(),sizeof(preg->m_pMouduleName));
3554
                        memcpy(preg->m_pRegName,m_ireader.attributes().value("reg_name").toString().toAscii().data(),sizeof(preg->m_pRegName));
3555
 
3556
//                      preg->m_unBitWidth   = m_ireader.attributes().value("bitwidth").toString().toInt();
3557
                        preg->m_unRegNum     = m_ireader.attributes().value("regnum").toString().toInt();
3558
                        QString iclockName   = m_ireader.attributes().value("locate_clock").toString();
3559
                        QVector<EziDebugModule::RegStructure*> iregStructureVec = module->m_iregMap.value(iclockName) ;
3560
                        iregStructureVec.append(preg);
3561
                        module->m_iregMap.insert(iclockName,iregStructureVec);
3562
                    }
3563
                    else
3564
                    {
3565
                        qDebug() << "readRegStructure: NULL Pointer!";
3566
                        return 1 ;
3567
                    }
3568
                }
3569
                m_ireader.readNext();
3570
            }
3571
            else
3572
            {
3573
                qDebug() << "readRegStructure: the log file is not complete!(There is no reg)";
3574
                return 1 ;
3575
            }
3576
        }
3577
        else if(m_ireader.isEndElement())
3578
        {
3579
            if(m_ireader.name() == "reg")
3580
            {
3581
                if(1 == isRegStructureInfoExist)
3582
                {
3583
                    m_ireader.readNext();
3584
                    isRegStructureInfoExist = 0 ;
3585
                }
3586
                else
3587
                {
3588
                    qDebug() << "The Label reg Has No StartElement!" ;
3589
                    return 1 ;
3590
                }
3591
            }
3592
            else if(m_ireader.name() == "reg_description")
3593
            {
3594
                if(!nregStructureInfoCount)
3595
                {
3596
                    qDebug() << "there is not reg structure info exist!" ;
3597
                    return 1 ;
3598
                }
3599
                else
3600
                {
3601
                    return 0 ;
3602
                }
3603
            }
3604
            else
3605
            {
3606
                qDebug() << "end element is not completed";
3607
                return 1 ;
3608
            }
3609
        }
3610
        else if(m_ireader.isCharacters())
3611
        {
3612
            QRegExp icomExp("\\s+");
3613
            if(icomExp.exactMatch(m_ireader.text().toString()))
3614
            {
3615
                m_ireader.readNext();
3616
            }
3617
            else
3618
            {
3619
                qDebug() << "the log file's format is not right!";
3620
                return 1 ;
3621
            }
3622
        }
3623
        else
3624
        {
3625
            qDebug() << "the log file is not right!";
3626
            return 1 ;
3627
        }
3628
    }
3629
    return 0 ;
3630
}
3631
 
3632
 
3633
int EziDebugPrj::readPortDescription(char readflag , EziDebugModule* module)
3634
{
3635
    bool  isPortDescriptionMarkExist = 0 ;
3636
    /*读取下一个有效的开始 标签*/
3637
    m_ireader.readNext();
3638
    while(!m_ireader.atEnd())
3639
    {
3640
        if(m_ireader.isStartElement())
3641
        {
3642
            if(m_ireader.name() == "port_description")
3643
            {
3644
                isPortDescriptionMarkExist = 1 ;
3645
                if(readPortStructure(readflag,module))
3646
                {
3647
                    qDebug() << "readPortDescription: readPortStructure has some problem!";
3648
                    return 1 ;
3649
                }
3650
            }
3651
        }
3652
        else if(m_ireader.isEndElement())
3653
        {
3654
            if(m_ireader.name() == "port_description")
3655
            {
3656
                if(1 == isPortDescriptionMarkExist)
3657
                {
3658
                    return 0 ;
3659
                }
3660
                else
3661
                {
3662
                    qDebug() << "readPortDescription:The Label port_description Has No StartElement!" ;
3663
                    return 1 ;
3664
                }
3665
            }
3666
            else
3667
            {
3668
                qDebug() << "readPortDescription:The Label port_description Has No EndElement!";
3669
                return 1 ;
3670
            }
3671
        }
3672
        else if(m_ireader.isCharacters())
3673
        {
3674
            QRegExp icomExp("\\s+");
3675
            if(icomExp.exactMatch(m_ireader.text().toString()))
3676
            {
3677
                m_ireader.readNext();
3678
            }
3679
            else
3680
            {
3681
                qDebug() << "readPortDescription:the log file's format is not right!";
3682
                return 1 ;
3683
            }
3684
        }
3685
        else
3686
        {
3687
            qDebug() << "readPortDescription:the log file is not right!";
3688
            return 1 ;
3689
        }
3690
    }
3691
    return 0 ;
3692
}
3693
 
3694
int EziDebugPrj::readPortStructure(char readflag , EziDebugModule* module)
3695
{
3696
    // 过程中只能遇到三种类型的 xml 标签
3697
    bool  isPortStructureInfoExist = 0 ;
3698
    int   nPortStructureInfoCount = 0 ;
3699
    /*读取下一个有效的开始 标签*/
3700
    m_ireader.readNext();
3701
    while(!m_ireader.atEnd())
3702
    {
3703
        if(m_ireader.isStartElement())
3704
        {
3705
            if(m_ireader.name() == "reg")
3706
            {
3707
                isPortStructureInfoExist = 1 ;
3708
                nPortStructureInfoCount++ ;
3709
 
3710
                if(m_ireader.attributes().value("port_name").isEmpty())
3711
                {
3712
                    return 1 ;
3713
                }
3714
 
3715
                if(m_ireader.attributes().value("module_name").isEmpty())
3716
                {
3717
                    return 1 ;
3718
                }
3719
 
3720
                if(m_ireader.attributes().value("direction_type").isEmpty())
3721
                {
3722
                    return 1 ;
3723
                }
3724
 
3725
                if(m_ireader.attributes().value("bitwidth").isEmpty())
3726
                {
3727
                    return 1 ;
3728
                }
3729
 
3730
                if(m_ireader.attributes().value("endian").isEmpty())
3731
                {
3732
                    return 1 ;
3733
                }
3734
 
3735
                if(!(m_ireader.attributes().value("endian").toString().toLower().compare("little")\
3736
                     &m_ireader.attributes().value("endian").toString().toLower().compare("big")))
3737
                {
3738
                    return 1 ;
3739
                }
3740
 
3741
                if(!(m_ireader.attributes().value("direction_type").toString().toLower().compare("in")\
3742
                     &m_ireader.attributes().value("direction_type").toString().toLower().compare("out")))
3743
                {
3744
                    return 1 ;
3745
                }
3746
 
3747
                if(readflag & READ_MODULE_INFO)
3748
                {
3749
                    if(module)
3750
                    {
3751
                        EziDebugModule::PortStructure * pport= new EziDebugModule::PortStructure ;
3752
                        // pport->m_isEndian     = static_cast<bool>(m_ireader.attributes().value("endian").toString().toLower().compare("little"));
3753
 
3754
                        //pport->m_pModuleName = m_ireader.attributes().value("module_name").toString().toAscii().data();
3755
                        memcpy(pport->m_pModuleName,m_ireader.attributes().value("module_name").toString().toAscii().data(),m_ireader.attributes().value("module_name").size()+1);
3756
 
3757
                        if(m_ireader.attributes().value("direction_type").toString().toLower() == "in")
3758
                        {
3759
                            pport->eDirectionType =  EziDebugModule::directionTypeInput ;
3760
                        }
3761
                        else if(m_ireader.attributes().value("direction_type").toString().toLower() == "out")
3762
                        {
3763
                             pport->eDirectionType =  EziDebugModule::directionTypeInput ;
3764
                        }
3765
                        else
3766
                        {
3767
                            delete pport ;
3768
                            return 1 ;
3769
                        }
3770
                        pport->m_unBitwidth   = m_ireader.attributes().value("bitwidth").toString().toInt();
3771
                        //pport->m_pPortName     = m_ireader.attributes().value("regnum").toString().toAscii().data();
3772
                        memcpy(pport->m_pPortName,m_ireader.attributes().value("regnum").toString().toAscii().data(),m_ireader.attributes().value("regnum").size()+1);
3773
 
3774
                        if(pport)
3775
                        {
3776
                            module->m_iportVec.append(pport);
3777
                        }
3778
                        else
3779
                        {
3780
                            return 1 ;
3781
                        }
3782
                    }
3783
                    else
3784
                    {
3785
                        qDebug() << "readPortStructure: NULL Pointer!";
3786
                        return 1 ;
3787
                    }
3788
                }
3789
                m_ireader.readNext();
3790
            }
3791
            else
3792
            {
3793
                qDebug() << "readPortStructure: the log file is not complete!(There is no reg)";
3794
                return 1 ;
3795
            }
3796
        }
3797
        else if(m_ireader.isEndElement())
3798
        {
3799
            if(m_ireader.name() == "port")
3800
            {
3801
                if(1 == isPortStructureInfoExist)
3802
                {
3803
                    m_ireader.readNext();
3804
                    isPortStructureInfoExist = 0 ;
3805
                }
3806
                else
3807
                {
3808
                    qDebug() << "The Label port Has No StartElement!" ;
3809
                    return 1 ;
3810
                }
3811
            }
3812
            else if(m_ireader.name() == "port_description")
3813
            {
3814
                if(!nPortStructureInfoCount)
3815
                {
3816
                    qDebug() << "there is not port structure info exist!" ;
3817
                    return 1 ;
3818
                }
3819
                else
3820
                {
3821
                    return 0 ;
3822
                }
3823
            }
3824
            else
3825
            {
3826
                qDebug() << "end element is not completed";
3827
                return 1 ;
3828
            }
3829
        }
3830
        else if(m_ireader.isCharacters())
3831
        {
3832
            QRegExp icomExp("\\s+");
3833
            if(icomExp.exactMatch(m_ireader.text().toString()))
3834
            {
3835
                m_ireader.readNext();
3836
            }
3837
            else
3838
            {
3839
                qDebug() << "the log file's format is not right!";
3840
                return 1 ;
3841
            }
3842
        }
3843
        else
3844
        {
3845
            qDebug() << "the log file is not right!";
3846
            return 1 ;
3847
        }
3848
    }
3849
 
3850
 
3851
    return 0 ;
3852
}
3853
 
3854
 
3855
int EziDebugPrj::readScanChainInfo(char readflag)
3856
{
3857
    // 过程中只能遇到三种类型的 xml 标签
3858
    QString  ifileName ;
3859
    QDateTime idateTime ;
3860
    QDate idate ;
3861
    QTime itime ;
3862
    QStringList imoduleList ;
3863
    bool  isFileStructureInfoExist = 0 ;
3864
    int   nfileStructureInfoCount = 0 ;
3865
    m_ireader.readNext();
3866
    /*读取下一个有效的开始 标签*/
3867
    while(!m_ireader.atEnd())
3868
    {
3869
        if(m_ireader.isStartElement())
3870
        {
3871
            if(m_ireader.name() == "file")
3872
            {
3873
                isFileStructureInfoExist = 1 ;
3874
                nfileStructureInfoCount++ ;
3875
                if(m_ireader.attributes().value("filename").isEmpty())
3876
                {
3877
                    return 1 ;
3878
                }
3879
 
3880
                if(m_ireader.attributes().value("modify_date").isEmpty())
3881
                {
3882
                    return 1 ;
3883
                }
3884
 
3885
                if(m_ireader.attributes().value("modify_time").isEmpty())
3886
                {
3887
                    return 1 ;
3888
                }
3889
 
3890
                if(m_ireader.attributes().value("module_array").isEmpty())
3891
                {
3892
                    return 1 ;
3893
                }
3894
 
3895
                ifileName = m_ireader.attributes().value("filename").toString();
3896
                imoduleList = m_ireader.attributes().value("filename").toString().split(QRegExp("\\s+"));
3897
                QStringList idateList = m_ireader.attributes().value("modify_date").toString().split("/") ;
3898
                QStringList itimeList = m_ireader.attributes().value("modify_time").toString().split(":") ;
3899
 
3900
                idate = QDate(idateList.at(2).toInt(),idateList.at(0).toInt(),idateList.at(1).toInt()) ;
3901
                itime = QTime(itimeList.at(0).toInt(),itimeList.at(1).toInt(),itimeList.at(2).toInt()) ;
3902
 
3903
                idateTime = QDateTime(idate,itime) ;
3904
                if((ifileName.endsWith(".v",Qt::CaseSensitive))&&(readflag|READ_FILE_INFO))
3905
                {
3906
                    /*创建文件对象指针 并加入工程对象的文件map中*/
3907
                    EziDebugVlgFile * pvlgFileObj = new EziDebugVlgFile(ifileName,idateTime,imoduleList);
3908
                    m_ivlgFileMap.insert(ifileName,pvlgFileObj);
3909
                    continue ;
3910
                }
3911
                else if((ifileName.endsWith(".vhd",Qt::CaseSensitive))&&(readflag|READ_FILE_INFO))
3912
                {
3913
                    /*创建文件对象指针 并加入工程对象的文件map中*/
3914
                    EziDebugVhdlFile * pvlgFileObj = new EziDebugVhdlFile(ifileName,idateTime,imoduleList);
3915
                    m_ivhdlFileMap.insert(ifileName,pvlgFileObj);
3916
                    continue ;
3917
                }
3918
                else
3919
                {
3920
                    qDebug() << "The log file format is not right(the source code file type is not right)!";
3921
                    return 1 ;
3922
                }
3923
            }
3924
            else
3925
            {
3926
                qDebug() << "the log file is not complete!";
3927
                return 1 ;
3928
            }
3929
        }
3930
        else if(m_ireader.isEndElement())
3931
        {
3932
            if(m_ireader.name() == "file")
3933
            {
3934
                if(1 == isFileStructureInfoExist)
3935
                {
3936
                    m_ireader.readNext();
3937
                    isFileStructureInfoExist = 0 ;
3938
                }
3939
                else
3940
                {
3941
                    qDebug() << "The Label File Has No endElement!" ;
3942
                    return 1 ;
3943
                }
3944
            }
3945
            else if(m_ireader.name() == "FILE_INFO")
3946
            {
3947
                if(!nfileStructureInfoCount)
3948
                {
3949
                    qDebug() << "there is not file info exist!" ;
3950
                    return 1 ;
3951
                }
3952
                else
3953
                {
3954
                    return 0 ;
3955
                }
3956
            }
3957
            else
3958
            {
3959
                qDebug() << "end element is not completed";
3960
                return 1 ;
3961
            }
3962
        }
3963
        else if(m_ireader.isCharacters())
3964
        {
3965
            QRegExp icomExp("\\s+");
3966
            if(icomExp.exactMatch(m_ireader.text().toString()))
3967
            {
3968
                m_ireader.readNext();
3969
            }
3970
            else
3971
            {
3972
                qDebug() << "the log file's format is not right!";
3973
                return 1 ;
3974
            }
3975
        }
3976
        else
3977
        {
3978
            qDebug() << "the log file is not right!";
3979
            return 1 ;
3980
        }
3981
    }
3982
    return 0 ;
3983
}
3984
 
3985
/*检测 log 文件 是否 OK */
3986
int EziDebugPrj::detectLogFile(char nreadFlag)
3987
{
3988
            QFile file(m_ilogFileName);
3989
 
3990
        #ifdef Parse_by_QXmlStreamReader
3991
            bool  isFileMarkExist = 0 ;
3992
        #endif
3993
 
3994
            if (!file.open(QFile::ReadOnly | QFile::Text))
3995
            {
3996
                qDebug() << "Error: Cannot read file " << qPrintable(m_ilogFileName) \
3997
                          << ": " << qPrintable(file.errorString()) << __LINE__ << __FILE__;
3998
                return 1 ;
3999
            }
4000
 
4001
        #ifdef Parse_by_QDom
4002
            QString ierrorStr;
4003
            int nerrorLine;
4004
            int nerrorColumn;
4005
 
4006
            QDomDocument idoc ;
4007
            if (!idoc.setContent(&file, false, &ierrorStr, &nerrorLine,
4008
                                &nerrorColumn)) {
4009
                qDebug() << "Error: Parse error at line " << nerrorLine << ", "
4010
                          << "column " << nerrorColumn << ": "
4011
                          << qPrintable(ierrorStr) ;
4012
                return 1 ;
4013
            }
4014
 
4015
    QDomElement irootElement = idoc.documentElement();
4016
 
4017
    if (irootElement.tagName() != "EziDebug")
4018
    {
4019
        qDebug() << "detectLogFile Error: Not a EziDebug file" ;
4020
        return 1 ;
4021
    }
4022
 
4023
    if(domParseEziDebugElement(irootElement,nreadFlag))
4024
    {
4025
        file.close();
4026
        return 1 ;
4027
    }
4028
#endif
4029
 
4030
#ifdef Parse_by_QXmlStreamReader
4031
 
4032
    m_ireader.setDevice(&file);
4033
    m_ireader.readNext();
4034
 
4035
    while (!m_ireader.atEnd())
4036
    {
4037
        if (m_ireader.isStartElement())
4038
        {
4039
            QStringRef ielement = m_ireader.name();
4040
            QString ielementString = ielement.toString();
4041
            if (ielementString == "EZIDEBUG")
4042
            {
4043
                isFileMarkExist = 1 ;
4044
 
4045
                if(readFileInfo(nreadFlag))
4046
                {
4047
                    qDebug() << "detectLogFile: encounter some problem in readFileInfo!";
4048
                    file.close();
4049
                    return 1 ;
4050
                }
4051
                else
4052
                {
4053
                    if(readModuleInfo(nreadFlag))
4054
                    {
4055
                        qDebug() << "detectLogFile: encounter some problem in readModuleInfo!";
4056
                        file.close();
4057
                        return 1 ;
4058
                    }
4059
                    else
4060
                    {
4061
                        m_ireader.readNext();
4062
                        if(readScanChainInfo(nreadFlag))
4063
                        {
4064
                            qDebug() << "detectLogFile: encounter some problem in readScanChainInfo!";
4065
                            file.close();
4066
                            return 1 ;
4067
                        }
4068
                    }
4069
                }
4070
            }
4071
            else if(m_ireader.isEndElement())
4072
            {
4073
                if(m_ireader.name() == "EZIDEBUG")
4074
                {
4075
                    if(isFileMarkExist)
4076
                    {
4077
//                        return 0 ;
4078
                        // do nothing !
4079
                    }
4080
                    else
4081
                    {
4082
                        qDebug() << "detectLogFile: \"EZIDEBUG\" has no StartElement ";
4083
                        file.close();
4084
                        return 1 ;
4085
                    }
4086
                }
4087
                else
4088
                {
4089
                    qDebug() << "detectLogFile: This Is Not a EziDebug File!";
4090
                    file.close();
4091
                    return 1 ;
4092
                }
4093
            }
4094
            else
4095
            {
4096
                m_ireader.raiseError(QObject::tr("Not a EZIDEBUG file"));
4097
                file.close();
4098
                return 1 ;
4099
            }
4100
 
4101
        }
4102
        else if(m_ireader.isCharacters())
4103
        {
4104
            QRegExp icomExp("\\s+");
4105
            if(icomExp.exactMatch(m_ireader.text().toString()))
4106
            {
4107
                m_ireader.readNext();
4108
            }
4109
            else
4110
            {
4111
                break ;
4112
            }
4113
        }
4114
        else if(m_ireader.isStartDocument())
4115
        {
4116
            m_ireader.readNext();
4117
        }
4118
        else
4119
        {
4120
            qDebug() << "the saved logfile format is not right, needed to scan the whole prject again!" ;
4121
            file.close();
4122
            return 1 ;
4123
        }
4124
    }
4125
#endif
4126
    file.close();
4127
    return 0 ;
4128
}
4129
 
4130
int EziDebugPrj::updatePrjAllFile(const QStringList& addfilelist,const QStringList& delfilelist,const QStringList& chgfilelist,QList<LOG_FILE_INFO*>& addinfolist , QList<LOG_FILE_INFO*> &deleteinfolist ,bool updateFlag)
4131
{
4132
    int i = 0 ;
4133
    QStringList ifileList ;
4134
    ifileList = delfilelist ;
4135
    /*获取删除的文件信息*/
4136
    /*找到相应的文件对象,删除有关的结构,然后释放对象指针*/
4137
    for(; i < ifileList.count(); i++)
4138
    {
4139
 
4140
        eliminateFile(ifileList.at(i),deleteinfolist);
4141
        preupdateProgressBar(updateFlag,(10+(i/ifileList.count())*10));
4142
 
4143
    }
4144
    ifileList.clear();
4145
    ifileList = addfilelist ;
4146
    /*获取增加的文件信息*/
4147
    /*扫描新添加的文件、创建文件对象指针、加入相应的结构*/
4148
    for(i = 0 ; i < ifileList.count() ; i++)
4149
    {
4150
        preupdateProgressBar(updateFlag,(20+(i/ifileList.count())*15));
4151
 
4152
        if(addFile(ifileList.at(i),partScanType,addinfolist))
4153 4 EziDebug
        {
4154
            #if 0
4155 2 EziDebug
            QMessageBox::StandardButton rb = QMessageBox::question(NULL, tr("扫描文件错误"), tr("是否继续扫描?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
4156 4 EziDebug
                        #else
4157
            QMessageBox::StandardButton rb = QMessageBox::question(NULL, tr("EziDebug"), tr("Scan file Error , do you want to continue to scan file ?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
4158
                        #endif
4159
 
4160 2 EziDebug
            if(rb == QMessageBox::Yes)
4161
            {
4162
               ++i;
4163
               continue ;
4164
            }
4165
            else
4166
            {
4167
                return 1 ;
4168
            }
4169
        }
4170
    }
4171
 
4172
    ifileList.clear();
4173
    ifileList = chgfilelist ;
4174
    /*获取更改的文件信息*/
4175
    /*扫描被更改的文件、创建文件对象指针、加入相应的结构 */
4176
    for(i = 0 ; i < ifileList.count() ; i++)
4177
    {
4178
        QString irelativeFileName = ifileList.at(i);
4179
        if(ifileList.at(i).endsWith(".v"))
4180
        {
4181
            EziDebugVlgFile* pfile = m_ivlgFileMap.value(ifileList.at(i)) ;
4182
 
4183
            preupdateProgressBar(updateFlag,(35+(i/ifileList.count())*15));
4184
 
4185
            if(!pfile->scanFile(this,partScanType,addinfolist,deleteinfolist))
4186
            {
4187
                // 文件被修改了 需要重新保存文件日期
4188
                LOG_FILE_INFO* pdelFileInfo = new LOG_FILE_INFO ;
4189
                pdelFileInfo->etype = infoTypeFileInfo ;
4190
                pdelFileInfo->pinfo = NULL ;
4191
                memcpy(pdelFileInfo->ainfoName , irelativeFileName.toAscii().data() , irelativeFileName.size()+1);
4192
                deleteinfolist.append(pdelFileInfo);
4193
 
4194
                struct LOG_FILE_INFO* paddFileInfo = new LOG_FILE_INFO ;
4195
                paddFileInfo->etype = infoTypeFileInfo ;
4196
                paddFileInfo->pinfo = pfile ;
4197
                memcpy(paddFileInfo->ainfoName , irelativeFileName.toAscii().data(), irelativeFileName.size()+1);
4198
                addinfolist.append(paddFileInfo);
4199
            }
4200
            else
4201
            {
4202
                // 如果出错 ,提示是否继续扫描
4203 4 EziDebug
                #if 0
4204 2 EziDebug
                QMessageBox::StandardButton rb = QMessageBox::question(NULL, tr("扫描文件错误"), tr("是否继续扫描?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
4205 4 EziDebug
                #else
4206
                QMessageBox::StandardButton rb = QMessageBox::question(NULL, tr("EziDebug"), tr("Scan file Error , do you want to continue to scan file ?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
4207
                #endif
4208
 
4209 2 EziDebug
                if(rb == QMessageBox::Yes)
4210
                {
4211
                   ++i;
4212
                   continue ;
4213
                }
4214
                else
4215
                {
4216
                    return 1 ;
4217
                }
4218
            }
4219
        }
4220
        else if(ifileList.at(i).endsWith(".vhd"))
4221
        {
4222
            EziDebugVhdlFile* pfile = m_ivhdlFileMap.value(ifileList.at(i)) ;
4223
//            if(!pfile->scanFile(currentPrj,EziDebugPrj::partScanType,iaddedinfoList,ideletedinfoList))
4224
//            {
4225
 
4226
//            }
4227
//            else
4228
//            {
4229
//                // 如果出错 ,提示是否继续扫描
4230
//            }
4231
        }
4232
        else
4233
        {
4234
 
4235
        }
4236
    }
4237
    return  0 ;
4238
}
4239
 
4240
void EziDebugPrj::preupdateProgressBar(bool updateflag ,int value)
4241
{
4242
    if(updateflag)
4243
    {
4244
        emit updateProgressBar(value);
4245
    }
4246
}
4247
 
4248
void EziDebugPrj::compareFileList(const QStringList& newfilelist,QStringList& addFileList,QStringList &delFileList,QStringList &chgFileList)
4249
{
4250
    std::list<QString> ideletedFileList(m_iCodefileNameList.count()) ;
4251
    std::list<QString> iidenticalFileList(m_iCodefileNameList.count()) ;
4252
    std::list<QString> iaddedFileList(m_iCodefileNameList.count()) ;
4253
 
4254
    std::list<QString>::iterator ioutDelIterator = ideletedFileList.begin() ;
4255
    std::list<QString>::iterator ioutIdenticalIterator = iidenticalFileList.begin() ;
4256
    std::list<QString>::iterator ioutAddIterator = iaddedFileList.begin() ;
4257
 
4258
    //newfilelist.sort();
4259
    QStringList::const_iterator ifirstBeginIterator = newfilelist.begin() ;
4260
    QStringList::const_iterator ifirstEndIterator = newfilelist.end() ;
4261
 
4262
    m_iCodefileNameList.sort();
4263
    QStringList::Iterator iSecondBeginIterator = m_iCodefileNameList.begin() ;
4264
    QStringList::Iterator iSecondEndIterator = m_iCodefileNameList.end() ;
4265
 
4266
    // ifirstBeginIterator 最新文件列表   iSecondBeginIterator 旧的文件列表
4267
    std::set_difference(ifirstBeginIterator,ifirstEndIterator,iSecondBeginIterator,iSecondEndIterator,ioutDelIterator);
4268
 
4269
    addFileList = QList<QString>::fromStdList(ideletedFileList) ;
4270
    addFileList = delFileList.filter(QRegExp(QObject::tr(".+"))) ;
4271
 
4272
 
4273
    std::set_difference(iSecondBeginIterator,iSecondEndIterator,ifirstBeginIterator,ifirstEndIterator,ioutAddIterator);
4274
    delFileList = QList<QString>::fromStdList(iaddedFileList);
4275
    delFileList = addFileList.filter(QRegExp(QObject::tr(".+"))) ;
4276
 
4277
 
4278
    std::set_intersection(ifirstBeginIterator,ifirstEndIterator,iSecondBeginIterator,iSecondEndIterator,ioutIdenticalIterator);
4279
 
4280
    ioutIdenticalIterator = iidenticalFileList.begin() ;
4281
    while(ioutIdenticalIterator != iidenticalFileList.end())
4282
    {
4283
        QFileInfo itempFileInfo(m_iprjPath,*ioutIdenticalIterator);
4284
        QDateTime idateTime = itempFileInfo.lastModified() ;
4285
 
4286
 
4287
        if((*ioutIdenticalIterator).endsWith(".v"))
4288
        {
4289
            QDateTime ilastDateTime = m_ivlgFileMap.value(*ioutIdenticalIterator)->getLastStoredTime();
4290
            if(idateTime.toString("dd.MM.yyyy hh:mm:ss") != ilastDateTime.toString("dd.MM.yyyy hh:mm:ss"))
4291
            {
4292
                qDebug() << idateTime << ilastDateTime ;
4293
                chgFileList.append(*ioutIdenticalIterator);
4294
            }
4295
        }
4296
        else if((*ioutIdenticalIterator).endsWith(".vhd"))
4297
        {
4298
            QDateTime ilastDateTime = m_ivhdlFileMap.value(*ioutIdenticalIterator)->getLastStoredTime();
4299
            if(idateTime != ilastDateTime)
4300
            {
4301
                chgFileList.append(*ioutIdenticalIterator);
4302
            }
4303
        }
4304
        else
4305
        {
4306
            // do nothing
4307
        }
4308
        ++ioutIdenticalIterator ;
4309
     }
4310
 
4311
    if(addFileList.count()&&delFileList.count()&&chgFileList.count())
4312
    {
4313
        m_isUpdated = true ;
4314
    }
4315
}
4316
 
4317
int EziDebugPrj::domParseEziDebugElement(const QDomElement &element,char readflag)
4318
{
4319
    QDomNode ichild = element.firstChild();
4320
    bool  eeziDebugFileStructureExistFlag = 0 ;
4321
    qDebug() << "Attention: Begin to detect the log file!";
4322
 
4323
    while(!ichild.isNull())
4324
    {
4325
        if(ichild.toElement().tagName() == "FILE_INFO")
4326
        {
4327
            eeziDebugFileStructureExistFlag |= EZIDEBUG_STRUCTURE_FILE ;
4328
            if(domParseFileInfoElement(ichild.toElement(),readflag))
4329
            {
4330
                qDebug() << "domParseEziDebugElement Error: function domParseFileInfoElement return wrong!" ;
4331
                goto Error ;
4332
            }
4333
        }
4334
        else if(ichild.toElement().tagName() == "MODULE_INFO")
4335
        {
4336
            eeziDebugFileStructureExistFlag |= EZIDEBUG_STRUCTURE_MODULE ;
4337
            if(domParseModuleInfoElement(ichild.toElement(),readflag))
4338
            {
4339
                qDebug() << "domParseEziDebugElement Error: function domParseModuleInfoElement return wrong!" ;
4340
                goto Error ;
4341
            }
4342
        }
4343
        else if(ichild.toElement().tagName() == "SCAN_CHAIN_INFO")
4344
        {
4345
            eeziDebugFileStructureExistFlag |= EZIDEBUG_STRUCTURE_SCAN_CHAIN ;
4346
            if(domParseScanChainInfoElement(ichild.toElement(),readflag))
4347
            {
4348
                qDebug() << "domParseEziDebugElement Error: function domParseScanChainInfoElement return wrong!" ;
4349
                goto Error ;
4350
            }
4351
        }
4352
        else
4353
        {
4354
            qDebug() << "domParseEziDebugElement Error: There is unknown element in the EziDebug File!" ;
4355
            goto Error ;
4356
        }
4357
 
4358
        ichild = ichild.nextSibling();
4359
    }
4360
 
4361
    if((eeziDebugFileStructureExistFlag&EZIDEBUG_STRUCTURE_ALL) == EZIDEBUG_STRUCTURE_ALL)
4362
    {
4363
        goto Error ;
4364
    }
4365
 
4366
    return 0 ;
4367
 
4368
Error:
4369
    return 1 ;
4370
 
4371
}
4372
 
4373
const int &EziDebugPrj::getMaxRegNumPerChain(void) const
4374
{
4375
    return  m_nmaxRegNumInChain ;
4376
}
4377
 
4378
int EziDebugPrj::setToolType(TOOL tool)
4379
{
4380
    if(ToolOther <= tool)
4381
    {
4382
       //QMessageBox::warning(0,QObject::tr("设置工具类型"),QObject::tr("确认工具是否正确"));
4383
 
4384
        return 1 ;
4385
    }
4386
    m_eusedTool = tool ;
4387
    return 0 ;
4388
}
4389
 
4390
int EziDebugPrj::setMaxRegNumPerChain(int num)
4391
{
4392
    /*需要 判断 个数是否在 范围中 */
4393
    m_nmaxRegNumInChain = num ;
4394
    return 0 ;
4395
}
4396
 
4397
 
4398
void EziDebugPrj::setLogFileExistFlag(bool flag)
4399
{
4400
    m_isLogFileExist =  flag ;
4401
    return ;
4402
}
4403
 
4404
void EziDebugPrj::setXilinxErrCheckedFlag(bool flag)
4405
{
4406
    m_isDisXilinxErrChecked = flag ;
4407
}
4408 4 EziDebug
 
4409 2 EziDebug
void EziDebugPrj::setLogFileName(const QString& filename)
4410
{
4411
    m_ilogFileName = filename ;
4412
    return ;
4413
}
4414
 
4415
void EziDebugPrj::setMaxRegWidth(int width)
4416
{
4417
    if(m_imaxRegWidth < width)
4418
    {
4419
        m_imaxRegWidth = width ;
4420
    }
4421
}
4422
 
4423
void EziDebugPrj::setLogfileDestroyedFlag(bool flag)
4424
{
4425
    m_isLogFileDestroyed = flag ;
4426
}
4427
 
4428
bool EziDebugPrj::getLogfileDestroyedFlag(void)
4429
{
4430
    return m_isLogFileDestroyed ;
4431
}
4432
 
4433
int EziDebugPrj::parsePrjFile(QMap<QString,EziDebugVlgFile*> &vlgFileMap ,QMap<QString,EziDebugVhdlFile*> &vhdlFileMap)
4434
{
4435
    m_iCodefileNameList.clear();
4436
    if(ToolQuartus == m_eusedTool)
4437
    {
4438
        if(parseQuartusPrjFile(vlgFileMap,vhdlFileMap))
4439
        {
4440
            qDebug() << "Error:Parse Quartus PrjFile failed!" ;
4441
            return 1 ;
4442
        }
4443
    }
4444
    else if(ToolIse == m_eusedTool)
4445
    {
4446
        if(parseIsePrjFile(vlgFileMap,vhdlFileMap))
4447
        {
4448
            qDebug() << "Error:Parse ISE PrjFile failed!" ;
4449
            return 1 ;
4450
        }
4451
    }
4452
    else
4453
    {
4454
        qDebug() << "EziDebug is not support this sortware project file parse!";
4455
        return 1 ;
4456
    }
4457
 
4458
    // QMessageBox::information(0, QObject::tr("EziDebug解析文件"),QObject::tr("可以继续试验了"));
4459
 
4460
    return 0 ;
4461
}
4462
 
4463
void EziDebugPrj::checkDelFile(QMap<QString,EziDebugVlgFile*> &vlgFileMap , QMap<QString,EziDebugVhdlFile*> &vhdlFileMap , QList<LOG_FILE_INFO*> &deleteinfolist)
4464
{
4465
    QMap<QString,EziDebugVlgFile*>::const_iterator i =  m_ivlgFileMap.constBegin();
4466
    while(i != m_ivlgFileMap.constEnd())
4467
    {
4468
        QString ifileName = i.key() ;
4469
        EziDebugVlgFile* pnewFile = vlgFileMap.value(ifileName,NULL);
4470
        if(!pnewFile)
4471
        {
4472
            struct LOG_FILE_INFO* pdelFileInfo = new LOG_FILE_INFO ;
4473
            pdelFileInfo->etype = infoTypeFileInfo ;
4474
            pdelFileInfo->pinfo = NULL ;
4475
            memcpy(pdelFileInfo->ainfoName , ifileName.toAscii().data() , ifileName.size()+1);
4476
            deleteinfolist.append(pdelFileInfo);
4477
        }
4478
        ++i ;
4479
    }
4480
 
4481
    QMap<QString,EziDebugVhdlFile*>::const_iterator j = m_ivhdlFileMap.constBegin() ;
4482
    while(j != m_ivhdlFileMap.constEnd())
4483
    {
4484
        QString ifileName = j.key() ;
4485
        EziDebugVhdlFile* pnewFile = vhdlFileMap.value(ifileName,NULL);
4486
        if(!pnewFile)
4487
        {
4488
            struct LOG_FILE_INFO* pdelFileInfo = new LOG_FILE_INFO ;
4489
            pdelFileInfo->etype = infoTypeFileInfo ;
4490
            pdelFileInfo->pinfo = NULL ;
4491
            memcpy(pdelFileInfo->ainfoName , ifileName.toAscii().data() , ifileName.size()+1);
4492
            deleteinfolist.append(pdelFileInfo);
4493
        }
4494
        ++j ;
4495
    }
4496
 
4497
}
4498
 
4499
void EziDebugPrj::updateFileMap(const QMap<QString,EziDebugVlgFile*> &vlgFileMap ,const QMap<QString,EziDebugVhdlFile*> &vhdlFileMap)
4500
{
4501
    EziDebugVlgFile* poldVlgFile = NULL ;
4502
    EziDebugVhdlFile* poldVhdlFile = NULL ;
4503
    EziDebugVlgFile* pnewVlgFile = NULL ;
4504
    EziDebugVhdlFile* pnewVhdlFile = NULL ;
4505
    QMap<QString,EziDebugVlgFile*>::const_iterator ivlgFileIter = m_ivlgFileMap.constBegin() ;
4506
     QMap<QString,EziDebugVhdlFile*>::const_iterator ivhdlFileIter = m_ivhdlFileMap.constBegin() ;
4507
 
4508
    while(ivlgFileIter != m_ivlgFileMap.constEnd())
4509
    {
4510
        poldVlgFile = ivlgFileIter.value() ;
4511
        delete poldVlgFile ;
4512
        poldVlgFile = NULL ;
4513
        ++ivlgFileIter ;
4514
    }
4515
    m_ivlgFileMap.clear();
4516
 
4517
    while(ivhdlFileIter != m_ivhdlFileMap.constEnd())
4518
    {
4519
        poldVhdlFile = ivhdlFileIter.value() ;
4520
        delete poldVhdlFile ;
4521
        poldVhdlFile = NULL ;
4522
        ++ivhdlFileIter ;
4523
    }
4524
    m_ivhdlFileMap.clear();
4525
 
4526
    if(vlgFileMap.count()!= 0)
4527
    {
4528
        ivlgFileIter = vlgFileMap.constBegin();
4529
        while(ivlgFileIter != vlgFileMap.constEnd())
4530
        {
4531
            pnewVlgFile = ivlgFileIter.value() ;
4532
            m_ivlgFileMap.insert(ivlgFileIter.key() , pnewVlgFile);
4533
            ++ivlgFileIter ;
4534
        }
4535
 
4536
    }
4537
 
4538
    if(vhdlFileMap.count()!= 0)
4539
    {
4540
        ivhdlFileIter = vhdlFileMap.constBegin();
4541
        while(ivhdlFileIter != vhdlFileMap.constEnd())
4542
        {
4543
            pnewVhdlFile = ivhdlFileIter.value() ;
4544
            m_ivhdlFileMap.insert(ivhdlFileIter.key() , pnewVhdlFile);
4545
            ++ivhdlFileIter ;
4546
        }
4547
    }
4548
}
4549
 
4550
int EziDebugPrj::traverseAllCodeFile(EziDebugPrj::SCAN_TYPE type , const QMap<QString,EziDebugVlgFile*> &vlgFileMap ,const QMap<QString,EziDebugVhdlFile*> &vhdlFileMap ,QList<LOG_FILE_INFO*> &addedinfoList,QList<LOG_FILE_INFO*> &deletedinfoList)
4551
 {
4552
     //QList<LOG_FILE_INFO*> iaddedinfoList ;
4553
     //QList<LOG_FILE_INFO*> ideletedinfoList ;
4554
     QString irelativeFileName ;
4555
     EziDebugVlgFile* poldVlgFile = NULL ;
4556
     EziDebugVhdlFile* poldVhdlFile = NULL ;
4557
     EziDebugVlgFile* pnewVlgFile = NULL ;
4558
     EziDebugVhdlFile* pnewVhdlFile = NULL ;
4559
     int nfileCount = 0 ;
4560
 
4561
     /*解析每个代码文件*/
4562
     qDebug() <<  QObject::tr("EziDebug::Begin traverAllCodeFile!");
4563
     /* 遍历 verilog 文件 获取 所有 module 信息*/
4564
     // 15 + (i/vlgFileMap.count())*45
4565
     if(vlgFileMap.count()!= 0)
4566
     {
4567
         QMap<QString,EziDebugVlgFile*>::const_iterator i = vlgFileMap.constBegin();
4568
         while(i != vlgFileMap.constEnd())
4569
         {
4570
             pnewVlgFile = i.value() ;
4571
             irelativeFileName = i.key() ;
4572
             if(pnewVlgFile)
4573
             {
4574
                 if(pnewVlgFile->scanFile(this,type,addedinfoList,deletedinfoList))
4575
                 {
4576
                     qDebug() << "traverseAllCodeFile:scan file failed! FILE NAME" << i.key();
4577
                     //dynamic_cast<QWidget*>(this->parent())
4578 4 EziDebug
                     #if 0
4579 2 EziDebug
                     QMessageBox::StandardButton rb = QMessageBox::question(NULL, tr("扫描文件错误"), tr("是否继续扫描?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
4580 4 EziDebug
                     #else
4581
                     QMessageBox::StandardButton rb = QMessageBox::question(NULL, tr("EziDebug"), tr("Scan file Error , do you want to continue to scan file ?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
4582
                     #endif
4583
 
4584 2 EziDebug
                     if(rb == QMessageBox::Yes)
4585
                     {
4586
                        ++i;
4587
                        continue ;
4588
                     }
4589
                     else
4590
                     {
4591
                         return 1 ;
4592
                     }
4593
                 }
4594
                 else
4595
                 {
4596
                     // 已经存在 扫描文件
4597
                     if((poldVlgFile = m_ivlgFileMap.value(i.key(),NULL)))
4598
                     {
4599
                         if((poldVlgFile->getLastStoredTime() != pnewVlgFile->getLastStoredTime())\
4600
                                 ||(poldVlgFile->getModuleList() == pnewVlgFile->getModuleList()))
4601
                         {
4602
                             struct LOG_FILE_INFO* pdelFileInfo = new LOG_FILE_INFO ;
4603
                             pdelFileInfo->etype = infoTypeFileInfo ;
4604
                             pdelFileInfo->pinfo = NULL ;
4605
                             memcpy(pdelFileInfo->ainfoName , irelativeFileName.toAscii().data() , irelativeFileName.size()+1);
4606
                             deletedinfoList.append(pdelFileInfo);
4607
 
4608
                             // 新增文件
4609
                             struct LOG_FILE_INFO* paddFileInfo = new LOG_FILE_INFO ;
4610
                             paddFileInfo->etype = infoTypeFileInfo ;
4611
                             paddFileInfo->pinfo = pnewVlgFile ;
4612
                             memcpy(paddFileInfo->ainfoName , irelativeFileName.toAscii().data(), irelativeFileName.size()+1);
4613
                             addedinfoList.append(paddFileInfo);
4614
                         }
4615
//                       m_ivlgFileMap.remove(i.key());
4616
//                       delete poldVlgFile ;
4617
                     }
4618
                     else
4619
                     {
4620
                         // 新增文件
4621
                         struct LOG_FILE_INFO* paddFileInfo = new LOG_FILE_INFO ;
4622
                         paddFileInfo->etype = infoTypeFileInfo ;
4623
                         paddFileInfo->pinfo = pnewVlgFile ;
4624
                         memcpy(paddFileInfo->ainfoName , irelativeFileName.toAscii().data() , irelativeFileName.size()+1);
4625
                         addedinfoList.append(paddFileInfo);
4626
                     }
4627
//                   m_ivlgFileMap.insert(i.key() , pnewVlgFile);
4628
                     ++i;
4629
                     emit updateProgressBar(15 + (nfileCount/vlgFileMap.count())*45);
4630
                     nfileCount++ ;
4631
                     continue ;
4632
                 }
4633
             }
4634
             else
4635
             {
4636
                 qDebug() << "null fileobj pointer!";
4637
             }
4638
             ++i;
4639
         }
4640
 
4641
     }
4642
 
4643
     /* 遍历 vhdl 文件 获取 所有 module 信息*/
4644
     if(vhdlFileMap.count() != 0)
4645
     {
4646
         QMap<QString,EziDebugVhdlFile*>::const_iterator i = vhdlFileMap.constBegin();
4647
         while(i != vhdlFileMap.constEnd())
4648
         {
4649
             if(i.value())
4650
             {
4651
                 //(i.value())->scanFile();
4652
             }
4653
             else
4654
             {
4655
                 qDebug() << "null fileobj pointer!";
4656
                 return 1 ;
4657
             }
4658
             ++i;
4659
         }
4660
     }
4661
 
4662
     qDebug() << QObject::tr("EziDebug:: finish tranverse all code file!");
4663
 
4664
     return 0 ;
4665
 }
4666
 
4667
int EziDebugPrj::resumeDataFromFile(void)
4668
{
4669
 
4670
    return 0 ;
4671
}
4672
 
4673
int EziDebugPrj::generateTreeView(void)
4674
{
4675
    QStringList imoduleList ;
4676
    QString itopModuleName = m_itopModule + QObject::tr(":")+ m_itopModule ;
4677
 
4678
    if(!m_imoduleMap.contains(m_itopModule))
4679
    {
4680
        qDebug() << "EziDebug Error: There is no Topmodule definition!";
4681
        return 1;
4682
    }
4683 4 EziDebug
 
4684 2 EziDebug
    /*根据topmodule 构造树状显示结构的数据信息*/
4685
    //  if (!m_imoduleMap.contains(m_itopModule))
4686
    //  {
4687
    //        qDebug() << " there is not topModule!";
4688
    //        return 1 ;
4689
    //  }
4690 4 EziDebug
 
4691 2 EziDebug
    EziDebugInstanceTreeItem* item = new EziDebugInstanceTreeItem(m_itopModule,m_itopModule);
4692
    if(!item)
4693
    {
4694
        qDebug() << "Error:There is no memory left!";
4695
        return 1 ;
4696
    }
4697
    m_headItem = item ;
4698
    //return (traverseModuleTree(itopModuleName,item));
4699
    return(traverseModuleTree(itopModuleName,item)) ;
4700
}
4701
 
4702
int EziDebugPrj::traverseModuleTree(const QString &module,EziDebugInstanceTreeItem* item)
4703
{
4704
    QString iparentItemModuleName = module.split(":").at(0);
4705
    QString iparentItemInstanceName = module.split(":").at(1);
4706
    QMap<QString,QString> iparentClockMap = m_imoduleMap.value(iparentItemModuleName)->getClockSignal();
4707
    QStringList iinstanceList ;
4708
    QString ihierarchyName  ;
4709
   // QMap<QString,QString> iclockSignalMap = m_imoduleMap.value(pchildItem->getModuleName())->getClockSignal() ;
4710
    QMap<QString,QString> ichildClockMap ;
4711
    QMap<QString,QString>::const_iterator  iclockIter = iparentClockMap .constBegin();
4712
    QMap<QString,QString> iparentResetMap = m_imoduleMap.value(iparentItemModuleName)->getResetSignal();
4713
    QMap<QString,QString> ichildResetMap ;
4714
 
4715
    // 创建本节点  然后再根据 子module 创建 子节点
4716
    EziDebugInstanceTreeItem* pparentItem = item ;
4717
    if(!pparentItem)
4718
    {
4719
        qDebug() << "Error:There is no memory left!" ;
4720
        return 1 ;
4721
    }
4722
 
4723
    if(iparentItemModuleName == m_itopModule)
4724
    {
4725
        qDebug() << "This is topModule!" ;
4726
        pparentItem->settItemHierarchyName(ihierarchyName);
4727
    }
4728
    else
4729
    {
4730
        ihierarchyName = pparentItem->parent()->getItemHierarchyName();
4731
        ihierarchyName = ihierarchyName ;
4732
        ihierarchyName.append(QObject::tr("%1:%2|").arg(iparentItemModuleName).arg(iparentItemInstanceName));
4733
        pparentItem->settItemHierarchyName(ihierarchyName);
4734
        // chainInfo 有值 、treeitem无值
4735
        if((m_ichainInfoMap.count())&&(!m_ichainTreeItemMap.count()))
4736
        {
4737
            QMap<QString,EziDebugScanChain*>::const_iterator i =  m_ichainInfoMap.constBegin() ;
4738
            while(i != m_ichainInfoMap.constEnd())
4739
            {
4740
                EziDebugScanChain *pchain = i.value() ;
4741
                if(pchain)
4742
                {
4743
                    QString itopInstanceNode = pchain->getInstanceItemList().last();
4744
                    if(itopInstanceNode == module)
4745
                    {
4746
                        pparentItem->setScanChainInfo(pchain);
4747
                        pchain->setHeadTreeItem(pparentItem);
4748
                        m_ibackupChainTreeItemMap.insert(pchain->getChainName(),pparentItem);
4749
                        m_iqueryTreeItemMap.insert(module,pparentItem);
4750
                        m_ichainInfoMap.remove(i.key());
4751
                        break ;
4752
                    }
4753
                }
4754
                ++i ;
4755
            }
4756
        }
4757
    }
4758
 
4759
 
4760
    if(m_imoduleMap.contains(iparentItemModuleName))
4761
    {
4762
        iinstanceList = (m_imoduleMap.value(iparentItemModuleName))->getInstanceList();
4763
 
4764
        // 将所有的defparameter 记录到 module中方便 计算寄存器宽度
4765
        QMap<QString,QString> idefparameterMap =  m_idefparameter.value(iparentItemInstanceName);
4766
        QMap<QString,QString>::const_iterator iiterrator = idefparameterMap.constBegin() ;
4767
        while(iiterrator != idefparameterMap.constEnd())
4768
        {
4769
            m_imoduleMap.value(iparentItemModuleName)->addToDefParameterMap(iparentItemInstanceName,iiterrator.key(),iiterrator.value());
4770
            ++iiterrator ;
4771
        }
4772
        m_imoduleMap.value(iparentItemModuleName)->calInstanceRegData(this,iparentItemInstanceName);
4773
        // 将寄存器宽度 所有的 宏全部替换
4774
 
4775
    }
4776
    else
4777
    {
4778
        qDebug() << "Error:module:" << iparentItemModuleName << "has no definition !" << "Can't finded in module map!"  ;
4779
        return 1 ;
4780
    }
4781
 
4782
    if(!(iinstanceList.count()))
4783
    {
4784
        return 0 ;
4785
    }
4786
    else
4787
    {
4788
        for(int i = 0 ; i < iinstanceList.count();i++)
4789
        {
4790
            QString ichildItemCombinedName = iinstanceList.at(i) ;
4791
            QString ichildItemModuleName = (ichildItemCombinedName.split(":")).at(0) ;
4792
 
4793
            // 每个子例化名
4794
            if(!m_imoduleMap.value(ichildItemModuleName,NULL))
4795
            {
4796
                qDebug() << "Warnning:: module:" << ichildItemModuleName << "has no definition!";
4797
                continue  ;
4798
            }
4799
 
4800
            // 确定 子module 与 父module 之间的 clock 对应关系
4801
            QString ichildItemInstanceName = (ichildItemCombinedName.split(":")).at(1) ;
4802
            EziDebugInstanceTreeItem * pchildItem = new EziDebugInstanceTreeItem(ichildItemInstanceName,ichildItemModuleName);
4803
            if(!pchildItem)
4804
            {
4805
                qDebug() << "Error:There is not memory left !" ;
4806
                return 1 ;
4807
            }
4808
 
4809
            pparentItem->appendChild(pchildItem);
4810
 
4811
            pchildItem->setItemParent(pparentItem);
4812
 
4813
            if(m_imoduleMap.value(pchildItem->getModuleName())->isLibaryCore())
4814
            {
4815
                // 专门为 libarycore 加入 层次名
4816
                QString ichildhierarchyName = pparentItem->getItemHierarchyName();
4817
                ichildhierarchyName.append(QObject::tr("%1:%2|").arg(ichildItemModuleName).arg(ichildItemInstanceName));
4818
                pchildItem->settItemHierarchyName(ichildhierarchyName);
4819
                continue ;
4820
            }
4821
 
4822
 
4823
            //            QString iparentClockName ;
4824
 
4825
            // 只针对单一时钟情况 遍历所有节点之前  确保父节点 有 存在 clock
4826
            //            QMap<QString,QString>::const_iterator iclockIter = iclockSignalMap.constBegin();
4827
            //            int j = 0 ;
4828
            //            if(!iparentClockMap.count())
4829
            //            {
4830
            //                /*检查 clock 是否 缺少*/
4831
            //                /*根据子节点 的 port-map 和 子节点 的 clock 来找到 父节点 的 clock */
4832
            //                QString icheckInstanceName = pchildItem->getInstanceName() ;
4833
            //                QString icheckModuleName = pchildItem->getModuleName() ;
4834
 
4835
            //                if(!iclockSignalMap.count())
4836
            //                {
4837
            //                    qDebug() <<  "EziDebug Info: child module:"<< pchildItem->getModuleName() << "has no clock!";
4838
 
4839
 
4840
            //                    while(!iclockSignalMap.count())
4841
            //                    {
4842
            //                        j++ ;
4843
            //                        if(j >= iinstanceList.count())
4844
            //                        {
4845
            //                            qDebug() <<  "EziDebug Error: The module:" << iparentItemModuleName << "'s child instance is ignoreg for no clock!" ;
4846
            //                            return 0 ;
4847
            //                        }
4848
 
4849
            //                        icheckInstanceName = iinstanceList.at(i+j).split(":").at(1) ;
4850
            //                        icheckModuleName = iinstanceList.at(i+j).split(':').at(0) ;
4851
            //                        iclockSignalMap = m_imoduleMap.value(icheckModuleName)->getClockSignal();
4852
            //                    }
4853
            //                }
4854
            //                else
4855
            //                {
4856
            //                    //iparentClockName = ;
4857
            //                    if(iclockSignalMap.count()>1)
4858
            //                    {
4859
            //                        qDebug() <<  "EziDebug Error: It is not Supported muticlock domain!";
4860
            //                        return 1 ;
4861
            //                    }
4862
 
4863
            //                    iclockIter = iclockSignalMap.constBegin();
4864
            //                    while(iclockIter != iclockSignalMap.constEnd())
4865
            //                    {
4866
            //                        iparentClockName = m_imoduleMap.value(pparentItem->getModuleName())->getInstancePortMap(pchildItem->getInstanceName()).value(iclockIter.key(),NULL);
4867
            //                        if(iparentClockName.isEmpty())
4868
            //                        {
4869
            //                            qDebug() <<  "EziDebug Error: clock wire is not correspond to the clock port!";
4870
            //                            return 1 ;
4871
            //                        }
4872
            //                        m_imoduleMap.value(pparentItem->getModuleName())->addToClockMap(iparentClockName);
4873
            //                        ++iclockIter ;
4874
            //                    }
4875
            //                }
4876
 
4877
 
4878
 
4879
            //                if(iclockSignalMap.count()>1)
4880
            //                {
4881
            //                    qDebug() <<  "EziDebug Error: It is not Supported muticlock domain!";
4882
            //                    return 1 ;
4883
            //                }
4884
 
4885
            //                iclockIter = iclockSignalMap.constBegin();
4886
            //                while(iclockIter != iclockSignalMap.constEnd())
4887
            //                {
4888
            //                    iparentClockName = m_imoduleMap.value(pparentItem->getModuleName())->getInstancePortMap(icheckInstanceName).value(iclockIter.key(),NULL);
4889
            //                    if(iparentClockName.isEmpty())
4890
            //                    {
4891
            //                        qDebug() <<  "EziDebug Error: clock wire is not correspond to the clock port!";
4892
            //                        return 1 ;
4893
            //                    }
4894
            //                    ++iclockIter ;
4895
            //                }
4896
 
4897
 
4898
            //                QString ichildClockName ;
4899
 
4900
            //                QVector<EziDebugModule::PortStructure*> iportVec = m_imoduleMap.value(pchildItem->getModuleName())->getPort() ;
4901
            //                while(iclockIter != iclockSignalMap.constEnd())
4902
            //                {
4903
            //                    for(int j = 0 ; j < iportVec.count(); j++)
4904
            //                    {
4905
            //                        if(iclockIter.key() == QString::fromAscii(iportVec.at(j)->m_pPortName))
4906
            //                        {
4907
            //                            ichildClockName = iclockIter.key() ;
4908
            //                            QMap<QString,QString> iportMap = m_imoduleMap.value(pparentItem->getModuleName())->getInstancePortMap(pchildItem->getInstanceName());
4909
            //                            iparentClockName = iportMap.value(ichildClockName,QString()) ;
4910
            //                            if(iparentClockName.isEmpty())
4911
            //                            {
4912
            //                                qDebug() <<  "Error: The clock is not correspond!";
4913
            //                                return 1 ;
4914
            //                            }
4915
 
4916
            //                            // 以后加上  检查 父节点端口 clock 和 例化端口 的 clock 是不是 一一对应的
4917
            //                            if(m_imoduleMap.value(pparentItem->getModuleName())->getClockSignal().value(iparentClockName,QString()).isEmpty())
4918
            //                            {
4919
            //                                m_imoduleMap.value(pparentItem->getModuleName())->addToClockMap(iparentClockName);
4920
 
4921
            //                            }
4922
            //                        }
4923
            //                    }
4924
            //                    ++iclockIter ;
4925
            //                }
4926
 
4927
 
4928
            //iclockSignalMap.clear();
4929
            // 添加相应的 本module里面的 clock 和 子例化的 module clock 名字对应关系
4930
            // 以后要 获取 是否 存在 clock 的别名,用于 clock 的 连接 <端口clock,别名clock>
4931
            // 在找对应关系时 端口clock 和 instance 的clock 不匹配 ,则尝试用别名匹配
4932
 
4933
 
4934
            QMap<QString,QMap<QString,QString> > iinstancePortMap = m_imoduleMap.value(iparentItemModuleName)->getInstancePortMap() ;
4935
            QMap<QString,QString> ichildPortMap = iinstancePortMap.value(ichildItemInstanceName);
4936
            //QMap<QString,QMap<QString,QString> >::const_iterator i = iinstancePortMap.constBegin() ;
4937
 
4938
            if(traverseModuleTree(ichildItemCombinedName,pchildItem))
4939
            {
4940
                qDebug() << "EziDebug Error: The node" << ichildItemCombinedName << "Travere Error!";
4941
 
4942
                pparentItem->removeChild(pchildItem);
4943
 
4944
                pchildItem->setItemParent(NULL);
4945
 
4946
                delete pchildItem ;
4947
 
4948
                return 1;
4949
            }
4950
            else
4951
            {
4952
 
4953
                // 子节点的时钟 map , 将子节点的时钟 填充到 父节点 中 ,防止 父节点无时钟
4954
                ichildClockMap =   m_imoduleMap.value(pchildItem->getModuleName())->getClockSignal() ;
4955
                iclockIter = ichildClockMap.constBegin() ;
4956
                while(iclockIter != ichildClockMap.constEnd())
4957
                {
4958
                    // 将所有子节点的时钟 加入 到 父节点的 时钟 map 中
4959
                    // 应该 根据 iclockIter.key() 和  端口 列表 以及 端口对应关系 得到 父节点的时钟
4960
                    // 目前不考虑  时钟名字 改变 即 子节点的时钟端口名与时钟名一致
4961
                    QString iparentCLockName = ichildPortMap.value(iclockIter.key(),QString()) ;
4962
                    if(!iparentCLockName.isEmpty())
4963
                    {
4964
                        m_imoduleMap.value(pparentItem->getModuleName())->addToClockMap(iparentCLockName);
4965
                    }
4966
                    ++iclockIter ;
4967
                }
4968
 
4969
                // 子节点的时钟 map , 将子节点的时钟 填充到 父节点 中 ,防止 父节点无时钟
4970
                ichildResetMap =   m_imoduleMap.value(pchildItem->getModuleName())->getResetSignal();
4971
                iclockIter = ichildResetMap.constBegin() ;
4972
                while(iclockIter != ichildResetMap.constEnd())
4973
                {
4974
                    // 将所有子节点的时钟 加入 到 父节点的 时钟 map 中
4975
                    // 应该 根据 iclockIter.key() 和  端口 列表 以及 端口对应关系 得到 父节点的时钟
4976
                    // 目前不考虑  时钟名字 改变 即 子节点的时钟端口名与时钟名一致
4977
                    QString iparentResetName = ichildPortMap.value(iclockIter.key(),QString()) ;
4978
                    QString iedge = iclockIter.value() ;
4979
                    if(!iparentResetName.isEmpty())
4980
                    {
4981
                        m_imoduleMap.value(pparentItem->getModuleName())->addToResetSignalMap(iparentResetName,iedge);
4982
                    }
4983
                    ++iclockIter ;
4984
                }
4985
 
4986
                //iclockSignalMap.clear();
4987
                //iclockSignalMap =  m_imoduleMap.value(pparentItem->getModuleName())->getClockSignal() ;
4988
            }
4989
        }
4990
        QMap<QString,QString> iclockMap ;
4991
 
4992
        iparentClockMap = m_imoduleMap.value(iparentItemModuleName)->getClockSignal();
4993
        iparentResetMap = m_imoduleMap.value(iparentItemModuleName)->getResetSignal();
4994
 
4995
 
4996
        // 遍历完所有节点之后 根据父节点 的 clock map 找到 填充 子节点 的 clock map
4997
        // 填充 父节点的clock map
4998
 
4999
        for(int i = 0 ; i < pparentItem->childCount();i++)
5000
        {
5001
            iclockMap.clear();
5002
            QString ichildModuleName = pparentItem->child(i)->getModuleName() ;
5003
            QString ichildInstanceName = pparentItem->child(i)->getInstanceName() ;
5004
 
5005
            QMap<QString,QString> ichildPortMap = m_imoduleMap.value(iparentItemModuleName)->getInstancePortMap(ichildInstanceName) ;
5006
            iclockIter = iparentClockMap.constBegin() ;
5007
            ichildClockMap = m_imoduleMap.value(ichildModuleName)->getClockSignal();
5008
 
5009
            while(iclockIter != iparentClockMap.constEnd())
5010
            {
5011
                QString ichildClockName = ichildPortMap.key(iclockIter.key());
5012
 
5013
                if(!ichildClockName.isEmpty())
5014
                {
5015
                    QMap<QString,QMap<QString,QString> > iinstancesPortMap = m_imoduleMap.value(ichildModuleName)->getInstancePortMap();
5016
                    QMap<QString,QMap<QString,QString> >::const_iterator iportMapIter = iinstancesPortMap.constBegin() ;
5017
                    while(iportMapIter != iinstancesPortMap.constEnd())
5018
                    {
5019
                        QMap<QString,QString> iinstancePortMap = iportMapIter.value();
5020
 
5021
                        if(!(iinstancePortMap.key(ichildClockName,QString()).isEmpty()))
5022
                        {
5023
                            // 子节点用到了 这个 clock
5024
                            m_imoduleMap.value(ichildModuleName)->addToClockMap(ichildClockName) ;
5025
                            iclockMap.insert(iclockIter.key(),ichildClockName);
5026
                        }
5027
                        ++iportMapIter ;
5028
                    }
5029
 
5030
                    //子节点 本身含有 这个clock
5031
                    if(!ichildClockMap.value(ichildClockName,QString()).isEmpty())
5032
                    {
5033
                        iclockMap.insert(iclockIter.key(),ichildClockName);
5034
                    }
5035
                }
5036
                ++iclockIter ;
5037
            }
5038
            pparentItem->setModuleClockMap(ichildInstanceName,iclockMap);
5039
 
5040
 
5041
            iclockIter = iparentResetMap.constBegin() ;
5042
            while(iclockIter != iparentResetMap.constEnd())
5043
            {
5044
                QString ichildResetSignalName = ichildPortMap.key(iclockIter.key());
5045
                QString iedge = iclockIter.value() ;
5046
                if(!ichildResetSignalName.isEmpty())
5047
                {
5048
                    QMap<QString,QMap<QString,QString> > iinstancesPortMap = m_imoduleMap.value(ichildModuleName)->getInstancePortMap();
5049
                    QMap<QString,QMap<QString,QString> >::const_iterator iportMapIter = iinstancesPortMap.constBegin() ;
5050
                    while(iportMapIter != iinstancesPortMap.constEnd())
5051
                    {
5052
                        QMap<QString,QString> iinstancePortMap = iportMapIter.value();
5053
 
5054
                        if(!(iinstancePortMap.key(ichildResetSignalName,QString()).isEmpty()))
5055
                        {
5056
                            // 子节点用到了 这个 clock
5057
                            m_imoduleMap.value(ichildModuleName)->addToResetSignalMap(ichildResetSignalName,iedge);
5058
                        }
5059
                        ++iportMapIter ;
5060
                    }
5061
                }
5062
                ++iclockIter ;
5063
            }
5064
        }
5065
    }
5066
    return 0 ;
5067
}
5068
 
5069
 
5070
 
5071
EziDebugInstanceTreeItem * EziDebugPrj::getInstanceTreeHeadItem(void)
5072
{
5073
    return m_headItem ;
5074
}
5075
 
5076
void EziDebugPrj::setInstanceTreeHeadItem(EziDebugInstanceTreeItem *item)
5077
{
5078
    m_headItem = item ;
5079
    return ;
5080
}
5081
 
5082
void EziDebugPrj::updateOperation(OPERATE_TYPE type, EziDebugScanChain* chain,EziDebugInstanceTreeItem* item)
5083
{
5084
    m_elastOperation = type ;
5085
    m_pLastOperateChain = chain ;
5086
    m_pLastOperteTreeItem = item ;
5087
 
5088
    if(OperateTypeNone == type)
5089
    {
5090
        m_ibackupChainInfoMap.clear();
5091
        m_ibackupChainTreeItemMap.clear();
5092
        m_ibackupQueryTreeItemMap.clear();
5093
    }
5094
    return ;
5095
}
5096
 
5097
int  EziDebugPrj::changedLogFile(const QList<LOG_FILE_INFO*>& addlist, const QList<LOG_FILE_INFO*> &deletelist)
5098
{
5099
    QFile file(m_ilogFileName);
5100
 
5101
    if(!file.open(QFile::ReadOnly | QFile::Text))
5102
    {
5103
        qDebug() << "Error: Cannot read file " << qPrintable(m_ilogFileName) \
5104
                  << ": " << qPrintable(file.errorString()) << __LINE__ << __FILE__;
5105
        return 1 ;
5106
    }
5107
 
5108
    QDomDocument idoc;
5109
    QString ierrorStr;
5110
    int nerrorLine;
5111
    int nerrorColumn;
5112
 
5113
    if (!idoc.setContent(&file, false, &ierrorStr, &nerrorLine,&nerrorColumn))
5114
    {
5115
        qDebug() << "Error: Parse error at line " << nerrorLine << ", "
5116
                  << "column " << nerrorColumn << ": "
5117
                  << qPrintable(ierrorStr) ;
5118
        return 1 ;
5119
    }
5120
 
5121
    qDebug() << "changedLogFile" << __FILE__ << __LINE__ << deletelist.count();
5122
    for(int i = 0 ; i < deletelist.count() ; i++)
5123
    {
5124
        LOG_FILE_INFO* pinfo = deletelist.at(i) ;
5125
        if(deleteLogFileElement(idoc,pinfo))
5126
        {
5127
            file.close();
5128
            return 1 ;
5129
        }
5130
    }
5131
 
5132
    for(int i = 0 ; i < addlist.count() ; i++)
5133
    {
5134
        LOG_FILE_INFO* pinfo = addlist.at(i) ;
5135
        if(saveInfoToLogFile(idoc,pinfo))
5136
        {
5137
            file.close();
5138
            qDebug() << "Error:save info!!!!" ;
5139
            return 1 ;
5140
        }
5141
        qDebug() << "save info to log file " << i;
5142
    }
5143
 
5144
 
5145
    file.close();
5146
    if(!file.open(QFile::WriteOnly | QIODevice::Truncate | QFile::Text))
5147
    {
5148
        qDebug() << "Error: Cannot write file " << qPrintable(m_ilogFileName) \
5149
                  << ": " << qPrintable(file.errorString());
5150
        return 1 ;
5151
    }
5152
    QTextStream iout(&file);
5153
    iout.setCodec("UTF-8");
5154
    idoc.save(iout,4,QDomNode::EncodingFromTextStream);
5155
    file.close();
5156
    return 0 ;
5157
}
5158
 
5159
 
5160
int EziDebugPrj::createLogFile(void)
5161
{
5162
    QString iuserDir = "No Dir";
5163
    QString itoutCore = "No Core" ;
5164
    QString iscanRegCore = "No Core" ;
5165
 
5166
    QDomDocument idoc;
5167
 
5168
    QDomElement iroot = idoc.createElement("EziDebug");
5169
 
5170
    idoc.appendChild(iroot);
5171
 
5172
    QDomElement ifileInfo = idoc.createElement("FILE_INFO");
5173
    iroot.appendChild(ifileInfo);
5174
 
5175
    QDomElement imoduleInfo = idoc.createElement("MODULE_INFO");
5176
    imoduleInfo.setAttribute("topmodule","No Module");
5177
    iroot.appendChild(imoduleInfo);
5178
 
5179
    if(EziDebugScanChain::getChainRegCore().toLower() != "no core")
5180
    {
5181
        iscanRegCore = EziDebugScanChain::getChainRegCore() ;
5182
    }
5183
 
5184
    if(EziDebugScanChain::getChainToutCore().toLower() != "no core")
5185
    {
5186
        itoutCore = EziDebugScanChain::getChainToutCore() ;
5187
    }
5188
 
5189
    if(EziDebugScanChain::getUserDir().toLower() != "no dir")
5190
    {
5191
        iuserDir = EziDebugScanChain::getUserDir() ;
5192
    }
5193
 
5194
    QDomElement iscanChainInfo = idoc.createElement("SCAN_CHAIN_INFO");
5195
    iscanChainInfo.setAttribute("scanreg_core_name",iscanRegCore);
5196
    iscanChainInfo.setAttribute("tout_core_name",itoutCore);
5197
    iscanChainInfo.setAttribute("user_dir",iuserDir);
5198
    iroot.appendChild(iscanChainInfo);
5199
 
5200
    QFile ifile(m_iprjPath.absoluteFilePath("config.ezi"));
5201
    if (!ifile.open(QIODevice::WriteOnly | QIODevice::Truncate |QIODevice::Text))
5202
    {
5203
        return 1 ;
5204
    }
5205
 
5206
    QTextStream iout(&ifile);
5207
 
5208
    iout.setCodec("UTF-8");
5209
 
5210
    idoc.save(iout,4,QDomNode::EncodingFromTextStream);
5211
    m_ilogFileName = m_iprjPath.absoluteFilePath("config.ezi") ;
5212
    ifile.close();
5213
    return 0 ;
5214
}
5215
 
5216
int EziDebugPrj::updateCodeFile()
5217
{
5218
    return 0 ;
5219
}
5220
 
5221
int EziDebugPrj::saveInfoToLogFile(QDomDocument &idoc, LOG_FILE_INFO* loginfo)
5222
{
5223
    //void *info , INFO_TYPE type
5224
    INFO_TYPE type = loginfo->etype ;
5225
    void *info = loginfo->pinfo ;
5226
    if(!loginfo)
5227
    {
5228
        qDebug() << "NULL Pointer!" << __LINE__ << __FILE__ ;
5229
        return 1 ;
5230
    }
5231
 
5232
    if(!info)
5233
    {
5234
        qDebug() << "NULL Pointer!" << __LINE__ << __FILE__ ;
5235
        return 1 ;
5236
    }
5237
 
5238
    if(type == infoTypeFileInfo)
5239
    {
5240
        //qDebug() << "saveInfoToLogFile!" << __LINE__ << __FILE__ ;
5241
        EziDebugFile * pfile = static_cast<EziDebugFile*>(info);
5242
 
5243
        if(pfile->fileName().endsWith(".v"))
5244
        {
5245
            EziDebugVlgFile *pvlgFile = static_cast<EziDebugVlgFile*>(info);
5246
 
5247
            QDomElement ielement = idoc.elementsByTagName("FILE_INFO").at(0).toElement() ;
5248
            QDomElement ifileElement = idoc.createElement("file") ;
5249
            QStringList imoduleList = pvlgFile->getModuleList() ;
5250
            QString imodule_array = imoduleList.join(",");
5251
 
5252
            ifileElement.setAttribute("file_name",m_iprjPath.relativeFilePath(pvlgFile->fileName()));
5253
            ifileElement.setAttribute("module_array",imodule_array);
5254
            QDateTime idateTime = pvlgFile->getLastStoredTime() ;
5255
            QDate imodifiedDate =  idateTime.date();
5256
            QTime imodifiedTime =  idateTime.time();
5257
 
5258
            if(imodifiedDate.isNull()||imodifiedTime.isNull())
5259
            {
5260
                qDebug() << "EziDebug Error: !!!!! save date and time error !!!!";
5261
            }
5262
 
5263
            ifileElement.setAttribute("modified_date",imodifiedDate.toString("MM/dd/yyyy"));
5264
            ifileElement.setAttribute("modified_time",imodifiedTime.toString("hh:mm:ss"));
5265
 
5266
            // macro
5267
            QStringList imacroStrList ;
5268
 
5269
            QMap<QString,QString>::const_iterator imacroIter = pvlgFile->m_imacro.constBegin() ;
5270
            while(imacroIter != pvlgFile->m_imacro.constEnd())
5271
            {
5272
                QString imacroStr = imacroIter.key() ;
5273
                QString imacroVal = imacroIter.value() ;
5274
                imacroStrList.append(imacroStr + tr("::") + imacroVal) ;
5275
                ++imacroIter ;
5276
            }
5277
 
5278
            if(imacroStrList.count())
5279
            {
5280
                ifileElement.setAttribute("macro",imacroStrList.join("$$"));
5281
            }
5282
            else
5283
            {
5284
                ifileElement.setAttribute("macro" , "No Macro");
5285
            }
5286
 
5287
            // defparameter
5288
            QStringList idefParamList ;
5289
            QMap<QString,QMap<QString,QString> >::const_iterator idefParaIter = pvlgFile->m_idefparameter.constBegin() ;
5290
            while(idefParaIter != pvlgFile->m_idefparameter.constEnd())
5291
            {
5292
                QString iinstanceName = idefParaIter.key() ;
5293
                QMap<QString,QString> iparameterMap = idefParaIter.value() ;
5294
                QMap<QString,QString>::const_iterator iparameterIter = iparameterMap.constBegin() ;
5295
                while(iparameterIter != iparameterMap.constEnd())
5296
                {
5297
                    QString iparameterStr = iparameterIter.key() ;
5298
                    QString iparameterVal = iparameterIter.value() ;
5299
                    idefParamList.append(iinstanceName + tr(".") + iparameterStr + tr("::") + iparameterVal);
5300
                    ++iparameterIter ;
5301
                }
5302
                ++idefParaIter ;
5303
            }
5304
 
5305
            if(idefParamList.count())
5306
            {
5307
                ifileElement.setAttribute("defparameter",idefParamList.join("$$"));
5308
            }
5309
            else
5310
            {
5311
                ifileElement.setAttribute("defparameter", "No Defparam");
5312
            }
5313
 
5314
            ielement.appendChild(ifileElement);
5315
 
5316
        }
5317
    }
5318
    else if(type == infoTypeModuleStructure)
5319
    {
5320
        //qDebug() << "saveInfoToLogFile!" << __LINE__ << __FILE__ ;
5321
 
5322
        EziDebugModule *pmodule = static_cast<EziDebugModule*>(info);
5323
        QDomElement imoduleInfoElement = idoc.elementsByTagName("MODULE_INFO").at(0).toElement() ;
5324
 
5325
        if(imoduleInfoElement.attribute("topmodule").toLower() == "no module")
5326
        {
5327
            imoduleInfoElement.setAttribute("topmodule",m_itopModule);
5328
        }
5329
 
5330
        //qDebug() << "saveInfoToLogFile!" << __LINE__ << __FILE__ ;
5331
 
5332
        QDomElement imoduleElement = idoc.createElement("module") ;
5333
        imoduleElement.setAttribute("module_name",pmodule->m_imoduleName);
5334
        //imoduleElement.setAttribute("appearance_count",QString::number(pmodule->m_ninstanceTimes));
5335
 
5336
        imoduleElement.setAttribute("lib_core",pmodule->m_isLibaryCore);
5337
        imoduleElement.setAttribute("file_name",pmodule->m_ilocatedFile);
5338
 
5339
        if(!pmodule->m_iinstanceNameList.size())
5340
        {
5341
            imoduleElement.setAttribute("instance_array","No Instance");
5342
        }
5343
        else
5344
        {
5345
            imoduleElement.setAttribute("instance_array",pmodule->m_iinstanceNameList.join("|"));
5346
        }
5347
 
5348
        //qDebug() << "saveInfoToLogFile!" << __LINE__ << __FILE__ ;
5349
 
5350
        QStringList iresetList ;
5351
        QMap<QString,QString>::const_iterator i = pmodule->m_iresetMap.constBegin();
5352
        while (i != pmodule->m_iresetMap.constEnd())
5353
        {
5354
            iresetList.append(i.key()+ QObject::tr(":") + i.value());
5355
                        ++i;
5356
        }
5357
 
5358
        if(iresetList.size())
5359
        {
5360
            imoduleElement.setAttribute("reset_signal",iresetList.join("|"));
5361
        }
5362
        else
5363
        {
5364
            imoduleElement.setAttribute("reset_signal","No Reset Signal");
5365
        }
5366
 
5367
        // 插入parameter 参数
5368
        QStringList ipraramList ;
5369
        QMap<QString,QString>::const_iterator iparamIter = pmodule->m_iparameter.constBegin() ;
5370
        while(iparamIter != pmodule->m_iparameter.constEnd())
5371
        {
5372
            QString iparamStr = iparamIter.key() ;
5373
            QString iparamVal = iparamIter.value() ;
5374
            ipraramList.append(iparamStr + tr("::") + iparamVal);
5375
            ++iparamIter ;
5376
        }
5377
 
5378
        if(ipraramList.count())
5379
        {
5380
            imoduleElement.setAttribute("parameter",ipraramList.join("$$"));
5381
        }
5382
        else
5383
        {
5384
            imoduleElement.setAttribute("parameter","No Parameter");
5385
        }
5386
 
5387
 
5388
        QDomElement iclockDescriptionElement = idoc.createElement("clock_description") ;
5389
        QMap<QString,QString>::const_iterator j = pmodule->m_iclockMap.constBegin();
5390
        while (j != pmodule->m_iclockMap.constEnd())
5391
        {
5392
            QDomElement iclock = idoc.createElement("clock") ;
5393
            iclock.setAttribute("clock_name",j.key());
5394
            iclock.setAttribute("polarity",j.value());
5395
            iclockDescriptionElement.appendChild(iclock);
5396
                        ++j ;
5397
        }
5398
        imoduleElement.appendChild(iclockDescriptionElement) ;
5399
 
5400
        //qDebug() << "saveInfoToLogFile!" << __LINE__ << __FILE__ ;
5401
 
5402
        QDomElement iregDescriptionElement   = idoc.createElement("reg_description") ;
5403
        QMap<QString,QVector<EziDebugModule::RegStructure*> >::const_iterator k= pmodule->m_iregMap.constBegin();
5404
        while (k!= pmodule->m_iregMap.constEnd())
5405
        {
5406
            for(int m = 0; m < k.value().size(); ++m)
5407
            {
5408
                QDomElement ireg = idoc.createElement("reg") ;
5409
                EziDebugModule::RegStructure * preg = k.value().at(m) ;
5410
                ireg.setAttribute("module_name",QString::fromLocal8Bit(preg->m_pMouduleName));
5411
                ireg.setAttribute("locate_clock",k.key());
5412
                ireg.setAttribute("reg_name",QString::fromLocal8Bit(preg->m_pRegName));
5413
                ireg.setAttribute("regnum",preg->m_pregNum);
5414
                //ireg.setAttribute("endian",preg->m_isEndian);
5415
                // 保存 位宽字符串
5416
                ireg.setAttribute("bitwidth",QString::fromAscii(preg->m_pExpString));
5417
                if(preg->m_eedge == EziDebugModule::signalPosEdge)
5418
                {
5419
                    ireg.setAttribute("polarity","posedge");
5420
                }
5421
                else if(preg->m_eedge == EziDebugModule::signalNegEdge)
5422
                {
5423
                    ireg.setAttribute("polarity","negedge");
5424
                }
5425
                else
5426
                {
5427
                    ireg.setAttribute("polarity","noedge");
5428
                }
5429
 
5430
                iregDescriptionElement.appendChild(ireg);
5431
            }
5432
                        ++k ;
5433
        }
5434
        imoduleElement.appendChild(iregDescriptionElement) ;
5435
 
5436
        //qDebug() << "saveInfoToLogFile!" << __LINE__ << __FILE__ ;
5437
 
5438
        QDomElement iportDescriptionElement  = idoc.createElement("port_description") ;
5439
        for(int n = 0 ; n < pmodule->m_iportVec.size();++n)
5440
        {
5441
            QDomElement iport = idoc.createElement("port") ;
5442
            EziDebugModule::PortStructure *pport = pmodule->m_iportVec.at(n) ;
5443
            iport.setAttribute("port_name",QString::fromLocal8Bit(pport->m_pPortName));
5444
            iport.setAttribute("module_name",QString::fromLocal8Bit(pport->m_pModuleName));
5445
            if(pport->eDirectionType == EziDebugModule::directionTypeInput)
5446
            {
5447
                iport.setAttribute("direction_type","in");
5448
            }
5449
            else if(pport->eDirectionType == EziDebugModule::directionTypeOutput)
5450
            {
5451
                iport.setAttribute("direction_type","out");
5452
            }
5453
            else
5454
            {
5455
                iport.setAttribute("direction_type","inout");
5456
            }
5457
 
5458
            iport.setAttribute("bitwidth",QString::fromAscii(pport->m_pBitWidth));
5459
 
5460
            // iport.setAttribute("endian",(pport->m_isEndian ? "big" :"little"));
5461
            iportDescriptionElement.appendChild(iport);
5462
        }
5463
        imoduleElement.appendChild(iportDescriptionElement);
5464
 
5465
        //qDebug() << "saveInfoToLogFile!" << __LINE__ << __FILE__ ;
5466
        QStringList iportList ;
5467
        QDomElement iinstancePortMapDescriptionElement  = idoc.createElement("instance_port_map_description") ;
5468
        QMap<QString,QMap<QString,QString> > iinstancePortMap = pmodule->getInstancePortMap() ;
5469
        QMap<QString,QMap<QString,QString> >::const_iterator instanceportiterator =  iinstancePortMap.constBegin();
5470
        while(instanceportiterator != iinstancePortMap.constEnd())
5471
        {
5472
            iportList.clear();
5473
            QDomElement iinstance = idoc.createElement("instance") ;
5474
            iinstance.setAttribute("instance_name",instanceportiterator.key());
5475
            QMap<QString,QString> iportMap = instanceportiterator.value() ;
5476
            QMap<QString,QString>::const_iterator iportMapIterator = iportMap.constBegin();
5477
            while(iportMapIterator != iportMap.constEnd())
5478
            {
5479
                iportList << iportMapIterator.key() + QObject::tr("@") + iportMapIterator.value();
5480
                ++iportMapIterator ;
5481
            }
5482
            iinstance.setAttribute("port_map",iportList.join("#"));
5483
            iinstancePortMapDescriptionElement.appendChild(iinstance);
5484
            ++instanceportiterator ;
5485
        }
5486
 
5487
        imoduleElement.appendChild(iinstancePortMapDescriptionElement);
5488
        imoduleInfoElement.appendChild(imoduleElement);
5489
    }
5490
    else if(type == infoTypeScanChainStructure)
5491
    {
5492
         EziDebugScanChain * pchain = static_cast<EziDebugScanChain*>(info);
5493
 
5494
         QDomElement ielement = idoc.elementsByTagName("SCAN_CHAIN_INFO").at(0).toElement() ;
5495
 
5496
         // 重新创建log文件时, 保证信息不为空
5497
         if(ielement.attribute("scanreg_core_name").toLower() == "no core")
5498
         {
5499
             QString iregCore = EziDebugScanChain::getChainRegCore().toLower() ;
5500
             if(iregCore == "no core")
5501
             {
5502
                 qDebug() << "EziDebug Error: there is no core info!";
5503
             }
5504
             ielement.setAttribute("scanreg_core_name","_EziDebug_ScnReg");
5505
         }
5506
 
5507
         if(ielement.attribute("tout_core_name").toLower() == "no core")
5508
         {
5509
             QString itoutCore = EziDebugScanChain::getChainToutCore().toLower() ;
5510
             if(itoutCore == "no core")
5511
             {
5512
                 qDebug() << "EziDebug Error: there is no core info!";
5513
             }
5514
             ielement.setAttribute("tout_core_name","_EziDebug_TOUT_m");
5515
         }
5516
 
5517
         if(ielement.attribute("user_dir").toLower().toLower() == "no dir")
5518
         {
5519
             ielement.setAttribute("user_dir","/EziDebug_1.0");
5520
         }
5521
 
5522
 
5523
         QDomElement ichainElement = idoc.createElement("chain") ;
5524
         ichainElement.setAttribute("chain_name",pchain->m_iChainName);
5525
 
5526
         ichainElement.setAttribute("instance_list",pchain->m_iinstanceItemList.join("|"));
5527
 
5528
         ichainElement.setAttribute("scaned_file_list",pchain->m_iscanedFileNameList.join("|"));
5529
         if(pchain->m_isysCoreOutputPortList.count())
5530
         {
5531
            ichainElement.setAttribute("system_output",pchain->m_isysCoreOutputPortList.join("@"));
5532
         }
5533
         else
5534
         {
5535
             ichainElement.setAttribute("system_output","No Sysoutput");
5536
         }
5537
 
5538
         QDomElement iregListDescriptionElement = idoc.createElement("reglist_description");
5539
 
5540
         QMap<QString,QVector<QStringList> >::const_iterator iregChainIter = pchain->m_iregChainStructure.constBegin() ;
5541
         while(iregChainIter != pchain->m_iregChainStructure.constEnd())
5542
         {
5543
             QString iinsertClock = iregChainIter.key() ;
5544
             QVector<QStringList> iregListVec = iregChainIter.value() ;
5545
 
5546
             for(int p = 0 ; p < iregListVec.size(); ++p)
5547
             {
5548
                 QStringList iregList = iregListVec.at(p) ;
5549
                 QString iregString ;
5550
                 iregString = iregList.join("@");
5551
 
5552
                 QDomElement iregChainElement = idoc.createElement("regchain") ;
5553
                 iregChainElement.setAttribute("insertclock",iinsertClock);
5554
 
5555
                 iregChainElement.setAttribute("regcount",pchain->m_nregCountMap.value(iinsertClock,0));
5556
 
5557
                 iregChainElement.setAttribute("reglist",iregString);
5558
                 iregListDescriptionElement.appendChild(iregChainElement);
5559
             }
5560
 
5561
             ++iregChainIter ;
5562
         }
5563
 
5564
         ichainElement.appendChild(iregListDescriptionElement);
5565
 
5566
         QDomElement icodeDescriptionElement = idoc.createElement("code_description") ;
5567
 
5568
         QMap<QString,QStringList>::const_iterator u = pchain->m_icodeMap.constBegin() ;
5569
         while(u != pchain->m_icodeMap.constEnd())
5570
         {
5571
             QStringList iblockCodeList = pchain->m_iblockCodeMap.value(u.key(),QStringList()) ;
5572
             QDomElement icode = idoc.createElement("added_code");
5573
             icode.setAttribute("module_name",u.key());
5574
 
5575
             icode.setAttribute("user_line_code",u.value().join("#"));
5576
             icodeDescriptionElement.appendChild(icode);
5577
 
5578
             if(iblockCodeList.count())
5579
             {
5580
                 icode.setAttribute("user_block_code",iblockCodeList.join("#"));
5581
             }
5582
             else
5583
             {
5584
                 icode.setAttribute("user_block_code","No Code");
5585
             }
5586
             ++u ;
5587
         }
5588
 
5589
 
5590
         ichainElement.appendChild(icodeDescriptionElement);
5591
 
5592
         ielement.appendChild(ichainElement);
5593
    }
5594
    else
5595
    {
5596
        return 1 ;
5597
    }
5598
 
5599
    return 0 ;
5600
}
5601
 
5602
// 删除指定的 file、module、chain 元素
5603
int EziDebugPrj::deleteLogFileElement(QDomDocument &idoc ,LOG_FILE_INFO* loginfo)
5604
{
5605
    QString ielementName ;
5606
    QString iattributionName ;
5607
    if(!loginfo)
5608
    {
5609
        return 1 ;
5610
    }
5611
    QString iinfoName = QString::fromAscii(loginfo->ainfoName);
5612
    INFO_TYPE etype = loginfo->etype ;
5613
    QDomNode ielement ;
5614
    if(etype == infoTypeFileInfo)
5615
    {
5616
        ielement  = idoc.elementsByTagName("FILE_INFO").at(0);
5617
        ielementName = "file" ;
5618
        iattributionName = "file_name" ;
5619
    }
5620
    else if(etype == infoTypeModuleStructure)
5621
    {
5622
        ielement =  idoc.elementsByTagName("MODULE_INFO").at(0);
5623
        ielementName = "module" ;
5624
        iattributionName = "module_name" ;
5625
    }
5626
    else if(etype == infoTypeScanChainStructure)
5627
    {
5628
        ielement =  idoc.elementsByTagName("SCAN_CHAIN_INFO").at(0);
5629
        ielementName = "chain" ;
5630
        iattributionName = "chain_name" ;
5631
    }
5632
    else
5633
    {
5634
        qDebug() << "Error: The element type is not suppport now!";
5635
        return 1 ;
5636
    }
5637
    //ichild.toElement().attribute("module_name")
5638
    QDomNode ichild = ielement.firstChild() ;
5639
    while(!ichild.isNull())
5640
    {
5641
        if((ichild.toElement().tagName() == ielementName )&&(ichild.toElement().attribute(iattributionName) == iinfoName))
5642
        {
5643
            ielement.removeChild(ichild);
5644
            return 0 ;
5645
        }
5646
        ichild = ichild.nextSibling() ;
5647
    }
5648
 
5649
    qDebug() << "EziDebug Info: The element is not delete !" ;
5650
    return 0 ;
5651
 
5652
}
5653
 
5654
void EziDebugPrj::addToChainMap(EziDebugScanChain* chain)
5655
{
5656
    m_ichainInfoMap.insert(chain->getChainName(),chain);
5657
    return ;
5658
}
5659
 
5660
void EziDebugPrj::addToTreeItemMap(const QString &chain ,EziDebugInstanceTreeItem* item)
5661
{
5662
    m_ichainTreeItemMap.insert(chain,item);
5663
    return ;
5664
}
5665
 
5666
void EziDebugPrj::addToQueryItemMap(const QString &name ,EziDebugInstanceTreeItem* item)
5667
{
5668
    m_iqueryTreeItemMap.insert(name,item);
5669
    return ;
5670
}
5671
 
5672
// 将所有文件中的宏放入到 prj 中 方便后面读取
5673
void EziDebugPrj::addToMacroMap(void)
5674
{
5675
    // 目前只考虑 verilog 的宏  不清楚 vhdl 的宏或者其他参数等
5676
    m_imacro.clear();
5677
    QMap<QString,EziDebugVlgFile*>::const_iterator ifileIter = m_ivlgFileMap.constBegin() ;
5678
    while(ifileIter != m_ivlgFileMap.constEnd())
5679
    {
5680
        EziDebugVlgFile *pfile = ifileIter.value() ;
5681
        QMap<QString,QString> imacroMap = pfile->getMacroMap();
5682
        QMap<QString,QString>::const_iterator imacroIter = imacroMap.constBegin() ;
5683
        while(imacroIter != imacroMap.constEnd())
5684
        {
5685
            QString imacroStr = imacroIter.key() ;
5686
            QString imacroVal = imacroIter.value() ;
5687
            m_imacro.insert(imacroStr,imacroVal);
5688
            ++imacroIter ;
5689
        }
5690
        ++ifileIter ;
5691
    }
5692
}
5693
 
5694
const QMap<QString,QString> &EziDebugPrj::getMacroMap(void) const
5695
{
5696
    return m_imacro ;
5697
}
5698
 
5699
void EziDebugPrj::addToDefparameterMap(void)
5700
{
5701
    m_idefparameter.clear();
5702
    QMap<QString,EziDebugVlgFile*>::const_iterator ifileIter = m_ivlgFileMap.constBegin() ;
5703
    while(ifileIter != m_ivlgFileMap.constEnd())
5704
    {
5705
        EziDebugVlgFile* pfile = ifileIter.value();
5706
        QMap<QString,QMap<QString,QString> > idefParamMap = pfile->getDefParamMap() ;
5707
        QMap<QString,QMap<QString,QString> >::const_iterator idefParamIter = idefParamMap.constBegin() ;
5708
        while(idefParamIter != idefParamMap.constEnd())
5709
        {   QMap<QString,QString> iparamMap = idefParamIter.value() ;
5710
            QString iinstanceName = idefParamIter.key() ;
5711
            QMap<QString,QString>::const_iterator iparamIter = iparamMap.constBegin() ;
5712
            while(iparamIter != iparamMap.constEnd())
5713
            {
5714
                QString iparamStr = iparamIter.key() ;
5715
                QString iparamVal = iparamIter.value() ;
5716
                QMap<QString,QString> ivalueMap ;
5717
                ivalueMap = m_idefparameter.value(iinstanceName,ivalueMap) ;
5718
                ivalueMap.insert(iparamStr,iparamVal) ;
5719
                m_idefparameter.insert(iinstanceName,ivalueMap) ;
5720
                ++iparamIter ;
5721
            }
5722
            ++idefParamIter ;
5723
        }
5724
        ++ifileIter ;
5725
    }
5726
}
5727
 
5728
QMap<QString,QString> EziDebugPrj::getdefparam(const QString &instancename)
5729
{
5730
   QMap<QString,QString> idefparamMap ;
5731
   return m_idefparameter.value(instancename,idefparamMap) ;
5732
}
5733
 
5734
EziDebugInstanceTreeItem* EziDebugPrj::getQueryItem(const QString &name)
5735
{
5736
    return m_iqueryTreeItemMap.value(name,NULL);
5737
}
5738
 
5739
void EziDebugPrj::updateTreeItem(EziDebugInstanceTreeItem* item)
5740
{
5741
    EziDebugInstanceTreeItem* pitem = NULL ;
5742
 
5743
    // 获得 那些已经加入链的  头节点,用来给新的节点 赋值 
5744
    if(m_elastOperation == OperateTypeDelAllScanChain)
5745
    {
5746
        pitem = m_ibackupQueryTreeItemMap.value(item->getNameData(),NULL);
5747
        if(pitem)
5748
        {
5749
           item->setScanChainInfo(pitem->getScanChainInfo()) ;
5750
           m_iqueryTreeItemMap.insert(item->getNameData(),item);
5751
           m_ibackupChainTreeItemMap.insert(pitem->getScanChainInfo()->getChainName(),item);
5752
        }
5753
    }
5754
    else
5755
    {
5756
        pitem = m_iqueryTreeItemMap.value(item->getNameData(),NULL);
5757
        if(pitem)
5758
        {
5759
            item->setScanChainInfo(pitem->getScanChainInfo()) ;
5760
            m_ibackupQueryTreeItemMap.insert(item->getNameData(),item);
5761
            m_ichainTreeItemMap.insert(pitem->getScanChainInfo()->getChainName(),item);
5762
        }
5763
 
5764
        // 添加链、或删除链
5765
        if(m_pLastOperteTreeItem)
5766
        {
5767
            if(m_pLastOperteTreeItem->getNameData() == item->getNameData())
5768
            {
5769
                m_pLastOperteTreeItem = item ;
5770
            }
5771
        }
5772
 
5773
    }
5774
 
5775
//        m_ichainTreeItemMap.insert(pitem->getScanChainInfo()->getChainName(),item);
5776
 
5777
//        EziDebugScanChain* pchain = m_ichainInfoMap.value(pitem->getScanChainInfo()->getChainName(),NULL);
5778
//        if(pchain)
5779
//        {
5780
//            pchain->setHeadTreeItem(item);
5781
//        }
5782
//        else
5783
//        {
5784
//            qDebug() << "NULL Pointer!" << __LINE__ << __FILE__ ;
5785
//        }
5786
 
5787
    // 遍历所有子节点
5788
    for(int i = 0 ; i < item->childCount() ;i++)
5789
    {
5790
        updateTreeItem(item->child(i));
5791
    }
5792
 
5793
}
5794
 
5795
void EziDebugPrj::eliminateChainFromMap(const QString &chain)
5796
{
5797
    m_ichainInfoMap.remove(chain);
5798
    return ;
5799
}
5800
 
5801
void EziDebugPrj::eliminateTreeItemFromMap(const QString &chain)
5802
 
5803
{
5804
    m_ichainTreeItemMap.remove(chain);
5805
    return ;
5806
}
5807
 
5808
void EziDebugPrj::eliminateTreeItemFromQueryMap(const QString &combinedname)
5809
{
5810
    m_iqueryTreeItemMap.remove(combinedname);
5811
    return ;
5812
}
5813
 
5814
void EziDebugPrj::backupChainQueryTreeItemMap(void)
5815
{
5816
    m_ibackupQueryTreeItemMap = m_iqueryTreeItemMap ;
5817
    return ;
5818
}
5819
 
5820
void EziDebugPrj::backupChainTreeItemMap(void)
5821
{
5822
    m_ibackupChainTreeItemMap = m_ichainTreeItemMap ;
5823
    return ;
5824
}
5825
 
5826
void EziDebugPrj::cleanupBakChainTreeItemMap(void)
5827
{
5828
    m_ibackupChainTreeItemMap.clear() ;
5829
    return ;
5830
}
5831
 
5832
 void EziDebugPrj::cleanupChainTreeItemMap(void)
5833
 {
5834
    m_ichainTreeItemMap.clear();
5835
    return ;
5836
 }
5837
 
5838
 void EziDebugPrj::cleanupChainQueryTreeItemMap(void)
5839
 {
5840
    m_iqueryTreeItemMap.clear();
5841
    return ;
5842
 }
5843
 
5844
 void EziDebugPrj::cleanupBakChainQueryTreeItemMap(void)
5845
 {
5846
    m_ibackupQueryTreeItemMap.clear();
5847
    return ;
5848
 }
5849
 
5850
void EziDebugPrj::resumeChainTreeItemMap(void)
5851
{
5852
    m_ichainTreeItemMap = m_ibackupChainTreeItemMap ;
5853
}
5854
 
5855
void EziDebugPrj::resumeChainQueryTreeItemMap(void)
5856
{
5857
    m_iqueryTreeItemMap = m_ibackupQueryTreeItemMap ;
5858
}
5859
 
5860
void EziDebugPrj::backupChainMap(void)
5861
{
5862
    m_ibackupChainInfoMap = m_ichainInfoMap ;
5863
}
5864
 
5865
void EziDebugPrj::cleanupChainMap(void)
5866
{
5867
    m_ichainInfoMap.clear();
5868
}
5869
 
5870
void EziDebugPrj::resumeChainMap(void)
5871
{
5872
    m_ichainInfoMap = m_ibackupChainInfoMap ;
5873
    return ;
5874
}
5875
 
5876
int EziDebugPrj::createCfgFile(EziDebugInstanceTreeItem * item)
5877
{
5878
    if(m_eusedTool == ToolQuartus)
5879
    {
5880
        if(m_itoolSoftwareVersion == "8.0")
5881
        {
5882
            /*创建 stp 文件 */
5883
            QString istpFileName("_EziDebug_stp.stp");
5884
            int istpCount = 0 ;
5885
            while(m_iwaveFileList.contains(istpFileName))
5886
            {
5887
                istpFileName = QObject::tr("_EziDebug_stp%1.stp").arg(istpCount);
5888
                istpCount++ ;
5889
            }
5890
 
5891
            QFileInfo istpFileInfo(m_iprjPath ,istpFileName);
5892
            QFile istpFile(istpFileInfo.absoluteFilePath());
5893
 
5894
            if(!istpFile.open(QIODevice::WriteOnly|QIODevice::Text))
5895
            {
5896
                qDebug() << "Cannot Open file for reading:" << qPrintable(istpFile.errorString());
5897
                return  1 ;
5898
            }
5899
 
5900
            QTextStream istpOutStream(&istpFile) ;
5901
 
5902
            /*判断软件版本*/
5903
            QString ifileContent ;
5904
            // <session sof_file="" top_level_entity="tb_ifft_top">
5905
            QString ilabelSessionStart(QObject::tr("<session sof_file=\"\" top_level_entity=\"%1\">").arg(m_itopModule));
5906
            // <display_tree gui_logging_enabled="0">
5907
            QString ilabelDisplay_treeStart(QObject::tr("\n  <display_tree gui_logging_enabled=\"0\">"));
5908
            ifileContent.append(ilabelSessionStart);
5909
            ifileContent.append(ilabelDisplay_treeStart);
5910
 
5911
            /*
5912
                <display_branch instance="auto_signaltap_0" signal_set="USE_GLOBAL_TEMP" trigger="USE_GLOBAL_TEMP"/>
5913
                <display_branch instance="auto_signaltap_1" signal_set="USE_GLOBAL_TEMP" trigger="USE_GLOBAL_TEMP"/>
5914
            */
5915
 
5916
            EziDebugModule *pmodule = this->getPrjModuleMap().value(item->getModuleName());
5917
 
5918
            for(int i = 0 ; i < pmodule->getClockSignal().count() ;i++)
5919
            {
5920
                QString ilabelDisplay_branch(QObject::tr("\n    <display_branch instance=\"auto_signaltap_%1\" signal_set=\"USE_GLOBAL_TEMP\" trigger=\"USE_GLOBAL_TEMP\"/>")\
5921
                                             .arg(i)) ;
5922
                ifileContent.append(ilabelDisplay_branch);
5923
            }
5924
 
5925
            // </display_tree>
5926
            QString ilabelDisplay_treeEnd(QObject::tr("\n  </display_tree>")) ;
5927
            ifileContent.append(ilabelDisplay_treeEnd);
5928
 
5929
 
5930
            /*创建 各个时钟 的 instance */
5931
 
5932
            /*
5933
             <instance entity_name="sld_signaltap" is_auto_node="yes" is_expanded="true" name="auto_signaltap_0" source_file="sld_signaltap.vhd">
5934
             <node_ip_info instance_id="0" mfg_id="110" node_id="0" version="6"/>
5935
                <position_info>
5936
                    <single attribute="active tab" value="1"/>
5937
                    <single attribute="setup horizontal scroll position" value="0"/>
5938
                    <single attribute="setup vertical scroll position" value="0"/>
5939
                </position_info>
5940
            */
5941
 
5942
//            QString ilabelInstanceStart(tr(""\
5943
//                                           "<instance entity_name=\"sld_signaltap\" is_auto_node=\"yes\" is_expanded=\"true\" name=\"auto_signaltap_0\" source_file=\"sld_signaltap.vhd\">")) ;
5944
 
5945
 
5946
//            ifileContent.append(ilabelInstanceStart);
5947
 
5948
            QString iinstanceString = constructCfgInstanceString(item);
5949
 
5950
            if(iinstanceString.isEmpty())
5951
            {
5952
                return 1 ;
5953
            }
5954
            ifileContent.append(iinstanceString);
5955
 
5956
            QString ilabelGlobal_infoStart(QObject::tr("\n  <global_info>"));
5957
            ifileContent.append(ilabelGlobal_infoStart);
5958
 
5959
            QString ilabelSingle1(QObject::tr("\n    <single attribute=\"active instance\" value=\"0\"/>"));
5960
            ifileContent.append(ilabelSingle1);
5961
 
5962
            QString ilabelSingle2(QObject::tr("\n    <single attribute=\"lock mode\" value=\"36110\"/>"));
5963
            ifileContent.append(ilabelSingle2);
5964
 
5965
            QString ilabelmulti1(QObject::tr("\n    <multi attribute=\"column width\" size=\"18\" value=\"34,34,223,74,68,70,88,100,101,101,101,101,101,101,101,101,107,78\"/>"));
5966
            ifileContent.append(ilabelmulti1);
5967
 
5968
            QString ilabelmulti2(QObject::tr("\n    <multi attribute=\"window position\" size=\"9\" value=\"1440,799,398,124,356,50,124,0,0\"/>"));
5969
            ifileContent.append(ilabelmulti2);
5970
 
5971
            QString ilabelGlobal_infoEnd(QObject::tr("\n  </global_info>"));
5972
            ifileContent.append(ilabelGlobal_infoEnd);
5973
 
5974
            QString ilabelSessionEnd(QObject::tr("\n</session>"));
5975
            ifileContent.append(ilabelSessionEnd);
5976
 
5977
            istpOutStream << ifileContent ;
5978
 
5979
            istpFile.close();
5980
 
5981
            QFile iprjFile(m_iprjName);
5982
            if(!iprjFile.open(QIODevice::ReadOnly|QIODevice::Text))
5983
            {
5984
                qDebug() << "Cannot Open file for reading:" << qPrintable(iprjFile.errorString());
5985
                return 1 ;
5986
            }
5987
 
5988
            QTextStream iinStream(&iprjFile) ;
5989
            QString ifileAllString =  iinStream.readAll();
5990
            iprjFile.close();
5991
 
5992
            int nlastPosOfVlgKeyWord = ifileAllString.lastIndexOf(QRegExp(QObject::tr("\\bVERILOG_FILE\\b")));
5993
            int nlastPosOfVhdlKeyWord = ifileAllString.lastIndexOf(QRegExp(QObject::tr("\\bVHDL_FILE\\b"))) ;
5994
 
5995
 
5996
            if(nlastPosOfVlgKeyWord > nlastPosOfVhdlKeyWord)
5997
            {
5998
                int ienterPos = ifileAllString.indexOf('\n',nlastPosOfVlgKeyWord);
5999
 
6000
                ifileAllString.insert(ienterPos,QObject::tr("\n""set_global_assignment -name SIGNALTAP_FILE %1").arg(istpFileName));
6001
            }
6002
            else
6003
            {
6004
                int ienterPos = ifileAllString.indexOf('\n',nlastPosOfVhdlKeyWord);
6005
                ifileAllString.insert(ienterPos,QObject::tr("\n""set_global_assignment -name SIGNALTAP_FILE %1").arg(istpFileName));
6006
            }
6007
 
6008
 
6009
            if(!iprjFile.open(QIODevice::WriteOnly|QIODevice::Text|QIODevice::Truncate))
6010
            {
6011
                qDebug() << "Cannot Open file for reading:" << qPrintable(iprjFile.errorString());
6012
                return 1 ;
6013
            }
6014
 
6015
            QTextStream iprjOutStream(&iprjFile) ;
6016
 
6017
            iprjOutStream << ifileAllString ;
6018
 
6019
            iprjFile.close();
6020
 
6021
        }
6022
    }
6023
    else if(m_eusedTool == ToolIse)
6024
    {
6025
        QString iinstanceName = item->getInstanceName();
6026
        QString ifileContent(QObject::tr("#ChipScope Core Inserter Project File Version 3.0")) ;
6027
        /*创建 cdc 文件 */
6028
        QString icdcFileName(QObject::tr("_EziDebug_%1.cdc").arg(iinstanceName));
6029
        QString ichainName(item->getScanChainInfo()->getChainName())   ;
6030
        QString iilaStr ;
6031
        int icdcCount = 0 ;
6032
        while(m_iprjPath.exists(icdcFileName))
6033
        {
6034
            icdcFileName = QObject::tr("_EziDebug_%1.cdc").arg(iinstanceName+QString::number(icdcCount));
6035
            icdcCount++ ;
6036
        }
6037
        QString iprjPath ;
6038
        iprjPath.clear();
6039
        QString iinputFilePath = m_iprjPath.absolutePath();
6040
 
6041
        QString isingleSep(QDir::separator());
6042
        QString idoubleSep ;
6043
 
6044
        if(isingleSep == "\\")
6045
        {
6046
            isingleSep = "\\";
6047
            idoubleSep = "\\\\" ;
6048
        }
6049
        else
6050
        {
6051
            isingleSep = "\\";
6052
            idoubleSep = "\\\\" ;
6053
        }
6054
        iinputFilePath = QDir::toNativeSeparators(iinputFilePath) ;
6055
 
6056
        iinputFilePath.replace(isingleSep ,idoubleSep );
6057
 
6058
 
6059
        QString icolon ;
6060
        icolon.append(isingleSep + ":");
6061
        iinputFilePath.replace(":", icolon);
6062
        iprjPath.append(iinputFilePath) ;
6063
        iinputFilePath.append(tr("%1%2.ngc").arg(idoubleSep).arg(m_headItem->getModuleName()));
6064
 
6065
        QString ioutputDir = iprjPath.append(tr("%1_ngo").arg(idoubleSep));
6066
 
6067
        QFileInfo icdcFileInfo(m_iprjPath ,icdcFileName);
6068
        QFile icdcFile(icdcFileInfo.absoluteFilePath());
6069
        if(!icdcFile.open(QIODevice::WriteOnly|QIODevice::Text))
6070
        {
6071
            qDebug() << "Cannot Open file for reading:" << icdcFile.errorString();
6072
            return  1 ;
6073
        }
6074
 
6075
        QTextStream icdcOutStream(&icdcFile) ;
6076
 
6077
        QDate icurrentDate = QDate::currentDate() ;
6078
        QTime icurrentTime = QTime::currentTime() ;
6079
 
6080
        //QString idateCom = QObject::tr("%1" "%2" "%3").arg(day[icurrentDate.dayOfWeek()]).arg(month[icurrentDate.month()]).arg(icurrentDate.daysInMonth());
6081
        // icurrentDate.toString("ddd MMM dd")
6082
        QString itimeString(QObject::tr("\n""#%1 %2 %3 %4 CST %5")\
6083
                            .arg(day[icurrentDate.dayOfWeek()]) \
6084
                            .arg(month[icurrentDate.month()])\
6085
                            .arg(icurrentDate.toString("dd"))\
6086
                            .arg(icurrentTime.toString(QObject::tr("hh:mm:ss")))
6087
                            .arg(icurrentDate.year())) ;
6088
 
6089
 
6090
        /*工程 导入 的网表文件 和 导出的 网表文件 */
6091
        QString iinNetFile(QObject::tr("\n""Project.device.designInputFile=%1").arg(iinputFilePath));
6092
        QString ioutNetFile(QObject::tr("\n""Project.device.designOutputFile=%1").arg(iinputFilePath));
6093
 
6094
        QString ideviceFamily(QObject::tr("\n""Project.device.deviceFamily=12"));
6095
        QString idevice_enableRPMs(QObject::tr("\n""Project.device.enableRPMs=true"));
6096
        QString idevice_outputDirectory(QObject::tr("\n""Project.device.outputDirectory=%1").arg(ioutputDir));
6097
        QString idevice_useSRL16(QObject::tr("\n""Project.device.useSRL16=true"));
6098
        QString ifilter_dimension(QObject::tr("\n""Project.filter.dimension=1"));
6099
        QString ifilter(QObject::tr("\n""Project.filter<0>="));
6100
        QString iicon_boundaryScanChain(QObject::tr("\n""Project.icon.boundaryScanChain=1"));
6101
        QString iicon_disableBUFGInsertion(QObject::tr("\n""Project.icon.disableBUFGInsertion=false"));
6102
        QString iicon_enableExtTriggerIn(QObject::tr("\n""Project.icon.enableExtTriggerIn=false"));
6103
        QString iicon_enableExtTriggerOut(QObject::tr("\n""Project.icon.enableExtTriggerOut=false"));
6104
        QString iicon_triggerInPinName(QObject::tr("\n""Project.icon.triggerInPinName="));
6105
        QString iicon_triggerOutPinName(QObject::tr("\n""Project.icon.triggerOutPinName="));
6106
 
6107
 
6108
        /*
6109
            #ChipScope Core Inserter Project File Version 3.0
6110
            #Mon Sep 03 15:30:56 CST 2012
6111
            Project.device.designInputFile=E\:\\gy\\ise_test\\ise_test.ngc
6112
            Project.device.designOutputFile=E\:\\gy\\ise_test\\ise_test.ngc
6113
            Project.device.deviceFamily=12
6114
            Project.device.enableRPMs=true
6115
            Project.device.outputDirectory=E\:\\gy\\ise_test\\_ngo
6116
            Project.device.useSRL16=true
6117
            Project.filter.dimension=1
6118
            Project.filter<0>=
6119
            Project.icon.boundaryScanChain=1
6120
            Project.icon.disableBUFGInsertion=false
6121
            Project.icon.enableExtTriggerIn=false
6122
            Project.icon.enableExtTriggerOut=false
6123
            Project.icon.triggerInPinName=
6124
            Project.icon.triggerOutPinName=
6125
            Project.unit.dimension=1
6126
            Project.unit<0>.clockChannel=clk_BUFGP
6127
            Project.unit<0>.clockEdge=Rising
6128
            Project.unit<0>.dataDepth=512
6129
            Project.unit<0>.dataEqualsTrigger=true
6130
            Project.unit<0>.dataPortWidth=2
6131
            Project.unit<0>.enableGaps=false
6132
            Project.unit<0>.enableStorageQualification=true
6133
            Project.unit<0>.enableTimestamps=false
6134
            Project.unit<0>.timestampDepth=0
6135
            Project.unit<0>.timestampWidth=0
6136
            Project.unit<0>.triggerChannel<0><0>=cnt1
6137
            Project.unit<0>.triggerChannel<0><1>=cnt2
6138
            Project.unit<0>.triggerConditionCountWidth=0
6139
            Project.unit<0>.triggerMatchCount<0>=1
6140
            Project.unit<0>.triggerMatchCountWidth<0><0>=0
6141
            Project.unit<0>.triggerMatchType<0><0>=0
6142
            Project.unit<0>.triggerPortCount=1
6143
            Project.unit<0>.triggerPortIsData<0>=true
6144
            Project.unit<0>.triggerPortWidth<0>=2
6145
            Project.unit<0>.triggerSequencerLevels=16
6146
            Project.unit<0>.triggerSequencerType=1
6147
            Project.unit<0>.type=ilaprol
6148
        */
6149
        //
6150
 
6151
        QMap<QString,QString> iclockMap = item->parent()->getModuleClockMap(item->getInstanceName()) ;
6152
        QString iregHiberarchy =  item->getItemHierarchyName();
6153
 
6154
        QRegExp ireplaceRegExp(QObject::tr("\\b\\w*:"));
6155
        QRegExp iregExp(QObject::tr("\\b%1:%2.*").arg(item->getModuleName()).arg(item->getInstanceName()));
6156
        QString inewRegHiberarchy = iregHiberarchy.replace('|','/') ;
6157
        inewRegHiberarchy = inewRegHiberarchy.replace(iregExp,"") ;
6158
        // 剔出 modulexxx: 字符
6159
        inewRegHiberarchy.replace(ireplaceRegExp,"");
6160
 
6161
        int i = 0 ;
6162
        int ntriggerNum = 0 ;
6163
 
6164
        QMap<QString,QString>::const_iterator iclockIterator = iclockMap.constBegin();
6165
        {
6166
            int nregWidth = -1 ;
6167
            ntriggerNum = 0 ;
6168
            QString itriggerChannelString ;
6169
            //Project.unit<0>.clockChannel=clk_BUFGP
6170
            //Project.unit<0>.clockEdge=Rising
6171
            // .arg(iclockIterator.key())
6172
 
6173
#if 0
6174
            QString iedgeString = this->getPrjModuleMap().value(item->getModuleName())->getClockSignal().value(iclockIterator.value());
6175
            if(iedgeString == "posedge")
6176
            {
6177
                iedgeString = QObject::tr("Rising");
6178
            }
6179
            else
6180
            {
6181
                iedgeString = QObject::tr("Descending");
6182
            }
6183
#endif
6184
 
6185
            if((iclockIterator.key() == item->getScanChainInfo()->getscaningPortClock())||(iclockMap.count()==1))
6186
            {
6187
                QString isuffixString ;
6188
                QString itdoPortRegName(QObject::tr("_EziDebug_%1_%2_tdo_r").arg(item->getScanChainInfo()->getChainName()).arg(iclockIterator.value()));
6189
 
6190
 
6191
                for(int m = (item->getScanChainInfo()->getChildChainNum(iclockIterator.key()) - 1) ; m >= 0  ; m--)
6192
                {
6193
                    if(item->getScanChainInfo()->getChildChainNum(iclockIterator.key()) > 1)
6194
                    {
6195
                        isuffixString = QObject::tr("<%1>").arg(m) ;
6196
                    }
6197
                    else
6198
                    {
6199
                        isuffixString.clear();
6200
                    }
6201
 
6202
                    if(nregWidth == 255)
6203
                    {
6204
                        ntriggerNum++ ;
6205
                        nregWidth = 0 ;
6206
                    }
6207
                    else
6208
                    {
6209
                        nregWidth++ ;
6210
                    }
6211
 
6212
                    itriggerChannelString.append(QObject::tr("\n""Project.unit<%1>.triggerChannel<%2><%3>=%4")\
6213
                                               .arg(i).arg(ntriggerNum).arg(nregWidth).arg(inewRegHiberarchy + itdoPortRegName + isuffixString));
6214
 
6215
                }
6216
 
6217
                // tout
6218
 
6219
                if(nregWidth == 255)
6220
                {
6221
                    ntriggerNum++ ;
6222
                    nregWidth = 0 ;
6223
                }
6224
                else
6225
                {
6226
                    nregWidth++ ;
6227
                }
6228
                QString itoutPortRegName(QObject::tr("_EziDebug_%1_tout_r").arg(item->getScanChainInfo()->getChainName()));
6229
                itriggerChannelString.append(QObject::tr("\n""Project.unit<%1>.triggerChannel<%2><%3>=%4")\
6230
                                             .arg(i).arg(ntriggerNum).arg(nregWidth).arg(inewRegHiberarchy + itoutPortRegName));
6231
 
6232
 
6233
 
6234
                EziDebugModule *  pmodule = m_imoduleMap.value(item->getModuleName(),NULL) ;
6235
 
6236
                if(!pmodule)
6237
                {
6238
                    qDebug() << "EziDebug Error: NULL Pointer!";
6239
                    return  1 ;
6240
                }
6241
 
6242
                QVector<EziDebugModule::PortStructure*> iportVec = this->getPrjModuleMap().value(item->getModuleName())->getPort(this,item->getInstanceName());
6243
                for(int j = 0 ; j < iportVec.count() ; j++)
6244
                {
6245
                    QString iportName = QString::fromAscii(iportVec.at(j)->m_pPortName) ;
6246
                    QString iportRegName(QObject::tr("_EziDebug_%1_%2_r").arg(ichainName).arg(iportName));
6247
                    // 跳过时钟  复位信号
6248
                    if(!(pmodule->getClockSignal().value(iportName,QString())).isEmpty())
6249
                    {
6250
                        continue ;
6251
                    }
6252
 
6253
                    if(!(pmodule->getResetSignal().value(iportName,QString())).isEmpty())
6254
                    {
6255
                        continue ;
6256
                    }
6257
 
6258
                    QString isuffixString ;
6259
                    for(int m = 0 ; m < iportVec.at(j)->m_unBitwidth ; m++)
6260
                    {
6261
                        if(1 == iportVec.at(j)->m_unBitwidth)
6262
                        {
6263
                            isuffixString.clear();
6264
                        }
6265
                        else
6266
                        {
6267
                            if(iportVec.at(j)->m_eEndian == EziDebugModule::endianBig)
6268
                            {
6269
 
6270
                                isuffixString = QObject::tr("<%1>").arg(iportVec.at(j)->m_unStartBit- m) ;
6271
                            }
6272
                            else
6273
                            {
6274
                                isuffixString = QObject::tr("<%1>").arg(iportVec.at(j)->m_unStartBit + m) ;
6275
                            }
6276
                        }
6277
 
6278
                        if(nregWidth == 255)
6279
                        {
6280
                            ntriggerNum++ ;
6281
                            nregWidth = 0 ;
6282
                        }
6283
                        else
6284
                        {
6285
                            nregWidth++ ;
6286
                        }
6287
 
6288
                        itriggerChannelString.append(QObject::tr("\n""Project.unit<%1>.triggerChannel<%2><%3>=%4")\
6289
                                                     .arg(i).arg(ntriggerNum).arg(nregWidth).arg(inewRegHiberarchy + iportRegName + isuffixString));
6290
 
6291
                    }
6292
                }
6293
 
6294
                // 内部端口寄存器
6295
                QStringList  iportList = item->getScanChainInfo()->getSyscoreOutputPortList() ;
6296
                for(int n = 0 ; n < iportList.count() ; n++ )
6297
                {
6298
                    QString ihierarchyName = iportList.at(n).split(QObject::tr("#")).at(0);
6299
                    QRegExp ieraseExp(QObject::tr("\\b\\w*:"));
6300
                    ihierarchyName.replace(ieraseExp,"");
6301
                    ihierarchyName.replace("|","/");
6302
 
6303
                    QString iregName = iportList.at(n).split(QObject::tr("#")).at(2);
6304
                    int nbitWidth =  iportList.at(n).split(QObject::tr("#")).at(3).toInt();
6305
                    QString isuffixString ;
6306
                    for(int n = (nbitWidth -1) ; n >= 0 ; n--)
6307
                    {
6308
                        if(nbitWidth > 1)
6309
                        {
6310
                            isuffixString = QObject::tr("<%1>").arg(n) ;
6311
                        }
6312
                        else
6313
                        {
6314
                            isuffixString.clear();
6315
                        }
6316
 
6317
                        if(nregWidth == 255)
6318
                        {
6319
                            ntriggerNum++ ;
6320
                            nregWidth = 0 ;
6321
                        }
6322
                        else
6323
                        {
6324
                            nregWidth++ ;
6325
                        }
6326
 
6327
                        itriggerChannelString.append(QObject::tr("\n""Project.unit<%1>.triggerChannel<%2><%3>=%4")\
6328
                                                     .arg(i).arg(ntriggerNum).arg(nregWidth).arg(ihierarchyName + iregName + isuffixString));
6329
                    }
6330
                }
6331
 
6332
            }
6333
            else
6334
            {
6335
                qDebug() << "EziDebug Error: create the cdc file error!";
6336
                return 2 ;
6337
            }
6338
 
6339
            QString  iclockChannel(QObject::tr("\n""Project.unit<%1>.clockChannel=").arg(i));
6340
            QString  iclockEdge(QObject::tr("\n""Project.unit<%1>.clockEdge=").arg(i));
6341
            QString  idataDepth(QObject::tr("\n""Project.unit<%1>.dataDepth=%2").arg(i).arg(m_nmaxRegNumInChain*2));
6342
            QString  idataEqualsTrigger(QObject::tr("\n""Project.unit<%1>.dataEqualsTrigger=true").arg(i));
6343
 
6344
            QString idataPortWidth(QObject::tr("\n""Project.unit<%1>.dataPortWidth=").arg(i));
6345
            QString ienableGaps(QObject::tr("\n""Project.unit<%1>.enableGaps=false").arg(i));
6346
            QString ienableStorageQualification(QObject::tr("\n""Project.unit<%1>.enableStorageQualification=true").arg(i));
6347
            QString ienableTimestamps(QObject::tr("\n""Project.unit<%1>.enableTimestamps=false").arg(i));
6348
            QString itimestampDepth(QObject::tr("\n""Project.unit<%1>.timestampDepth=0").arg(i));
6349
            QString itimestampWidth(QObject::tr("\n""Project.unit<%1>.timestampWidth=0").arg(i));
6350
 
6351
            QString itriggerConditionCountWidth(QObject::tr("\n""Project.unit<%1>.triggerConditionCountWidth=0").arg(i));
6352
            QString itriggerMatchCount(QObject::tr("\n""Project.unit<%1>.triggerMatchCount<0>=1").arg(i));
6353
            QString itriggerMatchCountWidth(QObject::tr("\n""Project.unit<%1>.triggerMatchCountWidth<0><0>=0").arg(i));
6354
            QString itriggerMatchType(QObject::tr("\n""Project.unit<%1>.triggerMatchType<0><0>=0").arg(i));
6355
            QString itriggerPortCount(QObject::tr("\n""Project.unit<%1>.triggerPortCount=%2").arg(i).arg(ntriggerNum+1)) ;
6356
            QString itriggerPortIsData ;
6357
            for(int trinum = 0 ; trinum < (ntriggerNum+1);trinum++)
6358
            {
6359
                itriggerPortIsData.append(QObject::tr("\n""Project.unit<%1>.triggerPortIsData<%2>=true").arg(i).arg(trinum));
6360
            }
6361
 
6362
            QString itriggerPortWidth ;
6363
            for(int trinum = 0 ; trinum < (ntriggerNum+1);trinum++)
6364
            {
6365
                if(trinum == ntriggerNum)
6366
                {
6367
                    itriggerPortWidth.append(QObject::tr("\n""Project.unit<%1>.triggerPortWidth<%2>=%3").arg(i).arg(trinum).arg(nregWidth));
6368
                }
6369
                else
6370
                {
6371
                    itriggerPortWidth.append(QObject::tr("\n""Project.unit<%1>.triggerPortWidth<%2>=%3").arg(i).arg(trinum).arg(255));
6372
                }
6373
            }
6374
            QString itriggerSequencerLevels(QObject::tr("\n""Project.unit<%1>.triggerSequencerLevels=16").arg(i));
6375
            QString itriggerSequencerType(QObject::tr("\n""Project.unit<%1>.triggerSequencerType=1").arg(i));
6376
            QString itype(QObject::tr("\n""Project.unit<%1>.type=ilapro").arg(i));
6377
 
6378
 
6379
            QString iprjUnit = iclockChannel \
6380
                    + iclockEdge \
6381
                    + idataDepth \
6382
                    + idataEqualsTrigger \
6383
                    + idataPortWidth \
6384
                    + ienableGaps \
6385
                    + ienableStorageQualification \
6386
                    + ienableTimestamps \
6387
                    + itimestampDepth \
6388
                    + itimestampWidth \
6389
                    + itriggerChannelString \
6390
                    + itriggerConditionCountWidth \
6391
                    + itriggerMatchCount \
6392
                    + itriggerMatchCountWidth \
6393
                    + itriggerPortCount \
6394
                    + itriggerMatchType \
6395
                    + itriggerPortIsData \
6396
                    + itriggerPortWidth \
6397
                    + itriggerSequencerLevels \
6398
                    + itriggerSequencerType \
6399
                    + itype ;
6400
            iilaStr.append(iprjUnit) ;
6401
 
6402
            ++i ;
6403
            ++iclockIterator ;
6404
        }
6405
 
6406
 
6407
        QString iunit_dimension(QObject::tr("\n""Project.unit.dimension=%1").arg(i));
6408
 
6409
        QString ipartOneString = itimeString \
6410
                + iinNetFile  \
6411
                + ioutNetFile \
6412
                + ideviceFamily  \
6413
                + idevice_enableRPMs  \
6414
                + idevice_outputDirectory  \
6415
                + idevice_useSRL16 \
6416
                + ifilter_dimension  \
6417
                + ifilter \
6418
                + iicon_boundaryScanChain  \
6419
                + iicon_disableBUFGInsertion  \
6420
                + iicon_enableExtTriggerIn  \
6421
                + iicon_enableExtTriggerOut  \
6422
                + iicon_triggerInPinName  \
6423
                + iicon_triggerOutPinName \
6424
                + iunit_dimension ;
6425
 
6426
        ifileContent.append(ipartOneString) ;
6427
        ifileContent.append(iilaStr) ;
6428
 
6429
        icdcOutStream <<  ifileContent ;
6430
        icdcFile.close();
6431
    }
6432
    else
6433
    {
6434
        /*输出文本*/
6435
        return 1 ;
6436
    }
6437
 
6438
    return 0 ;
6439
}
6440
 
6441
int EziDebugPrj:: chkEziDebugFileInvolved()
6442
{
6443
    QFile iprjFile(m_iprjName);
6444
    if(!iprjFile.open(QIODevice::Text|QIODevice::ReadOnly))
6445
    {
6446
        qDebug() << "EziDebug Error:Can not Open file for reading:" << qPrintable(iprjFile.errorString());
6447
        return -1 ;
6448
    }
6449
    //       "A" "" "" "" "PROP_UserBrowsedStrategyFiles" ""
6450
    QTextStream ifileStream(&iprjFile);
6451
    QString ifileContent  = ifileStream.readAll() ;
6452
    iprjFile.close();
6453
 
6454
 
6455
    if(m_eusedTool == ToolQuartus)
6456
    {
6457
        return 0 ;
6458
    }
6459
    else if(m_eusedTool == ToolIse)
6460
    {
6461
        if(m_itoolSoftwareVersion == "10.x")
6462
        {
6463
            // 修改 set user_files
6464
 
6465
            // set user_files
6466
            int nfileKeyPos = ifileContent.indexOf("set user_files") ;
6467
            if(nfileKeyPos != -1)
6468
            {
6469
                int nleftBra = ifileContent.indexOf('}',nfileKeyPos) ;
6470
                if(nleftBra != -1)
6471
                {
6472
                    QString ifileListStr = ifileContent.mid(nfileKeyPos,nleftBra - nfileKeyPos + 1);
6473
                    if((ifileListStr.contains(QRegExp("\"EziDebug_1.0/_EziDebug_ScanChainReg.v\"")))
6474
                        &&(ifileListStr.contains(QRegExp("\"EziDebug_1.0/_EziDebug_TOUT_m.v\""))))
6475
                    {
6476
                        qDebug() << "The project file already contains the new file info!";
6477
                        return 1 ;
6478
                    }
6479
                    else
6480
                    {
6481
                        return 0 ;
6482
                    }
6483
 
6484
                }
6485
                else
6486
                {
6487
                    qDebug() << "EziDebug Error:reading filecontent error!" << __LINE__;
6488
                    return -1;
6489
                }
6490
            }
6491
            else
6492
            {
6493
                qDebug() << "EziDebug Error:reading filecontent error!" << __LINE__;
6494
                return -1 ;
6495
            }
6496
        }
6497
        else if(m_itoolSoftwareVersion == "14.x")
6498
        {
6499
            return 0 ;
6500
        }
6501
        else
6502
        {
6503
            return 0 ; // do nothing!
6504
        }
6505
    }
6506
    else
6507
    {
6508
        return 0 ; // do nothing!
6509
    }
6510
}
6511
 
6512
QString EziDebugPrj::constructCfgInstanceString(EziDebugInstanceTreeItem * item)
6513
{
6514
    /*
6515
    <node_ip_info instance_id="0" mfg_id="110" node_id="0" version="6"/>
6516
    <position_info>
6517
      <single attribute="active tab" value="1"/>
6518
      <single attribute="setup horizontal scroll position" value="0"/>
6519
      <single attribute="setup vertical scroll position" value="0"/>
6520
    </position_info>
6521
    */
6522
    QString ifileContent ;
6523
 
6524
    EziDebugModule *pmodule = this->getPrjModuleMap().value(item->getModuleName());
6525
 
6526
    QMap<QString,QString>::const_iterator iclockiterator = pmodule->getClockSignal().constBegin() ;
6527
 
6528
    QString iscanPortClock = item->getScanChainInfo()->getscaningPortClock() ;
6529
    if(!iscanPortClock.isEmpty())
6530
    {
6531
        iscanPortClock = item->parent()->getModuleClockMap(item->getInstanceName()).value(item->getScanChainInfo()->getscaningPortClock(),QString());
6532
    }
6533
    else
6534
    {
6535
        if(pmodule->getClockSignal().count()!= 1)
6536
        {
6537
            return QString();
6538
        }
6539
        else
6540
        {
6541
            while(iclockiterator != pmodule->getClockSignal().constEnd())
6542
            {
6543
                iscanPortClock = iclockiterator.key();
6544
                ++iclockiterator ;
6545
            }
6546
        }
6547
    }
6548
 
6549
 
6550
    int i = 0 ;
6551
    iclockiterator = pmodule->getClockSignal().constBegin() ;
6552
    while(iclockiterator != pmodule->getClockSignal().constEnd())
6553
    {
6554
        QString ilabelInstanceStart(QObject::tr("\n  <instance entity_name=\"sld_signaltap\" is_auto_node=\"yes\" is_expanded=\"true\" name=\"auto_signaltap_%1\" source_file=\"sld_signaltap.vhd\">").arg(i));
6555
        ifileContent.append(ilabelInstanceStart);
6556
 
6557
        QString ilabelNode_ip_info(QObject::tr("\n    <node_ip_info instance_id=\"%1\" mfg_id=\"110\" node_id=\"0\" version=\"6\"/>").arg(i));
6558
        ifileContent.append(ilabelNode_ip_info);
6559
 
6560
 
6561
        /*
6562
            <signal_set global_temp="1" name="signal_set: 2012/10/31 17:44:31  #0">
6563
            <clock name="auto_stp_external_clock_0" polarity="posedge" tap_mode="classic"/>
6564
            <config ram_type="M4K" reserved_data_nodes="0" reserved_trigger_nodes="0" sample_depth="128" trigger_in_enable="no" trigger_out_enable="no"/>
6565
            <top_entity/>
6566
            <signal_vec>
6567
            <trigger_input_vec>
6568
            */
6569
        QDate icurrentDate = QDate::currentDate();
6570
        QTime icurrentTime = QTime::currentTime();
6571
 
6572
        QString ilabelSignal_setStart(QObject::tr("\n    <signal_set global_temp=\"1\" name=\"signal_set: %1 %2  #0\">").arg(icurrentDate.toString(QObject::tr("yyyy/MM/dd")))\
6573
                                    .arg(icurrentTime.toString(QObject::tr("hh:mm:ss")))) ;
6574
        ifileContent.append(ilabelSignal_setStart);
6575
 
6576
        QString idefaultLabelClock(QObject::tr("\n      <clock name=\"auto_stp_external_clock_0\" polarity=\"posedge\" tap_mode=\"classic\"/>"));
6577
        ifileContent.append(idefaultLabelClock);
6578
 
6579
        QString idefaultConfig(QObject::tr("\n      <config ram_type=\"M4K\" reserved_data_nodes=\"0\" reserved_trigger_nodes=\"0\" sample_depth=\"128\" trigger_in_enable=\"no\" trigger_out_enable=\"no\"/>"));
6580
        ifileContent.append(idefaultConfig);
6581
 
6582
        QString ilabelTop_entity(QObject::tr("\n      <top_entity/>"));
6583
        ifileContent.append(ilabelTop_entity);
6584
 
6585
        QString ilabelSignal_vecStart(QObject::tr("\n      <signal_vec>"));
6586
        ifileContent.append(ilabelSignal_vecStart);
6587
 
6588
        QString ilabeltrigger_input_vecStart(QObject::tr("\n        <trigger_input_vec>"));
6589
        ifileContent.append(ilabeltrigger_input_vecStart);
6590
 
6591
 
6592
        // 新加入的 tdo_reg 输出端口 的 reg
6593
        QString iTdoPortName(QObject::tr("_EziDebug_%1_%2_TDO_r").arg(item->getScanChainInfo()->getChainName()).arg(iclockiterator.key()));
6594
 
6595
        QString ichainClock = item->parent()->getModuleClockMap(item->getInstanceName()).key(iclockiterator.key(),QString());
6596
        int nchildChainNum =  item->getScanChainInfo()->getChildChainNum(ichainClock);
6597
        QString iregTdoHiberarchy = item->getItemHierarchyName();
6598
        if(1 == nchildChainNum)
6599
        {
6600
            QString itdo_reg(QObject::tr("\n          <wire name=\"%1\" tap_mode=\"classic\" type=\"register\"/>").arg(iregTdoHiberarchy + iTdoPortName));
6601
            ifileContent.append(itdo_reg);
6602
        }
6603
        else if(nchildChainNum > 1)
6604
        {
6605
            for(int m = 0 ; m < nchildChainNum ; m++)
6606
            {
6607
                QString itdo_reg(QObject::tr("\n          <wire name=\"%1[%2]\" tap_mode=\"classic\" type=\"register\"/>").arg(iregTdoHiberarchy + iTdoPortName).arg(m));
6608
                ifileContent.append(itdo_reg);
6609
            }
6610
        }
6611
        else
6612
        {
6613
            return QString();
6614
        }
6615
 
6616
        QString iToutRegName(QObject::tr("_EziDebug_%1_TOUT_reg").arg(item->getScanChainInfo()->getChainName()));
6617
        QString itout_reg(QObject::tr("\n          <wire name=\"%1\" tap_mode=\"classic\" type=\"register\"/>").arg(iregTdoHiberarchy + iToutRegName));
6618
        ifileContent.append(itout_reg);
6619
 
6620
        if(iscanPortClock == iclockiterator.key())
6621
        {
6622
            // 所有观测模块的 输入输出端口的  reg
6623
            QVector<EziDebugModule::PortStructure*> iportVec = pmodule->getPort(this,item->getInstanceName());
6624
            for(int i = 0 ; i < iportVec.count() ;i++)
6625
            {
6626
                QString iportName = QString::fromAscii(iportVec.at(i)->m_pPortName) ;
6627
                if(!(pmodule->getClockSignal().value(iportName,QString())).isEmpty())
6628
                {
6629
                    continue ;
6630
                }
6631
 
6632
                if(!(pmodule->getResetSignal().value(iportName,QString())).isEmpty())
6633
                {
6634
                    continue ;
6635
                }
6636
 
6637
                QString iregHiberarchy = item->getItemHierarchyName();
6638
                QString ieziDebugPortName ;
6639
                //ieziDebugPortName.append(QObject::tr("_EziDebug_")+iportName + QObject::tr("_r"));
6640
                ieziDebugPortName.append(QObject::tr("_EziDebug_%1_%2_r").arg(item->getScanChainInfo()->getChainName()).arg(iportName));
6641
                if(1 == iportVec.at(i)->m_unBitwidth)
6642
                {
6643
                    QString ilabelwire(QObject::tr("\n          <wire name=\"%1\" tap_mode=\"classic\" type=\"register\"/>").arg(iregHiberarchy + ieziDebugPortName));
6644
                    ifileContent.append(ilabelwire);
6645
                }
6646
                else
6647
                {
6648
                    for(unsigned int j  = 0 ;j < iportVec.at(i)->m_unBitwidth ; j++)
6649
                    {
6650
                        QString ilabelwire(QObject::tr("\n          <wire name=\"%1\" tap_mode=\"classic\" type=\"register\"/>").arg(iregHiberarchy +ieziDebugPortName+QObject::tr("[%1]").arg(j)));
6651
                        ifileContent.append(ilabelwire);
6652
                    }
6653
                }
6654
            }
6655
        }
6656
 
6657
        if(iscanPortClock == iclockiterator.key())
6658
        {
6659
            // 内部系统模块的输出端口  reg
6660
            QStringList iportList = item->getScanChainInfo()->getSyscoreOutputPortList() ;
6661
            for(int n = 0 ; n < iportList.count() ;n++)
6662
            {
6663
                QString iportHiberarchy = iportList.at(n).split(QObject::tr("#")).at(0);
6664
                QString iportName = iportList.at(n).split(QObject::tr("#")).at(1);
6665
                QString iportBitWidth = iportList.at(n).split(QObject::tr("#")).at(2) ;
6666
  //            QString iportEndian = iportList.at(n).split(QObject::tr("#")).at(3) ;
6667
 
6668
                QString iportReg = QObject::tr("_EziDebug_%1_%2_r").arg(item->getScanChainInfo()->getChainName()).arg(iportName);
6669
 
6670
                int nportBitWidth = iportBitWidth.toInt();
6671
                if(1 == nportBitWidth)
6672
                {
6673
                    QString itdo_reg(QObject::tr("\n          <wire name=\"%1\" tap_mode=\"classic\" type=\"register\"/>").arg(iportHiberarchy + iportReg));
6674
                    ifileContent.append(itdo_reg);
6675
                }
6676
                else if(nportBitWidth > 1)
6677
                {
6678
                    for(int m = 0 ; m < nchildChainNum ; m++)
6679
                    {
6680
                        QString itdo_reg(QObject::tr("\n          <wire name=\"%1[%2]\" tap_mode=\"classic\" type=\"register\"/>").arg(iportHiberarchy + iportReg).arg(m));
6681
                        ifileContent.append(itdo_reg);
6682
                    }
6683
                }
6684
                else
6685
                {
6686
                    return QString();
6687
                }
6688
            }
6689
        }
6690
 
6691
        QString ilabeltrigger_input_vecEnd(QObject::tr("\n        </trigger_input_vec>"));
6692
        ifileContent.append(ilabeltrigger_input_vecEnd);
6693
 
6694
 
6695
        QString ilabelData_input_vecStart(QObject::tr("\n        <data_input_vec>"));
6696
        ifileContent.append(ilabelData_input_vecStart);
6697
 
6698
 
6699
        // 新加入的 tdo_reg 输出端口 的 reg
6700
//        QString iTdoPortName(QObject::tr("_EziDebug_%1_%2_TDO_r").arg(item->getScanChainInfo()->getChainName()).arg(iclockiterator.key()));
6701
//        int nchildChainNum =  item->getScanChainInfo()->getChildChainNum(iclockiterator.key());
6702
 
6703
        if(1 == nchildChainNum)
6704
        {
6705
            QString itdo_reg(QObject::tr("\n          <wire name=\"%1\" tap_mode=\"classic\" type=\"register\"/>").arg(iregTdoHiberarchy + iTdoPortName));
6706
            ifileContent.append(itdo_reg);
6707
        }
6708
        else if(nchildChainNum > 1)
6709
        {
6710
            for(int m = 0 ; m < nchildChainNum ; m++)
6711
            {
6712
                QString itdo_reg(QObject::tr("\n          <wire name=\"%1[%2]\" tap_mode=\"classic\" type=\"register\"/>").arg(iregTdoHiberarchy + iTdoPortName).arg(m));
6713
                ifileContent.append(itdo_reg);
6714
            }
6715
        }
6716
        else
6717
        {
6718
            return QString();
6719
        }
6720
 
6721
        QString itout_reg1(QObject::tr("\n          <wire name=\"%1\" tap_mode=\"classic\" type=\"register\"/>").arg(iregTdoHiberarchy + iToutRegName));
6722
        ifileContent.append(itout_reg1);
6723
 
6724
        if(iscanPortClock == iclockiterator.key())
6725
        {
6726
            // 所有观测模块的 输入输出端口的  reg
6727
            QVector<EziDebugModule::PortStructure*> iportVec = pmodule->getPort(this,item->getInstanceName());
6728
            for(int i = 0 ; i < iportVec.count() ;i++)
6729
            {
6730
                QString iportName = QString::fromAscii(iportVec.at(i)->m_pPortName) ;
6731
 
6732
                if(!(pmodule->getClockSignal().value(iportName,QString())).isEmpty())
6733
                {
6734
                    continue ;
6735
                }
6736
 
6737
                if(!(pmodule->getResetSignal().value(iportName,QString())).isEmpty())
6738
                {
6739
                    continue ;
6740
                }
6741
 
6742
                QString iregHiberarchy = item->getItemHierarchyName();
6743
                QString ieziDebugPortName ;
6744
                ieziDebugPortName.append(QObject::tr("_EziDebug_%1_%2_r").arg(item->getScanChainInfo()->getChainName()).arg(iportName));
6745
                if(1 == iportVec.at(i)->m_unBitwidth)
6746
                {
6747
                    QString ilabelwire(QObject::tr("\n          <wire name=\"%1\" tap_mode=\"classic\" type=\"register\"/>").arg(iregHiberarchy + ieziDebugPortName));
6748
                    ifileContent.append(ilabelwire);
6749
                }
6750
                else
6751
                {
6752
                    for(unsigned int j  = 0 ;j < iportVec.at(i)->m_unBitwidth ; j++)
6753
                    {
6754
                        QString ilabelwire(QObject::tr("\n          <wire name=\"%1\" tap_mode=\"classic\" type=\"register\"/>").arg(iregHiberarchy + ieziDebugPortName + QObject::tr("[%1]").arg(j)));
6755
                        ifileContent.append(ilabelwire);
6756
                    }
6757
                }
6758
            }
6759
        }
6760
 
6761
 
6762
        if(iscanPortClock == iclockiterator.key())
6763
        {
6764
            // 内部系统模块的输出端口  reg
6765
            QStringList iportList = item->getScanChainInfo()->getSyscoreOutputPortList() ;
6766
            for(int n = 0 ; n < iportList.count() ;n++)
6767
            {
6768
                QString iportHiberarchy = iportList.at(n).split(QObject::tr("#")).at(0);
6769
                QString iportName = iportList.at(n).split(QObject::tr("#")).at(1);
6770
                int nportBitWidth = iportList.at(n).split(QObject::tr("#")).at(2).toInt();
6771
 
6772
                QString iportReg = QObject::tr("_EziDebug_%1_%2_r").arg(item->getScanChainInfo()->getChainName()).arg(iportName);
6773
 
6774
                if(1 == nportBitWidth)
6775
                {
6776
                    QString itdo_reg(QObject::tr("\n          <wire name=\"%1\" tap_mode=\"classic\" type=\"register\"/>").arg(iportHiberarchy + iportReg));
6777
                    ifileContent.append(itdo_reg);
6778
                }
6779
                else if(nportBitWidth > 1)
6780
                {
6781
                    for(int m = 0 ; m < nchildChainNum ; m++)
6782
                    {
6783
                        QString itdo_reg(QObject::tr("\n          <wire name=\"%1[%2]\" tap_mode=\"classic\" type=\"register\"/>").arg(iportHiberarchy + iportReg).arg(m));
6784
                        ifileContent.append(itdo_reg);
6785
                    }
6786
                }
6787
                else
6788
                {
6789
                    return QString();
6790
                }
6791
            }
6792
        }
6793
 
6794
        QString ilabelData_input_vecEnd(QObject::tr("\n        </data_input_vec>"));
6795
        ifileContent.append(ilabelData_input_vecEnd);
6796
 
6797
        QString ilabelSignal_vecEnd(QObject::tr("\n      </signal_vec>"));
6798
        ifileContent.append(ilabelSignal_vecEnd);
6799
 
6800
        QString ilabelPresentationStart(QObject::tr("\n      <presentation>"));
6801
        ifileContent.append(ilabelPresentationStart);
6802
 
6803
        QString ilabelData_viewStart(QObject::tr("\n        <data_view>"));
6804
        ifileContent.append(ilabelData_viewStart);
6805
 
6806
 
6807
 
6808
        // 新加入的 tdo_reg 输出端口 的 reg
6809
//      QString iTdoPortName(QObject::tr("_EziDebug_%1_%2_TDO_r").arg(item->getScanChainInfo()->getChainName()).arg(iclockiterator.key()));
6810
//      int nchildChainNum =  item->getScanChainInfo()->getChildChainNum(iclockiterator.key());
6811
 
6812
        if(1 == nchildChainNum)
6813
        {
6814
            QString ilabelnet(QObject::tr("\n          <net is_signal_inverted=\"no\" name=\"%1\"/>").arg(iregTdoHiberarchy + iTdoPortName));
6815
            ifileContent.append(ilabelnet);
6816
        }
6817
        else if(nchildChainNum > 1)
6818
        {
6819
            QString ilabelbusStart(QObject::tr("\n          <bus is_signal_inverted=\"no\" link=\"all\" name=\"%1\" order=\"lsb_to_msb\" radix=\"hex\" state=\"collapse\" type=\"register\">").arg(iTdoPortName));
6820
            ifileContent.append(ilabelbusStart);
6821
            for(int m = 0 ; m < nchildChainNum ; m++)
6822
            {
6823
                QString ilabelnet(QObject::tr("\n            <net is_signal_inverted=\"no\" name=\"%1[%2]\"/>").arg(iregTdoHiberarchy + iTdoPortName).arg(m));
6824
                ifileContent.append(ilabelnet);
6825
            }
6826
            QString ilabelbusEnd(QObject::tr("\n          </bus>"));
6827
            ifileContent.append(ilabelbusEnd);
6828
        }
6829
        else
6830
        {
6831
            return QString();
6832
        }
6833
 
6834
        QString itout_reg2(QObject::tr("\n          <net is_signal_inverted=\"no\" name=\"%1\"/>").arg(iregTdoHiberarchy + iToutRegName));
6835
        ifileContent.append(itout_reg2);
6836
 
6837
        if(iscanPortClock == iclockiterator.key())
6838
        {
6839
            // 所有观测模块的 输入输出端口的  reg
6840
            QVector<EziDebugModule::PortStructure*> iportVec = pmodule->getPort(this,item->getInstanceName());
6841
            for(int i = 0 ; i < iportVec.count() ;i++)
6842
            {
6843
                QString iportName = QString::fromAscii(iportVec.at(i)->m_pPortName) ;
6844
                if(!(pmodule->getClockSignal().value(iportName,QString())).isEmpty())
6845
                {
6846
                    continue ;
6847
                }
6848
 
6849
                if(!(pmodule->getResetSignal().value(iportName,QString())).isEmpty())
6850
                {
6851
                    continue ;
6852
                }
6853
 
6854
                QString iregHiberarchy = item->getItemHierarchyName();
6855
                QString ieziDebugPortName ;
6856
                //ieziDebugPortName.append(QObject::tr("_EziDebug_")+iportName + QObject::tr("_r"));
6857
                ieziDebugPortName.append(QObject::tr("_EziDebug_%1_%2_r").arg(item->getScanChainInfo()->getChainName()).arg(iportName));
6858
                if(1 == iportVec.at(i)->m_unBitwidth)
6859
                {
6860
                    QString ilabelnet(QObject::tr("\n          <net is_signal_inverted=\"no\" name=\"%1\"/>").arg(iregHiberarchy + ieziDebugPortName));
6861
                    ifileContent.append(ilabelnet);
6862
                }
6863
                else
6864
                {
6865
                    QString ilabelbusStart(QObject::tr("\n          <bus is_signal_inverted=\"no\" link=\"all\" name=\"%1\" order=\"lsb_to_msb\" radix=\"hex\" state=\"collapse\" type=\"register\">").arg(ieziDebugPortName));
6866
                    ifileContent.append(ilabelbusStart);
6867
                    for(unsigned int j  = 0 ;j < iportVec.at(i)->m_unBitwidth ; j++)
6868
                    {
6869
                        QString ilabelnet(QObject::tr("\n            <net is_signal_inverted=\"no\" name=\"%1[%2]\"/>").arg(iregHiberarchy + ieziDebugPortName).arg(j));
6870
                        ifileContent.append(ilabelnet);
6871
                    }
6872
                    QString ilabelbusEnd(QObject::tr("\n          </bus>"));
6873
                    ifileContent.append(ilabelbusEnd);
6874
                }
6875
            }
6876
        }
6877
 
6878
 
6879
        if(iscanPortClock == iclockiterator.key())
6880
        {
6881
            // 内部系统模块的输出端口  reg
6882
            QStringList iportList = item->getScanChainInfo()->getSyscoreOutputPortList() ;
6883
            for(int n = 0 ; n < iportList.count() ;n++)
6884
            {
6885
                QString iportHiberarchy = iportList.at(n).split(QObject::tr("#")).at(0);
6886
                QString iportName = iportList.at(n).split(QObject::tr("#")).at(1);
6887
                int nportBitWidth = iportList.at(n).split(QObject::tr("#")).at(2).toInt();
6888
                QString iportReg = QObject::tr("_EziDebug_%1_%2_r").arg(item->getScanChainInfo()->getChainName()).arg(iportName);
6889
 
6890
                if(1 == nportBitWidth)
6891
                {
6892
                    QString ilabelnet(QObject::tr("\n          <net is_signal_inverted=\"no\" name=\"%1\"/>").arg(iportHiberarchy + iportReg));
6893
                    ifileContent.append(ilabelnet);
6894
                }
6895
                else if(nportBitWidth > 1)
6896
                {
6897
                    QString ilabelbusStart(QObject::tr("\n          <bus is_signal_inverted=\"no\" link=\"all\" name=\"%1\" order=\"lsb_to_msb\" radix=\"hex\" state=\"collapse\" type=\"register\">").arg(iportHiberarchy + iportReg));
6898
                    ifileContent.append(ilabelbusStart);
6899
                    for(int m = 0 ; m < nchildChainNum ; m++)
6900
                    {
6901
                        QString ilabelnet(QObject::tr("\n            <net is_signal_inverted=\"no\" name=\"%1[%2]\"/>").arg(iportHiberarchy + iportName).arg(m));
6902
                        ifileContent.append(ilabelnet);
6903
                    }
6904
                    QString ilabelbusEnd(QObject::tr("\n          </bus>"));
6905
                    ifileContent.append(ilabelbusEnd);
6906
                }
6907
                else
6908
                {
6909
                    return QString();
6910
                }
6911
            }
6912
        }
6913
 
6914
        QString ilabelData_viewEnd(QObject::tr("\n        </data_view>"));
6915
        ifileContent.append(ilabelData_viewEnd);
6916
 
6917
 
6918
        QString ilabelSetup_viewStart(QObject::tr("\n        <setup_view>"));
6919
        ifileContent.append(ilabelSetup_viewStart);
6920
 
6921
 
6922
        // 新加入的 tdo_reg 输出端口 的 reg
6923
//      QString iTdoPortName(QObject::tr("_EziDebug_%1_%2_TDO_r").arg(item->getScanChainInfo()->getChainName()).arg(iclockiterator.key()));
6924
//      int nchildChainNum =  item->getScanChainInfo()->getChildChainNum(iclockiterator.key());
6925
 
6926
        if(1 == nchildChainNum)
6927
        {
6928
            QString ilabelnet(QObject::tr("\n          <net is_signal_inverted=\"no\" name=\"%1\"/>").arg(iregTdoHiberarchy + iTdoPortName));
6929
            ifileContent.append(ilabelnet);
6930
        }
6931
        else if(nchildChainNum > 1)
6932
        {
6933
            QString ilabelbusStart(QObject::tr("\n          <bus is_signal_inverted=\"no\" link=\"all\" name=\"%1\" order=\"lsb_to_msb\" radix=\"hex\" state=\"collapse\" type=\"register\">").arg(iTdoPortName));
6934
            ifileContent.append(ilabelbusStart);
6935
            for(int m = 0 ; m < nchildChainNum ; m++)
6936
            {
6937
                QString ilabelnet(QObject::tr("\n            <net is_signal_inverted=\"no\" name=\"%1[%2]\"/>").arg(iregTdoHiberarchy + iTdoPortName).arg(m));
6938
                ifileContent.append(ilabelnet);
6939
            }
6940
            QString ilabelbusEnd(QObject::tr("\n          </bus>"));
6941
            ifileContent.append(ilabelbusEnd);
6942
        }
6943
        else
6944
        {
6945
            return QString();
6946
        }
6947
 
6948
        QString itout_reg3(QObject::tr("\n          <net is_signal_inverted=\"no\" name=\"%1\"/>").arg(iregTdoHiberarchy + iToutRegName));
6949
        ifileContent.append(itout_reg3);
6950
 
6951
        if(iscanPortClock == iclockiterator.key())
6952
        {
6953
            // 所有观测模块的 输入输出端口的  reg
6954
            QVector<EziDebugModule::PortStructure*> iportVec = pmodule->getPort(this,item->getInstanceName());
6955
            for(int i = 0 ; i < iportVec.count() ;i++)
6956
            {
6957
                QString iportName = QString::fromAscii(iportVec.at(i)->m_pPortName) ;
6958
                if(!(pmodule->getClockSignal().value(iportName,QString())).isEmpty())
6959
                {
6960
                    continue ;
6961
                }
6962
 
6963
                if(!(pmodule->getResetSignal().value(iportName,QString())).isEmpty())
6964
                {
6965
                    continue ;
6966
                }
6967
 
6968
                QString iregHiberarchy = item->getItemHierarchyName();
6969
                QString ieziDebugPortName ;
6970
                //ieziDebugPortName.append(QObject::tr("_EziDebug_")+iportName + QObject::tr("_r"));
6971
                ieziDebugPortName.append(QObject::tr("_EziDebug_%1_%2_r").arg(item->getScanChainInfo()->getChainName()).arg(iportName));
6972
 
6973
                if(1 == iportVec.at(i)->m_unBitwidth)
6974
                {
6975
                    QString ilabelnet(QObject::tr("\n          <net is_signal_inverted=\"no\" name=\"%1\"/>").arg(iregHiberarchy + ieziDebugPortName));
6976
                    ifileContent.append(ilabelnet);
6977
                }
6978
                else
6979
                {
6980
                    QString ilabelbusStart(QObject::tr("\n          <bus is_signal_inverted=\"no\" link=\"all\" name=\"%1\" order=\"lsb_to_msb\" radix=\"hex\" state=\"collapse\" type=\"register\">").arg(ieziDebugPortName));
6981
                    ifileContent.append(ilabelbusStart);
6982
                    for(int j  = 0 ;j < iportVec.at(i)->m_unBitwidth ; j++)
6983
                    {
6984
                        QString ilabelnet(QObject::tr("\n            <net is_signal_inverted=\"no\" name=\"%1[%2]\"/>").arg(iregHiberarchy + ieziDebugPortName).arg(j));
6985
                        ifileContent.append(ilabelnet);
6986
                    }
6987
                    QString ilabelbusEnd(QObject::tr("\n          </bus>"));
6988
                    ifileContent.append(ilabelbusEnd);
6989
                }
6990
            }
6991
        }
6992
 
6993
 
6994
        if(iscanPortClock == iclockiterator.key())
6995
        {
6996
            // 内部系统模块的输出端口  reg
6997
            QStringList iportList = item->getScanChainInfo()->getSyscoreOutputPortList() ;
6998
            for(int n = 0 ; n < iportList.count() ;n++)
6999
            {
7000
                QString iportHiberarchy = iportList.at(n).split(QObject::tr("#")).at(0);
7001
                QString iportName = iportList.at(n).split(QObject::tr("#")).at(1);
7002
                QString iportReg = QObject::tr("_EziDebug_%1_%2_r").arg(item->getScanChainInfo()->getChainName()).arg(iportName);
7003
 
7004
 
7005
                int nportBitWidth = iportList.at(n).split(QObject::tr("#")).at(2).toInt();
7006
                if(1 == nportBitWidth)
7007
                {
7008
                    QString ilabelnet(QObject::tr("\n          <net is_signal_inverted=\"no\" name=\"%1\"/>").arg(iportHiberarchy + iportReg));
7009
                    ifileContent.append(ilabelnet);
7010
                }
7011
                else if(nportBitWidth > 1)
7012
                {
7013
                    QString ilabelbusStart(QObject::tr("\n          <bus is_signal_inverted=\"no\" link=\"all\" name=\"%1\" order=\"lsb_to_msb\" radix=\"hex\" state=\"collapse\" type=\"register\">").arg(iportHiberarchy + iportReg));
7014
                    ifileContent.append(ilabelbusStart);
7015
                    for(int m = 0 ; m < nchildChainNum ; m++)
7016
                    {
7017
                        QString ilabelnet(QObject::tr("\n            <net is_signal_inverted=\"no\" name=\"%1[%2]\"/>").arg(iportHiberarchy + iportReg).arg(m));
7018
                        ifileContent.append(ilabelnet);
7019
                    }
7020
                    QString ilabelbusEnd(QObject::tr("\n          </bus>"));
7021
                    ifileContent.append(ilabelbusEnd);
7022
                }
7023
                else
7024
                {
7025
                    return QString();
7026
                }
7027
            }
7028
        }
7029
 
7030
        QString ilabelSetup_viewEnd(QObject::tr("\n        </setup_view>"));
7031
        ifileContent.append(ilabelSetup_viewEnd);
7032
 
7033
 
7034
        QString ilabelPresentationEnd("\n      </presentation>");
7035
        ifileContent.append(ilabelPresentationEnd);
7036
 
7037
        /*
7038
            <trigger attribute_mem_mode="false" global_temp="1" name="trigger: 2012/10/31 19:32:21  #1" position="pre" power_up_trigger_mode="false" segment_size="1" trigger_in="dont_care" trigger_out="active high" trigger_type="circular">
7039
              <power_up_trigger position="pre" trigger_in="dont_care" trigger_out="active high"/>
7040
              <events use_custom_flow_control="no">
7041
                <level enabled="yes" name="condition1" type="basic">
7042
                  <power_up enabled="yes">
7043
                  </power_up>
7044
                  <op_node/>
7045
                </level>
7046
              </events>
7047
            </trigger>
7048
          </signal_set>
7049
        </instance>
7050
        <mnemonics/>
7051
        */
7052
 
7053
        icurrentDate = QDate::currentDate();
7054
        icurrentTime = QTime::currentTime();
7055
 
7056
        QString ilabelTriggerStart(QObject::tr("\n      <trigger attribute_mem_mode=\"false\" global_temp=\"1\" name=\"trigger: %1 %2  #1\" position=\"pre\" power_up_trigger_mode=\"false\" segment_size=\"1\" trigger_in=\"dont_care\" trigger_out=\"active high\" trigger_type=\"circular\">").arg(icurrentDate.toString(QObject::tr("yyyy/MM/dd")))\
7057
                                   .arg(icurrentTime.toString(QObject::tr("hh:mm:ss")))) ;
7058
        ifileContent.append(ilabelTriggerStart);
7059
 
7060
        QString ilabelPower_up_trigger(QObject::tr("\n        <power_up_trigger position=\"pre\" trigger_in=\"dont_care\" trigger_out=\"active high\"/>"));
7061
        ifileContent.append(ilabelPower_up_trigger);
7062
 
7063
        QString ilabelEventStart(QObject::tr("\n        <events use_custom_flow_control=\"no\">"));
7064
        ifileContent.append(ilabelEventStart);
7065
 
7066
        QString ilabelLevelStart(QObject::tr("\n          <level enabled=\"yes\" name=\"condition1\" type=\"basic\">"));
7067
        ifileContent.append(ilabelLevelStart);
7068
 
7069
        QString ilabelPower_upStart(QObject::tr("\n            <power_up enabled=\"yes\">"));
7070
        ifileContent.append(ilabelPower_upStart);
7071
 
7072
 
7073
        QString ilabelPower_upEnd(QObject::tr("\n            </power_up>"));
7074
        ifileContent.append(ilabelPower_upEnd);
7075
 
7076
        QString ilabelOp_nodeStart(QObject::tr("\n            <op_node/>"));
7077
        ifileContent.append(ilabelOp_nodeStart);
7078
 
7079
        QString ilabelLevelEnd(QObject::tr("\n          </level>"));
7080
        ifileContent.append(ilabelLevelEnd);
7081
 
7082
        QString ilabelEventEnd(QObject::tr("\n        </events>"));
7083
        ifileContent.append(ilabelEventEnd);
7084
 
7085
        QString ilabelTriggerEnd(QObject::tr("\n      </trigger>"));
7086
        ifileContent.append(ilabelTriggerEnd);
7087
 
7088
 
7089
        QString ilabelSignal_setEnd(QObject::tr("\n    </signal_set>"));
7090
        ifileContent.append(ilabelSignal_setEnd);
7091
 
7092
        QString ilabelPosition_infoStart(QObject::tr("\n    <position_info>")) ;
7093
        ifileContent.append(ilabelPosition_infoStart);
7094
 
7095
        QString ilableSingle1(QObject::tr("\n      <single attribute=\"active tab\" value=\"1\"/>"));
7096
        ifileContent.append(ilableSingle1);
7097
 
7098
        QString ilableSingle2(QObject::tr("\n      <single attribute=\"setup horizontal scroll position\" value=\"0\"/>"));
7099
        ifileContent.append(ilableSingle2);
7100
 
7101
        QString ilableSingle3(QObject::tr("\n      <single attribute=\"setup vertical scroll position\" value=\"0\"/>"));
7102
        ifileContent.append(ilableSingle3);
7103
 
7104
        QString ilabelPosition_infoEnd(QObject::tr("\n    </position_info>")) ;
7105
        ifileContent.append(ilabelPosition_infoEnd);
7106
 
7107
        QString ilabelInstanceEnd(QObject::tr("\n  </instance>"));
7108
        ifileContent.append(ilabelInstanceEnd);
7109
 
7110
 
7111
        if(0 == i)
7112
        {
7113
            QString ilabelMnemonics(QObject::tr("\n  <mnemonics/>"));
7114
            ifileContent.append(ilabelMnemonics);
7115
        }
7116
 
7117
        ++iclockiterator ;
7118
        ++i ;
7119
    }
7120
 
7121
    return  ifileContent ;
7122
}
7123
 
7124
#if 0
7125
void EziDebugPrj::constructIlaunitString(int &regwidth,int &triggernum)
7126
{
7127
    if(regwidth >= 255)
7128
    {
7129
        regwidth = 0 ;
7130
        triggernum++ ;
7131
    }
7132
    else
7133
    {
7134
        ++regwidth ;
7135
    }
7136
}
7137
#endif
7138
 
7139
 
7140
 
7141
 
7142
 

powered by: WebSVN 2.1.0

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