Initialize and cleanup attr_ids before/after design processing.
diff --git a/systemverilog-plugin/UhdmAst.cc b/systemverilog-plugin/UhdmAst.cc index 0025a17..40e80cd 100644 --- a/systemverilog-plugin/UhdmAst.cc +++ b/systemverilog-plugin/UhdmAst.cc
@@ -53,6 +53,7 @@ static IdString low_high_bound; }; // namespace attr_id +// TODO(mglb): use attr_id::* directly everywhere and remove those methods. /*static*/ const IdString &UhdmAst::partial() { return attr_id::partial; } /*static*/ const IdString &UhdmAst::packed_ranges() { return attr_id::packed_ranges; } /*static*/ const IdString &UhdmAst::unpacked_ranges() { return attr_id::unpacked_ranges; } @@ -61,7 +62,7 @@ /*static*/ const IdString &UhdmAst::is_simplified_wire() { return attr_id::is_simplified_wire; } /*static*/ const IdString &UhdmAst::low_high_bound() { return attr_id::low_high_bound; } -void UhdmAst::static_init() +void attr_id_init() { // Initialize only once static bool already_initialized = false; @@ -82,6 +83,18 @@ attr_id::low_high_bound = IdString("$systemverilog_plugin$low_high_bound"); } +void attr_id_cleanup() +{ + // Release static copies of private IdStrings. + attr_id::low_high_bound = IdString(); + attr_id::is_simplified_wire = IdString(); + attr_id::is_imported = IdString(); + attr_id::force_convert = IdString(); + attr_id::unpacked_ranges = IdString(); + attr_id::packed_ranges = IdString(); + attr_id::partial = IdString(); +} + static void sanitize_symbol_name(std::string &name) { if (!name.empty()) { @@ -4715,6 +4728,8 @@ AST::AstNode *UhdmAst::visit_designs(const std::vector<vpiHandle> &designs) { + attr_id_init(); + current_node = new AST::AstNode(AST::AST_DESIGN); for (auto design : designs) { UhdmAst ast(this, shared, indent); @@ -4725,14 +4740,7 @@ } } - // Release static copies of private IdStrings. Those should be last instances in use. - attr_id::low_high_bound = IdString(); - attr_id::is_simplified_wire = IdString(); - attr_id::is_imported = IdString(); - attr_id::force_convert = IdString(); - attr_id::unpacked_ranges = IdString(); - attr_id::packed_ranges = IdString(); - attr_id::partial = IdString(); + attr_id_cleanup(); return current_node; }
diff --git a/systemverilog-plugin/UhdmAst.h b/systemverilog-plugin/UhdmAst.h index ad71834..81679e3 100644 --- a/systemverilog-plugin/UhdmAst.h +++ b/systemverilog-plugin/UhdmAst.h
@@ -168,11 +168,6 @@ // Visits all VPI design objects and returns created ASTs ::Yosys::AST::AstNode *visit_designs(const std::vector<vpiHandle> &designs); - // Does initialization of the class global data. - // Must be called before the first use of the class. - // Can be called multiple times; only the first call performs actual initialization. - static void static_init(); - static const ::Yosys::IdString &partial(); static const ::Yosys::IdString &packed_ranges(); static const ::Yosys::IdString &unpacked_ranges();
diff --git a/systemverilog-plugin/uhdmsurelogastfrontend.cc b/systemverilog-plugin/uhdmsurelogastfrontend.cc index 4233357..a0e71a6 100644 --- a/systemverilog-plugin/uhdmsurelogastfrontend.cc +++ b/systemverilog-plugin/uhdmsurelogastfrontend.cc
@@ -130,8 +130,6 @@ this->print_read_options(); } - virtual void on_register() override { UhdmAst::static_init(); } - AST::AstNode *parse(std::string filename) override { std::vector<const char *> cstrings;