diff options
| -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  | 
