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

Subversion Repositories ezidebug

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

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 EziDebug
#include "reg_scan.h"
2
//#include "ui_reg_scan.h"
3
 
4
#include <QtCore>
5
#include <QtGui/QtGui>
6
//#include <QWidget>
7
//#include <QtGui/QLabel>
8
#include <QDebug>
9
#include <QChar>
10
#include <QFile>
11
#include <QMap>
12
#include <qmath.h>
13
#include <QString>
14
 
15
 
16
#define PROG_SIZE 1024*200
17
 
18
commands ComTable[]={
19
{       "ifdef",   IFDEF},
20
{       "ifndef",   IFNDEF},
21
{       "endif",   ENDIF},
22
{       "module",   MODULE},
23
{       "begin",    BEGIN},
24
{       "end",      END},
25
{       "endmodule",ENDMODULE },
26
{       "defparam", DEFPARAM },
27
{       "posedge",  POSEDGE },
28
{       "negedge",  NEGEDGE },
29
{       "if",       IF},
30
{       "else",     ELSE},
31
{       "reg",      REG},
32
{       "wire",     WIRE},
33
{       "case",     CASE},
34
{       "casex",    CASEX},
35
{       "endcase",  ENDCASE},
36
{       "parameter",PARAMETER},
37
{       "define",   DEFINE},
38
{       "include",  INCLUDE},
39
{       "input",    INPUT},
40
{       "output",   OUTPUT},
41
{       "inout",    INOUT},
42
{       "always",   ALWAYS},
43
{       "assign",   ASSIGN},
44
{       "signed",   SIGNED}
45
 };
46
 
47
ModuleMem ModuleTab[MAX_T_LEN];
48
 
49
MacroMem MacroTab[MAX_T_LEN];
50
 
51
QMap<QString,QString> def_map ;
52
QMap<QString,QMap<QString,QString> > inst_map ;
53
 
54
QStringList iinstNameList ;
55
 
56
unsigned int unModuCnt=0;
57
unsigned int unMacroCnt=0;
58
int nIsComponent=0;
59
 
60
#if 0
61
#define DealError(a) { \
62
                       qDebug(a);\
63
                       return false ;}
64
#endif
65
 
66
reg_scan::reg_scan(QWidget *parent) :
67
    QWidget(parent) //,ui(new Ui::reg_scan)
68
{
69
    memset(cToken,0, 64 );
70
    //ui->setupUi(this);
71
}
72
 
73
reg_scan::~reg_scan()
74
{
75
    //delete ui;
76
}
77
//load the parse program
78
/******************************************************/
79
/*×°ÔØ´ý·ÖÎöVerilogÎļþ£¬ÅжϴóСÄÜ·ñ·ÖÎöÒÔ¼°Ìí¼Ó½áÊø·ûºÅ('\0') */
80
/******************************************************/
81
bool reg_scan::LoadVeriFile(char *p,char *fname)
82
{
83
    unsigned long i=0;
84
    QFile iFile(fname);
85
    ClearModule();
86
    if(iFile.open(QIODevice::ReadOnly))//WriteOnly | QFile::Truncate))
87
    {
88
        do
89
        {
90
            iFile.getChar(p);
91
            p++;i++;
92
        }while(!iFile.atEnd());
93
        if(i==PROG_SIZE)
94
        {
95
            qDebug("program too big\n");
96
            iFile.close();
97
            return FALSE;
98
        }
99
        if(*(p-1)==0x1a)  /*Null terminate the program. Skip any EOF mark if present in the file.*/
100
            *(p-1)='\0';
101
        else
102
            *p='\0';
103
        iFile.close();
104
        qDebug() << i ;
105
        return TRUE;
106
    }
107
    else
108
    {
109
        return FALSE;
110
    }
111
}
112
//retrun true if c is a delimiter
113
bool reg_scan::IsDelim(char c)
114
{
115
//    if((*prog=='@'||*prog==' '||*prog=='='||*prog=='+'||*prog=='-' || *prog=='*'||*prog=='^'||*prog=='/'||*prog=='%'
116
//            ||*prog==';'||*prog==':'||*prog=='('||*prog==')'||*prog==','||*prog=='`'||*prog=='"'||*prog=='!'||*prog=='<'||*prog=='>')
117
//            ||c==9||c=='\r'||c==0)return true;
118
    if((c==':'||c=='@'||*prog==' '||c=='='||c=='+'||c=='-' || c=='*'||c=='^'||c=='/'||c=='%'
119
        ||c==';'||c=='('||c==')'||c==','||c=='`'||c=='"'||c=='!'||c=='<'||c=='>'||c=='['||c==']')
120
            ||c==9||c=='\r'||c==0||c=='\n')return true;
121
    else
122
        return false;
123
}
124
 
125
/******************************************************/
126
/*´ÓÊý¾ÝÁ÷ÖÐÌáÈ¡ÏÂÒ»¸öÁîÅÆÒÔ¹©·ÖÎö                          */
127
/******************************************************/
128
TOK_TYPES reg_scan::GetToken()
129
{
130
  char *temp;
131
    eTokenType=UNDEFTT;
132
    eTok=UNDEFTOK;
133
  //memset(token,0,sizeof(token));
134
    temp=cToken;
135
  *temp='\0';
136
  while(*prog==' '&& *prog||*prog=='\t') ++prog;  //QChar::isSpace()
137
//skip over newline
138
  while(*prog=='\r'||*prog=='\n')
139
    {
140
      ++prog;
141
//   ++prog;
142
   while(*prog==' '&& *prog||*prog=='\t') ++prog;
143
  }
144
 
145
  //check for end of program
146
  if(*prog=='\0')
147
  {
148
        *cToken='\0';
149
        eTok=ENDLINE;
150
      //prog++;
151
        return(eTokenType=DELIMITER);
152
  }
153
  //look for comments
154
  if(*prog=='/')
155
      if(*(prog+1)=='*')
156
  {
157
          prog+=2;
158
          do
159
          {//find end of comment
160
              while(*prog!='*')prog++;
161
              prog++;
162
 
163
          }while(*prog!='/');
164
          prog++;
165
            return(eTokenType=DELIMITER);
166
  }
167
      else if(*(prog+1)=='/')
168
      {
169
        prog+=2;
170
        //find end of comment
171
        while(*prog!='\r' && *prog!='\n'&&*prog!='\0')      //'\n' substitute '\0'
172
            prog++;
173
        if(*prog=='\r')
174
            prog+=2;
175
            return(eTokenType=DELIMITER);
176
      }
177
 
178
  while(*prog==' '&& *prog||*prog=='\t') ++prog;  //QChar::isSpace()
179
 
180
  //skip over newline
181
    while(*prog=='\r'||*prog=='\n')
182
    {
183
     ++prog;
184
//     ++prog;
185
     while(*prog==' '&& *prog||*prog=='\t') ++prog;
186
    }
187
 
188
  //check for double-ops.
189
    if(*prog=='!'||*prog=='<'||*prog=='>'||*prog=='='||*prog=='+'||*prog=='-'||*prog=='*'||*prog=='|'){
190
  if(*prog=='=')
191
     { if(*(prog+1)=='=')
192
      {
193
        prog++;
194
        prog++;
195
        *temp=EQ;
196
        temp++;
197
        *temp=EQ;
198
        temp++;
199
        *temp='\0';
200
      }
201
     }
202
   else if(*prog=='!'){
203
      if(*(prog+1)=='=')
204
      {
205
        prog++;
206
        prog++;
207
        *temp=NE;
208
        temp++;
209
        *temp=NE;
210
        temp++;
211
        *temp='\0';
212
      }
213
  }else if(*prog=='<')
214
  {
215
      if(*(prog+1)=='=')
216
            {
217
              prog++;
218
              prog++;
219
              *temp=LE;
220
              temp++;
221
              *temp=LE;
222
            }else if(*(prog+1)=='<')
223
      {
224
        prog++;prog++;
225
        *temp=LS;
226
        temp++;
227
        *temp=LS;
228
      }else
229
      {
230
          prog++;
231
          *temp=LT;
232
      }
233
      temp++;
234
      *temp='\0';
235
 
236
  }
237
  else if(*prog=='>')
238
    {
239
        if(*(prog+1)=='=')
240
              {
241
                prog++;
242
                prog++;
243
                *temp=GE;
244
                temp++;
245
                *temp=GE;
246
              }else if(*(prog+1)=='>')
247
        {
248
          prog++;prog++;
249
          *temp=RS;
250
          temp++;
251
          *temp=RS;
252
        }else
253
        {
254
            prog++;
255
            *temp=GT;
256
        }
257
        temp++;
258
        *temp='\0';
259
 
260
    }
261
  else if(*prog=='+'){
262
      if(*(prog+1)=='+'){
263
       prog++;
264
       prog++;
265
       *temp=INC;
266
       temp++;
267
       *temp=INC;
268
       temp++;
269
       *temp='\0';
270
      }
271
 
272
 
273
  }else if(*prog=='-'){
274
      if(*(prog+1)=='-'){
275
       prog++;
276
       prog++;
277
       *temp=DEC;
278
       temp++;
279
       *temp=DEC;
280
       temp++;
281
       *temp='\0';
282
      }
283
  }
284
  ///////////////////////////ΪÁË´¦Àí**ΪÃݵÄÇé¿ö
285
  else if(*prog=='*'){
286
        if(*(prog+1)=='*'){
287
         prog++;
288
         prog++;
289
         *temp=POW;
290
         temp++;
291
         *temp=POW;
292
         temp++;
293
         *temp='\0';
294
        }
295
 
296
    }
297
  /////////////////////////////ΪÁË´¦Àí||µÄÇé¿ö
298
  else if(*prog=='|'){
299
        if(*(prog+1)=='|'){
300
         prog++;
301
         prog++;
302
         *temp=OR;
303
         temp++;
304
         *temp=OR;
305
         temp++;
306
         *temp='\0';
307
        }
308
 
309
    }
310
        if(*cToken)return(eTokenType=DELIMITER);
311
 }
312
 
313
//check for other delimiters.
314
  if(*prog=='@'||*prog=='='||*prog=='+'||*prog=='-' || *prog=='*'||*prog=='^'||*prog=='/'||*prog=='%'
315
          ||*prog==';'||*prog==':'||*prog=='('||*prog==')'||*prog==','||*prog=='`'||*prog=='\''||*prog==']'
316
          ||*prog=='['||*prog=='\t'||*prog=='&'||*prog=='!'||*prog=='{'||*prog=='}'||*prog=='~'||*prog=='.'||*prog=='?')
317
  {
318
      *temp=*prog;
319
      prog++;
320
      temp++;
321
      *temp='\0';
322
        return(eTokenType=DELIMITER);
323
 
324
  }
325
 
326
//read a quoted string
327
  if(*prog=='"'){
328
  prog++;
329
  while(*prog!='"'&&*prog!='\r'&&*prog){
330
      if(*prog=='\\'){
331
          if(*(prog+1)=='n')
332
          {
333
            prog++;
334
            *temp='\n';
335
 
336
          }
337
      }
338
            else if((temp-cToken)<MAX_T_LEN)
339
          *temp++=*prog;
340
      prog++;
341
   }
342
  if(*prog=='\r'||*prog==0)
343
     throw InterpExc(SYNTAX);
344
            //DealError("Error: read a quoted string");
345
 
346
  prog++;
347
  *temp='\0';
348
        return(eTokenType=STRING);
349
  }
350
//read an integer number
351
  QChar qchr(*prog);
352
  if(qchr.isDigit())
353
  {
354
        while(!IsDelim(*prog))
355
      {
356
            if((temp-cToken)<MAX_ID_LEN)
357
              *temp++=*prog ;
358
          prog++;
359
      }
360
      *temp='\0';
361
        return(eTokenType=NUMBER);
362
  }
363
 
364
    //read identifier or keyword,¿ªÍ·Îª"_"µÄÒ²ÒªÌáÈ¡³öÀ´
365
    if(qchr.isLetter()||qchr=='_')
366
  {
367
        while(!IsDelim(*prog)){//&&*prog!=' ' for module name();
368
            if((temp-cToken)<MAX_ID_LEN)
369
              *temp++=*prog;
370
          prog++;
371
 
372
      }
373
        eTokenType=TEMP;
374
  }
375
  *temp='\0';
376
 
377
//   qDebug() << temp << token << __LINE__;
378
 
379
  //determine if token is a keyword or identifier.
380
    if(eTokenType==TEMP)
381
  {
382
        eTok=LookUp(cToken);
383
        if(eTok)
384
            eTokenType=KEYWORD;
385
      else
386
            eTokenType=IDENTFIER;
387
  }
388
 
389
  //check  for unidentified character in file.
390
    if(eTokenType==UNDEFTT)
391
//      throw InterpExc(SYNTAX);
392
    {
393
        qDebug()<<*(prog-6)<<*(prog-5)<<*(prog-4)<<*(prog-3)<<*(prog-2)<<*(prog-1)<<*(prog)<<*(prog+1)<<*(prog+2)<<*(prog+3)<<*(prog+4)<<*(prog+5)<<*(prog+6)<<*(prog+7);
394
        DealError("Error:undefine unidentified character");
395
        //throw InterpExc(SYNTAX);
396
        prog++;
397
    }
398
    return eTokenType;
399
 
400
}
401
 
402
/******************************************************/
403
/*ÔÚÁîÅƱíComTableÖвéÕÒÁîÅÆ                              */
404
/******************************************************/
405
TOKEN_IREPS reg_scan::LookUp(char *s)
406
{
407
 int i;
408
 
409
    //convert to lowercase
410
    QString iStr=s;
411
    iStr=iStr.toLower();
412
    for(i=0;*ComTable[i].cCmd;i++)
413
    {   if(!iStr.compare(ComTable[i].cCmd))
414
            return ComTable[i].eTok;
415
 
416
    }
417
    return UNDEFTOK;
418
}
419
 
420
/******************************************************/
421
/*ÊÍ·ÅÉÏÒ»¸öÁîÅƵ½Êý¾ÝÁ÷ÖÐ                                 */
422
/******************************************************/
423
void reg_scan::PutBack()
424
{
425
    char *t;
426
    t=cToken;
427
    for(;*t;t++)
428
    {
429
        prog--;
430
        //qDebug()<<*prog;
431
    }
432
 
433
}
434
 
435
 
436
 
437
/**************************************************** */
438
/*Find the location of all macro ,deal with "include" */
439
/*file  in the program , store global variables       */
440
/******************************************************/
441
void reg_scan::ScanPre()
442
{
443
    char *p,*tp;
444
    TOKEN_IREPS DataType;
445
    QString iStrBegin="module";
446
    QString iStrEnd="endmodule";
447
 
448
 
449
    // qDebug()<<prog;
450
    int nBraceFlag=0;
451
 
452
 
453
 
454
    p=prog;
455
    do{
456
        while(nBraceFlag){
457
            GetToken();
458
            if(eTok==ENDLINE) //DealError("ScanPre error\n");
459
                                throw InterpExc(UNBAL_BRACES);
460
 
461
            if(!iStrBegin.compare(cToken))nBraceFlag++;
462
            if(!iStrEnd.compare(cToken))
463
                nBraceFlag--;
464
        }
465
        tp=prog;
466
        GetToken();
467
 
468
        //See if global var type or function return type
469
        if(*cToken=='`'){
470
            GetToken();
471
 
472
            if(eTok==DEFINE)  //store macro value
473
            {
474
                //              qDebug("define");
475
                GetToken();
476
                StoreMacro();
477
            }
478
            else if(eTok==INCLUDE)// deal with include file
479
            {
480
                GetToken();
481
                ExecInclude();
482
            }
483
 
484
 
485
        }
486
        else{
487
            //          if(*cToken=='{')nBraceFlag++;
488
            //          if(*cToken=='}')nBraceFlag--;
489
            if(!iStrBegin.compare(cToken))nBraceFlag++;
490
            if(!iStrEnd.compare(cToken))nBraceFlag--;
491
        }
492
    }while(eTok!=ENDLINE);
493
    if(nBraceFlag)
494
        throw InterpExc(UNBAL_BRACES);
495
        //DealError("nBraceFlag is not equal 0\n");
496
    prog=p;
497
    //   qDebug()<<*(prog)<<*(prog+1)<<*(prog+2)<<*(prog+3)<<*(prog+4)<<*(prog+5)<<*(prog+6)<<*(prog+7)<<*(prog+8)<<*(prog+9)<<*(prog+10)<<*(prog+11);
498
}
499
 
500
 
501
 
502
//interpret a single statment or block of code.When interp() returns from its initial call,the final
503
//module(or a return) in module has been encounted.
504
void reg_scan::Interp()
505
{
506
    do{   //find all module
507
 
508
        if(FindModule("module"))
509
            do{
510
            //don't interpret until the keyword "endmodule"
511
            eTokenType= GetToken();
512
            if(eTokenType==IDENTFIER)
513
            {
514
                // qDebug()<<*(prog)<<*(prog+1)<<*(prog+2)<<*(prog+3)<<*(prog+4)<<*(prog+5)<<*(prog+6)<<*(prog+7)<<*(prog+8)<<*(prog+9)<<*(prog+10)<<*(prog+11);
515
                ExecInst();
516
                //return;
517
            }
518
            else if(eTokenType==DELIMITER)
519
            {
520
                if(*cToken=='`')
521
                    ExecDef();
522
            }
523
            else //is keyword
524
 
525
                switch(eTok) {
526
                case MODULE:
527
                    ExecModule();
528
                    break;
529
 
530
                case INPUT:
531
                case OUTPUT:
532
                case INOUT:
533
                    ExecIO();
534
                    break;
535
 
536
                case REG:
537
                    ExecReg();
538
                    break;
539
 
540
                case WIRE:
541
                    do{
542
                        prog++;
543
                    }while(*prog!=';');
544
                    prog++;
545
                    break;
546
 
547
                case PARAMETER:
548
                    ExecParam();
549
                    break;
550
 
551
                case DEFPARAM:
552
                    ExecDefparam();
553
                    break;
554
 
555
                case ALWAYS:
556
                    ExecAlways();
557
                    break;
558
 
559
                case ASSIGN:
560
                    ExecAssign();
561
                    break;
562
 
563
                case ENDMODULE:
564
                    break;
565
 
566
                case ENDLINE:
567
                                        throw InterpExc(SYNTAX);
568
                    //DealError("Error:innormal endline\n");
569
                    return;
570
 
571
                default:
572
                    qDebug()<<cToken;
573
                    break;
574
                }
575
        }while(eTok!=ENDMODULE);
576
    }while(eTok!=ENDLINE);
577
    //  return;
578
}
579
 
580
//return the entry point of the inst module
581
char *reg_scan::FindInstModu(char *name)
582
{
583
    unsigned i;
584
    for(i=0;i<ModuleTab[unModuCnt-1].InstModuTab[i].unSize;i++)
585
        if(!qstrcmp(name,ModuleTab[unModuCnt-1].InstModuTab[i].cInstName))
586
            return ModuleTab[unModuCnt-1].InstModuTab[i].cModuName;
587
    return NULL;
588
}
589
 
590
 
591
 
592
 
593
bool reg_scan::FindModule(char *name)
594
{
595
    // QString str=prog;
596
    //    qDebug()<<*(prog)<<*(prog+1)<<*(prog+2)<<*(prog+3)<<*(prog+4)<<*(prog+5)<<*(prog+6)<<*(prog+7)<<*(prog+8)<<*(prog+9)<<*(prog+10)<<*(prog+11);
597
    do
598
    {
599
        GetToken();
600
    }while(eTok!=ENDLINE&&eTok!=MODULE/*str.compare(name)*/);
601
    if(eTok==ENDLINE/*&&tok!=1*/)
602
    {
603
        return FALSE;
604
    }
605
    PutBack();
606
    // qDebug()<<"cToken is "<<*prog;
607
    return TRUE;
608
}
609
 
610
 
611
 
612
void reg_scan::ExecModule()
613
{
614
    eTokenType=GetToken();
615
    // qDebug()<<"ExecModule";
616
    if(eTokenType==IDENTFIER)
617
    {
618
        qstrcpy(ModuleTab[unModuCnt].cModuleName,cToken);
619
        unModuCnt++;
620
    }
621
    while(*cToken!=';')
622
    {
623
        GetToken();
624
    }
625
    // qDebug()<<eTokenType<<*cToken;
626
    ModuleTab[unModuCnt-1].nIPCore=0;
627
 
628
}
629
 
630
void reg_scan::ExecIO()
631
{
632
    QString iIOAttri=cToken;
633
    QString iWidthAttri="1";//´æ´¢Î»¿í
634
    //  int value=1,partial_value;
635
    do{
636
 
637
        if(!iIOAttri.compare("input"))
638
            ModuleTab[unModuCnt-1].IOTab[ModuleTab[unModuCnt-1].unIOCnt].eIOAttri=IO_INPUT;
639
        else  if(!iIOAttri.compare("output"))
640
            ModuleTab[unModuCnt-1].IOTab[ModuleTab[unModuCnt-1].unIOCnt].eIOAttri=IO_OUTPUT;
641
        else  if(!iIOAttri.compare("inout"))
642
            ModuleTab[unModuCnt-1].IOTab[ModuleTab[unModuCnt-1].unIOCnt].eIOAttri=IO_INOUT;
643
        else
644
                        throw InterpExc(SYNTAX);
645
            //DealError("Error:Not a io port\n");
646
 
647
        eTokenType= GetToken();
648
        if(eTokenType==KEYWORD)
649
        {eTokenType= GetToken();}
650
        if(eTokenType==DELIMITER&&*cToken!=',')
651
        {
652
            /*/////////////////////////////////////////
653
            //ÒÔÏÂÇé¿öÊǽ«Î»¿í¼ÆËã°´ÕÕ±í´ïʽ´¦Àí£¬Ö±½Ó¼ÆËã³ö½á¹û
654
            if(*cToken=='[')
655
            {//
656
                EvalExp(value);    //caculate the width and store to the value
657
                //               qDebug()<<"eval_deal"<<value<<cToken;
658
                GetToken();
659
 
660
                if(*cToken==':'||*cToken==']')
661
                {
662
                    if(*cToken==':')
663
                    {
664
                        EvalExp(partial_value);
665
                        //                       qDebug(": is coming");
666
                        if(*cToken==']')
667
                        {
668
 
669
                            value=value-partial_value+1;
670
                            GetToken();
671
                        }
672
                        //                       qDebug()<<cToken<<value;
673
                    }
674
                }
675
            }
676
            ////////////////////////////////////////////////*/
677
            //ÒÔÏÂÊÇÕë¶Ô½«Î»¿í±í´ïʽ´æ´¢Îª×Ö·û´®µÄ´¦Àí¹ý³Ì
678
            if(*cToken=='[')
679
            {
680
                iWidthAttri.clear();
681
                GetToken();
682
                do
683
                {
684
                    iWidthAttri.append(cToken);
685
                    GetToken();
686
 
687
                }while(*cToken!=']');
688
            }
689
        }
690
        else if(eTokenType==IDENTFIER)
691
        {
692
            qstrcpy(ModuleTab[unModuCnt-1].IOTab[ModuleTab[unModuCnt-1].unIOCnt].cIOName,cToken);//store the io name
693
            ModuleTab[unModuCnt-1].IOTab[ModuleTab[unModuCnt-1].unIOCnt++].iIOWidth=iWidthAttri;
694
            // qDebug()<<"name is"<<IOTab[ModuleTab[unModuCnt-1].unIOCnt-1].cIOName;
695
            // qDebug()<<"width is"<<IOTab[ModuleTab[unModuCnt-1].unIOCnt-1].iIOWidth;
696
        }
697
    }while(*cToken!=';');
698
}
699
 
