frontend/base: Fix lookup of nets by module index

Signed-off-by: David Shah <dave@ds0.me>
diff --git a/frontend/frontend_base.h b/frontend/frontend_base.h
index 40d0386..35558d2 100644
--- a/frontend/frontend_base.h
+++ b/frontend/frontend_base.h
@@ -298,37 +298,39 @@
     // 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