sv: Fix typedefs in packages
authorDavid Shah <dave@ds0.me>
Thu, 19 Sep 2019 20:21:21 +0000 (21:21 +0100)
committerDavid Shah <dave@ds0.me>
Thu, 3 Oct 2019 08:54:14 +0000 (09:54 +0100)
Signed-off-by: David Shah <dave@ds0.me>
frontends/ast/simplify.cc
tests/svtypes/typedef_package.sv [new file with mode: 0644]

index 9abd2916d4669a755e484286373664f815f6bb07..44e32b29c830872ed9727b70c56f1f89d1c29b82 100644 (file)
@@ -796,14 +796,17 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage,
                        log_assert(children.size() == 1);
                        log_assert(children[0]->type == AST_WIRETYPE);
                        if (!current_scope.count(children[0]->str))
-                               log_file_error(filename, linenum, "Unknown identifier `%s' used as type name", children[0]->str.c_str());
+                               log_file_error(filename, linenum, "Unknown identifier `%s' used as type name\n", children[0]->str.c_str());
                        AstNode *resolved_type = current_scope.at(children[0]->str);
                        if (resolved_type->type != AST_TYPEDEF)
-                               log_file_error(filename, linenum, "`%s' does not name a type", children[0]->str.c_str());
+                               log_file_error(filename, linenum, "`%s' does not name a type\n", children[0]->str.c_str());
                        log_assert(resolved_type->children.size() == 1);
                        AstNode *templ = resolved_type->children[0];
                        delete_children(); // type reference no longer needed
 
+                       // Ensure typedef itself is fully simplified
+                       while(templ->simplify(const_fold, at_zero, in_lvalue, stage, width_hint, sign_hint, in_param)) {};
+
                        is_reg = templ->is_reg;
                        is_logic = templ->is_logic;
                        is_signed = templ->is_signed;
@@ -826,15 +829,18 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage,
                        log_assert(children.size() == 2);
                        log_assert(children[1]->type == AST_WIRETYPE);
                        if (!current_scope.count(children[1]->str))
-                               log_file_error(filename, linenum, "Unknown identifier `%s' used as type name", children[1]->str.c_str());
+                               log_file_error(filename, linenum, "Unknown identifier `%s' used as type name\n", children[1]->str.c_str());
                        AstNode *resolved_type = current_scope.at(children[1]->str);
                        if (resolved_type->type != AST_TYPEDEF)
-                               log_file_error(filename, linenum, "`%s' does not name a type", children[1]->str.c_str());
+                               log_file_error(filename, linenum, "`%s' does not name a type\n", children[1]->str.c_str());
                        log_assert(resolved_type->children.size() == 1);
                        AstNode *templ = resolved_type->children[0];
                        delete children[1];
                        children.pop_back();
 
+                       // Ensure typedef itself is fully simplified
+                       while(templ->simplify(const_fold, at_zero, in_lvalue, stage, width_hint, sign_hint, in_param)) {};
+
                        is_signed = templ->is_signed;
                        is_string = templ->is_string;
                        is_custom_type = templ->is_custom_type;
diff --git a/tests/svtypes/typedef_package.sv b/tests/svtypes/typedef_package.sv
new file mode 100644 (file)
index 0000000..4aa22b6
--- /dev/null
@@ -0,0 +1,11 @@
+package pkg;
+       typedef logic [7:0] uint8_t;
+endpackage
+
+module top;
+
+       (* keep *) pkg::uint8_t a = 8'hAA;
+
+       always @* assert(a == 8'hAA);
+
+endmodule
\ No newline at end of file