700
void reg_scan::ExecReg()
701
{
702
    QString iWidthAttri="1";//´æ´¢Î»¿í
703
    QString iRegWidth;
704
    do{
705
        eTokenType= GetToken();
706
        if(eTokenType==DELIMITER&&*cToken!=',')
707
        {
708
            /*////////////////////////////////////
709
            //ÒÔÏÂÇé¿öÊǽ«Î»¿í¼ÆËã°´ÕÕ±í´ïʽ´¦Àí£¬Ö±½Ó¼ÆËã³ö½á¹û
710
            if(*cToken=='[')
711
            {
712
                EvalExp(value);    //caculate the width and store to the value
713
 
714
                GetToken();
715
 
716
                if(*cToken==':'||*cToken==']')
717
                {
718
                    if(*cToken==':')
719
                    {
720
                        EvalExp(partial_value);
721
                        //                       qDebug(": is coming");
722
                        if(*cToken==']')
723
                        {
724
 
725
                            value=value-partial_value+1;
726
                            GetToken();
727
                        }
728
                        //                       qDebug()<<cToken<<value;
729
                    }
730
                }
731
 
732
            }
733
            //////////////////////////////////////*/
734
            //ÒÔÏÂÊÇÕë¶Ô½«Î»¿í±í´ïʽ´æ´¢Îª×Ö·û´®µÄ´¦Àí¹ý³Ì
735
            if(*cToken=='[')
736
            {
737
                iWidthAttri.clear();
738
                GetToken();
739
                do
740
                {
741
                    iWidthAttri.append(cToken);
742
                    GetToken();
743
 
744
                }while(*cToken!=']');
745
                qDebug() << "EziDebug the BitWidth:"<< iWidthAttri ;
746
            }
747
        }
748
        else if(eTokenType==IDENTFIER)
749
        {
750
            qstrcpy(ModuleTab[unModuCnt-1].RegTab[ModuleTab[unModuCnt-1].unRegCnt].cRegName,cToken);//store the reg name
751
            ModuleTab[unModuCnt-1].RegTab[ModuleTab[unModuCnt-1].unRegCnt++].iRegWidth=iWidthAttri;
752
            // qDebug() << "name  is" << unModuCnt-1 << ModuleTab[unModuCnt-1].unRegCnt-1<< ModuleTab[unModuCnt-1].RegTab[ModuleTab[unModuCnt-1].unRegCnt-1].cRegName;
753
            // qDebug() << "width is" << unModuCnt-1 << ModuleTab[unModuCnt-1].unRegCnt-1 << ModuleTab[unModuCnt-1].RegTab[ModuleTab[unModuCnt-1].unRegCnt-1].iRegWidth;
754
            GetToken();
755
            /*/////////////////////////////
756
            //ÒÔÏÂÇé¿öÊǽ«¼Ä´æÆ÷¸öÊý°´ÕÕ±í´ïʽ´¦Àí£¬Ö±½Ó¼ÆËã³ö½á¹û
757
            if(*cToken=='[')
758
            {
759
                EvalExp(value);    //caculate the width and store to the value
760
 
761
                GetToken();
762
 
763
                if(*cToken==':'||*cToken==']')
764
                {
765
                    if(*cToken==':')
766
                    {
767
                        EvalExp(partial_value);
768
                        //                       qDebug(": is coming");
769
                        if(*cToken==']')
770
                        {
771
 
772
                            value=value-partial_value+1;
773
                            GetToken();
774
                        }
775
                        //                       qDebug()<<cToken<<value;
776
                    }
777
                }
778
 
779
                ModuleTab[unModuCnt-1].RegTab[ModuleTab[unModuCnt-1].unRegCnt-1].iRegCnt=value;
780
                qDebug()<<"width is"<<ModuleTab[unModuCnt-1].RegTab[ModuleTab[unModuCnt-1].unRegCnt-1].iRegCnt;
781
            }
782
            ///////////////////////////////////////////////*/
783
            //ÒÔÏÂÊÇÕë¶Ô½«¼Ä´æÆ÷¸öÊý±í´ïʽ´æ´¢Îª×Ö·û´®µÄ´¦Àí¹ý³Ì
784
            if(*cToken=='[')
785
            {
786
                iRegWidth.clear();
787
                GetToken();
788
                do
789
                {
790
                    iRegWidth.append(cToken);
791
                    GetToken();
792
 
793
                }while(*cToken!=']');
794
                ModuleTab[unModuCnt-1].RegTab[ModuleTab[unModuCnt-1].unRegCnt-1].iRegCnt=iRegWidth;
795
            }
796
            else
797
                PutBack();
798
        }
799
    }while(*cToken!=';');
800
}
801
//store the value of macro (`define)
802
void reg_scan::StoreMacro()
803
{
804
    QString iMacroVal;
805
    if(eTokenType==IDENTFIER)
806
    {
807
        MacroTab[unMacroCnt].nMacroFlag=1;
808
        qstrcpy(MacroTab[unMacroCnt].cMacroName,cToken);
809
        eTokenType=GetToken();
810
        if(*cToken==NULL||*cToken=='`'||eTokenType==KEYWORD||eTokenType==IDENTFIER)
811
        {
812
            unMacroCnt++;
813
            PutBack();
814
        }
815
        else
816
        {
817
            iMacroVal.clear();
818
            do{
819
                iMacroVal.append(cToken);
820
                eTokenType=GetToken();
821
            }while(*cToken!=NULL&&*cToken!='`'&&eTokenType!=KEYWORD&&eTokenType!=IDENTFIER);
822
            PutBack();
823
            MacroTab[unMacroCnt++].iMacroVal=iMacroVal;
824
        }
825
    }
826
}
827
void reg_scan::ExecParam()
828
{
829
    // int value=1;
830
    QString iParaVal;
831
    do{
832
        eTokenType=GetToken();
833
        if(eTokenType==IDENTFIER)
834
        {   qstrcpy(ModuleTab[unModuCnt-1].ParaTab[ModuleTab[unModuCnt-1].unParaCnt].cParaName,cToken);
835
            eTokenType=GetToken();
836
            if(eTokenType==DELIMITER&&*cToken=='=')
837
            {
838
                /////////////////////
839
                //´¦ÀíparameterºóÃæÖ»ÊÇÊý×ÖµÄÇé¿ö
840
                //  EvalExp(value);    //caculate the width and store to the value
841
                //////////////////////
842
                //½«ºóÃæµÄ²ÎÊý´æ´¢Îª×Ö·û´®
843
                iParaVal.clear();
844
                GetToken();
845
                do
846
                {
847
                    iParaVal.append(cToken);
848
                    GetToken();
849
 
850
                }while(*cToken!=','&&*cToken!=';');
851
                PutBack();
852
                ModuleTab[unModuCnt-1].ParaTab[ModuleTab[unModuCnt-1].unParaCnt++].iParaVal=iParaVal;
853
                //qstrcpy(ModuleTab[unModuCnt-1].ParaTab[ModuleTab[unModuCnt-1].unParaCnt++].iParaVal,token);
854
            }
855
        }
856
    }while(*cToken!=';');
857
}
858
void reg_scan::ExecAlways()
859
{
860
 
861
    int i=0;
862
    char *p;  //record current location
863
    struct TempBuf iTmpTab[2];
864
    *iTmpTab[0].cNameBuf='\0';
865
    iTmpTab[0].eEdge=INVALID;
866
    *iTmpTab[1].cNameBuf='\0';
867
    iTmpTab[1].eEdge=INVALID;
868
 
869
    GetToken();
870
    if(*cToken=='@')
871
    {
872
        while(*cToken!=')')
873
        {
874
            GetToken();
875
            //qDebug()<<"token is"<<token<<"prog is"<<*prog;
876
            if(eTok==POSEDGE)
877
            {
878
                GetToken();
879
                qstrcpy(iTmpTab[i].cNameBuf,cToken);
880
                iTmpTab[i++].eEdge=POSE;
881
 
882
            }
883
            else if(eTok==NEGEDGE)
884
            {
885
                GetToken();
886
                strcpy( iTmpTab[i].cNameBuf,cToken);
887
                iTmpTab[i++].eEdge=NEGE;
888
            }
889
 
890
        }
891
    }
892
    else
893
                throw InterpExc(SYNTAX);
894
        //DealError("error: 'always' is error\n");
895
    // qDebug()<<"before is"<<token;
896
    if(i==0)
897
    {
898
        qDebug("current always is not logic curcuit");
899
        InterpAlways(NULL,NULL,0);
900
    }
901
    else
902
    {
903
        if(i==1)
904
        {
905
            qDebug("tmp2 is clk");
906
            InterpAlways(&iTmpTab[0],&iTmpTab[1],1);
907
        }
908
        else if(i==2)
909
        {
910
            //qDebug("tmp1 is clk");
911
            p=prog;
912
            do{
913
                GetToken();
914
                //qDebug()<<"prog is "<<*prog<<*p<<token;
915
                if(eTokenType==IDENTFIER)
916
                {
917
                    if(!qstrcmp(cToken,iTmpTab[0].cNameBuf)){
918
                        prog=p;  //return the prelocation
919
                        //qDebug()<<"prog is "<<*prog;
920
                        InterpAlways(&iTmpTab[1],&iTmpTab[0],1);
921
 
922
                    }
923
                    else  if(!qstrcmp(cToken,iTmpTab[1].cNameBuf)){
924
                        prog=p;  //return the prelocation
925
                        //qDebug()<<"prog is "<<*(prog-1)<<token;
926
                        InterpAlways(&iTmpTab[0],&iTmpTab[1],1);
927
                    }
928
                    //else
929
                    //DealError("ERROR: always programa error");
930
                    return;
931
                }
932
            }while(*cToken!=')');
933
            prog=p;  //return the prelocation
934
        }
935
        else
936
            qDebug("find reset");
937
    }
938
    //qDebug()<<"token is"<<token;
939
}
940
 
941
void reg_scan::ExecAssign()
942
{
943
    do{
944
        prog++;
945
    }while(*prog!=';');
946
    prog++;
947
    qDebug()<<"assign"<<*prog;
948
}
949
 
950
unsigned int reg_scan::VarToUint(char *str)
951
{
952
    uint32_t var;
953
    QString iStr=str;
954
    QString tmp;
955
    int position;
956
    bool ok;
957
 
958
 
959
    if((position=iStr.indexOf("b",0))!=-1)
960
    {
961
        tmp=iStr.remove(0,position+1);
962
        tmp=tmp.remove('_');
963
        var=tmp.toUInt(&ok,2);
964
    }
965
    else if((position=iStr.indexOf("o",0))!=-1)
966
    {
967
        tmp=iStr.remove(0,position+1);
968
        tmp=tmp.remove('_');
969
        var=tmp.toUInt(&ok,8);
970
    }
971
    else if((position=iStr.indexOf("h",0))!=-1)
972
    {
973
        tmp=iStr.remove(0,position+1);
974
        tmp=tmp.remove('_');
975
        var=tmp.toUInt(&ok,16);
976
    }
977
    else if((position=iStr.indexOf("d",0))!=-1)
978
    {
979
        tmp=iStr.remove(0,position+1);
980
        tmp=tmp.remove('_');
981
        var=tmp.toUInt(&ok,10);
982
    }
983
    else
984
    {
985
 
986
        tmp=iStr.remove('_');
987
        var=iStr.toUInt(&ok,10);
988
    }
989
    return var;
990
}
991
 
992
 
993
bool reg_scan::DealError(char *str)
994
{
995
    qDebug(str);
996
    return FALSE;
997
}
998
 
999
 
1000
bool reg_scan::IsVar(char *vname)
1001
{
1002
    for(int i=0;i<ModuleTab[unModuCnt-1].unParaCnt;i++)
1003
    {
1004
        if(!qstrcmp(ModuleTab[unModuCnt-1].ParaTab[i].cParaName,vname))
1005
            return TRUE;
1006
    }
1007
    return FALSE;
1008
}
1009
 
1010
QString reg_scan::FindVar(char *vname)
1011
{
1012
    for(int i=0 ; i < ModuleTab[unModuCnt-1].unParaCnt ; i++)
1013
    {
1014
        if(!qstrcmp(ModuleTab[unModuCnt-1].ParaTab[i].cParaName,vname))
1015
            return ModuleTab[unModuCnt-1].ParaTab[i].iParaVal ;
1016
    }
1017
 
1018
    for(int i=0;i<unMacroCnt;i++)
1019
    {
1020
        if(!qstrcmp(MacroTab[i].cMacroName,vname))
1021
            return MacroTab[i].iMacroVal;
1022
    }
1023
    return QString() ;
1024
    // return FALSE;
1025
 
1026
}
1027
 
1028
 
1029
/*void reg_scan::find_attr_reg()
1030
{
1031
  int flag=1;
1032
  GetToken();
1033
  if(tok==BEGIN)
1034
  {
1035
     do
1036
      {
1037
       GetToken();
1038
       switch(tok){
1039
           case BEGIN:
1040
                flag++;
1041
                break;
1042
           case END:
1043
                flag--;
1044
                break;
1045
           case LT:
1046
           case GE:
1047
 
1048
                break;
1049
        }
1050
      }while(flag);
1051
  }
1052
  else if(tok==IF||tok==ELSE)
1053
  {
1054
      GetToken();
1055
      if(tok==BEGIN)
1056
      {
1057
          do
1058
           {
1059
            GetToken();
1060
            switch(tok){
1061
                case BEGIN:
1062
                     flag++;
1063
                     break;
1064
                case END:
1065
                     flag--;
1066
                     break;
1067
                case LT:
1068
                case GE:
1069
                     return;
1070
                     break;
1071
             }
1072
           }while(flag);
1073
      }
1074
     else
1075
      {
1076
 
1077
       }
1078
 
1079
 
1080
  }
1081
}*/
1082
 
