Support logic typed parameters
authorLukasz Dalek <ldalek@antmicro.com>
Mon, 18 May 2020 19:02:19 +0000 (21:02 +0200)
committerKamil Rakoczy <krakoczy@antmicro.com>
Mon, 6 Jul 2020 07:18:48 +0000 (09:18 +0200)
Signed-off-by: Lukasz Dalek <ldalek@antmicro.com>
frontends/verilog/verilog_parser.y

index 656910c0cb3e2f0cfd82d1ea4eeefddc3f3de7f0..dfdb11cf0e6fe7a5086c6f47cc0b2683894c2850 100644 (file)
@@ -1337,8 +1337,6 @@ param_signed:
 
 param_integer:
        TOK_INTEGER {
-               if (astbuf1->children.size() != 1)
-                       frontend_verilog_yyerror("Internal error in param_integer - should not happen?");
                astbuf1->children.push_back(new AstNode(AST_RANGE));
                astbuf1->children.back()->children.push_back(AstNode::mkconst_int(31, true));
                astbuf1->children.back()->children.push_back(AstNode::mkconst_int(0, true));
@@ -1347,16 +1345,19 @@ param_integer:
 
 param_real:
        TOK_REAL {
-               if (astbuf1->children.size() != 1)
-                       frontend_verilog_yyerror("Parameter already declared as integer, cannot set to real.");
                astbuf1->children.push_back(new AstNode(AST_REALVALUE));
        }
 
+param_logic:
+       TOK_LOGIC {
+               // SV LRM 6.11, Table 6-8: logic -- 4-state, user-defined vector size, unsigned
+               astbuf1->is_signed = false;
+               astbuf1->is_logic = true;
+       }
+
 param_range:
        range {
                if ($1 != NULL) {
-                       if (astbuf1->children.size() != 1)
-                               frontend_verilog_yyerror("integer/real parameters should not have a range.");
                        astbuf1->children.push_back($1);
                }
        };
@@ -1365,8 +1366,10 @@ param_integer_type: param_integer param_signed
 param_range_type: type_vec param_signed param_range
 param_implicit_type: param_signed param_range
 
+param_integer_vector_type: param_logic param_signed param_range
+
 param_type:
-       param_integer_type | param_real | param_range_type | param_implicit_type |
+       param_integer_type | param_integer_vector_type | param_real | param_range_type | param_implicit_type |
        hierarchical_type_id {
                astbuf1->is_custom_type = true;
                astbuf1->children.push_back(new AstNode(AST_WIRETYPE));