From fa04366f38797f882d90c40dbcc3854a2f9140c9 Mon Sep 17 00:00:00 2001 From: Robert Ou Date: Wed, 30 Aug 2017 16:46:32 -0700 Subject: [PATCH] coolrunner2: Generate a feed-through AND term when necessary --- techlibs/coolrunner2/coolrunner2_sop.cc | 44 +++++++++++++++++-------- 1 file changed, 31 insertions(+), 13 deletions(-) diff --git a/techlibs/coolrunner2/coolrunner2_sop.cc b/techlibs/coolrunner2/coolrunner2_sop.cc index d526f8036..089d3b438 100644 --- a/techlibs/coolrunner2/coolrunner2_sop.cc +++ b/techlibs/coolrunner2/coolrunner2_sop.cc @@ -161,19 +161,16 @@ struct Coolrunner2SopPass : public Pass { // Special P-term handling 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 - for (auto x : special_pterms_inv[sop_output]) { - log("%s %s", std::get<0>(x)->name.c_str(), std::get<1>(x).c_str()); + for (auto x : special_pterms_inv[sop_output]) 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()); + for (auto x : special_pterms_no_inv[sop_output]) std::get<0>(x)->setPort(std::get<1>(x), *intermed_wires.begin()); - } } - else + + if (has_invert) { if (special_pterm_can_invert) { @@ -184,10 +181,19 @@ struct Coolrunner2SopPass : public Pass { } else { - // Need to construct a set of feed-through terms - - // XXX TODO - log_assert(!"not implemented yet"); + // 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); } } } @@ -211,7 +217,19 @@ struct Coolrunner2SopPass : public Pass { 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); } } -- 2.30.2