aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobert Ou <rqou@robertou.com>2017-08-30 16:46:32 -0700
committerAndrew Zonenberg <azonenberg@drawersteak.com>2017-09-01 07:22:01 -0700
commitfa04366f38797f882d90c40dbcc3854a2f9140c9 (patch)
treeb55cd8986ae27d426cec8f4b242d4d8449e7902e
parent6775177171e70c64292a78a5d860d7b82d5c64b9 (diff)
downloadyosys-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.cc44
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);
}
}