Fixed bug where counter extraction on non-GreenPAK devices incorrectly handled parall...
authorAndrew Zonenberg <azonenberg@drawersteak.com>
Thu, 14 Sep 2017 17:18:49 +0000 (10:18 -0700)
committerAndrew Zonenberg <azonenberg@drawersteak.com>
Thu, 14 Sep 2017 17:27:10 +0000 (10:27 -0700)
passes/techmap/extract_counter.cc

index 27fc558ad5ee7801e89a302b139ef51ee6e52a19..af0eb852a508b4ce97c9e439ca4a14ab58f1551a 100644 (file)
@@ -281,44 +281,34 @@ int counter_tryextract(
                max_loads = 3;
        if(cnout_loads.size() > max_loads)
        {
-               //If we specified a limited set of cells for parallel output, check that we only drive them
-               if(!parallel_cells.empty())
+               for(auto c : cnout_loads)
                {
-                       for(auto c : cnout_loads)
-                       {
-                               if(c == underflow_inv)
-                                       continue;
-                               if(c == cell)
-                                       continue;
-                               if(c == muxload)
-                                       continue;
+                       if(c == underflow_inv)
+                               continue;
+                       if(c == cell)
+                               continue;
+                       if(c == muxload)
+                               continue;
 
+                       //If we specified a limited set of cells for parallel output, check that we only drive them
+                       if(!parallel_cells.empty())
+                       {
                                //Make sure we're in the whitelist
                                if( parallel_cells.find(c->type) == parallel_cells.end())
                                        return 17;
+                       }
 
-                               //Figure out what port(s) are driven by it
-                               //TODO: this can probably be done more efficiently w/o multiple iterations over our whole net?
-                               RTLIL::IdString portname;
-                               for(auto b : qport)
+                       //Figure out what port(s) are driven by it
+                       //TODO: this can probably be done more efficiently w/o multiple iterations over our whole net?
+                       for(auto b : qport)
+                       {
+                               pool<ModIndex::PortInfo> ports = index.query_ports(b);
+                               for(auto x : ports)
                                {
-                                       pool<ModIndex::PortInfo> ports = index.query_ports(b);
-                                       for(auto x : ports)
-                                       {
-                                               if(x.cell != c)
-                                                       continue;
-                                               if(portname == "")
-                                                       portname = x.port;
-
-                                               //somehow our counter output is going to multiple ports
-                                               //this makes no sense, don't allow inference
-                                               else if(portname != x.port)
-                                                       return 17;
-                                       }
+                                       if(x.cell != c)
+                                               continue;
+                                       extract.pouts.insert(ModIndex::PortInfo(c, x.port, 0));
                                }
-
-                               //Save the other loads
-                               extract.pouts.insert(ModIndex::PortInfo(c, portname, 0));
                        }
                }
        }
@@ -529,10 +519,15 @@ void counter_worker(
        string reset_type = "non-resettable";
        if(extract.has_reset)
        {
+               if(extract.rst_inverted)
+                       reset_type = "negative";
+               else
+                       reset_type = "positive";
+
                //TODO: support other kind of reset
-               reset_type = "async resettable";
+               reset_type += " async resettable";
        }
-       log("  Found %d-bit %s down counter %s (counting from %d) for register %s declared at %s\n",
+       log("  Found %d-bit (%s) down counter %s (counting from %d) for register %s, declared at %s\n",
                extract.width,
                reset_type.c_str(),
                countname.c_str(),