1083
/******************************************************/
1084
/*´¦ÀíalwaysÖеÄÄÚÈÝ£¬Ö®Ç°ÒѾ­½âÎö³öʱÖÓÐźź͸´Î»Ðźţ¬Èç¹ûûÓÐ */
1085
/*ÒÔÉÏÐźţ¬ÔòisRegValidΪ0,·ñÔòΪ1                       */
1086
/******************************************************/
1087
void reg_scan::InterpAlways(struct TempBuf* clk,struct TempBuf* rst,bool isRegValid)
1088
{
1089
    int flag=0;
1090
    int brace_f=1;
1091
    char tmp[MAX_T_LEN];
1092
 
1093
    //   qDebug()<<"start is"<<token;
1094
    GetToken();
1095
    //   qDebug()<<"end is "<<token;
1096
 
1097
    //½â¾ötab¼üµÄÎÊÌâ
1098
    while(eTokenType!=IDENTFIER&&eTokenType!=KEYWORD)
1099
    {
1100
        GetToken();
1101
    }
1102
 
1103
    if(eTokenType==IDENTFIER&&flag==0)
1104
    {
1105
        //qDebug()<<" identifier is"<<token;
1106
        qstrcpy(tmp,cToken);
1107
        GetToken();
1108
        //if(*cToken==LE||*cToken=='=')
1109
        {
1110
            qDebug("no begin &if");
1111
            //set the tmp's clk and rst
1112
            if(!SetRegAttr(tmp,clk,rst,isRegValid))
1113
                                throw InterpExc(SYNTAX);
1114
                //DealError("ERROR: Reg is not exist");
1115
            //           qDebug()<<"current token is"<<token<<*(prog-1);
1116
            do{
1117
                prog++;
1118
            }while(*prog!=';');
1119
            prog++;
1120
 
1121
            return;     //deal with the case that section have no begin/end
1122
        }
1123
    }
1124
    else{
1125
        PutBack();
1126
 
1127
        do{
1128
            GetToken();
1129
            if(eTokenType==IDENTFIER)
1130
            {
1131
                qstrcpy(tmp,cToken);
1132
                GetToken();
1133
                if(*cToken==LE)
1134
                {
1135
                    PutBack();
1136
                    //set reg attribute
1137
                    SetRegAttr(tmp,clk,rst,isRegValid);
1138
                    do
1139
                    {
1140
                        prog++;
1141
                    }while(*prog!=';');
1142
                    prog++;
1143
                }
1144
 
1145
            }else{
1146
                switch(eTok){
1147
                case BEGIN:
1148
                    flag++;
1149
                    //          qDebug()<<"flag is"<<flag;
1150
                    break;
1151
                case END:
1152
                    flag--;
1153
                    if(!flag)
1154
                    {
1155
                        GetToken();
1156
                        if(eTok==ELSE/*||tok==IF*/)
1157
                        {
1158
                            PutBack();
1159
                            InterpAlways(clk,rst,isRegValid);
1160
                        }
1161
                        else
1162
                            PutBack();
1163
                    }
1164
                    qDebug()<<"flag end is"<<flag;
1165
                    break;
1166
 
1167
                case IF:
1168
 
1169
                    do{
1170
                        GetToken();
1171
                        if(*cToken=='(')
1172
                            brace_f++;
1173
                        else if(*cToken==')')
1174
                            brace_f--;
1175
                    }while(brace_f!=1);
1176
                    InterpAlways(clk,rst,isRegValid);
1177
 
1178
                    //for "if" without begin/end
1179
                    if(!flag)
1180
                    {
1181
                        GetToken();
1182
                        while(eTokenType==DELIMITER)
1183
                            GetToken();
1184
                        if(eTok==ELSE/*||tok==IF*/)
1185
                        {
1186
                            PutBack();
1187
                            InterpAlways(clk,rst,isRegValid);
1188
                        }
1189
                        else
1190
                            PutBack();
1191
                    }
1192
                    break;
1193
 
1194
                case ELSE:
1195
                    qDebug()<<"else is"<<cToken;
1196
                    InterpAlways(clk,rst,isRegValid);
1197
                    break;
1198
 
1199
                case CASE:
1200
                    flag++;
1201
                    do{
1202
                        GetToken();
1203
                    }while(*cToken!=')');
1204
                    break;
1205
 
1206
                case CASEX:
1207
                    flag++;
1208
                    do{
1209
                        GetToken();
1210
                    }while(*cToken!=')');
1211
                    break;
1212
 
1213
                case ENDCASE:
1214
                    flag--;
1215
                    break;
1216
                default:
1217
                    break;
1218
                }
1219
            }
1220
        }while(flag!=0);
1221
    }
1222
    qDebug("quit always");
1223
}
1224
 
1225
/******************************************************/
1226
/*´æ´¢regµÄÏà¹ØÊôÐÔ£¬°üÀ¨Ê±ÖÓÐźÅÃû³Æ¼°ÊôÐÔ£¬¸´Î»ÐźÅÃû³Æ¼°ÊôÐÔ   */
1227
/******************************************************/
1228
bool reg_scan::SetRegAttr(char *reg,struct TempBuf* clk,struct TempBuf* rst,bool isRegValid)
1229
{
1230
    int i;
1231
    if(isRegValid){
1232
        for(i=0;i<ModuleTab[unModuCnt-1].unRegCnt;i++)
1233
        {
1234
            if(!qstrcmp(reg,ModuleTab[unModuCnt-1].RegTab[i].cRegName))
1235
            {
1236
                qstrcpy( ModuleTab[unModuCnt-1].RegTab[i].RstAttri.cRstName,rst->cNameBuf);
1237
                ModuleTab[unModuCnt-1].RegTab[i].RstAttri.eRstEdge=rst->eEdge;
1238
                qstrcpy(ModuleTab[unModuCnt-1].RegTab[i].ClkAttri.cClkName,clk->cNameBuf);
1239
                ModuleTab[unModuCnt-1].RegTab[i].ClkAttri.eClkEdge=clk->eEdge;
1240
                ModuleTab[unModuCnt-1].RegTab[i].IsFlag=1;
1241
                return TRUE;
1242
            }
1243
 
1244
        }
1245
    }
1246
    else
1247
    {
1248
        for(i=0;i<ModuleTab[unModuCnt-1].unRegCnt;i++)
1249
        {
1250
            if(!qstrcmp(reg,ModuleTab[unModuCnt-1].RegTab[i].cRegName))
1251
            {
1252
                //qstrcpy( ModuleTab[unModuCnt-1].RegTab[i].RstAttri.cRstName,rst->cNameBuf);
1253
                //ModuleTab[unModuCnt-1].RegTab[i].RstAttri.eRstEdge=rst->eEdge;
1254
                //qstrcpy(ModuleTab[unModuCnt-1].RegTab[i].ClkAttri.cClkName,clk->cNameBuf);
1255
                //ModuleTab[unModuCnt-1].RegTab[i].ClkAttri.eClkEdge=clk->eEdge;
1256
                ModuleTab[unModuCnt-1].RegTab[i].IsFlag=0;
1257
                return TRUE;
1258
            }
1259
        }
1260
    }
1261
    return FALSE;
1262
}
1263
 
1264
/******************************************************/
1265
/*½«Õû¸ö³ÌÐò½âÎö³öÀ´µÄÄÚÈÝ´òÓ¡ÔÚÎı¾Îļþresult.txtÖУ¬ÒÔ¹©Ð£Ñé  */
1266
/******************************************************/
1267
void reg_scan::PrintFile()
1268
{
1269
    int i,j;
1270
    ///////////////////////////////////////////////////ÒÔÏÂΪÊä³öµ½ÎļþÖнøÐмì²â
1271
    QFile resultFile("result.txt");
1272
    if(!resultFile.open(QFile::Append|QIODevice::Text|QIODevice::WriteOnly))
1273
    {
1274
        qDebug() << resultFile.errorString();
1275
    }
1276
    QTextStream out(&resultFile);
1277
 
1278
    //Êä³ödefineÐÅÏ¢
1279
    out<<"define macros:\n";
1280
    for(i=0;i<unMacroCnt;i++)
1281
    {
1282
        out<<qSetFieldWidth(16)<<right<<MacroTab[i].cMacroName<<MacroTab[i].iMacroVal
1283
          << "flag:" <<MacroTab[i].nMacroFlag << "\n";
1284
    }
1285
 
1286
    for (j=0;j<unModuCnt;j++)
1287
    {
1288
        out<<"module:"<<"\n";
1289
        out<<qSetFieldWidth(16)<<right<<ModuleTab[j].cModuleName<<"\n";
1290
        for(i=0;i<ModuleTab[j].unInstCnt;i++)
1291
        {
1292
            out<<"instname:"<<ModuleTab[j].InstModuTab[i].cInstName<<"modulename:"<<ModuleTab[j].InstModuTab[i].cModuName<<"\n";
1293
        }
1294
 
1295
        //Êä³öinput,outputÐÅÏ¢
1296
        out<<"ports:\n";
1297
        for (i=0;i<ModuleTab[j].unIOCnt;i++)
1298
        {
1299
 
1300
            out<<qSetFieldWidth(10)<<right<<ModuleTab[j].IOTab[i].cIOName;//<<IOTab[i].eIOAttri<<IOTab[i].iIOWidth<<"\n";
1301
            if(ModuleTab[j].IOTab[i].eIOAttri==0)
1302
                out<<"input";
1303
            else if(ModuleTab[j].IOTab[i].eIOAttri==1)
1304
                out<<"output";
1305
            else out<<"inout";
1306
            out<<ModuleTab[j].IOTab[i].iIOWidth<<"\n";
1307
        }
1308
 
1309
        //Êä³öregÐÅÏ¢
1310
        out<<"regs:\n";
1311
        for(i=0;i<ModuleTab[j].unRegCnt;i++)
1312
        {
1313
            out<<ModuleTab[j].RegTab[i].cRegName;
1314
            out<<"IsFlag:"<<ModuleTab[j].RegTab[i].IsFlag;
1315
            out<<"width:"<<ModuleTab[j].RegTab[i].iRegWidth;
1316
            out<<"count:"<<ModuleTab[j].RegTab[i].iRegCnt;
1317
            out<<"reg_clk:"<<ModuleTab[j].RegTab[i].ClkAttri.cClkName;
1318
            if(ModuleTab[j].RegTab[i].ClkAttri.eClkEdge==3)
1319
                out<<"POSEDGE";
1320
            else if(ModuleTab[j].RegTab[i].ClkAttri.eClkEdge==4)
1321
                out<<"NEGEDGE";
1322
            out<<"reg_rst:"<<ModuleTab[j].RegTab[i].RstAttri.cRstName;
1323
            if(ModuleTab[j].RegTab[i].RstAttri.eRstEdge==3)
1324
                out<<"POSEDGE";
1325
            else if(ModuleTab[j].RegTab[i].RstAttri.eRstEdge==4)
1326
                out<<"NEGEDGE";
1327
            out<<"\n";
1328
        }
1329
 
1330
        //Êä³öparameterÐÅÏ¢
1331
        out<<"PARAMETERS:\n";
1332
        for(i=0;i<ModuleTab[j].unParaCnt;i++)
1333
        {
1334
            out<<ModuleTab[j].ParaTab[i].cParaName<<ModuleTab[j].ParaTab[i].iParaVal<<"\n";
1335
        }
1336
 
1337
        for(int k=0;k<10;k++)
1338
            out<<"******************";
1339
        out<<"\n";
1340
 
1341
    }
1342
}
1343
 
