diff options
author | Robert Ou <rqou@robertou.com> | 2017-08-30 16:46:32 -0700 |
---|---|---|
committer | Andrew Zonenberg <azonenberg@drawersteak.com> | 2017-09-01 07:22:01 -0700 |
commit | fa04366f38797f882d90c40dbcc3854a2f9140c9 (patch) | |
tree | b55cd8986ae27d426cec8f4b242d4d8449e7902e | |
parent | 6775177171e70c64292a78a5d860d7b82d5c64b9 (diff) | |
download | yosys-fa04366f38797f882d90c40dbcc3854a2f9140c9.tar.gz yosys-fa04366f38797f882d90c40dbcc3854a2f9140c9.tar.bz2 yosys-fa04366f38797f882d90c40dbcc3854a2f9140c9.zip |
coolrunner2: Generate a feed-through AND term when necessary
-rw-r--r-- | techlibs/coolrunner2/coolrunner2_sop.cc | 44 |
1 files 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); } } |