diff options
author | David Shah <dave@ds0.me> | 2019-11-15 18:08:27 +0000 |
---|---|---|
committer | David Shah <dave@ds0.me> | 2019-12-27 10:44:30 +0000 |
commit | c9a0033c5c7d5bfcf75df3afb0f877e61a1d0df5 (patch) | |
tree | 2e3dcfa15cab7bd00c375b174e33d3d69a0ffdf5 | |
parent | 3e21f894f4cbf843fbf3c9d1603886e63f2a8d5b (diff) | |
download | nextpnr-c9a0033c5c7d5bfcf75df3afb0f877e61a1d0df5.tar.gz nextpnr-c9a0033c5c7d5bfcf75df3afb0f877e61a1d0df5.tar.bz2 nextpnr-c9a0033c5c7d5bfcf75df3afb0f877e61a1d0df5.zip |
frontend/base: Fix lookup of nets by module index
Signed-off-by: David Shah <dave@ds0.me>
-rw-r--r-- | frontend/frontend_base.h | 58 |
1 files changed, 30 insertions, 28 deletions
diff --git a/frontend/frontend_base.h b/frontend/frontend_base.h index 40d03863..35558d2f 100644 --- a/frontend/frontend_base.h +++ b/frontend/frontend_base.h @@ -298,37 +298,39 @@ template <typename FrontendType> struct GenericFrontend // Get a net by index in modulestate (not flatindex); creating it if it doesn't already exist NetInfo *create_or_get_net(HierModuleState &m, int idx) { - std::string name; - if (idx < int(m.net_names.size()) && !m.net_names.at(idx).empty()) { - // Use the rule above to find the preferred name for a net - name = m.net_names.at(idx).at(0); - for (size_t j = 1; j < m.net_names.at(idx).size(); j++) - if (prefer_netlabel(m, m.net_names.at(idx).at(j), name)) - name = m.net_names.at(idx).at(j); - } else { - name = "$frontend$" + std::to_string(idx); - } - NetInfo *net = ctx->createNet(unique_name(m.prefix, name, true)); - // Add to the flat index of nets - net->udata = int(net_flatindex.size()); - net_flatindex.push_back(net); - // Add to the module-level index of nets auto &midx = m.net_by_idx(idx); - // Check we don't try and create more than one net with the same index - NPNR_ASSERT(midx == -1); - midx = net->udata; - // Create aliases for all possible names - if (idx < int(m.net_names.size()) && !m.net_names.at(idx).empty()) { - for (const auto &name : m.net_names.at(idx)) { - IdString name_id = ctx->id(name); - net->aliases.push_back(name_id); - ctx->net_aliases[name_id] = net->name; - } + if (midx != -1) { + return net_flatindex.at(midx); } else { - net->aliases.push_back(net->name); - ctx->net_aliases[net->name] = net->name; + std::string name; + if (idx < int(m.net_names.size()) && !m.net_names.at(idx).empty()) { + // Use the rule above to find the preferred name for a net + name = m.net_names.at(idx).at(0); + for (size_t j = 1; j < m.net_names.at(idx).size(); j++) + if (prefer_netlabel(m, m.net_names.at(idx).at(j), name)) + name = m.net_names.at(idx).at(j); + } else { + name = "$frontend$" + std::to_string(idx); + } + NetInfo *net = ctx->createNet(unique_name(m.prefix, name, true)); + // Add to the flat index of nets + net->udata = int(net_flatindex.size()); + net_flatindex.push_back(net); + // Add to the module-level index of netsd + midx = net->udata; + // Create aliases for all possible names + if (idx < int(m.net_names.size()) && !m.net_names.at(idx).empty()) { + for (const auto &name : m.net_names.at(idx)) { + IdString name_id = ctx->id(name); + net->aliases.push_back(name_id); + ctx->net_aliases[name_id] = net->name; + } + } else { + net->aliases.push_back(net->name); + ctx->net_aliases[net->name] = net->name; + } + return net; } - return net; } // Get the name of a vector bit given basename; settings and index |