1344
/******************************************************/
1345
/*´¦ÀíʵÌåÀý»¯µÄÇé¿ö£¬²¢½«ÄÚÈÝ´æ´¢ÔÚÈ«¾Ö±äÁ¿InstMapÖУ¬´æ´¢¸ñʽΪ*/
1346
/*<module_name#inst_name,<port_name,port_value> >     */
1347
/******************************************************/
1348
void reg_scan::ExecInst()
1349
{
1350
    char module_tmp[MAX_NAME_LEN];
1351
    char inst_tmp[MAX_NAME_LEN];
1352
    char port_module[MAX_NAME_LEN];
1353
    char port_inst[MAX_NAME_LEN];
1354
    int position;
1355
 
1356
    QMap<QString,QString> port_map;
1357
    QString  name_map;
1358
    QString  port_inst_tmp;
1359
 
1360
    qstrcpy(module_tmp,cToken); //moduleÃû³Æ
1361
    do
1362
    {
1363
        GetToken();
1364
    }while(eTokenType!=IDENTFIER);
1365
    qstrcpy(inst_tmp,cToken);
1366
 
1367
 
1368
    name_map.append(module_tmp);
1369
    name_map.append("#");
1370
    name_map.append(inst_tmp);
1371
 
1372
 
1373
    qDebug()<<"inst module is"<<name_map;
1374
    qstrcpy(ModuleTab[unModuCnt-1].InstModuTab[ModuleTab[unModuCnt-1].unInstCnt].cModuName,cToken);
1375
    do{
1376
        GetToken();
1377
                if(eTok == ENDLINE)
1378
                {
1379
                        throw InterpExc(SYNTAX);
1380
                }
1381
        switch(*cToken){
1382
        case '.':
1383
            while(eTokenType!=IDENTFIER)
1384
            {
1385
                GetToken();
1386
            }
1387
            qstrcpy(port_module,cToken);
1388
            do{
1389
                GetToken();
1390
                                if(eTok == ENDLINE)
1391
                                {
1392
                                        throw InterpExc(SYNTAX);
1393
                            }
1394
            }while(*cToken!='(');
1395
            eTokenType=GetToken();
1396
            if(*cToken==')')
1397
            {
1398
                qstrcpy(port_inst,"NULL");
1399
                port_map.insert(port_module,port_inst);
1400
                PutBack();
1401
            }
1402
            else if(*cToken=='{')
1403
            {
1404
                do{
1405
                    port_inst_tmp.append(cToken);
1406
                    GetToken();
1407
                                        if(eTok == ENDLINE)
1408
                                        {
1409
                                        throw InterpExc(SYNTAX);
1410
                                }
1411
                }while(*cToken!=')');
1412
                PutBack();
1413
                port_map.insert(port_module,port_inst_tmp);
1414
            }
1415
            else
1416
            {
1417
                qstrcpy(port_inst,cToken);
1418
                port_map.insert(port_module,port_inst);
1419
            }
1420
 
1421
            do{
1422
                GetToken();
1423
                                if(eTok == ENDLINE)
1424
                                {
1425
                                    throw InterpExc(SYNTAX);
1426
                            }
1427
            }while(*cToken!=')');
1428
            break;
1429
        default:
1430
            break;
1431
        }
1432
    }while(*cToken!=';');
1433
 
1434
    inst_map.insert(name_map,port_map);
1435
    iinstNameList.append(name_map);
1436
    //ÅжÏÊÇ·ñΪipcore
1437
    if((position=name_map.indexOf("_component",0))!=-1) //±íʾÕÒµ½
1438
        nIsComponent=1;
1439
}
1440
 
1441
/******************************************************/
1442
/*´¦Àí¹Ø¼ü×ÖDEFPARAMµÄÇé¿ö£¬²¢½«ÄÚÈÝ´æ´¢ÔÚÈ«¾Ö±äÁ¿DefMapÖУ¬´æ´¢*/
1443
/*¸ñʽΪ<inst_name.para_name,para_value>               */
1444
/******************************************************/
1445
void reg_scan::ExecDefparam()
1446
{
1447
    QString inst_name;
1448
    QString para_name;
1449
    if(nIsComponent)
1450
    {
1451
        ModuleTab[unModuCnt-1].nIPCore=1;
1452
        nIsComponent=0;
1453
        do{
1454
            GetToken();
1455
        }while(*cToken!=';');
1456
    }
1457
    else
1458
    {
1459
        do{
1460
            eTokenType=GetToken();
1461
            if(eTokenType==IDENTFIER)
1462
            {
1463
                //´æ´¢¸ñʽΪ£¨ÊµÌåÃû.¶Ë¿ÚÃû£¬ÊýÖµ£©
1464
                inst_name.clear();
1465
                para_name.clear();
1466
                inst_name.append(cToken);
1467
                GetToken();
1468
                if(*cToken=='=')
1469
                {
1470
                    GetToken();
1471
                    do{
1472
                        para_name.append(cToken);
1473
                        GetToken();
1474
                    }while(*cToken!=';'&&*cToken!=',');
1475
                    PutBack();
1476
                }
1477
                else
1478
                                        throw InterpExc(SYNTAX);
1479
                    //DealError("Error in para value of defparam!\n");
1480
 
1481
                def_map.insert(inst_name,para_name);
1482
            }
1483
 
1484
        }while(*cToken!=';');
1485
    }
1486
    qDebug()<<"defparam is" << def_map;
1487
}
1488
 
1489
/******************************************************/
1490
/*´¦ÀíÔ¤´¦ÀíÖ¸Áî(`),·ÖΪÈýÖÖÇé¿ö£ºDEFINE,IFDEF,IFNDEF       */
1491
/******************************************************/
1492
void reg_scan::ExecDef()
1493
{
1494
    int l_nMacroFlag=0;
1495
    int l_nElseFlag=0;
1496
    GetToken();
1497
    if(eTok==IFDEF)
1498
    {
1499
        eTokenType=GetToken();
1500
        if(eTokenType==IDENTFIER)
1501
            if(FindMacro(cToken))
1502
                l_nMacroFlag=1;
1503
        if(l_nMacroFlag==1)//Èç¹û¶¨ÒåÁ˾ÍÖ´ÐÐÉÏÃæµÄ
1504
        {
1505
            ExecIfels(l_nElseFlag);
1506
            SkipElsend(l_nElseFlag);
1507
        }
1508
        else  //ûÓж¨ÒåµÄÇé¿ö´¦Àí
1509
        {
1510
            SkipIfels(l_nElseFlag);
1511
            ExecElsend(l_nElseFlag);
1512
        }
1513
    }
1514
 
1515
    else if(eTok==IFNDEF)
1516
    {
1517
        eTokenType=GetToken();
1518
        if(eTokenType==IDENTFIER)
1519
            if(FindMacro(cToken))
1520
                l_nMacroFlag=1;
1521
        if(l_nMacroFlag==0)//Èç¹û䶨ÒåÁ˾ÍÖ´ÐÐÉÏÃæµÄ
1522
        {
1523
            ExecIfels(l_nElseFlag);
1524
            SkipElsend(l_nElseFlag);
1525
        }
1526
        else  //¶¨ÒåµÄÇé¿ö´¦Àí
1527
        {
1528
            SkipIfels(l_nElseFlag);
1529
            ExecElsend(l_nElseFlag);
1530
        }
1531
    }
1532
    else if(eTok==DEFINE)//´¦ÀímoduleÄÚ²¿Óж¨ÒåºêµÄÇé¿ö
1533
    {
1534
        GetToken();
1535
        StoreMacro();
1536
    }
1537
 
1538
}
1539
 
1540
/**************************************************** */
1541
/*ÔÚÒÑ´æÈëµÄMacroTabÖвéÕÒµ±Ç°µÄºêÊÇ·ñ´æÔÚ£¬Èç¹ûÕÒµ½£¬·µ»ØÕ棬·ñ */
1542
/*Ôò£¬·µ»Ø¼Ù                                            */
1543
/******************************************************/
1544
bool reg_scan::FindMacro(char *vname)
1545
{
1546
    for(int i=0;i<unMacroCnt;i++)
1547
    {
1548
        if(!qstrcmp(MacroTab[i].cMacroName,vname))
1549
        {
1550
            if(MacroTab[i].nMacroFlag==1)
1551
                return TRUE;
1552
            else
1553
                return FALSE;
1554
        }
1555
    }
1556
 
1557
    return FALSE;
1558
}
1559
 
1560
/***************************************************************************/
1561
/*´¦ÀíÔ¤´¦ÀíÖ¸ÁִÐÐ`else֮ǰµÄÖ¸Áî                                             */
1562
/****************************************************************************/
1563
void reg_scan::ExecIfels(int &nElseFlag) //nElseFlagΪelseµÄ±ê־룬1±íʾ·¢ÏÖelse
1564
{
1565
    int l_nEndFlag=1;//±ê־λ
1566
 
1567
    do{
1568
        eTokenType= GetToken();
1569
        switch(eTokenType)
1570
        {
1571
        case IDENTFIER:
1572
            ExecInst();
1573
            break;
1574
 
1575
        case DELIMITER:
1576
            if(*cToken=='`')
1577
            {
1578
                GetToken();
1579
                switch(eTok)
1580
                {
1581
                case IFDEF:
1582
                case IFNDEF:
1583
                    PutBack();
1584
                    ExecDef();
1585
                    break;
1586
 
1587
                case ELSE:
1588
                    l_nEndFlag=0;
1589
                    nElseFlag=1;
1590
                    break;
1591
 
1592
                case ENDIF:
1593
                    if(l_nEndFlag) //´¦Àí²»´æÔÚelseµÄÇé¿ö£¬Ö±½ÓÊÇendifʱ
1594
                    {
1595
                        l_nEndFlag=0;
1596
                        nElseFlag=0;
1597
                    }
1598
                    break;
1599
                default:
1600
                    break;
1601
                }
1602
            }
1603
        case KEYWORD:
1604
        {
1605
            switch(eTok)
1606
            {
1607
            case ALWAYS:
1608
                ExecAlways();
1609
                break;
1610
 
1611
            case INPUT:
1612
            case OUTPUT:
1613
            case INOUT:
1614
                ExecIO();
1615
                break;
1616
 
1617
            case REG:
1618
                ExecReg();
1619
                break;
1620
 
1621
            case WIRE:
1622
                do{
1623
                    prog++;
1624
                }while(*prog!=';');
1625
                prog++;
1626
                break;
1627
 
1628
            case PARAMETER:
1629
                ExecParam();
1630
                break;
1631
 
1632
 
1633
            case DEFPARAM://½«²ÎÊý´æ´¢£¬°üÀ¨Ä£¿éÃû£¬²ÎÊýÃû£¬²ÎÊýÊýÖµ£¬ÒÔ×Ö·û´®ÐÎʽ´æ´¢
1634
                ExecDefparam();
1635
                break;
1636
 
1637
            case ASSIGN:
1638
                do{
1639
                    prog++;
1640
                }while(*prog!=';');
1641
                prog++;
1642
                break;
1643
 
1644
            default:
1645
                break;
1646
            }
1647
        }
1648
        default:
1649
            break;
1650
        }
1651
    }while(l_nEndFlag);
1652
}
1653
 
1654
/***************************************************************************/
1655
/*Ö´ÐÐÔ¤´¦ÀíÃüÁִÐÐ`elseµ½`endifÖмäµÄÖ¸Áî                                     */
1656
/****************************************************************************/
1657
void reg_scan::ExecElsend(int &nElseFlag)
1658
{
1659
    if(nElseFlag)//±íʾ´æÔÚelseµÄÇé¿ö
1660
    {
1661
        int l_nEndFlag=1;//±ê־λ
1662
 
1663
        do{
1664
            eTokenType= GetToken();
1665
            switch(eTokenType)
1666
            {
1667
            case IDENTFIER:
1668
                ExecInst();
1669
                break;
1670
 
1671
            case DELIMITER:
1672
                if(*cToken=='`')
1673
                {
1674
                    GetToken();
1675
                    switch(eTok)
1676
                    {
1677
                    case IFDEF:
1678
                    case IFNDEF:
1679
                        PutBack();
1680
                        ExecDef();
1681
                        break;
1682
 
1683
                    case ENDIF:
1684
                        l_nEndFlag=0;
1685
                        break;
1686
 
1687
                    default:
1688
                        break;
1689
                    }
1690
                }
1691
            case KEYWORD:
1692
            {
1693
                switch(eTok)
1694
                {
1695
                case ALWAYS:
1696
                    ExecAlways();
1697
                    break;
1698
 
1699
                case INPUT:
1700
                case OUTPUT:
1701
                case INOUT:
1702
                    ExecIO();
1703
                    break;
1704
 
1705
                case REG:
1706
                    ExecReg();
1707
                    break;
1708
 
1709
                case WIRE:
1710
                    do{
1711
                        prog++;
1712
                    }while(*prog!=';');
1713
                    prog++;
1714
                    break;
1715
 
1716
                case PARAMETER:
1717
                    ExecParam();
1718
                    break;
1719
 
1720
                case DEFPARAM://½«²ÎÊý´æ´¢£¬°üÀ¨Ä£¿éÃû£¬²ÎÊýÃû£¬²ÎÊýÊýÖµ£¬ÒÔ×Ö·û´®ÐÎʽ´æ´¢
1721
                    ExecDefparam();
1722
                    break;
1723
 
1724
                case ASSIGN:
1725
                    do{
1726
                        prog++;
1727
                    }while(*prog!=';');
1728
                    prog++;
1729
                    break;
1730
 
1731
                default:
1732
                    break;
1733
                }
1734
            }
1735
            default:
1736
                break;
1737
            }
1738
        }while(l_nEndFlag);
1739
    }
1740
}
1741
 
1742
/***************************************************************************/
1743
/*Ö´ÐÐÔ¤´¦ÀíÃüÁÌø¹ý`ifºÍ`elseÖ®¼äµÄÖ¸Áî                                        */
1744
/****************************************************************************/
1745
void reg_scan::SkipIfels(int &nElseFlag)
1746
{
1747
    int l_nEndFlag=1;
1748
 
1749
    do{
1750
        GetToken();
1751
        if(*cToken=='`')
1752
        {
1753
            GetToken();
1754
            switch(eTok)
1755
            {
1756
            case IFDEF:
1757
            case IFNDEF:
1758
                l_nEndFlag++;
1759
                break;
1760
 
1761
            case ENDIF:
1762
                l_nEndFlag--;
1763
                break;
1764
 
1765
            case ELSE:
1766
                if(l_nEndFlag==1)
1767
                { l_nEndFlag=0;
1768
                    nElseFlag=1;
1769
                }
1770
                break;
1771
 
1772
            default:
1773
                break;
1774
            }
1775
 
1776
        }
1777
    }while(l_nEndFlag);
1778
 
1779
}
1780
 
1781
/***************************************************************************/
1782
/*Ö´ÐÐÔ¤´¦ÀíÃüÁÌø¹ý`elseµ½`endifÖмäµÄÖ¸Áî                                    */
1783
/****************************************************************************/
1784
void reg_scan::SkipElsend(int &nElseFlag)
1785
{
1786
    int l_nEndFlag=1;
1787
    if(nElseFlag)//±íʾ·¢ÏÖelse
1788
    {
1789
        do{
1790
            GetToken();
1791
            if(*cToken=='`')
1792
            {
1793
                GetToken();
1794
                switch(eTok)
1795
                {
1796
                case IFDEF:
1797
                case IFNDEF:
1798
                    l_nEndFlag++;
1799
                    break;
1800
                case ENDIF:
1801
                    l_nEndFlag--;
1802
                    break;
1803
 
1804
                default:
1805
                    break;
1806
                }
1807
            }
1808
        }while(l_nEndFlag);
1809
    }
1810
}
1811
 
1812
/***************************************************************************/
1813
/*Ϊ´¦ÀíincludeÖ¸ÁîÔ¤Áô½Ó¿Ú                                                   */
1814
/***************************************************************************/
1815
void reg_scan::ExecInclude()
1816
{
1817
 
1818
}
1819
 
