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: