Fix handling of unique/unique0/priority cases in the frontend.
authorMarcelina Kościelnicka <mwk@0x04.net>
Mon, 22 Feb 2021 18:19:42 +0000 (19:19 +0100)
committerMarcelina Kościelnicka <mwk@0x04.net>
Thu, 25 Feb 2021 20:53:58 +0000 (21:53 +0100)
Basically:

- priority converts to (* full_case *)
- unique0 converts to (* parallel_case *)
- unique converts to (* parallel_case, full_case *)

Fixes #2596.

frontends/verilog/verilog_lexer.l
frontends/verilog/verilog_parser.y

index f2241066ff8a75c169938ccf92baa67f2df27ac2..eeb7440f81f963962fc8db91f597943f458543e2 100644 (file)
@@ -234,7 +234,7 @@ static bool isUserType(std::string &s)
 "automatic"    { return TOK_AUTOMATIC; }
 
 "unique"       { SV_KEYWORD(TOK_UNIQUE); }
-"unique0"      { SV_KEYWORD(TOK_UNIQUE); }
+"unique0"      { SV_KEYWORD(TOK_UNIQUE0); }
 "priority"     { SV_KEYWORD(TOK_PRIORITY); }
 
 "always_comb"  { SV_KEYWORD(TOK_ALWAYS_COMB); }
index 89e68681826447bd4444eaf708aea4203f3b600e..dc7ec8348735c75f81c1b8d5baff673e423fd901 100644 (file)
@@ -277,7 +277,7 @@ static void rewriteAsMemoryNode(AstNode *node, AstNode *rangeNode)
 %token TOK_SUPPLY0 TOK_SUPPLY1 TOK_TO_SIGNED TOK_TO_UNSIGNED
 %token TOK_POS_INDEXED TOK_NEG_INDEXED TOK_PROPERTY TOK_ENUM TOK_TYPEDEF
 %token TOK_RAND TOK_CONST TOK_CHECKER TOK_ENDCHECKER TOK_EVENTUALLY
-%token TOK_INCREMENT TOK_DECREMENT TOK_UNIQUE TOK_PRIORITY
+%token TOK_INCREMENT TOK_DECREMENT TOK_UNIQUE TOK_UNIQUE0 TOK_PRIORITY
 %token TOK_STRUCT TOK_PACKED TOK_UNSIGNED TOK_INT TOK_BYTE TOK_SHORTINT TOK_UNION
 %token TOK_OR_ASSIGN TOK_XOR_ASSIGN TOK_AND_ASSIGN TOK_SUB_ASSIGN
 
@@ -286,7 +286,7 @@ static void rewriteAsMemoryNode(AstNode *node, AstNode *rangeNode)
 %type <string> opt_label opt_sva_label tok_prim_wrapper hierarchical_id hierarchical_type_id integral_number
 %type <string> type_name
 %type <ast> opt_enum_init enum_type struct_type non_wire_data_type
-%type <boolean> opt_signed opt_property unique_case_attr always_comb_or_latch always_or_always_ff
+%type <boolean> opt_signed opt_property always_comb_or_latch always_or_always_ff
 %type <al> attr case_attr
 %type <ast> struct_union
 
@@ -2559,20 +2559,21 @@ behavioral_stmt:
                ast_stack.pop_back();
        };
 
-unique_case_attr:
-       %empty {
-               $$ = false;
+case_attr:
+       attr {
+               $$ = $1;
        } |
-       TOK_PRIORITY case_attr {
-               $$ = $2;
+       attr TOK_UNIQUE0 {
+               (*$1)[ID::parallel_case] = AstNode::mkconst_int(1, false);
+               $$ = $1;
        } |
-       TOK_UNIQUE case_attr {
-               $$ = true;
-       };
-
-case_attr:
-       attr unique_case_attr {
-               if ($2) (*$1)[ID::parallel_case] = AstNode::mkconst_int(1, false);
+       attr TOK_PRIORITY {
+               (*$1)[ID::full_case] = AstNode::mkconst_int(1, false);
+               $$ = $1;
+       } |
+       attr TOK_UNIQUE {
+               (*$1)[ID::full_case] = AstNode::mkconst_int(1, false);
+               (*$1)[ID::parallel_case] = AstNode::mkconst_int(1, false);
                $$ = $1;
        };