1820
/***************************************************************************/
1821
/*Çå¿Õ´ý´æ´¢µÄmodule½á¹¹Ìå                                                     */
1822
/***************************************************************************/
1823
void reg_scan::ClearModule()
1824
{
1825
    inst_map.clear();
1826
    def_map.clear();
1827
 
1828
    for(int i=0;i<MAX_T_LEN;i++)
1829
    {
1830
 
1831
        qstrcpy(ModuleTab[i].cModuleName,NULL);
1832
        ModuleTab[i].unInstCnt=0;
1833
        ModuleTab[i].unIOCnt=0;
1834
        ModuleTab[i].unParaCnt=0;
1835
        ModuleTab[i].unRegCnt=0;
1836
        ModuleTab[i].nIPCore=0;
1837
 
1838
        for(int j=0;j<MAX_T_LEN;j++)
1839
        {
1840
            qstrcpy(ModuleTab[i].InstModuTab[j].cInstName,NULL);
1841
            qstrcpy(ModuleTab[i].InstModuTab[j].cModuName,NULL);
1842
            ModuleTab[i].InstModuTab[j].unSize=0;
1843
        }
1844
        for(int j=0;j<MAX_T_LEN;j++)
1845
        {
1846
            qstrcpy(ModuleTab[i].IOTab[j].cIOName,NULL);
1847
            ModuleTab[i].IOTab[j].eIOAttri=IO_INVALID;
1848
            ModuleTab[i].IOTab[j].iIOWidth.clear();
1849
        }
1850
        for(int j=0;j<MAX_T_LEN;j++)
1851
        {
1852
            qstrcpy(ModuleTab[i].RegTab[j].cRegName,NULL);
1853
            ModuleTab[i].RegTab[j].iRegWidth.clear();
1854
            ModuleTab[i].RegTab[j].iRegCnt.clear();
1855
            qstrcpy(ModuleTab[i].RegTab[j].ClkAttri.cClkName,NULL);
1856
            ModuleTab[i].RegTab[j].ClkAttri.eClkEdge=INVALID;
1857
            qstrcpy(ModuleTab[i].RegTab[j].RstAttri.cRstName,NULL);
1858
            ModuleTab[i].RegTab[j].RstAttri.eRstEdge=INVALID;
1859
            ModuleTab[i].RegTab[j].IsFlag=0;
1860
        }
1861
        for(int j=0;j<MAX_T_LEN;j++)
1862
        {
1863
            qstrcpy(ModuleTab[i].ParaTab[j].cParaName,NULL);
1864
            ModuleTab[i].ParaTab[j].iParaVal.clear();
1865
        }
1866
 
1867
    }
1868
 
1869
    for(int k=0;k<MAX_T_LEN;k++)
1870
    {
1871
        qstrcpy(MacroTab[k].cMacroName,NULL);
1872
        MacroTab[k].iMacroVal.clear();
1873
        MacroTab[k].nMacroFlag=0;
1874
    }
1875
}
1876
 
1877
 
1878
//entry point into parser
1879
void reg_scan::EvalExp(int &value)
1880
{
1881
    GetToken();
1882
    //  qDebug()<<"EvalExp token is "<<cToken<<eTokenType;
1883
    if(!*cToken)
1884
        //    {throw InterpExc(NO_EXP);}
1885
        //DealError("empty exp\n");
1886
        throw InterpExc(NO_EXP);
1887
    if(*cToken==';')//||*cToken==':'||*cToken==']'
1888
    {
1889
        value=0;
1890
        return;
1891
    }
1892
    EvalExp0(value);
1893
    PutBack();
1894
}
1895
 
1896
//process an assignment expression
1897
void reg_scan::EvalExp0(int &value)
1898
{
1899
    char temp[MAX_ID_LEN+1];
1900
    TOK_TYPES temp_tok;
1901
 
1902
    if(eTokenType==IDENTFIER)
1903
    {
1904
        if(IsVar(cToken))              ////????????
1905
        {
1906
            qstrcpy(temp,cToken);
1907
            temp_tok=eTokenType;
1908
            GetToken();
1909
            if(*cToken=='=')
1910
            {// is an assignment
1911
                GetToken();
1912
                EvalExp0(value);
1913
                //assign_var(temp,value);
1914
                qDebug()<<"assign var";
1915
                return;
1916
 
1917
            }
1918
            else{
1919
 
1920
                PutBack();
1921
                qstrcpy(cToken,temp);
1922
                eTokenType=temp_tok;
1923
            }
1924
        }
1925
    }
1926
    EvalExp1(value);
1927
}
1928
 
1929
//process relational operators
1930
void reg_scan::EvalExp1(int &value)
1931
{
1932
    int partial_value;
1933
    char op;
1934
    char relops[]={LT,LE,GT,GE,EQ,NE,0};
1935
    QString str=relops;
1936
 
1937
 
1938
    EvalExp2(value);
1939
    op=*cToken;
1940
    if(str.indexOf(op)!=-1)
1941
    {
1942
        GetToken();
1943
        EvalExp2(partial_value);
1944
        switch(op){
1945
        case LT:
1946
            value=value<partial_value;
1947
            break;
1948
        case LE:
1949
            value=value<=partial_value;
1950
            break;
1951
        case GT:
1952
            value=value>partial_value;
1953
            break;
1954
        case GE:
1955
            value=value>=partial_value;
1956
            break;
1957
        case EQ:
1958
            value=value==partial_value;
1959
            break;
1960
        case NE:
1961
            value=value!=partial_value;
1962
            break;
1963
        }
1964
 
1965
    }
1966
}
1967
 
1968
//add or subtract two terms
1969
void reg_scan::EvalExp2(int &value)
1970
{
1971
    char op;
1972
    int partial_value;
1973
    char okops[]={'(',INC,DEC,'-','+',0};
1974
    QString str=okops;
1975
    EvalExp3(value);
1976
    while((op=*cToken)=='+'||op=='-')
1977
    {
1978
        GetToken();
1979
        if(eTokenType==DELIMITER&&str.indexOf(*cToken)==-1)
1980
            //          throw InterpExc(SYNTAX);
1981
            // DealError("exp2\n");
1982
            throw InterpExc(SYNTAX);
1983
        EvalExp3(partial_value);
1984
        switch(op)
1985
        {
1986
        case '-':
1987
            value=value-partial_value;
1988
            break;
1989
        case '+':
1990
            value=value+partial_value;
1991
            break;
1992
 
1993
        }
1994
    }
1995
}
1996
//multiply or divide two factors
1997
void reg_scan::EvalExp3(int &value)
1998
{
1999
    char op;
2000
    int partial_value,t;
2001
    char okops[]={'(',INC,DEC,'-','+',0};
2002
    QString str=okops;
2003
    EvalExp4(value);
2004
    while((op=*cToken)=='*'||op=='/'||op=='%'||op==POW)
2005
    {
2006
        GetToken();
2007
        if(eTokenType==DELIMITER&&str.indexOf(*cToken)==-1)
2008
                    throw InterpExc(SYNTAX);
2009
            //DealError("exp4\n");
2010
        EvalExp4(partial_value);
2011
        switch(op)
2012
        {
2013
        case '*':
2014
            value=value*partial_value;
2015
            break;
2016
        case '/':
2017
            if(partial_value==0)
2018
                //            throw InterpExc(SYNTAX);
2019
                // DealError("divide 0\n");
2020
                 throw InterpExc(SYNTAX);
2021
            value=(value)/partial_value;
2022
            break;
2023
        case '%':
2024
            t=(value)/partial_value;
2025
            value=value-(t*partial_value);
2026
            break;
2027
        case POW:
2028
            value=qPow(value,partial_value);
2029
            break;
2030
        }
2031
    }
2032
 
2033
}
2034
 
2035
//is a unary +,-,++,or --.
2036
void reg_scan::EvalExp4(int &value)
2037
{
2038
   EvalExp5(value);
2039
}
2040
 
2041
//process parenthesized expression
2042
void reg_scan::EvalExp5(int &value)
2043
{
2044
    if(*cToken=='(')
2045
    {
2046
      GetToken();
2047
      EvalExp0(value);  //get subexpression
2048
        if(*cToken!=')')
2049
//          throw InterpExc(PAREN_EXPECTED);
2050
         // DealError("EvalExp5 error\n");
2051
         throw InterpExc(PAREN_EXPECTED);
2052
      GetToken();
2053
    }
2054
    else
2055
        Atom(value);
2056
}
2057
 
2058
 
2059
void reg_scan::Atom(int &value)
2060
{
2061
 int i;
2062
 char temp[MAX_ID_LEN+1];
2063
 QString str=cToken;
2064
 bool ok;
2065
 switch(eTokenType)
2066
 {
2067
   case IDENTFIER:
2068
//     i=internal_func(cToken);
2069
       // value = FindVar(cToken);  //get var's value
2070
       value = 0 ;
2071
//     strcpy(temp,cToken);
2072
       GetToken() ;
2073
       return ;
2074
   case NUMBER:
2075
     value=VarToUint(cToken);
2076
     //value=str.toInt(&ok,10);  //   atoi(cToken);
2077
     GetToken();
2078
//     qDebug()<<cToken;
2079
     return;
2080
   case DELIMITER:
2081
     if(*cToken=='\'')
2082
     {
2083
       value= *prog;
2084
       prog++;
2085
       if(*prog!='\'')
2086
//          throw InterpExc(QUOTE_EXPECTED);
2087
           //DealError("Atom error");
2088
           throw InterpExc(QUOTE_EXPECTED);
2089
       prog++;
2090
       GetToken();
2091
       return;
2092
     }
2093
     if(*cToken==')')return;  //process empty expression
2094
     else if(*cToken==':'||*cToken==']'){
2095
         qDebug("end character");
2096
//         GetToken();
2097
         return;
2098
     }
2099
     else
2100
         throw InterpExc(SYNTAX);
2101
//         DealError("process empty expression");
2102
   default:
2103
//     throw InterpExc(SYNTAX);
2104
//     DealError("Atom default");
2105
                throw InterpExc(SYNTAX);
2106
 
2107
 }
2108
}
2109
 

powered by: WebSVN 2.1.0

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