diff options
author | Eddie Hung <eddie@fpgeh.com> | 2019-09-18 09:39:59 -0700 |
---|---|---|
committer | Eddie Hung <eddie@fpgeh.com> | 2019-09-18 09:39:59 -0700 |
commit | 1f18736d20787ec3f88b63df2e277e4ca3034415 (patch) | |
tree | ffe110840860d8772d4ed7ac893928ed7f845583 /passes/pmgen/xilinx_dsp.cc | |
parent | 0932e23dffe0a270d4e41a0f09c0bf06b6998091 (diff) | |
download | yosys-1f18736d20787ec3f88b63df2e277e4ca3034415.tar.gz yosys-1f18736d20787ec3f88b63df2e277e4ca3034415.tar.bz2 yosys-1f18736d20787ec3f88b63df2e277e4ca3034415.zip |
Add support for overflow using pattern detector
Diffstat (limited to 'passes/pmgen/xilinx_dsp.cc')
-rw-r--r-- | passes/pmgen/xilinx_dsp.cc | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/passes/pmgen/xilinx_dsp.cc b/passes/pmgen/xilinx_dsp.cc index e0c7823ed..786582cfa 100644 --- a/passes/pmgen/xilinx_dsp.cc +++ b/passes/pmgen/xilinx_dsp.cc @@ -271,6 +271,7 @@ void pack_xilinx_dsp(dict<SigBit, Cell*> &bit_to_driver, xilinx_dsp_pm &pm) log("postAdd: %s\n", log_id(st.postAdd, "--")); log("postAddMux: %s\n", log_id(st.postAddMux, "--")); log("ffP: %s %s %s\n", log_id(st.ffP, "--"), log_id(st.ffPcemux, "--"), log_id(st.ffPrstmux, "--")); + log("overflow: %s\n", log_id(st.overflow, "--")); #endif log("Analysing %s.%s for Xilinx DSP packing.\n", log_id(pm.module), log_id(st.dsp)); @@ -329,6 +330,24 @@ void pack_xilinx_dsp(dict<SigBit, Cell*> &bit_to_driver, xilinx_dsp_pm &pm) pm.autoremove(st.postAdd); } + if (st.overflow) { + log(" overflow %s (%s)\n", log_id(st.overflow), log_id(st.overflow->type)); + cell->setParam("\\USE_PATTERN_DETECT", Const("PATDET")); + cell->setParam("\\SEL_PATTERN", Const("PATTERN")); + cell->setParam("\\SEL_MASK", Const("MASK")); + + if (st.overflow->type == "$ge") { + int B = st.overflow->getPort("\\B").as_int(); + log_assert((B & (B-1)) == 0); // Exact power of 2 + + cell->setParam("\\MASK", Const(B-1, 48)); + cell->setParam("\\PATTERN", Const(0, 48)); + cell->setPort("\\OVERFLOW", st.overflow->getPort("\\Y")); + } + else log_abort(); + + pm.autoremove(st.overflow); + } if (st.clock != SigBit()) { |