Standardize flex->bison token names. No functional change.
git-svn-id: file://localhost/svn/verilator/trunk/verilator@920 77ca24e4-aefa-0310-84f0-b9a241c72d87
This commit is contained in:
parent
6f414ee9e2
commit
a77e331e89
118
src/verilog.l
118
src/verilog.l
|
@ -130,30 +130,30 @@ escid \\[^ \t\f\r\n]+
|
|||
"$fdisplay" {yylval.fileline = CRELINE(); return yD_FDISPLAY;}
|
||||
"$finish" {yylval.fileline = CRELINE(); return yD_FINISH;}
|
||||
"$fopen" {yylval.fileline = CRELINE(); return yD_FOPEN;}
|
||||
"$fullskew" {yylval.fileline = CRELINE(); return yTIMINGSPEC;}
|
||||
"$fullskew" {yylval.fileline = CRELINE(); return yaTIMINGSPEC;}
|
||||
"$fwrite" {yylval.fileline = CRELINE(); return yD_FWRITE;}
|
||||
"$hold" {yylval.fileline = CRELINE(); return yTIMINGSPEC;}
|
||||
"$nochange" {yylval.fileline = CRELINE(); return yTIMINGSPEC;}
|
||||
"$period" {yylval.fileline = CRELINE(); return yTIMINGSPEC;}
|
||||
"$hold" {yylval.fileline = CRELINE(); return yaTIMINGSPEC;}
|
||||
"$nochange" {yylval.fileline = CRELINE(); return yaTIMINGSPEC;}
|
||||
"$period" {yylval.fileline = CRELINE(); return yaTIMINGSPEC;}
|
||||
"$readmemb" {yylval.fileline = CRELINE(); return yD_READMEMB;}
|
||||
"$readmemh" {yylval.fileline = CRELINE(); return yD_READMEMH;}
|
||||
"$realtime" {yylval.fileline = CRELINE(); return yD_TIME;}
|
||||
"$recovery" {yylval.fileline = CRELINE(); return yTIMINGSPEC;}
|
||||
"$recrem" {yylval.fileline = CRELINE(); return yTIMINGSPEC;}
|
||||
"$removal" {yylval.fileline = CRELINE(); return yTIMINGSPEC;}
|
||||
"$setup" {yylval.fileline = CRELINE(); return yTIMINGSPEC;}
|
||||
"$setuphold" {yylval.fileline = CRELINE(); return yTIMINGSPEC;}
|
||||
"$skew" {yylval.fileline = CRELINE(); return yTIMINGSPEC;}
|
||||
"$recovery" {yylval.fileline = CRELINE(); return yaTIMINGSPEC;}
|
||||
"$recrem" {yylval.fileline = CRELINE(); return yaTIMINGSPEC;}
|
||||
"$removal" {yylval.fileline = CRELINE(); return yaTIMINGSPEC;}
|
||||
"$setup" {yylval.fileline = CRELINE(); return yaTIMINGSPEC;}
|
||||
"$setuphold" {yylval.fileline = CRELINE(); return yaTIMINGSPEC;}
|
||||
"$skew" {yylval.fileline = CRELINE(); return yaTIMINGSPEC;}
|
||||
"$stop" {yylval.fileline = CRELINE(); return yD_STOP;}
|
||||
"$time" {yylval.fileline = CRELINE(); return yD_TIME;}
|
||||
"$timeskew" {yylval.fileline = CRELINE(); return yTIMINGSPEC;}
|
||||
"$width" {yylval.fileline = CRELINE(); return yTIMINGSPEC;}
|
||||
"$timeskew" {yylval.fileline = CRELINE(); return yaTIMINGSPEC;}
|
||||
"$width" {yylval.fileline = CRELINE(); return yaTIMINGSPEC;}
|
||||
"$write" {yylval.fileline = CRELINE(); return yD_WRITE;}
|
||||
/* Keywords */
|
||||
"always" {yylval.fileline = CRELINE(); return yALWAYS;}
|
||||
"and" {yylval.fileline = CRELINE(); return yAND;}
|
||||
"assign" {yylval.fileline = CRELINE(); return yASSIGN;}
|
||||
"begin" {yylval.fileline = CRELINE(); return yBBEGIN;}
|
||||
"begin" {yylval.fileline = CRELINE(); return yBEGIN;}
|
||||
"buf" {yylval.fileline = CRELINE(); return yBUF;}
|
||||
"case" {yylval.fileline = CRELINE(); return yCASE;}
|
||||
"casex" {yylval.fileline = CRELINE(); return yCASEX;}
|
||||
|
@ -161,7 +161,7 @@ escid \\[^ \t\f\r\n]+
|
|||
"default" {yylval.fileline = CRELINE(); return yDEFAULT;}
|
||||
"defparam" {yylval.fileline = CRELINE(); return yDEFPARAM;}
|
||||
"else" {yylval.fileline = CRELINE(); return yELSE;}
|
||||
"end" {yylval.fileline = CRELINE(); return yBEND;}
|
||||
"end" {yylval.fileline = CRELINE(); return yEND;}
|
||||
"endcase" {yylval.fileline = CRELINE(); return yENDCASE;}
|
||||
"endfunction" {yylval.fileline = CRELINE(); return yENDFUNCTION;}
|
||||
"endmodule" {yylval.fileline = CRELINE(); return yENDMODULE;}
|
||||
|
@ -187,7 +187,7 @@ escid \\[^ \t\f\r\n]+
|
|||
"reg" {yylval.fileline = CRELINE(); return yREG;}
|
||||
"scalared" {yylval.fileline = CRELINE(); return ySCALARED;}
|
||||
"specify" {yylval.fileline = CRELINE(); return ySPECIFY;}
|
||||
"specparam" {yylval.fileline = CRELINE(); return yTIMINGSPEC;}
|
||||
"specparam" {yylval.fileline = CRELINE(); return yaTIMINGSPEC;}
|
||||
"supply0" {yylval.fileline = CRELINE(); return ySUPPLY0;}
|
||||
"supply1" {yylval.fileline = CRELINE(); return ySUPPLY1;}
|
||||
"task" {yylval.fileline = CRELINE(); return yTASK;}
|
||||
|
@ -552,45 +552,45 @@ escid \\[^ \t\f\r\n]+
|
|||
|
||||
/* Verilog 1995 Operators */
|
||||
<V95,V01,V05,S05,PSL>{
|
||||
"&&" {yylval.fileline = CRELINE(); return yANDAND;}
|
||||
"||" {yylval.fileline = CRELINE(); return yOROR;}
|
||||
"<=" {yylval.fileline = CRELINE(); return yLTE;}
|
||||
">=" {yylval.fileline = CRELINE(); return yGTE;}
|
||||
"<<" {yylval.fileline = CRELINE(); return ySLEFT;}
|
||||
">>" {yylval.fileline = CRELINE(); return ySRIGHT;}
|
||||
"==" {yylval.fileline = CRELINE(); return yEQUAL;}
|
||||
"!=" {yylval.fileline = CRELINE(); return yNOTEQUAL;}
|
||||
"===" {yylval.fileline = CRELINE(); return yCASEEQUAL;}
|
||||
"!==" {yylval.fileline = CRELINE(); return yCASENOTEQUAL;}
|
||||
"^~" {yylval.fileline = CRELINE(); return yOP_XNOR;}
|
||||
"~^" {yylval.fileline = CRELINE(); return yOP_XNOR;}
|
||||
"~&" {yylval.fileline = CRELINE(); return yOP_NAND;}
|
||||
"~|" {yylval.fileline = CRELINE(); return yOP_NOR;}
|
||||
"&&" {yylval.fileline = CRELINE(); return yP_ANDAND;}
|
||||
"||" {yylval.fileline = CRELINE(); return yP_OROR;}
|
||||
"<=" {yylval.fileline = CRELINE(); return yP_LTE;}
|
||||
">=" {yylval.fileline = CRELINE(); return yP_GTE;}
|
||||
"<<" {yylval.fileline = CRELINE(); return yP_SLEFT;}
|
||||
">>" {yylval.fileline = CRELINE(); return yP_SRIGHT;}
|
||||
"==" {yylval.fileline = CRELINE(); return yP_EQUAL;}
|
||||
"!=" {yylval.fileline = CRELINE(); return yP_NOTEQUAL;}
|
||||
"===" {yylval.fileline = CRELINE(); return yP_CASEEQUAL;}
|
||||
"!==" {yylval.fileline = CRELINE(); return yP_CASENOTEQUAL;}
|
||||
"^~" {yylval.fileline = CRELINE(); return yP_XNOR;}
|
||||
"~^" {yylval.fileline = CRELINE(); return yP_XNOR;}
|
||||
"~&" {yylval.fileline = CRELINE(); return yP_NAND;}
|
||||
"~|" {yylval.fileline = CRELINE(); return yP_NOR;}
|
||||
}
|
||||
|
||||
/* Verilog 2001 Operators */
|
||||
<V01,V05,S05,PSL>{
|
||||
"<<<" {yylval.fileline = CRELINE(); return ySLEFT;}
|
||||
">>>" {yylval.fileline = CRELINE(); return ySSRIGHT;}
|
||||
"**" {yylval.fileline = CRELINE(); return yPOW;}
|
||||
"+:" {yylval.fileline = CRELINE(); return yPLUSCOLON;}
|
||||
"-:" {yylval.fileline = CRELINE(); return yMINUSCOLON;}
|
||||
"<<<" {yylval.fileline = CRELINE(); return yP_SLEFT;}
|
||||
">>>" {yylval.fileline = CRELINE(); return yP_SSRIGHT;}
|
||||
"**" {yylval.fileline = CRELINE(); return yP_POW;}
|
||||
"+:" {yylval.fileline = CRELINE(); return yP_PLUSCOLON;}
|
||||
"-:" {yylval.fileline = CRELINE(); return yP_MINUSCOLON;}
|
||||
}
|
||||
|
||||
/* PSL Operators */
|
||||
<PSL>{
|
||||
"{" {yylval.fileline = CRELINE(); return yPSL_BRA;} // Avoid parser hitting concatenate.
|
||||
"}" {yylval.fileline = CRELINE(); return yPSL_KET;} // Avoid parser hitting concatenate.
|
||||
"->" {yylval.fileline = CRELINE(); return yOP_LOGIF;}
|
||||
"->" {yylval.fileline = CRELINE(); return yP_LOGIF;}
|
||||
"<->" {yyerrorf("Unsupported: PSL operator not implemented: %s",yytext);} //Unsup in other tools
|
||||
"[*" {yyerrorf("Unsupported: PSL operator not implemented: %s",yytext);} // yBRA_STAR
|
||||
"[*]" {yyerrorf("Unsupported: PSL operator not implemented: %s",yytext);} // yBRA_STAR_KET
|
||||
"[+]" {yyerrorf("Unsupported: PSL operator not implemented: %s",yytext);} // yBRA_PLUS_KET
|
||||
"[->" {yyerrorf("Unsupported: PSL operator not implemented: %s",yytext);} // yBRA_MINUS_GT
|
||||
"[->]" {yyerrorf("Unsupported: PSL operator not implemented: %s",yytext);} // yBRA_MINUS_GT_KET
|
||||
"[=" {yyerrorf("Unsupported: PSL operator not implemented: %s",yytext);} // yBRA_EQ
|
||||
"|->" {yyerrorf("Unsupported: PSL operator not implemented: %s",yytext);} // yOR_MINUS_GT
|
||||
"|=>" {yyerrorf("Unsupported: PSL operator not implemented: %s",yytext);} // yOR_EQ_GT
|
||||
"[*" {yyerrorf("Unsupported: PSL operator not implemented: %s",yytext);} // yP_BRA_STAR
|
||||
"[*]" {yyerrorf("Unsupported: PSL operator not implemented: %s",yytext);} // yP_BRA_STAR_KET
|
||||
"[+]" {yyerrorf("Unsupported: PSL operator not implemented: %s",yytext);} // yP_BRA_PLUS_KET
|
||||
"[->" {yyerrorf("Unsupported: PSL operator not implemented: %s",yytext);} // yP_BRA_MINUS_GT
|
||||
"[->]" {yyerrorf("Unsupported: PSL operator not implemented: %s",yytext);} // yP_BRA_MINUS_GT_KET
|
||||
"[=" {yyerrorf("Unsupported: PSL operator not implemented: %s",yytext);} // yP_BRA_EQ
|
||||
"|->" {yyerrorf("Unsupported: PSL operator not implemented: %s",yytext);} // yP_OR_MINUS_GT
|
||||
"|=>" {yyerrorf("Unsupported: PSL operator not implemented: %s",yytext);} // yP_OR_EQ_GT
|
||||
}
|
||||
|
||||
/* Identifiers and numbers */
|
||||
|
@ -604,41 +604,41 @@ escid \\[^ \t\f\r\n]+
|
|||
} else {
|
||||
yylval.strp = V3Read::newString(yytext); // Need _ as "6..." isn't legal ID
|
||||
}
|
||||
return yID;
|
||||
return yaID;
|
||||
}
|
||||
|
||||
{id} { yylval.strp = V3Read::newString(yytext);
|
||||
return yID;
|
||||
return yaID;
|
||||
}
|
||||
|
||||
\"[^\"\\]*\" { yylval.strp = V3Read::newString(yytext+1,yyleng-2);
|
||||
return ySTRING;
|
||||
return yaSTRING;
|
||||
}
|
||||
\" { yy_push_state(STRING); yymore(); }
|
||||
|
||||
|
||||
[0-9]*?['']s?[bcodhBCODH][ \t]*[A-Fa-f0-9xXzZ_?]* {
|
||||
yylval.nump = V3Read::newNumber(V3Read::fileline(),(char*)yytext);
|
||||
return yINTNUM;
|
||||
return yaINTNUM;
|
||||
}
|
||||
[0-9]*?['']s?[01xXzZ] { /* SystemVerilog */
|
||||
yylval.nump = V3Read::newNumber(V3Read::fileline(),(char*)yytext);
|
||||
return yINTNUM;
|
||||
return yaINTNUM;
|
||||
}
|
||||
[0-9]+[_0-9]*[ \t]*['']s?[bcodhBCODH]?[ \t]*[A-Fa-f0-9xXzZ_?]* {
|
||||
yylval.nump = V3Read::newNumber(V3Read::fileline(),(char*)yytext);
|
||||
return yINTNUM;
|
||||
return yaINTNUM;
|
||||
}
|
||||
[0-9]* { yylval.nump = V3Read::newNumber(V3Read::fileline(),(char*)yytext);
|
||||
return yINTNUM;
|
||||
return yaINTNUM;
|
||||
}
|
||||
[-+]?[0-9]+(\.[0-9]+)([eE][-+]?[0-9]+)? {
|
||||
yylval.cdouble = 0; /* Only for delays, not used yet */
|
||||
return yFLOATNUM;
|
||||
return yaFLOATNUM;
|
||||
}
|
||||
[-+]?[0-9]+(\.[0-9]+)?([eE][-+]?[0-9]+) {
|
||||
yylval.cdouble = 0; /* Only for delays, not used yet */
|
||||
return yFLOATNUM;
|
||||
return yaFLOATNUM;
|
||||
}
|
||||
|
||||
"`timescale"{ws}+[^\n]* {}
|
||||
|
@ -653,7 +653,7 @@ escid \\[^ \t\f\r\n]+
|
|||
<STRING>\\. { yymore(); }
|
||||
<STRING>\" { yy_pop_state();
|
||||
yylval.strp = V3Read::newString(yytext+1,yyleng-2);
|
||||
return ySTRING; }
|
||||
return yaSTRING; }
|
||||
|
||||
/************************************************************************/
|
||||
/* Common for all SYSC header states */
|
||||
|
@ -678,12 +678,12 @@ escid \\[^ \t\f\r\n]+
|
|||
"`line"[ \t][^\n]*\n {V3Read::ppline(yytext);}
|
||||
}
|
||||
|
||||
<SYSCHDR>[ \t]*[^` \t\n][^\n]*\n { NEXTLINE(); yylval.strp = V3Read::newString(yytext); return ySCHDR;}
|
||||
<SYSCINT>[ \t]*[^` \t\n][^\n]*\n { NEXTLINE(); yylval.strp = V3Read::newString(yytext); return ySCINT;}
|
||||
<SYSCIMP>[ \t]*[^` \t\n][^\n]*\n { NEXTLINE(); yylval.strp = V3Read::newString(yytext); return ySCIMP;}
|
||||
<SYSCIMPH>[ \t]*[^` \t\n][^\n]*\n { NEXTLINE(); yylval.strp = V3Read::newString(yytext); return ySCIMPH;}
|
||||
<SYSCCTOR>[ \t]*[^` \t\n][^\n]*\n { NEXTLINE(); yylval.strp = V3Read::newString(yytext); return ySCCTOR;}
|
||||
<SYSCDTOR>[ \t]*[^` \t\n][^\n]*\n { NEXTLINE(); yylval.strp = V3Read::newString(yytext); return ySCDTOR;}
|
||||
<SYSCHDR>[ \t]*[^` \t\n][^\n]*\n { NEXTLINE(); yylval.strp = V3Read::newString(yytext); return yaSCHDR;}
|
||||
<SYSCINT>[ \t]*[^` \t\n][^\n]*\n { NEXTLINE(); yylval.strp = V3Read::newString(yytext); return yaSCINT;}
|
||||
<SYSCIMP>[ \t]*[^` \t\n][^\n]*\n { NEXTLINE(); yylval.strp = V3Read::newString(yytext); return yaSCIMP;}
|
||||
<SYSCIMPH>[ \t]*[^` \t\n][^\n]*\n { NEXTLINE(); yylval.strp = V3Read::newString(yytext); return yaSCIMPH;}
|
||||
<SYSCCTOR>[ \t]*[^` \t\n][^\n]*\n { NEXTLINE(); yylval.strp = V3Read::newString(yytext); return yaSCCTOR;}
|
||||
<SYSCDTOR>[ \t]*[^` \t\n][^\n]*\n { NEXTLINE(); yylval.strp = V3Read::newString(yytext); return yaSCDTOR;}
|
||||
<IGNORE>[ \t]*[^` \t\n][^\n]*\n { NEXTLINE(); }
|
||||
|
||||
/* Pick up text-type data */
|
||||
|
|
359
src/verilog.y
359
src/verilog.y
|
@ -63,7 +63,7 @@ public:
|
|||
static AstText* createTextQuoted(FileLine* fileline, string text);
|
||||
static AstDisplay* createDisplayError(FileLine* fileline) {
|
||||
AstDisplay* nodep = new AstDisplay(fileline,AstDisplayType::ERROR, "", NULL,NULL);
|
||||
nodep->addNext(new AstStop(fileline));
|
||||
nodep->addNext(new AstStop(fileline));
|
||||
return nodep;
|
||||
}
|
||||
static string deQuote(FileLine* fileline, string text);
|
||||
|
@ -124,31 +124,83 @@ class AstSenTree;
|
|||
AstVarRef* varrefp;
|
||||
}
|
||||
|
||||
%token<nump> yINTNUM
|
||||
%token<cdouble> yFLOATNUM
|
||||
%token<strp> yID ySTRING
|
||||
%token<strp> ySCHDR ySCINT ySCIMP ySCIMPH ySCCTOR ySCDTOR
|
||||
%token<fileline> yMODULE yENDMODULE yALWAYS yINITIAL yPOSEDGE yNEGEDGE yBBEGIN yBEND yOR
|
||||
%token<fileline> yINPUT yOUTPUT yINOUT yWIRE yTRI yREG yPARAM yLOCALPARAM yDEFPARAM
|
||||
%token<fileline> yFUNCTION yENDFUNCTION yTASK yENDTASK
|
||||
%token<fileline> yGENVAR yGENERATE yENDGENERATE
|
||||
%token<fileline> ySPECIFY yENDSPECIFY yTIMINGSPEC
|
||||
%token<fileline> yCASE yCASEX yCASEZ yDEFAULT yENDCASE yIF yELSE
|
||||
%token<fileline> yASSIGN yINTEGER yFOR ySUPPLY0 ySUPPLY1 ySIGNED yUNSIGNED
|
||||
%token<fileline> yBUF yNOT yAND yNAND yNOR yXOR yXNOR
|
||||
%token<fileline> ySCALARED yVECTORED
|
||||
// Generic lexer tokens, for example a number
|
||||
%token<cdouble> yaFLOATNUM "FLOATING-POINT NUMBER"
|
||||
%token<fileline> yaTIMINGSPEC "TIMING SPEC ELEMENT"
|
||||
%token<nump> yaINTNUM "INTEGER NUMBER"
|
||||
%token<strp> yaID "IDENTIFIER"
|
||||
%token<strp> yaSTRING "STRING"
|
||||
|
||||
%token<strp> yaSCHDR "`systemc_header BLOCK"
|
||||
%token<strp> yaSCINT "`systemc_ctor BLOCK"
|
||||
%token<strp> yaSCIMP "`systemc_dtor BLOCK"
|
||||
%token<strp> yaSCIMPH "`systemc_interface BLOCK"
|
||||
%token<strp> yaSCCTOR "`systemc_implementation BLOCK"
|
||||
%token<strp> yaSCDTOR "`systemc_imp_header BLOCK"
|
||||
|
||||
// Specific keywords
|
||||
// yKEYWORD means match "keyword"
|
||||
// Other cases are yXX_KEYWORD where XX makes it unique,
|
||||
// for example yP_ for punctuation based operators.
|
||||
%token<fileline> yALWAYS "always"
|
||||
%token<fileline> yAND "and"
|
||||
%token<fileline> yASSERT "assert"
|
||||
%token<fileline> yASSIGN "assign"
|
||||
%token<fileline> yBEGIN "begin"
|
||||
%token<fileline> yBUF "buf"
|
||||
%token<fileline> yCASE "case"
|
||||
%token<fileline> yCASEX "casex"
|
||||
%token<fileline> yCASEZ "casez"
|
||||
%token<fileline> yCLOCK "clock"
|
||||
%token<fileline> yCOVER "cover"
|
||||
%token<fileline> yDEFAULT "default"
|
||||
%token<fileline> yDEFPARAM "defparam"
|
||||
%token<fileline> yDO "do"
|
||||
%token<fileline> yELSE "else"
|
||||
%token<fileline> yEND "bend"
|
||||
%token<fileline> yENDCASE "endcase"
|
||||
%token<fileline> yENDFUNCTION "endfunction"
|
||||
%token<fileline> yENDGENERATE "endgenerate"
|
||||
%token<fileline> yENDMODULE "endmodule"
|
||||
%token<fileline> yENDSPECIFY "endspecify"
|
||||
%token<fileline> yENDTASK "endtask"
|
||||
%token<fileline> yFINAL "final"
|
||||
%token<fileline> yFOR "for"
|
||||
%token<fileline> yFUNCTION "function"
|
||||
%token<fileline> yGENERATE "generate"
|
||||
%token<fileline> yGENVAR "genvar"
|
||||
%token<fileline> yIF "if"
|
||||
%token<fileline> yINITIAL "initial"
|
||||
%token<fileline> yINOUT "inout"
|
||||
%token<fileline> yINPUT "input"
|
||||
%token<fileline> yINTEGER "integer"
|
||||
%token<fileline> yLOCALPARAM "localparam"
|
||||
%token<fileline> yMODULE "module"
|
||||
%token<fileline> yNAND "nand"
|
||||
%token<fileline> yNEGEDGE "negedge"
|
||||
%token<fileline> yNOR "nor"
|
||||
%token<fileline> yNOT "not"
|
||||
%token<fileline> yOR "or"
|
||||
%token<fileline> yOUTPUT "output"
|
||||
%token<fileline> yPARAM "param"
|
||||
%token<fileline> yPOSEDGE "posedge"
|
||||
%token<fileline> yPSL "psl"
|
||||
%token<fileline> yREG "reg"
|
||||
%token<fileline> yREPORT "report"
|
||||
%token<fileline> ySCALARED "scalared"
|
||||
%token<fileline> ySIGNED "signed"
|
||||
%token<fileline> ySPECIFY "specify"
|
||||
%token<fileline> ySUPPLY0 "supply0"
|
||||
%token<fileline> ySUPPLY1 "supply1"
|
||||
%token<fileline> yTASK "task"
|
||||
%token<fileline> yTRI "tri"
|
||||
%token<fileline> yTRUE "true"
|
||||
%token<fileline> yUNSIGNED "unsigned"
|
||||
%token<fileline> yVECTORED "vectored"
|
||||
%token<fileline> yWHILE "while"
|
||||
|
||||
%token<fileline> yPSL_ASSERT "PSL assert"
|
||||
%token<fileline> yWIRE "wire"
|
||||
%token<fileline> yXNOR "xnor"
|
||||
%token<fileline> yXOR "xor"
|
||||
|
||||
%token<fileline> yD_BITS "$bits"
|
||||
%token<fileline> yD_C "$c"
|
||||
|
@ -174,56 +226,58 @@ class AstSenTree;
|
|||
%token<fileline> yD_WARNING "$warning"
|
||||
%token<fileline> yD_WRITE "$write"
|
||||
|
||||
%token<fileline> yPSL_ASSERT "PSL assert"
|
||||
|
||||
%token<fileline> yVL_CLOCK "/*verilator sc_clock*/"
|
||||
%token<fileline> yVL_CLOCK_ENABLE "/*verilator clock_enable*/"
|
||||
%token<fileline> yVL_COVER_OFF "/*verilator coverage_block_off*/"
|
||||
%token<fileline> yVL_FULL_CASE "/*verilator full_case*/"
|
||||
%token<fileline> yVL_INLINE_MODULE "/*verilator inline_module*/"
|
||||
%token<fileline> yVL_ISOLATE_ASSIGNMENTS "/*verilator isolate_assignments*/"
|
||||
%token<fileline> yVL_NO_INLINE_MODULE "/*verilator no_inline_module*/"
|
||||
%token<fileline> yVL_NO_INLINE_TASK "/*verilator no_inline_task*/"
|
||||
%token<fileline> yVL_PARALLEL_CASE "/*verilator parallel_case*/"
|
||||
%token<fileline> yVL_PUBLIC "/*verilator public*/"
|
||||
%token<fileline> yVL_PUBLIC_FLAT "/*verilator public_flat*/"
|
||||
%token<fileline> yVL_PUBLIC_MODULE "/*verilator public_module*/"
|
||||
%token<fileline> yVL_ISOLATE_ASSIGNMENTS "/*verilator isolate_assignments*/"
|
||||
%token<fileline> yVL_TRACING_OFF "/*verilator tracing_off*/"
|
||||
%token<fileline> yVL_TRACING_ON "/*verilator tracing_on*/"
|
||||
|
||||
%token<fileline> yPLUSCOLON "+:"
|
||||
%token<fileline> yMINUSCOLON "-:"
|
||||
%token<fileline> yPSL_BRA "{"
|
||||
%token<fileline> yPSL_KET "}"
|
||||
%token<fileline> yP_PLUSCOLON "+:"
|
||||
%token<fileline> yP_MINUSCOLON "-:"
|
||||
|
||||
%token<fileline> yPSL_BRA "{"
|
||||
%token<fileline> yPSL_KET "}"
|
||||
|
||||
%token<fileline> ';' '=' ',' '(' '.' '!' '~' '[' '@'
|
||||
|
||||
//********************
|
||||
// PSL op precedence
|
||||
%right<fileline> yOP_LOGIF yOP_LOGIFF
|
||||
%right<fileline> yOR_MINUS_GT yOR_EQ_GT
|
||||
%left<fileline> yBRA_STAR yBRA_STAR_KET yBRA_PLUS_KET yBRA_MINUS_GT yBRA_MINUS_GT_KET yBRA_EQ
|
||||
%right<fileline> yP_LOGIF yP_LOGIFF
|
||||
%right<fileline> yP_OR_MINUS_GT yP_OR_EQ_GT
|
||||
%left<fileline> prPSLCLK
|
||||
|
||||
// Verilog op precedence
|
||||
%left<fileline> ':'
|
||||
%left<fileline> '?'
|
||||
%left<fileline> yOROR
|
||||
%left<fileline> yANDAND
|
||||
%left<fileline> '|' yOP_NOR
|
||||
%left<fileline> yP_OROR
|
||||
%left<fileline> yP_ANDAND
|
||||
%left<fileline> '|' yP_NOR
|
||||
%left<fileline> '^'
|
||||
%left<fileline> yOP_XNOR
|
||||
%left<fileline> '&' yOP_NAND
|
||||
%left<fileline> yEQUAL yNOTEQUAL yCASEEQUAL yCASENOTEQUAL
|
||||
%left<fileline> '>' '<' yGTE yLTE
|
||||
%left<fileline> ySLEFT ySRIGHT ySSRIGHT
|
||||
%left<fileline> yP_XNOR
|
||||
%left<fileline> '&' yP_NAND
|
||||
%left<fileline> yP_EQUAL yP_NOTEQUAL yP_CASEEQUAL yP_CASENOTEQUAL
|
||||
%left<fileline> '>' '<' yP_GTE yP_LTE
|
||||
%left<fileline> yP_SLEFT yP_SRIGHT yP_SSRIGHT
|
||||
%left<fileline> '+' '-'
|
||||
%left<fileline> '*' '/' '%'
|
||||
%left<fileline> yPOW
|
||||
%left<fileline> yP_POW
|
||||
%left<fileline> '{' '}'
|
||||
%left<fileline> yUNARYARITH
|
||||
%left<fileline> yREDUCTION
|
||||
%left<fileline> yNEGATION
|
||||
%left<fileline> prUNARYARITH
|
||||
%left<fileline> prREDUCTION
|
||||
%left<fileline> prNEGATION
|
||||
|
||||
%nonassoc yLOWER_THAN_ELSE
|
||||
%nonassoc prLOWER_THAN_ELSE
|
||||
%nonassoc yELSE
|
||||
|
||||
// Types are in same order as declarations.
|
||||
|
@ -283,8 +337,6 @@ class AstSenTree;
|
|||
|
||||
%%
|
||||
//**********************************************************************
|
||||
//**********************************************************************
|
||||
//**********************************************************************
|
||||
// Feedback to the Lexer
|
||||
|
||||
stateExitPsl: { V3Read::stateExitPsl(); }
|
||||
|
@ -294,8 +346,6 @@ statePushVlg: { V3Read::statePushVlg(); }
|
|||
statePop: { V3Read::statePop(); }
|
||||
;
|
||||
|
||||
//**********************************************************************
|
||||
//**********************************************************************
|
||||
//**********************************************************************
|
||||
// Modules
|
||||
|
||||
|
@ -309,7 +359,7 @@ mod: mheader modParE modportsE ';' modItemListE yENDMODULE
|
|||
;
|
||||
|
||||
mheader: yMODULE { V3Parse::s_trace=v3Global.opt.trace();}
|
||||
yID { $$ = new AstModule($1,*$3); $$->inLibrary(V3Read::inLibrary());
|
||||
yaID { $$ = new AstModule($1,*$3); $$->inLibrary(V3Read::inLibrary());
|
||||
$$->modTrace(v3Global.opt.trace());
|
||||
V3Read::rootp()->addModulep($$); }
|
||||
;
|
||||
|
@ -334,7 +384,7 @@ portList: port { $$ = $1; }
|
|||
| portList ',' port { $$ = $1->addNext($3); }
|
||||
;
|
||||
|
||||
port: yID portrangeE { $$ = new AstPort(CRELINE(),V3Parse::s_pinNum++,*$1); }
|
||||
port: yaID portrangeE { $$ = new AstPort(CRELINE(),V3Parse::s_pinNum++,*$1); }
|
||||
;
|
||||
|
||||
v2kPortList: v2kPort { $$ = $1; }
|
||||
|
@ -417,12 +467,12 @@ modItemList: modItem { $$ = $1; }
|
|||
|
||||
modItem: modOrGenItem { $$ = $1; }
|
||||
| yGENERATE genTopBlock yENDGENERATE { $$ = new AstGenerate($1, $2); }
|
||||
| ySCHDR { $$ = new AstScHdr(CRELINE(),*$1); }
|
||||
| ySCINT { $$ = new AstScInt(CRELINE(),*$1); }
|
||||
| ySCIMP { $$ = new AstScImp(CRELINE(),*$1); }
|
||||
| ySCIMPH { $$ = new AstScImpHdr(CRELINE(),*$1); }
|
||||
| ySCCTOR { $$ = new AstScCtor(CRELINE(),*$1); }
|
||||
| ySCDTOR { $$ = new AstScDtor(CRELINE(),*$1); }
|
||||
| yaSCHDR { $$ = new AstScHdr(CRELINE(),*$1); }
|
||||
| yaSCINT { $$ = new AstScInt(CRELINE(),*$1); }
|
||||
| yaSCIMP { $$ = new AstScImp(CRELINE(),*$1); }
|
||||
| yaSCIMPH { $$ = new AstScImpHdr(CRELINE(),*$1); }
|
||||
| yaSCCTOR { $$ = new AstScCtor(CRELINE(),*$1); }
|
||||
| yaSCDTOR { $$ = new AstScDtor(CRELINE(),*$1); }
|
||||
| yVL_INLINE_MODULE { $$ = new AstPragma($1,AstPragmaType::INLINE_MODULE); }
|
||||
| yVL_NO_INLINE_MODULE { $$ = new AstPragma($1,AstPragmaType::NO_INLINE_MODULE); }
|
||||
| yVL_PUBLIC_MODULE { $$ = new AstPragma($1,AstPragmaType::PUBLIC_MODULE); }
|
||||
|
@ -437,7 +487,7 @@ modOrGenItem: yALWAYS sensitivityE stmtBlock { $$ = new AstAlways($1,$2,$3); }
|
|||
| yINITIAL stmtBlock { $$ = new AstInitial($1,$2); }
|
||||
| yASSIGN delayE assignList ';' { $$ = $3; }
|
||||
| yDEFPARAM defpList ';' { $$ = $2; }
|
||||
| yID instparamListE {INSTPREP(*$1,$2);} instnameList ';' { $$ = $4; V3Parse::s_impliedDecl=false;}
|
||||
| yaID instparamListE {INSTPREP(*$1,$2);} instnameList ';' { $$ = $4; V3Parse::s_impliedDecl=false;}
|
||||
| taskDecl { $$ = $1; }
|
||||
| funcDecl { $$ = $1; }
|
||||
| gateDecl { $$ = $1; }
|
||||
|
@ -458,10 +508,10 @@ genTopBlock: genItemList { $$ = $1; }
|
|||
| genItemBegin { $$ = $1; }
|
||||
;
|
||||
|
||||
genItemBegin: yBBEGIN genItemList yBEND { $$ = new AstBegin($1,"genblk",$2); }
|
||||
| yBBEGIN yBEND { $$ = NULL; }
|
||||
| yBBEGIN ':' yID genItemList yBEND { $$ = new AstBegin($2,*$3,$4); }
|
||||
| yBBEGIN ':' yID yBEND { $$ = NULL; }
|
||||
genItemBegin: yBEGIN genItemList yEND { $$ = new AstBegin($1,"genblk",$2); }
|
||||
| yBEGIN yEND { $$ = NULL; }
|
||||
| yBEGIN ':' yaID genItemList yEND { $$ = new AstBegin($2,*$3,$4); }
|
||||
| yBEGIN ':' yaID yEND { $$ = NULL; }
|
||||
;
|
||||
|
||||
genItemList: genItem { $$ = $1; }
|
||||
|
@ -470,7 +520,7 @@ genItemList: genItem { $$ = $1; }
|
|||
|
||||
genItem: modOrGenItem { $$ = $1; }
|
||||
| yCASE '(' expr ')' genCaseList yENDCASE { $$ = new AstGenCase($1,$3,$5); }
|
||||
| yIF expr genItemBlock %prec yLOWER_THAN_ELSE { $$ = new AstGenIf($1,$2,$3,NULL); }
|
||||
| yIF expr genItemBlock %prec prLOWER_THAN_ELSE { $$ = new AstGenIf($1,$2,$3,NULL); }
|
||||
| yIF expr genItemBlock yELSE genItemBlock { $$ = new AstGenIf($1,$2,$3,$5); }
|
||||
| yFOR '(' varRefBase '=' expr ';' expr ';' varRefBase '=' expr ')' genItemBlock
|
||||
{ $$ = new AstGenFor($1, new AstAssign($4,$3,$5)
|
||||
|
@ -508,27 +558,27 @@ delayE: /* empty */
|
|||
| '#' '(' dterm ',' dterm ',' dterm ')' {} /* ignored */
|
||||
;
|
||||
|
||||
dterm: yID { $$ = NULL; }
|
||||
| yINTNUM { $$ = NULL; }
|
||||
| yFLOATNUM { $$ = NULL; }
|
||||
dterm: yaID { $$ = NULL; }
|
||||
| yaINTNUM { $$ = NULL; }
|
||||
| yaFLOATNUM { $$ = NULL; }
|
||||
;
|
||||
|
||||
onesig: sigId { $$=$1; }
|
||||
| sigId sigAttrList { $$=$1; }
|
||||
;
|
||||
|
||||
sigId: yID { $$ = V3Parse::createVariable(CRELINE(), *$1, NULL); }
|
||||
sigId: yaID { $$ = V3Parse::createVariable(CRELINE(), *$1, NULL); }
|
||||
;
|
||||
|
||||
sigIdRange: yID rangeList { $$ = V3Parse::createVariable(CRELINE(), *$1, $2); }
|
||||
sigIdRange: yaID rangeList { $$ = V3Parse::createVariable(CRELINE(), *$1, $2); }
|
||||
;
|
||||
|
||||
regSigId: yID rangeListE { $$ = V3Parse::createVariable(CRELINE(), *$1, $2); }
|
||||
| yID rangeListE '=' constExpr { $$ = V3Parse::createVariable(CRELINE(), *$1, $2);
|
||||
regSigId: yaID rangeListE { $$ = V3Parse::createVariable(CRELINE(), *$1, $2); }
|
||||
| yaID rangeListE '=' constExpr { $$ = V3Parse::createVariable(CRELINE(), *$1, $2);
|
||||
$$->addNext(new AstInitial($3,new AstAssign($3, new AstVarRef($3, $$, true), $4))); }
|
||||
;
|
||||
|
||||
paramId: yID { $$ = V3Parse::createVariable(CRELINE(), *$1, NULL); }
|
||||
paramId: yaID { $$ = V3Parse::createVariable(CRELINE(), *$1, NULL); }
|
||||
;
|
||||
|
||||
sigAttrListE: /*empty*/ {}
|
||||
|
@ -604,7 +654,7 @@ defpList: defpOne { $$ = $1; }
|
|||
| defpList ',' defpOne { $$ = $1->addNext($3); }
|
||||
;
|
||||
|
||||
defpOne: yID '.' yID '=' expr { $$ = new AstDefParam($4,*$1,*$3,$5); }
|
||||
defpOne: yaID '.' yaID '=' expr { $$ = new AstDefParam($4,*$1,*$3,$5); }
|
||||
;
|
||||
|
||||
// Instances
|
||||
|
@ -616,7 +666,7 @@ instnameList: instname { $$ = $1; }
|
|||
| instnameList ',' instname { $$ = $1->addNext($3); }
|
||||
;
|
||||
|
||||
instname: yID funcRange '(' cellpinList ')' { $$ = new AstCell($3,*$1,V3Parse::s_instModule,$4,V3Parse::s_instParamp,$2); $$->pinStar(V3Parse::s_pinStar); }
|
||||
instname: yaID funcRange '(' cellpinList ')' { $$ = new AstCell($3,*$1,V3Parse::s_instModule,$4,V3Parse::s_instParamp,$2); $$->pinStar(V3Parse::s_pinStar); }
|
||||
;
|
||||
|
||||
cellpinList: {V3Parse::s_pinNum=1; V3Parse::s_pinStar=false; } cellpinlist2 { $$ = $2; }
|
||||
|
@ -628,9 +678,9 @@ cellpinlist2: cellpinitemE { $$ = $1; }
|
|||
|
||||
cellpinitemE: /* empty */ { $$ = NULL; V3Parse::s_pinNum++; }
|
||||
| '.' '*' { $$ = NULL; if (V3Parse::s_pinStar) $1->v3error("Duplicate .* in a cell"); V3Parse::s_pinStar=true; }
|
||||
| '.' yID { $$ = new AstPin($1,V3Parse::s_pinNum++,*$2,new AstVarRef($1,*$2,false)); $$->svImplicit(true);}
|
||||
| '.' yID '(' ')' { $$ = NULL; V3Parse::s_pinNum++; }
|
||||
| '.' yID '(' expr ')' { $$ = new AstPin($1,V3Parse::s_pinNum++,*$2,$4); }
|
||||
| '.' yaID { $$ = new AstPin($1,V3Parse::s_pinNum++,*$2,new AstVarRef($1,*$2,false)); $$->svImplicit(true);}
|
||||
| '.' yaID '(' ')' { $$ = NULL; V3Parse::s_pinNum++; }
|
||||
| '.' yaID '(' expr ')' { $$ = new AstPin($1,V3Parse::s_pinNum++,*$2,$4); }
|
||||
| expr { $$ = new AstPin(CRELINE(),V3Parse::s_pinNum++,"",$1); }
|
||||
;
|
||||
|
||||
|
@ -656,14 +706,14 @@ senitemEdge: yPOSEDGE varRefDotBit { $$ = new AstSenItem($1,AstEdgeType::POSED
|
|||
;
|
||||
|
||||
stmtBlock: stmt { $$ = $1; }
|
||||
| yBBEGIN stmtList yBEND { $$ = $2; }
|
||||
| yBBEGIN yBEND { $$ = NULL; }
|
||||
| beginNamed stmtList yBEND { $$ = $1; $1->addStmtp($2); }
|
||||
| beginNamed yBEND { $$ = $1; }
|
||||
| yBEGIN stmtList yEND { $$ = $2; }
|
||||
| yBEGIN yEND { $$ = NULL; }
|
||||
| beginNamed stmtList yEND { $$ = $1; $1->addStmtp($2); }
|
||||
| beginNamed yEND { $$ = $1; }
|
||||
;
|
||||
|
||||
beginNamed: yBBEGIN ':' yID varDeclList { $$ = new AstBegin($2,*$3,$4); }
|
||||
| yBBEGIN ':' yID { $$ = new AstBegin($2,*$3,NULL); }
|
||||
beginNamed: yBEGIN ':' yaID varDeclList { $$ = new AstBegin($2,*$3,$4); }
|
||||
| yBEGIN ':' yaID { $$ = new AstBegin($2,*$3,NULL); }
|
||||
;
|
||||
|
||||
stmtList: stmtBlock { $$ = $1; }
|
||||
|
@ -672,13 +722,13 @@ stmtList: stmtBlock { $$ = $1; }
|
|||
|
||||
stmt: ';' { $$ = NULL; }
|
||||
| labeledStmt { $$ = $1; }
|
||||
| yID ':' labeledStmt { $$ = new AstBegin($2, *$1, $3); } /*S05 block creation rule*/
|
||||
| yaID ':' labeledStmt { $$ = new AstBegin($2, *$1, $3); } /*S05 block creation rule*/
|
||||
|
||||
| varRefDotBit yLTE delayE expr ';' { $$ = new AstAssignDly($2,$1,$4); }
|
||||
| varRefDotBit yP_LTE delayE expr ';' { $$ = new AstAssignDly($2,$1,$4); }
|
||||
| varRefDotBit '=' delayE expr ';' { $$ = new AstAssign($2,$1,$4); }
|
||||
| varRefDotBit '=' yD_FOPEN '(' expr ',' expr ')' ';' { $$ = new AstFOpen($3,$1,$5,$7); }
|
||||
| yASSIGN varRefDotBit '=' delayE expr ';' { $$ = new AstAssign($1,$2,$5); }
|
||||
| '{' concIdList '}' yLTE delayE expr ';' { $$ = new AstAssignDly($4,$2,$6); }
|
||||
| '{' concIdList '}' yP_LTE delayE expr ';' { $$ = new AstAssignDly($4,$2,$6); }
|
||||
| '{' concIdList '}' '=' delayE expr ';' { $$ = new AstAssign($4,$2,$6); }
|
||||
| yD_C '(' cStrList ')' ';' { $$ = (v3Global.opt.ignc() ? NULL : new AstUCStmt($1,$3)); }
|
||||
| yD_FCLOSE '(' varRefDotBit ')' ';' { $$ = new AstFClose($1, $3); }
|
||||
|
@ -689,19 +739,19 @@ stmt: ';' { $$ = NULL; }
|
|||
| taskRef ';' { $$ = $1; }
|
||||
|
||||
| yD_DISPLAY ';' { $$ = new AstDisplay($1,AstDisplayType::DISPLAY,"", NULL,NULL); }
|
||||
| yD_DISPLAY '(' ySTRING commaEListE ')' ';' { $$ = new AstDisplay($1,AstDisplayType::DISPLAY,*$3,NULL,$4); }
|
||||
| yD_WRITE '(' ySTRING commaEListE ')' ';' { $$ = new AstDisplay($1,AstDisplayType::WRITE, *$3,NULL,$4); }
|
||||
| yD_FDISPLAY '(' varRefDotBit ',' ySTRING commaEListE ')' ';' { $$ = new AstDisplay($1,AstDisplayType::DISPLAY,*$5,$3,$6); }
|
||||
| yD_FWRITE '(' varRefDotBit ',' ySTRING commaEListE ')' ';' { $$ = new AstDisplay($1,AstDisplayType::WRITE, *$5,$3,$6); }
|
||||
| yD_DISPLAY '(' yaSTRING commaEListE ')' ';' { $$ = new AstDisplay($1,AstDisplayType::DISPLAY,*$3,NULL,$4); }
|
||||
| yD_WRITE '(' yaSTRING commaEListE ')' ';' { $$ = new AstDisplay($1,AstDisplayType::WRITE, *$3,NULL,$4); }
|
||||
| yD_FDISPLAY '(' varRefDotBit ',' yaSTRING commaEListE ')' ';' { $$ = new AstDisplay($1,AstDisplayType::DISPLAY,*$5,$3,$6); }
|
||||
| yD_FWRITE '(' varRefDotBit ',' yaSTRING commaEListE ')' ';' { $$ = new AstDisplay($1,AstDisplayType::WRITE, *$5,$3,$6); }
|
||||
| yD_INFO ';' { $$ = new AstDisplay($1,AstDisplayType::INFO, "", NULL,NULL); }
|
||||
| yD_INFO '(' ySTRING commaEListE ')' ';' { $$ = new AstDisplay($1,AstDisplayType::INFO, *$3,NULL,$4); }
|
||||
| yD_INFO '(' yaSTRING commaEListE ')' ';' { $$ = new AstDisplay($1,AstDisplayType::INFO, *$3,NULL,$4); }
|
||||
| yD_WARNING ';' { $$ = new AstDisplay($1,AstDisplayType::WARNING,"", NULL,NULL); }
|
||||
| yD_WARNING '(' ySTRING commaEListE ')' ';' { $$ = new AstDisplay($1,AstDisplayType::WARNING,*$3,NULL,$4); }
|
||||
| yD_WARNING '(' yaSTRING commaEListE ')' ';' { $$ = new AstDisplay($1,AstDisplayType::WARNING,*$3,NULL,$4); }
|
||||
| yD_ERROR ';' { $$ = V3Parse::createDisplayError($1); }
|
||||
| yD_ERROR '(' ySTRING commaEListE ')' ';' { $$ = new AstDisplay($1,AstDisplayType::ERROR, *$3,NULL,$4); $$->addNext(new AstStop($1)); }
|
||||
| yD_ERROR '(' yaSTRING commaEListE ')' ';' { $$ = new AstDisplay($1,AstDisplayType::ERROR, *$3,NULL,$4); $$->addNext(new AstStop($1)); }
|
||||
| yD_FATAL ';' { $$ = new AstDisplay($1,AstDisplayType::FATAL, "", NULL,NULL); $$->addNext(new AstStop($1)); }
|
||||
| yD_FATAL '(' expr ')' ';' { $$ = new AstDisplay($1,AstDisplayType::FATAL, "", NULL,NULL); $$->addNext(new AstStop($1)); }
|
||||
| yD_FATAL '(' expr ',' ySTRING commaEListE ')' ';' { $$ = new AstDisplay($1,AstDisplayType::FATAL, *$5,NULL,$6); $$->addNext(new AstStop($1)); }
|
||||
| yD_FATAL '(' expr ',' yaSTRING commaEListE ')' ';' { $$ = new AstDisplay($1,AstDisplayType::FATAL, *$5,NULL,$6); $$->addNext(new AstStop($1)); }
|
||||
|
||||
| yD_READMEMB '(' expr ',' varRefMem ')' ';' { $$ = new AstReadMem($1,false,$3,$5,NULL,NULL); }
|
||||
| yD_READMEMB '(' expr ',' varRefMem ',' expr ')' ';' { $$ = new AstReadMem($1,false,$3,$5,$7,NULL); }
|
||||
|
@ -716,7 +766,7 @@ labeledStmt: assertStmt { $$ = $1; }
|
|||
;
|
||||
|
||||
stateCaseForIf: caseStmt caseAttrE caseList yENDCASE { $$ = $1; $1->addItemsp($3); }
|
||||
| yIF expr stmtBlock %prec yLOWER_THAN_ELSE { $$ = new AstIf($1,$2,$3,NULL); }
|
||||
| yIF expr stmtBlock %prec prLOWER_THAN_ELSE { $$ = new AstIf($1,$2,$3,NULL); }
|
||||
| yIF expr stmtBlock yELSE stmtBlock { $$ = new AstIf($1,$2,$3,$5); }
|
||||
| yFOR '(' varRefBase '=' expr ';' expr ';' varRefBase '=' expr ')' stmtBlock
|
||||
{ $$ = new AstFor($1, new AstAssign($4,$3,$5)
|
||||
|
@ -726,7 +776,7 @@ stateCaseForIf: caseStmt caseAttrE caseList yENDCASE { $$ = $1; $1->addItemsp($3
|
|||
| yDO stmtBlock yWHILE '(' expr ')' { $$ = $2->cloneTree(true); $$->addNext(new AstWhile($1,$5,$2));}
|
||||
;
|
||||
|
||||
assertStmt: yASSERT '(' expr ')' stmtBlock %prec yLOWER_THAN_ELSE { $$ = new AstVAssert($1,$3,$5, V3Parse::createDisplayError($1)); }
|
||||
assertStmt: yASSERT '(' expr ')' stmtBlock %prec prLOWER_THAN_ELSE { $$ = new AstVAssert($1,$3,$5, V3Parse::createDisplayError($1)); }
|
||||
| yASSERT '(' expr ')' yELSE stmtBlock { $$ = new AstVAssert($1,$3,NULL,$6); }
|
||||
| yASSERT '(' expr ')' stmtBlock yELSE stmtBlock { $$ = new AstVAssert($1,$3,$5,$7); }
|
||||
;
|
||||
|
@ -753,14 +803,14 @@ casecondList: expr { $$ = $1; }
|
|||
| casecondList ',' expr { $$ = $1;$1->addNext($3); }
|
||||
;
|
||||
|
||||
taskDecl: yTASK yID ';' stmtBlock yENDTASK { $$ = new AstTask ($1,*$2,$4);}
|
||||
| yTASK yID ';' funcVarList stmtBlock yENDTASK { $$ = new AstTask ($1,*$2,$4); $4->addNextNull($5); }
|
||||
taskDecl: yTASK yaID ';' stmtBlock yENDTASK { $$ = new AstTask ($1,*$2,$4);}
|
||||
| yTASK yaID ';' funcVarList stmtBlock yENDTASK { $$ = new AstTask ($1,*$2,$4); $4->addNextNull($5); }
|
||||
;
|
||||
|
||||
funcDecl: yFUNCTION funcRange yID ';' funcBody yENDFUNCTION { $$ = new AstFunc ($1,*$3,$5,$2); }
|
||||
| yFUNCTION ySIGNED funcRange yID ';' funcBody yENDFUNCTION { $$ = new AstFunc ($1,*$4,$6,$3); $$->isSigned(true); }
|
||||
| yFUNCTION funcRange yID yVL_ISOLATE_ASSIGNMENTS ';' funcBody yENDFUNCTION { $$ = new AstFunc ($1,*$3,$6,$2); $$->attrIsolateAssign(true);}
|
||||
| yFUNCTION ySIGNED funcRange yID yVL_ISOLATE_ASSIGNMENTS ';' funcBody yENDFUNCTION { $$ = new AstFunc ($1,*$4,$7,$3); $$->attrIsolateAssign(true); $$->isSigned(true); }
|
||||
funcDecl: yFUNCTION funcRange yaID ';' funcBody yENDFUNCTION { $$ = new AstFunc ($1,*$3,$5,$2); }
|
||||
| yFUNCTION ySIGNED funcRange yaID ';' funcBody yENDFUNCTION { $$ = new AstFunc ($1,*$4,$6,$3); $$->isSigned(true); }
|
||||
| yFUNCTION funcRange yaID yVL_ISOLATE_ASSIGNMENTS ';' funcBody yENDFUNCTION { $$ = new AstFunc ($1,*$3,$6,$2); $$->attrIsolateAssign(true);}
|
||||
| yFUNCTION ySIGNED funcRange yaID yVL_ISOLATE_ASSIGNMENTS ';' funcBody yENDFUNCTION { $$ = new AstFunc ($1,*$4,$7,$3); $$->attrIsolateAssign(true); $$->isSigned(true); }
|
||||
;
|
||||
|
||||
funcBody: funcVarList stmtBlock { $$ = $1;$1->addNextNull($2); }
|
||||
|
@ -783,44 +833,44 @@ funcVar: ioDecl { $$ = $1; }
|
|||
constExpr: expr { $$ = $1; }
|
||||
;
|
||||
|
||||
exprNoStr: expr yOROR expr { $$ = new AstLogOr ($2,$1,$3); }
|
||||
| expr yANDAND expr { $$ = new AstLogAnd ($2,$1,$3); }
|
||||
exprNoStr: expr yP_OROR expr { $$ = new AstLogOr ($2,$1,$3); }
|
||||
| expr yP_ANDAND expr { $$ = new AstLogAnd ($2,$1,$3); }
|
||||
| expr '&' expr { $$ = new AstAnd ($2,$1,$3); }
|
||||
| expr '|' expr { $$ = new AstOr ($2,$1,$3); }
|
||||
| expr yOP_NAND expr { $$ = new AstNot($2,new AstAnd ($2,$1,$3)); }
|
||||
| expr yOP_NOR expr { $$ = new AstNot($2,new AstOr ($2,$1,$3)); }
|
||||
| expr yP_NAND expr { $$ = new AstNot($2,new AstAnd ($2,$1,$3)); }
|
||||
| expr yP_NOR expr { $$ = new AstNot($2,new AstOr ($2,$1,$3)); }
|
||||
| expr '^' expr { $$ = new AstXor ($2,$1,$3); }
|
||||
| expr yOP_XNOR expr { $$ = new AstXnor ($2,$1,$3); }
|
||||
| expr yEQUAL expr { $$ = new AstEq ($2,$1,$3); }
|
||||
| expr yNOTEQUAL expr { $$ = new AstNeq ($2,$1,$3); }
|
||||
| expr yCASEEQUAL expr { $$ = new AstEqCase ($2,$1,$3); }
|
||||
| expr yCASENOTEQUAL expr { $$ = new AstNeqCase ($2,$1,$3); }
|
||||
| expr yP_XNOR expr { $$ = new AstXnor ($2,$1,$3); }
|
||||
| expr yP_EQUAL expr { $$ = new AstEq ($2,$1,$3); }
|
||||
| expr yP_NOTEQUAL expr { $$ = new AstNeq ($2,$1,$3); }
|
||||
| expr yP_CASEEQUAL expr { $$ = new AstEqCase ($2,$1,$3); }
|
||||
| expr yP_CASENOTEQUAL expr { $$ = new AstNeqCase ($2,$1,$3); }
|
||||
| expr '>' expr { $$ = new AstGt ($2,$1,$3); }
|
||||
| expr '<' expr { $$ = new AstLt ($2,$1,$3); }
|
||||
| expr yGTE expr { $$ = new AstGte ($2,$1,$3); }
|
||||
| expr yLTE expr { $$ = new AstLte ($2,$1,$3); }
|
||||
| expr ySLEFT expr { $$ = new AstShiftL ($2,$1,$3); }
|
||||
| expr ySRIGHT expr { $$ = new AstShiftR ($2,$1,$3); }
|
||||
| expr ySSRIGHT expr { $$ = new AstShiftRS ($2,$1,$3); }
|
||||
| expr yP_GTE expr { $$ = new AstGte ($2,$1,$3); }
|
||||
| expr yP_LTE expr { $$ = new AstLte ($2,$1,$3); }
|
||||
| expr yP_SLEFT expr { $$ = new AstShiftL ($2,$1,$3); }
|
||||
| expr yP_SRIGHT expr { $$ = new AstShiftR ($2,$1,$3); }
|
||||
| expr yP_SSRIGHT expr { $$ = new AstShiftRS ($2,$1,$3); }
|
||||
| expr '+' expr { $$ = new AstAdd ($2,$1,$3); }
|
||||
| expr '-' expr { $$ = new AstSub ($2,$1,$3); }
|
||||
| expr '*' expr { $$ = new AstMul ($2,$1,$3); }
|
||||
| expr '/' expr { $$ = new AstDiv ($2,$1,$3); }
|
||||
| expr '%' expr { $$ = new AstModDiv ($2,$1,$3); }
|
||||
| expr yPOW expr { $$ = new AstPow ($2,$1,$3); }
|
||||
| expr yOP_LOGIF expr { $$ = new AstLogIf ($2,$1,$3); }
|
||||
| expr yOP_LOGIFF expr { $$ = new AstLogIff ($2,$1,$3); }
|
||||
| expr yP_POW expr { $$ = new AstPow ($2,$1,$3); }
|
||||
| expr yP_LOGIF expr { $$ = new AstLogIf ($2,$1,$3); }
|
||||
| expr yP_LOGIFF expr { $$ = new AstLogIff ($2,$1,$3); }
|
||||
|
||||
| '-' expr %prec yUNARYARITH { $$ = new AstUnaryMin ($1,$2); }
|
||||
| '+' expr %prec yUNARYARITH { $$ = $2; }
|
||||
| '&' expr %prec yREDUCTION { $$ = new AstRedAnd ($1,$2); }
|
||||
| '|' expr %prec yREDUCTION { $$ = new AstRedOr ($1,$2); }
|
||||
| '^' expr %prec yREDUCTION { $$ = new AstRedXor ($1,$2); }
|
||||
| yOP_XNOR expr %prec yREDUCTION { $$ = new AstRedXnor ($1,$2); }
|
||||
| yOP_NAND expr %prec yREDUCTION { $$ = new AstNot($1,new AstRedAnd($1,$2)); }
|
||||
| yOP_NOR expr %prec yREDUCTION { $$ = new AstNot($1,new AstRedOr ($1,$2)); }
|
||||
| '!' expr %prec yNEGATION { $$ = new AstLogNot ($1,$2); }
|
||||
| '~' expr %prec yNEGATION { $$ = new AstNot ($1,$2); }
|
||||
| '-' expr %prec prUNARYARITH { $$ = new AstUnaryMin ($1,$2); }
|
||||
| '+' expr %prec prUNARYARITH { $$ = $2; }
|
||||
| '&' expr %prec prREDUCTION { $$ = new AstRedAnd ($1,$2); }
|
||||
| '|' expr %prec prREDUCTION { $$ = new AstRedOr ($1,$2); }
|
||||
| '^' expr %prec prREDUCTION { $$ = new AstRedXor ($1,$2); }
|
||||
| yP_XNOR expr %prec prREDUCTION { $$ = new AstRedXnor ($1,$2); }
|
||||
| yP_NAND expr %prec prREDUCTION { $$ = new AstNot($1,new AstRedAnd($1,$2)); }
|
||||
| yP_NOR expr %prec prREDUCTION { $$ = new AstNot($1,new AstRedOr ($1,$2)); }
|
||||
| '!' expr %prec prNEGATION { $$ = new AstLogNot ($1,$2); }
|
||||
| '~' expr %prec prNEGATION { $$ = new AstNot ($1,$2); }
|
||||
|
||||
| expr '?' expr ':' expr { $$ = new AstCond($2,$1,$3,$5); }
|
||||
| '(' expr ')' { $$ = $2; }
|
||||
|
@ -840,7 +890,7 @@ exprNoStr: expr yOROR expr { $$ = new AstLogOr ($2,$1,$3); }
|
|||
|
||||
| funcRef { $$ = $1; }
|
||||
|
||||
| yINTNUM { $$ = new AstConst(CRELINE(),*$1); }
|
||||
| yaINTNUM { $$ = new AstConst(CRELINE(),*$1); }
|
||||
|
||||
| varRefDotBit { $$ = $1; }
|
||||
;
|
||||
|
@ -877,7 +927,6 @@ commaEListE: /* empty */ { $$ = NULL; }
|
|||
| ',' eList { $$ = $2; }
|
||||
;
|
||||
|
||||
|
||||
// Gate declarations
|
||||
gateDecl: yBUF gateBufList ';' { $$ = $2; }
|
||||
| yNOT gateNotList ';' { $$ = $2; }
|
||||
|
@ -915,7 +964,7 @@ gateXnorList: gateXnor { $$ = $1; }
|
|||
;
|
||||
|
||||
gateIdE: /*empty*/ {}
|
||||
| yID {}
|
||||
| yaID {}
|
||||
;
|
||||
|
||||
gateBuf: gateIdE '(' varRefDotBit ',' expr ')' { $$ = new AstAssignW ($2,$3,$5); $$->allowImplicit(true); }
|
||||
|
@ -952,13 +1001,12 @@ specifyJunkList: specifyJunk /* ignored */
|
|||
;
|
||||
|
||||
specifyJunk: dterm {} /* ignored */
|
||||
| ySTRING {}
|
||||
| ';' {}
|
||||
| '!' {}
|
||||
| '&' {}
|
||||
| '(' {}
|
||||
| ')' {}
|
||||
| '*' {} | '/' {} | '%' {} | yPOW {}
|
||||
| '*' {} | '/' {} | '%' {} | yP_POW {}
|
||||
| '+' {} | '-' {}
|
||||
| ',' {}
|
||||
| ':' {}
|
||||
|
@ -971,32 +1019,27 @@ specifyJunk: dterm {} /* ignored */
|
|||
| '[' {} | ']' {}
|
||||
| '|' {}
|
||||
| '~' {}
|
||||
| yANDAND {} | yGTE {} | yLTE {}
|
||||
| yEQUAL {} | yNOTEQUAL {}
|
||||
| yIF {}
|
||||
| yNEGATION {}
|
||||
| yNEGEDGE {}
|
||||
| yOP_XNOR {} | yOP_NOR {} | yOP_NAND {}
|
||||
| yOROR {}
|
||||
| yPOSEDGE {}
|
||||
| yREDUCTION {}
|
||||
| ySLEFT {} | ySRIGHT {} | ySSRIGHT {}
|
||||
| yPLUSCOLON {} | yMINUSCOLON {}
|
||||
| yUNARYARITH {}
|
||||
| yTIMINGSPEC {}
|
||||
|
||||
| yOP_LOGIF {}
|
||||
| yOP_LOGIFF {}
|
||||
| yBRA_STAR {}
|
||||
| yBRA_STAR_KET {}
|
||||
| yBRA_PLUS_KET {}
|
||||
| yBRA_MINUS_GT {}
|
||||
| yBRA_MINUS_GT_KET {}
|
||||
| yBRA_EQ {}
|
||||
| yIF {}
|
||||
| yNEGEDGE {}
|
||||
| yPOSEDGE {}
|
||||
|
||||
| yaSTRING {}
|
||||
| yaTIMINGSPEC {}
|
||||
|
||||
| yP_ANDAND {} | yP_GTE {} | yP_LTE {}
|
||||
| yP_EQUAL {} | yP_NOTEQUAL {}
|
||||
| yP_XNOR {} | yP_NOR {} | yP_NAND {}
|
||||
| yP_OROR {}
|
||||
| yP_SLEFT {} | yP_SRIGHT {} | yP_SSRIGHT {}
|
||||
| yP_PLUSCOLON {} | yP_MINUSCOLON {}
|
||||
|
||||
| yP_LOGIF {}
|
||||
| yP_LOGIFF {}
|
||||
| yPSL_BRA {}
|
||||
| yPSL_KET {}
|
||||
| yOR_MINUS_GT {}
|
||||
| yOR_EQ_GT {}
|
||||
| yP_OR_MINUS_GT {}
|
||||
| yP_OR_EQ_GT {}
|
||||
;
|
||||
|
||||
//************************************************
|
||||
|
@ -1005,11 +1048,11 @@ specifyJunk: dterm {} /* ignored */
|
|||
// Single component of dotted path, maybe [#].
|
||||
// Due to lookahead constraints, we can't know if [:] or [+:] are valid (last dotted part),
|
||||
// we'll assume so and cleanup later.
|
||||
idArrayed: yID { $$ = new AstText(CRELINE(),*$1); }
|
||||
idArrayed: yaID { $$ = new AstText(CRELINE(),*$1); }
|
||||
| idArrayed '[' expr ']' { $$ = new AstSelBit($2,$1,$3); } // Or AstArraySel, don't know yet.
|
||||
| idArrayed '[' constExpr ':' constExpr ']' { $$ = new AstSelExtract($2,$1,$3,$5); }
|
||||
| idArrayed '[' expr yPLUSCOLON constExpr ']' { $$ = new AstSelPlus($2,$1,$3,$5); }
|
||||
| idArrayed '[' expr yMINUSCOLON constExpr ']' { $$ = new AstSelMinus($2,$1,$3,$5); }
|
||||
| idArrayed '[' expr yP_PLUSCOLON constExpr ']' { $$ = new AstSelPlus($2,$1,$3,$5); }
|
||||
| idArrayed '[' expr yP_MINUSCOLON constExpr ']' { $$ = new AstSelMinus($2,$1,$3,$5); }
|
||||
;
|
||||
|
||||
idDotted: idArrayed { $$ = $1; }
|
||||
|
@ -1017,7 +1060,7 @@ idDotted: idArrayed { $$ = $1; }
|
|||
;
|
||||
|
||||
// VarRef without any dots or vectorizaion
|
||||
varRefBase: yID { $$ = new AstVarRef(CRELINE(),*$1,false);}
|
||||
varRefBase: yaID { $$ = new AstVarRef(CRELINE(),*$1,false);}
|
||||
;
|
||||
|
||||
// VarRef to a Memory
|
||||
|
@ -1035,10 +1078,10 @@ taskRef: idDotted { $$ = new AstTaskRef(CRELINE(),new AstParseRef($1->fileli
|
|||
funcRef: idDotted '(' eList ')' { $$ = new AstFuncRef($2,new AstParseRef($1->fileline(), AstParseRefExp::FUNC, $1), $3); }
|
||||
;
|
||||
|
||||
strAsInt: ySTRING { $$ = new AstConst(CRELINE(),V3Number(V3Number::VerilogString(),CRELINE(),V3Parse::deQuote(CRELINE(),*$1)));}
|
||||
strAsInt: yaSTRING { $$ = new AstConst(CRELINE(),V3Number(V3Number::VerilogString(),CRELINE(),V3Parse::deQuote(CRELINE(),*$1)));}
|
||||
;
|
||||
|
||||
strAsText: ySTRING { $$ = V3Parse::createTextQuoted(CRELINE(),*$1);}
|
||||
strAsText: yaSTRING { $$ = V3Parse::createTextQuoted(CRELINE(),*$1);}
|
||||
;
|
||||
|
||||
concIdList: varRefDotBit { $$ = $1; }
|
||||
|
@ -1052,15 +1095,15 @@ pslStmt: yPSL pslDir stateExitPsl { $$ = $2; }
|
|||
| yPSL pslDecl stateExitPsl { $$ = $2; }
|
||||
;
|
||||
|
||||
pslDir: yID ':' pslDirOne { $$ = $3; } // ADD: Create label on $1
|
||||
pslDir: yaID ':' pslDirOne { $$ = $3; } // ADD: Create label on $1
|
||||
| pslDirOne { $$ = $1; }
|
||||
;
|
||||
|
||||
//ADD: | yRESTRICT pslSequence ';' { $$ = PSLUNSUP(new AstPslRestrict($1,$2)); }
|
||||
pslDirOne: yPSL_ASSERT pslProp ';' { $$ = new AstPslAssert($1,$2); }
|
||||
| yPSL_ASSERT pslProp yREPORT ySTRING ';' { $$ = new AstPslAssert($1,$2,*$4); }
|
||||
| yPSL_ASSERT pslProp yREPORT yaSTRING ';' { $$ = new AstPslAssert($1,$2,*$4); }
|
||||
| yCOVER pslProp ';' { $$ = new AstPslCover($1,$2); }
|
||||
| yCOVER pslProp yREPORT ySTRING ';' { $$ = new AstPslCover($1,$2,*$4); }
|
||||
| yCOVER pslProp yREPORT yaSTRING ';' { $$ = new AstPslCover($1,$2,*$4); }
|
||||
;
|
||||
|
||||
pslDecl: yDEFAULT yCLOCK '=' senitemEdge ';' { $$ = new AstPslDefClock($3, $4); }
|
||||
|
@ -1095,8 +1138,6 @@ pslExpr: exprPsl { $$ = new AstPslBool($1->fileline(), $1); }
|
|||
| yTRUE { $$ = new AstPslBool($1, new AstConst($1, V3Number($1,1,1))); }
|
||||
;
|
||||
|
||||
//**********************************************************************
|
||||
//**********************************************************************
|
||||
//**********************************************************************
|
||||
%%
|
||||
|
||||
|
|
Loading…
Reference in New Issue