systemverilog-plugin: dont simplify wire multiple times Signed-off-by: Kamil Rakoczy <krakoczy@antmicro.com>
diff --git a/systemverilog-plugin/UhdmAst.cc b/systemverilog-plugin/UhdmAst.cc index 4292cfc..a3f1315 100644 --- a/systemverilog-plugin/UhdmAst.cc +++ b/systemverilog-plugin/UhdmAst.cc
@@ -1149,13 +1149,13 @@ AST_INTERNAL::current_scope[current_node->str] = current_node; break; case AST::AST_WIRE: - delete_attribute(current_node, UhdmAst::is_simplified_wire()); - current_node->attributes[UhdmAst::is_simplified_wire()] = AST::AstNode::mkconst_int(1, true); - [[fallthrough]]; case AST::AST_PARAMETER: case AST::AST_LOCALPARAM: - AST_INTERNAL::current_scope[current_node->str] = current_node; - convert_packed_unpacked_range(current_node); + if (!current_node->attributes.count(UhdmAst::is_simplified_wire())) { + current_node->attributes[UhdmAst::is_simplified_wire()] = AST::AstNode::mkconst_int(1, true); + AST_INTERNAL::current_scope[current_node->str] = current_node; + convert_packed_unpacked_range(current_node); + } break; case AST::AST_IDENTIFIER: if (!current_node->children.empty() && !current_node->basic_prep) { @@ -1183,19 +1183,22 @@ break; case AST::AST_STRUCT: case AST::AST_UNION: - simplify_struct(current_node, 0, parent_node); - // instance rather than just a type in a typedef or outer struct? - if (!current_node->str.empty() && current_node->str[0] == '\\') { - // instance so add a wire for the packed structure - auto wnode = make_packed_struct_local(current_node, current_node->str); - convert_packed_unpacked_range(wnode); - log_assert(AST_INTERNAL::current_ast_mod); - AST_INTERNAL::current_ast_mod->children.push_back(wnode); - AST_INTERNAL::current_scope[wnode->str]->attributes[ID::wiretype] = AST::AstNode::mkconst_str(current_node->str); - AST_INTERNAL::current_scope[wnode->str]->attributes[ID::wiretype]->id2ast = current_node; - } + if (!current_node->attributes.count(UhdmAst::is_simplified_wire())) { + current_node->attributes[UhdmAst::is_simplified_wire()] = AST::AstNode::mkconst_int(1, true); + simplify_struct(current_node, 0, parent_node); + // instance rather than just a type in a typedef or outer struct? + if (!current_node->str.empty() && current_node->str[0] == '\\') { + // instance so add a wire for the packed structure + auto wnode = make_packed_struct_local(current_node, current_node->str); + convert_packed_unpacked_range(wnode); + log_assert(AST_INTERNAL::current_ast_mod); + AST_INTERNAL::current_ast_mod->children.push_back(wnode); + AST_INTERNAL::current_scope[wnode->str]->attributes[ID::wiretype] = AST::AstNode::mkconst_str(current_node->str); + AST_INTERNAL::current_scope[wnode->str]->attributes[ID::wiretype]->id2ast = current_node; + } - current_node->basic_prep = true; + current_node->basic_prep = true; + } break; case AST::AST_STRUCT_ITEM: AST_INTERNAL::current_scope[current_node->str] = current_node;