%{ #include #include #undef YY_INPUT #ifndef YYWRAP # define YYWRAP int yywrap() {return 1;} #endif extern int PortType; extern int InitVal; extern int EdgeSymbol; extern int CSSymbol; extern int useUpperCase; #define YY_INPUT(buf,result,max_size) \ { \ int c = getChar(); \ result = (c == 0) ? YY_NULL : (buf[0] = c, 1); \ } #include "BeIf.h" #include "vsyn.h" #include "veriext.h" typedef struct StateData { int State; struct StateData *Prev,*Next; }StateData; static StateData *StateList=NULL,*LastState=NULL; void PushState(int State); int PopState(); static int MultiLineComment=0; static int CurrentState=INITIAL; void ChangeToState(int NewState); int GetCurrentState(); void BeginState(char *NewState); void LexFreeBuffer() { if (yy_current_buffer) { yy_delete_buffer(yy_current_buffer); } yy_current_buffer = 0; } %} %s MCOMMENT %s SCOMMENT %s IN_STRING %s SPECIFY_BLOCK %s CS_TABLE %s CONSTANT_ONLY %s INITIALU %s SPECIFY_BLOCKU %s IN_HIER NL \n WS [ \t\r\b\f] Digit [0-9] DigitU [0-9_] Letter [a-zA-Z] LetterU [a-zA-Z_] WordNum [0-9a-zA-Z] WordNumU [0-9a-zA-Z_] DWordNumU [$0-9a-zA-Z_] WSs {WS}+ Number {Digit}{DigitU}* Word {LetterU}{WordNumU}* DWord {LetterU}{DWordNumU}* Binary ({Number})?[ \t]*'[bB][ \t]*[01xXzZ?][01xXzZ?_]* Octal ({Number})?[ \t]*'[oO][ \t]*[0-7xXzZ?][0-7xXzZ?_]* Decimal ({Number})?[ \t]*'[dD][ \t]*{Number} Hexdecimal ({Number})?[ \t]*'[hH][ \t]*[0-9a-fA-FxXzZ?][0-9a-fA-FxXzZ?_]* Simpreal {Number}[.]({Number})? Real0 {Number}[eE][+-]?{Number} Real1 {Simpreal}[eE][+-]?{Simpreal} Real2 {Number}[eE][+-]?{Simpreal} Real3 {Simpreal}[eE][+-]?{Number} QoutedString \"[^"\n]*["{NL}] Comment "//"[^\n]*{NL} %% {NL} { } {WSs} { } "//" { PushState(GetCurrentState()); ChangeToState(SCOMMENT); } "/*" { PushState(GetCurrentState()); MultiLineComment++; ChangeToState(MCOMMENT); } /* * Symbols. */ /* Generic. */ "#" { ChangeToState(CONSTANT_ONLY); return '#'; } "@" { return '@'; } /* Unary. */ "+" { yylval.num = BEIF_EXPR_NODE_TYPE_UPLUS; return '+'; } "-" { yylval.num = BEIF_EXPR_NODE_TYPE_UMINUS; return '-'; } "!" { yylval.num = BEIF_EXPR_NODE_TYPE_ULNOT; return '!'; } "~" { yylval.num = BEIF_EXPR_NODE_TYPE_UBNOT; return '~'; } "&" { yylval.num = BEIF_EXPR_NODE_TYPE_URAND; return '&'; } "~&" { yylval.num = BEIF_EXPR_NODE_TYPE_UBNOT; return TILDEAMPER; } "|" { yylval.num = BEIF_EXPR_NODE_TYPE_UOR; return '|'; } "~|" { yylval.num = BEIF_EXPR_NODE_TYPE_URNAND; return TILDEVERTBAR; } "^" { yylval.num = BEIF_EXPR_NODE_TYPE_URXOR; return '^'; } "~^" { yylval.num = BEIF_EXPR_NODE_TYPE_UBEQU1; return TILDECARET; } "^~" { yylval.num = BEIF_EXPR_NODE_TYPE_UBEQU2; return CARETTILDE; } /* Binary. */ "*" { return '*'; } "/" { return '/'; } "%" { return '%'; } "==" { return EQUALEQUAL; } "!=" { return EXCLAMEQUAL; } "===" { return EQUALEQUALEQUAL; } "!==" { return EXCLAMEQUALEQUAL; } "&&" { return AMPERAMPER; } "||" { return VERTBARVERTBAR; } "<" { return '<'; } "<=" { return LESSEQUAL; } ">" { return '>'; } ">=" { return GREATEREQUAL; } ">>" { return GREATERGREATER; } "<<" { return LESSLESS; } "->" { return TRIGGER; } "(" { if (useUpperCase) { ChangeToState(INITIALU); } else { ChangeToState(INITIAL); } return '('; } /* Ternary. */ "?" { return '?'; } ":" { return ':'; } /* * Keywords. */ always | ALWAYS { return ALWAYSKW; } and | AND { return ANDKW; } assign | ASSIGN { return ASSIGNKW; } begin | BEGIN { return BEGINKW; } buf | BUF { return BUFKW; } bufif0 | BUFIF0 { return BUFIF0KW; } bufif1 | BUFIF1 { return BUFIF1KW; } case | CASE { return CASEKW; } casex | CASEX { return CASEXKW; } casez | CASEZ { return CASEZKW; } cmos | CMOS { return CMOSKW; } deassign | DEASSIGN { return DEASSIGNKW; } default | DEFAULT { return DEFAULTKW; } defparam | DEFPARAM { return DEFPARMKW; } disable | DISABLE { return DISABLEKW; } edge | EDGE { return EDGEKW; } else | ELSE { return ELSEKW; } end | END { return ENDKW; } endcase | ENDCASE { return ENDCASEKW; } endfunction | ENDFUNCTION { return ENDFUNCKW; } endmodule | ENDMODULE { return ENDMODKW; } endprimitive | ENDPRIMITIVE { return ENDPRIMKW; } endspecify | ENDSPECIFY { return ENDSPECIFYKW; } endtable | ENDTABLE { return ENDTABLEKW; } endtask | ENDTASK { return ENDTASKKW; } event | EVENT { yylval.num = BEIF_VAR_TYPE_EVENT; return EVENTKW; } for | FOR { return FORKW; } force | FORCE { return FORCEKW; } forever | FOREVER { return FOREVERKW; } fork | FORK { return FORKKW; } function | FUNCTION { return FUNCKW; } highz0 | HIGHZ0 { return HIGHZ0; } highz1 | HIGHZ1 { return HIGHZ1; } if | IF { return IFKW; } ifnone | IFNONE { return IFNONEKW; } initial | INITIAL { return INITKW; } inout | INOUT { PortType = BEIF_PORT_TYPE_INOUT; return INOUTKW; } input | INPUT { PortType = BEIF_PORT_TYPE_INPUT; return INPUTKW; } integer | INTEGER { yylval.num = BEIF_VAR_TYPE_INTEGER; return INTKW; } join | JOIN { return JOINKW; } large | LARGE { return LARGEKW; } macromodule | MACROMODULE { return MACMODKW; } medium | MEDIUM { return MEDIUMKW; } module | MODULE { return MODKW; } nand | NAND { return NANDKW; } negedge | NEGEDGE { return NEGEDGEKW; } nmos | NMOS { return NMOSKW; } nor | NOR { return NORKW; } not | NOT { return NOTKW; } notif0 | NOTIF0 { return NOTIF0KW; } notif1 | NOTIF1 { return NOTIF1KW; } or | OR { return ORKW; } output | OUTPUT { PortType = BEIF_PORT_TYPE_OUTPUT; return OUTPUTKW; } parameter | PARAMETER { return PARMKW; } pmos | PMOS { return PMOSKW; } posedge | POSEDGE { return POSEDGEKW; } primitive | PRIMITIVE { return PRIMKW; } pull0 | PULL0 { return PULL0; } pull1 | PULL1 { return PULL1; } pulldown | PULLDOWN { return PULLDOWNKW; } pullup | PULLUP { return PULLUPKW; } rcmos | RCMOS { return RCMOSKW; } real | REAL { yylval.num = BEIF_VAR_TYPE_REAL; return REALKW; } realtime | REALTIME { yylval.num = BEIF_VAR_TYPE_REALTIME; return REALTIMEKW; } reg | REG { yylval.num = BEIF_VAR_TYPE_REG; return REGKW; } release | RELEASE { return RELEASEKW; } repeat | REPEAT { return REPEATKW; } rnmos | RNMOS { return RNMOSKW; } rpmos | RPMOS { return RPMOSKW; } rtran | RTRAN { return RTRANKW; } rtranif0 | RTANIF0 { return RTRANIF0KW; } rtranif1 | RTRANIF1 { return RTRANIF1KW; } scalared | SCALARED { return SCALAREDKW; } small | SMALL { return SMALLKW; } specify | SPECIFY { if (useUpperCase) { ChangeToState(SPECIFY_BLOCKU); } else { ChangeToState(SPECIFY_BLOCK); } } endspecify | ENDSPECIFY { if (useUpperCase) { ChangeToState(INITIALU); } else { ChangeToState(INITIAL); } } "//" { if (useUpperCase) { PushState(SPECIFY_BLOCKU); } else { PushState(SPECIFY_BLOCK); } ChangeToState(SCOMMENT); } "/*" { if (useUpperCase) { PushState(SPECIFY_BLOCKU); } else { PushState(SPECIFY_BLOCK); } MultiLineComment++; ChangeToState(MCOMMENT); } \" { if (useUpperCase) { PushState(SPECIFY_BLOCKU); } else { PushState(SPECIFY_BLOCK); } ChangeToState(IN_STRING); } [ \t\n] { } . { } "*/" { if(!(--MultiLineComment)) { ChangeToState(PopState()); } } . { } .*\n { ChangeToState(PopState()); } specparam | SPECPARAM { return SPECPARMKW; } strong0 | STRONG0 { return STRONG0KW; } strong1 | STRONG1 { return STRONG1KW; } supply0 | SUPPLY0 { return SUPPLY0KW; } supply1 | SUPPLY1 { return SUPPLY1KW; } table | TABLE { return TABLEKW; } task | TASK { return TASKKW; } time | TIME { yylval.num = BEIF_VAR_TYPE_TIME; return TIMEKW; } tran | TRAN { return TRANKW; } tranif0 | TRANIF0 { return TRANIF0KW; } tranif1 | TRANIF1 { return TRANIF1KW; } tri | TRI { return TRIKW; } tri0 | TRI0 { return TRI0KW; } tri1 | TRI1 { return TRI1KW; } triand | TRIAND { return TRIANDKW; } trior | TRIOR { return TRIORKW; } trireg | TRIREG { return TRIREGKW; } vectored | VECTORED { return VECTOREDKW; } wait | WAIT { return WAITKW; } wand | WAND { return WANDKW; } weak0 | WEAK0 { return WEAK0; } weak1 | WEAK1 { return WEAK1; } wor | WOR { return WORKW; } while | WHILE { return WHILEKW; } wire | WIRE { return WIREKW; } xnor | XNOR { return XNORKW; } xor | XOR { return XORKW; } /* * Others. */ <> { return YYENDOFFILE; } [01] { CpyString(yytext); if (useUpperCase) { ChangeToState(INITIALU); } else { ChangeToState(INITIAL); } return (InitVal ? INIT_VAL : CONST); } 1'[bB][ \t]*[01xX] { CpyString(yytext); return (InitVal ? INIT_VAL : BINNUMBER); } \${DWord} { CpyString(yytext); HierNameFlag=0; if (useUpperCase) { ChangeToState(INITIALU); } else { ChangeToState(INITIAL); } return SYSIDENT; } {Binary} { CpyString(yytext); return BINNUMBER; } {Octal} { CpyString(yytext); return OCTNUMBER; } {Decimal} { CpyString(yytext); return DECNUMBER; } {Hexdecimal} { CpyString(yytext); return HEXNUMBER; } {Number} { CpyString(yytext); if (useUpperCase) { ChangeToState(INITIALU); } else { ChangeToState(INITIAL); } return CONST; } {Simpreal} { CpyString(yytext); if (useUpperCase) { ChangeToState(INITIALU); } else { ChangeToState(INITIAL); } return REALNUMBER; } {Real0} { CpyString(yytext); if (useUpperCase) { ChangeToState(INITIALU); } else { ChangeToState(INITIAL); } return REALNUMBER; } {Real1} { CpyString(yytext); if (useUpperCase) { ChangeToState(INITIALU); } else { ChangeToState(INITIAL); } return REALNUMBER; } {Real2} { CpyString(yytext); if (useUpperCase) { ChangeToState(INITIALU); } else { ChangeToState(INITIAL); } return REALNUMBER; } {Real3} { CpyString(yytext); if (useUpperCase) { ChangeToState(INITIALU); } else { ChangeToState(INITIAL); } return REALNUMBER; } [ \t\n] /* This causes problems for #d where d is an IDENT . { return yytext[0];} */ \" { if (useUpperCase) { PushState(INITIALU); } else { PushState(INITIAL); } ChangeToState(IN_STRING); } \\. { yymore(); } \" { int State=PopState(); ChangeToState(State); if((State == INITIAL) || (State == INITIALU)) { CpyString1(yytext); return STRING; } } {NL} { char TmpStr[200]; BeIfRegisterError("Unterminated string",(char *)NULL); yymore(); } . { yymore(); } {DWord} { CpyString(yytext); if (useUpperCase) { ChangeToState(INITIALU); } else { ChangeToState(INITIAL); } HierNameFlag=0; return IDENT; } /* {Word}([ ]*\.[ ]*{Word})+ { CpyString(yytext); if (useUpperCase) { ChangeToState(INITIALU); } else { ChangeToState(INITIAL); } HierNameFlag=1; return IDENT; } */ \\[^ \t\n]+[ \t]* { CpyEscapedString(yytext); if (useUpperCase) { ChangeToState(INITIALU); } else { ChangeToState(INITIAL); } return IDENT; } ({Word}|\\[^ \t\n]+)[ \t]*\.[ \t]* { ChangeToState(IN_HIER); HierNameFlag = 1; yymore(); } ({Word}|\\[^ \t\n]+)[ \t]*\.[ \t]* { yymore(); } {Word}|\\[^ \t\n]+ { if (useUpperCase) { ChangeToState(INITIALU); } else { ChangeToState(INITIAL); } CpyString(yytext); return IDENT; } [bBxX01?] { return CS_SYMBOL; } [rRfFpPnN*] { return EDGE_SYMBOL; } \n { } . { return(yytext[0]); } %% int reset_lex(yyin) FILE *yyin; { yyrestart(yyin); return 0; } #define STRING_BUF_SIZE 16384 static char StringBuf[STRING_BUF_SIZE]; static char *StrPtr=&StringBuf[0]; static char *EndStr=&StringBuf[STRING_BUF_SIZE-1]; void InitLexer() { StrPtr=&StringBuf[0]; EndStr=&StringBuf[STRING_BUF_SIZE-1]; StateList=NULL; LastState=NULL; MultiLineComment=0; if (useUpperCase) { CurrentState=INITIALU; ChangeToState(INITIALU); } else { CurrentState=INITIAL; ChangeToState(INITIAL); } yy_init = 1; yy_c_buf_p = (char *) 0; } void CpyString1(char *str) { int i; int NotEnoughRoom; char *OrigStrPtr; NotEnoughRoom = 0; if (StrPtr >= EndStr) { StrPtr = &StringBuf[0]; } OrigStrPtr = StrPtr; *StrPtr = '\"'; StrPtr++; for (i=0; str[i] != '\0'; i++) { *StrPtr = str[i]; StrPtr++; if (StrPtr >= EndStr) { NotEnoughRoom = 1; break; } } if (NotEnoughRoom) { StrPtr = &StringBuf[0]; OrigStrPtr = StrPtr; for (i=0; str[i] != '\0'; i++) { *StrPtr = str[i]; StrPtr++; } } *StrPtr = '\0'; StrPtr++; yylval.string = OrigStrPtr; } void CpyString(char *str) { int i; int NotEnoughRoom; char *OrigStrPtr; NotEnoughRoom = 0; if (StrPtr >= EndStr) { StrPtr = &StringBuf[0]; } OrigStrPtr = StrPtr; for (i=0; str[i] != '\0'; i++) { *StrPtr = str[i]; StrPtr++; if (StrPtr >= EndStr) { NotEnoughRoom = 1; break; } } if (NotEnoughRoom) { StrPtr = &StringBuf[0]; OrigStrPtr = StrPtr; for (i=0; str[i] != '\0'; i++) { *StrPtr = str[i]; StrPtr++; } } *StrPtr = '\0'; StrPtr++; yylval.string = OrigStrPtr; } void CpyEscapedString(char *str) { int i, last; int NotEnoughRoom; char *OrigStrPtr; char *newStr, *cPtr; int flag=0; last = strlen(str)-1; NotEnoughRoom = 0; if (StrPtr >= EndStr) { StrPtr = &StringBuf[0]; } #ifdef RLDEBUG printf("escaped name Ident - \"%s\"\n", str); #endif last = strlen(str)-1; OrigStrPtr = StrPtr; if (str[last] == ']') { for (i=last-1; i >= 0; i--) { if (str[i] == '[') { flag = 1; break; } } } else if (str[last] == ' ' && last-1 >= 0 && str[last-1] == ']') { for (i=last-2; i >= 0; i--) { if (str[i] == '[') { flag = 1; break; } } } else if (strlen(str) >= 3 && str[last] == '}' && str[1] == '{') { flag = 1; } else if (strlen(str) >= 4 && str[last] == ' ' && str[last-1] == '}' && str[1] == '{') { flag = 1; } else if (index(str, '.')) { flag = 1; } if (!flag) { for (i=1; str[i] != '\0'; i++) { if (!(i == last && str[last] == ' ')) { *StrPtr = str[i]; StrPtr++; if (StrPtr >= EndStr) { NotEnoughRoom = 1; break; } } } if (NotEnoughRoom) { StrPtr = &StringBuf[0]; OrigStrPtr = StrPtr; for (i=1; str[i] != '\0'; i++) { if (!(i == last && str[last] == ' ')) { *StrPtr = str[i]; StrPtr++; } } } } else { for (i=0; str[i] != '\0'; i++) { if (!(i == last && str[last] == ' ')) { *StrPtr = str[i]; StrPtr++; if (StrPtr >= EndStr) { NotEnoughRoom = 1; break; } } } if (NotEnoughRoom) { StrPtr = &StringBuf[0]; OrigStrPtr = StrPtr; for (i=0; str[i] != '\0'; i++) { if (!(i == last && str[last] == ' ')) { *StrPtr = str[i]; StrPtr++; } } } *StrPtr = str[0]; StrPtr++; } *StrPtr = '\0'; StrPtr++; yylval.string = OrigStrPtr; #ifdef RLDEBUG printf("OrigStrPtr - \"%s\"\n", OrigStrPtr); #endif } void PushState(int State) { register StateData *Tmp; Tmp=(StateData *)malloc(sizeof(StateData)); Tmp->State=State; Tmp->Next=NULL; if(LastState == NULL) { LastState=StateList=Tmp; Tmp->Prev=NULL; } else { Tmp->Prev=LastState; LastState=LastState->Next=Tmp; } } int PopState() { int State; register StateData *Tmp; State=LastState->State; Tmp=LastState->Prev; if(Tmp) Tmp->Next=NULL; else { free(LastState); LastState=Tmp; } return State; } void ChangeToState(int NewState) { CurrentState=NewState; BEGIN NewState; } void BeginState(char *NewState) { if(NewState == NULL) return; if(strcmp(NewState,"INITIAL") == 0) { ChangeToState(INITIAL); return; } if(strcmp(NewState,"INITIALU") == 0) { ChangeToState(INITIALU); return; } if(strcmp(NewState,"CS_TABLE") == 0) { ChangeToState(CS_TABLE); return; } } int GetCurrentState() { return CurrentState; } void LexPrintState() { int state; state = (yy_start - 1) / 2; switch (state) { case MCOMMENT: printf("Lex State is MCOMMENT\n"); break; case SCOMMENT: printf("Lex State is SCOMMENT\n"); break; case IN_STRING: printf("Lex State is IN_STRING\n"); break; case SPECIFY_BLOCK: printf("Lex State is SPECIFY_BLOCK\n"); break; case CS_TABLE: printf("Lex State is CS_TABLE\n"); break; case CONSTANT_ONLY: printf("Lex State is CONSTANT_ONLY\n"); break; case INITIALU: printf("Lex State is INITIALU\n"); break; case SPECIFY_BLOCKU: printf("Lex State is SPECIFY_BLOCKU\n"); break; } }