diff --git a/src/verilog.l b/src/verilog.l index e1465ffcd..fc6b1a17f 100644 --- a/src/verilog.l +++ b/src/verilog.l @@ -79,7 +79,7 @@ static double lexParseDouble(FileLine* fl, const char* textp, size_t length) { %o 25000 %s V95 V01NC V01C V05 S05 S09 S12 S17 S23 -%s ATTRMODE QQQ STRING TABLE +%s ATTRMODE QQQ STRING TABLE EDGEDESC %s VA5 SAX VLT %s SYSCHDR SYSCINT SYSCIMP SYSCIMPH SYSCCTOR SYSCDTOR @@ -328,6 +328,7 @@ vnum {vnum1}|{vnum2}|{vnum3}|{vnum4}|{vnum5} "default" { FL; return yDEFAULT; } "defparam" { FL; return yDEFPARAM; } "disable" { FL; return yDISABLE; } + "edge"/{ws}*"[" { FL; yy_push_state(EDGEDESC); return yEDGE; } "edge" { FL; return yEDGE; } "else" { FL; return yELSE; } "end" { FL; return yEND; } @@ -1023,6 +1024,13 @@ vnum {vnum1}|{vnum2}|{vnum3}|{vnum4}|{vnum5} <> { FL; yylval.fl->v3error("EOF in 'table'"); yyleng = 0; yy_pop_state(); FL_BRK; yyterminate(); } +{ + 01|10|[01][zZxX]|[zZxX][01] { FL; return yaEDGEDESC; } +} +","|"[" { FL; return yytext[0]; } +{ws} { FL_FWD; FL_BRK; } /* otherwise ignore white-space */ +"]" { FL; yy_pop_state(); return yytext[0]; } + /************************************************************************/ /* Preprocessor */ /* Common for all SYSC header states */ diff --git a/src/verilog.y b/src/verilog.y index d78b1a078..36bf03f04 100644 --- a/src/verilog.y +++ b/src/verilog.y @@ -443,6 +443,8 @@ BISONPRE_VERSION(3.7,%define api.header.include {"V3ParseBison.h"}) // IEEE: string_literal %token yaSTRING "STRING" %token yaSTRING__IGNORE "STRING-ignored" // Used when expr:string not allowed +// IEEE: edge_descriptor +%token yaEDGEDESC "EDGE DESCRIPTOR" %token yaTIMINGSPEC "TIMING SPEC ELEMENT" @@ -5797,14 +5799,21 @@ setuphold_timing_check: // ==IEEE: $setuphold_timing_check ; timing_check_event: // ==IEEE: $timing_check_event - terminal_identifier { $$ = $1; } - | yPOSEDGE terminal_identifier { $$ = $2; } - | yNEGEDGE terminal_identifier { $$ = $2; } - | yEDGE terminal_identifier { $$ = $2; } - | terminal_identifier yP_ANDANDAND expr { $$ = $1; } - | yPOSEDGE terminal_identifier yP_ANDANDAND expr { $$ = $2; } - | yNEGEDGE terminal_identifier yP_ANDANDAND expr { $$ = $2; } - | yEDGE terminal_identifier yP_ANDANDAND expr { $$ = $2; } + terminal_identifier { $$ = $1; } + | yPOSEDGE terminal_identifier { $$ = $2; } + | yNEGEDGE terminal_identifier { $$ = $2; } + | yEDGE terminal_identifier { $$ = $2; } + | yEDGE '[' edge_descriptor_list ']' terminal_identifier { $$ = $5; } + | terminal_identifier yP_ANDANDAND expr { $$ = $1; } + | yPOSEDGE terminal_identifier yP_ANDANDAND expr { $$ = $2; } + | yNEGEDGE terminal_identifier yP_ANDANDAND expr { $$ = $2; } + | yEDGE terminal_identifier yP_ANDANDAND expr { $$ = $2; } + | yEDGE '[' edge_descriptor_list ']' terminal_identifier yP_ANDANDAND expr { $$ = $5; } + ; + +edge_descriptor_list: + yaEDGEDESC { } + | edge_descriptor_list ',' yaEDGEDESC { } ; timing_check_limit: