1919#include < set>
2020#include < stdexcept>
2121#include < string>
22+ #include < unordered_map>
2223#include < variant>
2324#include < vector>
2425
@@ -1286,6 +1287,14 @@ void DefOut::Impl::writeNets(dbBlock* block)
12861287
12871288 auto sorted_nets = sortedSet (nets);
12881289
1290+ // Build map of mterm names and associated nets
1291+ std::unordered_map<std::string, std::set<dbNet*>> snet_term_map;
1292+ for (auto * inst : block->getInsts ()) {
1293+ for (auto * iterm : inst->getITerms ()) {
1294+ snet_term_map[iterm->getMTerm ()->getName ()].insert (iterm->getNet ());
1295+ }
1296+ }
1297+
12891298 for (dbNet* net : sorted_nets) {
12901299 if (_select_net_map) {
12911300 if (!(*_select_net_map)[net]) {
@@ -1319,7 +1328,7 @@ void DefOut::Impl::writeNets(dbBlock* block)
13191328 continue ;
13201329 }
13211330 if (net->isSpecial ()) {
1322- writeSNet (net);
1331+ writeSNet (net, snet_term_map );
13231332 }
13241333 }
13251334
@@ -1341,7 +1350,9 @@ void DefOut::Impl::writeNets(dbBlock* block)
13411350 *_out << " END NETS\n " ;
13421351}
13431352
1344- void DefOut::Impl::writeSNet (dbNet* net)
1353+ void DefOut::Impl::writeSNet (
1354+ dbNet* net,
1355+ const std::unordered_map<std::string, std::set<dbNet*>>& snet_term_map)
13451356{
13461357 std::string nname = net->getName ();
13471358 *_out << " - " << nname;
@@ -1365,7 +1376,12 @@ void DefOut::Impl::writeSNet(dbNet* net)
13651376 dbInst* inst = iterm->getInst ();
13661377 dbMTerm* mterm = iterm->getMTerm ();
13671378 char * mtname = mterm->getName (inst, &ttname[0 ]);
1368- if (net->isWildConnected ()) {
1379+ bool iswildcard = false ;
1380+ if (snet_term_map.at (mterm->getName ()).size () == 1 ) {
1381+ // mterm is unique to this net, so we can use wildcard
1382+ iswildcard = true ;
1383+ }
1384+ if (iswildcard) {
13691385 if (wild_names.find (mtname) == wild_names.end ()) {
13701386 *_out << " ( * " << mtname << " )" ;
13711387 ++i;
0 commit comments