diff options
author | Andrew Zonenberg <azonenberg@drawersteak.com> | 2017-09-14 10:18:49 -0700 |
---|---|---|
committer | Andrew Zonenberg <azonenberg@drawersteak.com> | 2017-09-14 10:27:10 -0700 |
commit | 367d6b2194c6ba2b09b81b6cd2946702cb5ce895 (patch) | |
tree | 3f8aa04e338c8cde3d96f37cf9c4a4a1c0a1b06a | |
parent | c8f2f082c6e20a50ca7efe8c5a67d26f2e24a4ab (diff) | |
download | yosys-367d6b2194c6ba2b09b81b6cd2946702cb5ce895.tar.gz yosys-367d6b2194c6ba2b09b81b6cd2946702cb5ce895.tar.bz2 yosys-367d6b2194c6ba2b09b81b6cd2946702cb5ce895.zip |
Fixed bug where counter extraction on non-GreenPAK devices incorrectly handled parallel counter output
-rw-r--r-- | passes/techmap/extract_counter.cc | 59 |
1 files 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<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(), |