Fixed bug where counter extraction on non-GreenPAK devices incorrectly handled parallel counter output

This commit is contained in:
Andrew Zonenberg 2017-09-14 10:18:49 -07:00
parent c8f2f082c6
commit 367d6b2194
1 changed files with 27 additions and 32 deletions

View File

@ -281,44 +281,34 @@ int counter_tryextract(
max_loads = 3; max_loads = 3;
if(cnout_loads.size() > max_loads) if(cnout_loads.size() > max_loads)
{ {
//If we specified a limited set of cells for parallel output, check that we only drive them for(auto c : cnout_loads)
if(!parallel_cells.empty())
{ {
for(auto c : cnout_loads) if(c == underflow_inv)
{ continue;
if(c == underflow_inv) if(c == cell)
continue; continue;
if(c == cell) if(c == muxload)
continue; 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 //Make sure we're in the whitelist
if( parallel_cells.find(c->type) == parallel_cells.end()) if( parallel_cells.find(c->type) == parallel_cells.end())
return 17; return 17;
}
//Figure out what port(s) are driven by it //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? //TODO: this can probably be done more efficiently w/o multiple iterations over our whole net?
RTLIL::IdString portname; for(auto b : qport)
for(auto b : qport) {
pool<ModIndex::PortInfo> ports = index.query_ports(b);
for(auto x : ports)
{ {
pool<ModIndex::PortInfo> ports = index.query_ports(b); if(x.cell != c)
for(auto x : ports) continue;
{ extract.pouts.insert(ModIndex::PortInfo(c, x.port, 0));
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;
}
} }
//Save the other loads
extract.pouts.insert(ModIndex::PortInfo(c, portname, 0));
} }
} }
} }
@ -529,10 +519,15 @@ void counter_worker(
string reset_type = "non-resettable"; string reset_type = "non-resettable";
if(extract.has_reset) if(extract.has_reset)
{ {
if(extract.rst_inverted)
reset_type = "negative";
else
reset_type = "positive";
//TODO: support other kind of reset //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, extract.width,
reset_type.c_str(), reset_type.c_str(),
countname.c_str(), countname.c_str(),