coolrunner2: Generate a feed-through AND term when necessary

This commit is contained in:
Robert Ou 2017-08-30 16:46:32 -07:00 committed by Andrew Zonenberg
parent 6775177171
commit fa04366f38
1 changed files with 30 additions and 12 deletions

View File

@ -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()); std::get<0>(x)->setPort(std::get<1>(x), *intermed_wires.begin());
} for (auto x : special_pterms_no_inv[sop_output])
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());
std::get<0>(x)->setPort(std::get<1>(x), *intermed_wires.begin()); std::get<0>(x)->setPort(std::get<1>(x), *intermed_wires.begin());
}
} }
else
if (has_invert)
{ {
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);
} }
} }