mirror of https://github.com/YosysHQ/yosys.git
extract_counter: Add support for inverted clock enable
This commit is contained in:
parent
5fc180ed2d
commit
940bab6841
|
@ -93,6 +93,7 @@ struct CounterExtraction
|
||||||
RTLIL::Wire* rwire; //the register output
|
RTLIL::Wire* rwire; //the register output
|
||||||
bool has_reset; //true if we have a reset
|
bool has_reset; //true if we have a reset
|
||||||
bool has_ce; //true if we have a clock enable
|
bool has_ce; //true if we have a clock enable
|
||||||
|
bool ce_inverted; //true if clock enable is active low
|
||||||
RTLIL::SigSpec rst; //reset pin
|
RTLIL::SigSpec rst; //reset pin
|
||||||
bool rst_inverted; //true if reset is active low
|
bool rst_inverted; //true if reset is active low
|
||||||
bool rst_to_max; //true if we reset to max instead of 0
|
bool rst_to_max; //true if we reset to max instead of 0
|
||||||
|
@ -223,14 +224,24 @@ int counter_tryextract(
|
||||||
return 24;
|
return 24;
|
||||||
count_reg = *cey_loads.begin();
|
count_reg = *cey_loads.begin();
|
||||||
|
|
||||||
//Mux should have A driven by count Q, and B by muxy
|
|
||||||
//TODO: if A and B are swapped, CE polarity is inverted
|
|
||||||
if(sigmap(cemux->getPort(ID::B)) != muxy)
|
|
||||||
return 24;
|
|
||||||
if(sigmap(cemux->getPort(ID::A)) != sigmap(count_reg->getPort(ID(Q))))
|
|
||||||
return 24;
|
|
||||||
if(sigmap(cemux->getPort(ID::Y)) != sigmap(count_reg->getPort(ID(D))))
|
if(sigmap(cemux->getPort(ID::Y)) != sigmap(count_reg->getPort(ID(D))))
|
||||||
return 24;
|
return 24;
|
||||||
|
//Mux should have A driven by count Q, and B by muxy
|
||||||
|
//if A and B are swapped, CE polarity is inverted
|
||||||
|
if(sigmap(cemux->getPort(ID::B)) == muxy &&
|
||||||
|
sigmap(cemux->getPort(ID::A)) == sigmap(count_reg->getPort(ID(Q))))
|
||||||
|
{
|
||||||
|
extract.ce_inverted = false;
|
||||||
|
}
|
||||||
|
else if(sigmap(cemux->getPort(ID::A)) == muxy &&
|
||||||
|
sigmap(cemux->getPort(ID::B)) == sigmap(count_reg->getPort(ID(Q))))
|
||||||
|
{
|
||||||
|
extract.ce_inverted = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return 24;
|
||||||
|
}
|
||||||
|
|
||||||
//Select of the mux is our clock enable
|
//Select of the mux is our clock enable
|
||||||
extract.has_ce = true;
|
extract.has_ce = true;
|
||||||
|
@ -271,7 +282,9 @@ int counter_tryextract(
|
||||||
//Sanity check that we use the ALU output properly
|
//Sanity check that we use the ALU output properly
|
||||||
if(extract.has_ce)
|
if(extract.has_ce)
|
||||||
{
|
{
|
||||||
if(!is_full_bus(muxy, index, count_mux, ID::Y, cemux, ID::B))
|
if(!extract.ce_inverted && !is_full_bus(muxy, index, count_mux, ID::Y, cemux, ID::B))
|
||||||
|
return 16;
|
||||||
|
if(extract.ce_inverted && !is_full_bus(muxy, index, count_mux, ID::Y, cemux, ID::A))
|
||||||
return 16;
|
return 16;
|
||||||
if(!is_full_bus(cey, index, cemux, ID::Y, count_reg, ID(D)))
|
if(!is_full_bus(cey, index, cemux, ID::Y, count_reg, ID(D)))
|
||||||
return 16;
|
return 16;
|
||||||
|
@ -506,6 +519,13 @@ void counter_worker(
|
||||||
if(extract.has_ce)
|
if(extract.has_ce)
|
||||||
{
|
{
|
||||||
cell->setParam(ID(HAS_CE), RTLIL::Const(1));
|
cell->setParam(ID(HAS_CE), RTLIL::Const(1));
|
||||||
|
if(extract.ce_inverted)
|
||||||
|
{
|
||||||
|
auto realce = cell->module->addWire(NEW_ID);
|
||||||
|
cell->module->addNot(NEW_ID, extract.ce, RTLIL::SigSpec(realce));
|
||||||
|
cell->setPort(ID(CE), realce);
|
||||||
|
}
|
||||||
|
else
|
||||||
cell->setPort(ID(CE), extract.ce);
|
cell->setPort(ID(CE), extract.ce);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
Loading…
Reference in New Issue