From 4e73b1b133a3716c5bd0c4e3deb5c5bd7f73be00 Mon Sep 17 00:00:00 2001 From: Nick Gasson Date: Mon, 30 Jun 2008 17:47:45 +0100 Subject: [PATCH] Fix bug when resolving nexus to VHDL signal --- tgt-vhdl/scope.cc | 9 ++++++++- tgt-vhdl/vhdl.cc | 13 +++++++++---- tgt-vhdl/vhdl_target.h | 1 + 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/tgt-vhdl/scope.cc b/tgt-vhdl/scope.cc index 142c2d535..615ec1aea 100644 --- a/tgt-vhdl/scope.cc +++ b/tgt-vhdl/scope.cc @@ -38,6 +38,9 @@ vhdl_var_ref *nexus_to_var_ref(vhdl_scope *arch_scope, ivl_nexus_t nexus) ivl_signal_t sig; if ((sig = ivl_nexus_ptr_sig(nexus_ptr))) { + if (!seen_signal_before(sig)) + continue; + const char *signame = get_renamed_signal(sig).c_str(); vhdl_decl *decl = arch_scope->get_decl(signame); @@ -215,6 +218,8 @@ static void declare_signals(vhdl_entity *ent, ivl_scope_t scope) ent->get_scope()->add_decl (new vhdl_port_decl(name.c_str(), sig_type, VHDL_PORT_INOUT)); break; + default: + assert(false); } } } @@ -331,7 +336,9 @@ static void port_map(ivl_scope_t scope, vhdl_entity *parent, case IVL_SIP_INOUT: map_signal(sig, parent, inst); break; - } + default: + assert(false); + } } } diff --git a/tgt-vhdl/vhdl.cc b/tgt-vhdl/vhdl.cc index 670c928ae..c3a22bedd 100644 --- a/tgt-vhdl/vhdl.cc +++ b/tgt-vhdl/vhdl.cc @@ -90,12 +90,17 @@ void remember_entity(vhdl_entity* ent) g_entities.push_back(ent); } +bool seen_signal_before(ivl_signal_t sig) +{ + return g_known_signals.find(sig) != g_known_signals.end(); +} + /* * Remeber the association of signal to entity. */ void remember_signal(ivl_signal_t sig, const vhdl_scope *scope) { - assert(g_known_signals.find(sig) == g_known_signals.end()); + assert(!seen_signal_before(sig)); signal_defn_t defn = { ivl_signal_basename(sig), scope }; g_known_signals[sig] = defn; @@ -106,21 +111,21 @@ void remember_signal(ivl_signal_t sig, const vhdl_scope *scope) */ void rename_signal(ivl_signal_t sig, const std::string &renamed) { - assert(g_known_signals.find(sig) != g_known_signals.end()); + assert(seen_signal_before(sig)); g_known_signals[sig].renamed = renamed; } const vhdl_scope *find_scope_for_signal(ivl_signal_t sig) { - assert(g_known_signals.find(sig) != g_known_signals.end()); + assert(seen_signal_before(sig)); return g_known_signals[sig].scope; } const std::string &get_renamed_signal(ivl_signal_t sig) { - assert(g_known_signals.find(sig) != g_known_signals.end()); + assert(seen_signal_before(sig)); return g_known_signals[sig].renamed; } diff --git a/tgt-vhdl/vhdl_target.h b/tgt-vhdl/vhdl_target.h index 4e8109a1d..1d91a77e9 100644 --- a/tgt-vhdl/vhdl_target.h +++ b/tgt-vhdl/vhdl_target.h @@ -27,6 +27,7 @@ vhdl_entity *get_active_entity(); vhdl_var_ref *nexus_to_var_ref(vhdl_scope *arch_scope, ivl_nexus_t nexus); +bool seen_signal_before(ivl_signal_t sig); void remember_signal(ivl_signal_t sig, const vhdl_scope *scope); void rename_signal(ivl_signal_t sig, const std::string &renamed); const vhdl_scope *find_scope_for_signal(ivl_signal_t sig);