mirror of https://github.com/YosysHQ/yosys.git
coolrunner2: Generate a feed-through AND term when necessary
This commit is contained in:
parent
6775177171
commit
fa04366f38
|
@ -161,19 +161,16 @@ struct Coolrunner2SopPass : public Pass {
|
||||||
// Special P-term handling
|
// Special P-term handling
|
||||||
if (is_special_pterm)
|
if (is_special_pterm)
|
||||||
{
|
{
|
||||||
if (!has_invert)
|
if (!has_invert || special_pterm_can_invert)
|
||||||
{
|
{
|
||||||
// Can connect the P-term directly to the special term sinks
|
// Can connect the P-term directly to the special term sinks
|
||||||
for (auto x : special_pterms_inv[sop_output]) {
|
for (auto x : special_pterms_inv[sop_output])
|
||||||
log("%s %s", std::get<0>(x)->name.c_str(), std::get<1>(x).c_str());
|
std::get<0>(x)->setPort(std::get<1>(x), *intermed_wires.begin());
|
||||||
|
for (auto x : special_pterms_no_inv[sop_output])
|
||||||
std::get<0>(x)->setPort(std::get<1>(x), *intermed_wires.begin());
|
std::get<0>(x)->setPort(std::get<1>(x), *intermed_wires.begin());
|
||||||
}
|
}
|
||||||
for (auto x : special_pterms_no_inv[sop_output]) {
|
|
||||||
log("%s %s", std::get<0>(x)->name.c_str(), std::get<1>(x).c_str());
|
if (has_invert)
|
||||||
std::get<0>(x)->setPort(std::get<1>(x), *intermed_wires.begin());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
if (special_pterm_can_invert)
|
if (special_pterm_can_invert)
|
||||||
{
|
{
|
||||||
|
@ -184,10 +181,19 @@ struct Coolrunner2SopPass : public Pass {
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Need to construct a set of feed-through terms
|
// Need to construct a feed-through term
|
||||||
|
auto feedthrough_out = module->addWire(NEW_ID);
|
||||||
|
auto feedthrough_cell = module->addCell(NEW_ID, "\\ANDTERM");
|
||||||
|
feedthrough_cell->setParam("\\TRUE_INP", 1);
|
||||||
|
feedthrough_cell->setParam("\\COMP_INP", 0);
|
||||||
|
feedthrough_cell->setPort("\\OUT", feedthrough_out);
|
||||||
|
feedthrough_cell->setPort("\\IN", sop_output);
|
||||||
|
feedthrough_cell->setPort("\\IN_B", SigSpec());
|
||||||
|
|
||||||
// XXX TODO
|
for (auto x : special_pterms_inv[sop_output])
|
||||||
log_assert(!"not implemented yet");
|
std::get<0>(x)->setPort(std::get<1>(x), feedthrough_out);
|
||||||
|
for (auto x : special_pterms_no_inv[sop_output])
|
||||||
|
std::get<0>(x)->setPort(std::get<1>(x), feedthrough_out);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -211,7 +217,19 @@ struct Coolrunner2SopPass : public Pass {
|
||||||
|
|
||||||
if (is_special_pterm)
|
if (is_special_pterm)
|
||||||
{
|
{
|
||||||
// Need to construct a set of feed-through terms
|
// Need to construct a feed-through term
|
||||||
|
auto feedthrough_out = module->addWire(NEW_ID);
|
||||||
|
auto feedthrough_cell = module->addCell(NEW_ID, "\\ANDTERM");
|
||||||
|
feedthrough_cell->setParam("\\TRUE_INP", 1);
|
||||||
|
feedthrough_cell->setParam("\\COMP_INP", 0);
|
||||||
|
feedthrough_cell->setPort("\\OUT", feedthrough_out);
|
||||||
|
feedthrough_cell->setPort("\\IN", sop_output);
|
||||||
|
feedthrough_cell->setPort("\\IN_B", SigSpec());
|
||||||
|
|
||||||
|
for (auto x : special_pterms_inv[sop_output])
|
||||||
|
std::get<0>(x)->setPort(std::get<1>(x), feedthrough_out);
|
||||||
|
for (auto x : special_pterms_no_inv[sop_output])
|
||||||
|
std::get<0>(x)->setPort(std::get<1>(x), feedthrough_out);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue