From a01999451369c8dc880f3a05c36a7a09bcbcc380 Mon Sep 17 00:00:00 2001 From: Martin Whitaker Date: Wed, 23 Dec 2020 19:16:14 +0000 Subject: [PATCH] Fix search for class imported from another package (issue #437). --- elab_scope.cc | 2 +- elab_sig.cc | 2 +- elaborate.cc | 2 +- net_scope.cc | 15 ++++++++++----- netlist.h | 2 +- 5 files changed, 14 insertions(+), 9 deletions(-) diff --git a/elab_scope.cc b/elab_scope.cc index 119d7f677..9c7613d88 100644 --- a/elab_scope.cc +++ b/elab_scope.cc @@ -468,7 +468,7 @@ static void elaborate_scope_class(Design*des, NetScope*scope, PClass*pclass) netclass_t*use_base_class = 0; if (base_class) { - use_base_class = scope->find_class(base_class->name); + use_base_class = scope->find_class(des, base_class->name); if (use_base_class == 0) { cerr << pclass->get_fileline() << ": error: " << "Base class " << base_class->name diff --git a/elab_sig.cc b/elab_sig.cc index 490d39401..ea8bcafc6 100644 --- a/elab_sig.cc +++ b/elab_sig.cc @@ -198,7 +198,7 @@ static void elaborate_sig_classes(Design*des, NetScope*scope, { for (map::const_iterator cur = classes.begin() ; cur != classes.end() ; ++ cur) { - netclass_t*use_class = scope->find_class(cur->second->pscope_name()); + netclass_t*use_class = scope->find_class(des, cur->second->pscope_name()); use_class->elaborate_sig(des, cur->second); } } diff --git a/elaborate.cc b/elaborate.cc index 7b938b00f..fc075ed03 100644 --- a/elaborate.cc +++ b/elaborate.cc @@ -6003,7 +6003,7 @@ static void elaborate_classes(Design*des, NetScope*scope, { for (map::const_iterator cur = classes.begin() ; cur != classes.end() ; ++ cur) { - netclass_t*use_class = scope->find_class(cur->second->pscope_name()); + netclass_t*use_class = scope->find_class(des, cur->second->pscope_name()); use_class->elaborate(des, cur->second); if (use_class->test_for_missing_initializers()) { diff --git a/net_scope.cc b/net_scope.cc index 31225eb92..48c3d7642 100644 --- a/net_scope.cc +++ b/net_scope.cc @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2019 Stephen Williams (steve@icarus.com) + * Copyright (c) 2000-2020 Stephen Williams (steve@icarus.com) * Copyright (c) 2016 CERN Michele Castellana (michele.castellana@cern.ch) * * This source code is free software; you can redistribute it @@ -702,7 +702,7 @@ NetNet* NetScope::find_signal(perm_string key) return 0; } -netclass_t*NetScope::find_class(perm_string name) +netclass_t*NetScope::find_class(const Design*des, perm_string name) { // Special case: The scope itself is the class that we are // looking for. This may happen for example when elaborating @@ -715,20 +715,25 @@ netclass_t*NetScope::find_class(perm_string name) if (cur != classes_.end()) return cur->second; + // Try the imports. + NetScope*import_scope = find_import(des, name); + if (import_scope) + return import_scope->find_class(des, name); + if (up_==0 && type_==CLASS) { assert(class_def_); NetScope*def_parent = class_def_->definition_scope(); - return def_parent->find_class(name); + return def_parent->find_class(des, name); } // Try looking up for the class. if (up_!=0 && type_!=MODULE) - return up_->find_class(name); + return up_->find_class(des, name); // Try the compilation unit. if (unit_ != 0) - return unit_->find_class(name); + return unit_->find_class(des, name); // Nowhere left to try... return 0; diff --git a/netlist.h b/netlist.h index 8ab6ca2a3..3c43517e2 100644 --- a/netlist.h +++ b/netlist.h @@ -1015,7 +1015,7 @@ class NetScope : public Definitions, public Attrib { void rem_signal(NetNet*); NetNet* find_signal(perm_string name); - netclass_t* find_class(perm_string name); + netclass_t* find_class(const Design*des, perm_string name); /* The unit(), parent(), and child() methods allow users of NetScope objects to locate nearby scopes. */