aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Shah <dave@ds0.me>2019-09-19 21:21:21 +0100
committerDavid Shah <dave@ds0.me>2019-10-03 09:54:14 +0100
commite70e4afb60a41da6d9f6200b20f36f61c6b993b2 (patch)
tree4c006d3182e2b3a745c8ec5d9c07cce5a244deae
parentc9629516120930aedaf52d72fec5d7fabe51d496 (diff)
downloadyosys-e70e4afb60a41da6d9f6200b20f36f61c6b993b2.tar.gz
yosys-e70e4afb60a41da6d9f6200b20f36f61c6b993b2.tar.bz2
yosys-e70e4afb60a41da6d9f6200b20f36f61c6b993b2.zip
sv: Fix typedefs in packages
Signed-off-by: David Shah <dave@ds0.me>
-rw-r--r--frontends/ast/simplify.cc14
-rw-r--r--tests/svtypes/typedef_package.sv11
2 files changed, 21 insertions, 4 deletions
diff --git a/frontends/ast/simplify.cc b/frontends/ast/simplify.cc
index 9abd2916d..44e32b29c 100644
--- a/frontends/ast/simplify.cc
+++ b/frontends/ast/simplify.cc
@@ -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
index 000000000..4aa22b6af
--- /dev/null
+++ b/tests/svtypes/typedef_package.sv
@@ -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