From 367d6b2194c6ba2b09b81b6cd2946702cb5ce895 Mon Sep 17 00:00:00 2001 From: Andrew Zonenberg Date: Thu, 14 Sep 2017 10:18:49 -0700 Subject: [PATCH] Fixed bug where counter extraction on non-GreenPAK devices incorrectly handled parallel counter output --- passes/techmap/extract_counter.cc | 59 ++++++++++++++----------------- 1 file changed, 27 insertions(+), 32 deletions(-) diff --git a/passes/techmap/extract_counter.cc b/passes/techmap/extract_counter.cc index 27fc558ad..af0eb852a 100644 --- a/passes/techmap/extract_counter.cc +++ b/passes/techmap/extract_counter.cc @@ -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 ports = index.query_ports(b); + for(auto x : ports) { - pool 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(), -- 2.30.2