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

Subversion Repositories ezidebug

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

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

powered by: WebSVN 2.1.0

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