aboutsummaryrefslogtreecommitdiffstats
path: root/passes/pmgen/ice40_dsp.cc
diff options
context:
space:
mode:
authorEddie Hung <eddie@fpgeh.com>2019-07-26 10:15:36 -0700
committerEddie Hung <eddie@fpgeh.com>2019-07-26 10:15:36 -0700
commitc1a05f45577223c0585e93d728c8e04169c4598d (patch)
tree6c5d989afa06cfb5bae444cd507ae19860daf65b /passes/pmgen/ice40_dsp.cc
parentc39ccc65e9ba79aafa6ebd5c3abe9faf7d465a8f (diff)
downloadyosys-c1a05f45577223c0585e93d728c8e04169c4598d.tar.gz
yosys-c1a05f45577223c0585e93d728c8e04169c4598d.tar.bz2
yosys-c1a05f45577223c0585e93d728c8e04169c4598d.zip
Allow adders/accumulators with 33 bits using CO output
Diffstat (limited to 'passes/pmgen/ice40_dsp.cc')
-rw-r--r--passes/pmgen/ice40_dsp.cc11
1 files changed, 8 insertions, 3 deletions
diff --git a/passes/pmgen/ice40_dsp.cc b/passes/pmgen/ice40_dsp.cc
index 3ceffdbf6..c5655ad20 100644
--- a/passes/pmgen/ice40_dsp.cc
+++ b/passes/pmgen/ice40_dsp.cc
@@ -56,8 +56,8 @@ void create_ice40_dsp(ice40_dsp_pm &pm)
return;
}
- if (GetSize(st.sigO) > 32) {
- log(" accumulator (%s) is too large (%d > 32).\n", log_signal(st.sigO), GetSize(st.sigO));
+ if (GetSize(st.sigO) > 33) {
+ log(" adder/accumulator (%s) is too large (%d > 33).\n", log_signal(st.sigO), GetSize(st.sigO));
return;
}
@@ -137,7 +137,6 @@ void create_ice40_dsp(ice40_dsp_pm &pm)
cell->setPort("\\SIGNEXTOUT", pm.module->addWire(NEW_ID));
cell->setPort("\\CI", State::Sx);
- cell->setPort("\\CO", pm.module->addWire(NEW_ID));
cell->setPort("\\ACCUMCI", State::Sx);
cell->setPort("\\ACCUMCO", pm.module->addWire(NEW_ID));
@@ -145,6 +144,12 @@ void create_ice40_dsp(ice40_dsp_pm &pm)
// SB_MAC16 Output Interface
SigSpec O = st.sigO;
+ if (GetSize(O) == 33)
+ cell->setPort("\\CO", st.sigO[32]);
+ else {
+ log_assert(GetSize(O) <= 32);
+ cell->setPort("\\CO", pm.module->addWire(NEW_ID));
+ }
if (GetSize(O) < 32)
O.append(pm.module->addWire(NEW_ID, 32-GetSize(O)));