Fixed bugs in the k6n10f dsp_macc inference pass Signed-off-by: Maciej Kurc <mkurc@antmicro.com>
diff --git a/ql-qlf-plugin/ql-dsp-macc.cc b/ql-qlf-plugin/ql-dsp-macc.cc index c422d31..f95ca87 100644 --- a/ql-qlf-plugin/ql-dsp-macc.cc +++ b/ql-qlf-plugin/ql-dsp-macc.cc
@@ -55,6 +55,11 @@ } } + // Accept only posedge clocked FFs + if (st.ff->getParam(ID(CLK_POLARITY)) != RTLIL::S1) { + return; + } + // Get port widths size_t a_width = GetSize(st.mul->getPort(ID(A))); size_t b_width = GetSize(st.mul->getPort(ID(B))); @@ -146,13 +151,21 @@ RTLIL::SigSpec ena; if (st.ff->hasPort(ID(ARST))) { - rst = st.ff->getPort(ID(ARST)); + if (st.ff->getParam(ID(ARST_POLARITY)) != RTLIL::S0) { + rst = pm.module->Not(NEW_ID, st.ff->getPort(ID(ARST))); + } else { + rst = st.ff->getPort(ID(ARST)); + } } else { - rst = RTLIL::SigSpec(RTLIL::S0); + rst = RTLIL::SigSpec(RTLIL::S1); } if (st.ff->hasPort(ID(EN))) { - ena = st.ff->getPort(ID(EN)); + if (st.ff->getParam(ID(EN_POLARITY)) != RTLIL::S1) { + ena = pm.module->Not(NEW_ID, st.ff->getPort(ID(EN))); + } else { + ena = st.ff->getPort(ID(EN)); + } } else { ena = RTLIL::SigSpec(RTLIL::S1); } @@ -166,19 +179,20 @@ // Depending on the mux port ordering insert inverter if needed log_assert(st.mux_ab == ID(A) || st.mux_ab == ID(B)); - if (st.mux_ab == ID(B)) { + if (st.mux_ab == ID(A)) { sig_s = pm.module->Not(NEW_ID, sig_s); } // Assemble the full control signal for the feedback_i port RTLIL::SigSpec sig_f; - sig_f.append(RTLIL::S0); sig_f.append(sig_s); + sig_f.append(RTLIL::S0); + sig_f.append(RTLIL::S0); cell->setPort(RTLIL::escape_id("feedback_i"), sig_f); } // No acc clear/load else { - cell->setPort(RTLIL::escape_id("feedback_i"), RTLIL::SigSpec(RTLIL::S0, 2)); + cell->setPort(RTLIL::escape_id("feedback_i"), RTLIL::SigSpec(RTLIL::S0, 3)); } // Connect control ports @@ -196,7 +210,7 @@ // 3 - output post acc // 1 - output pre acc - cell->setPort(RTLIL::escape_id("output_select_i"), out_ff ? RTLIL::Const(3, 3) : RTLIL::Const(1, 3)); + cell->setPort(RTLIL::escape_id("output_select_i"), out_ff ? RTLIL::Const(1, 3) : RTLIL::Const(3, 3)); // Mark the cells for removal pm.autoremove(st.mul);