Reject if not minlen from inside pattern matcher

This commit is contained in:
Eddie Hung 2019-08-21 14:26:24 -07:00
parent cab2bd083e
commit 1c7d721558
2 changed files with 11 additions and 8 deletions

View File

@ -30,14 +30,11 @@ bool did_something;
#include "passes/pmgen/ice40_dsp_pm.h"
#include "passes/pmgen/peepopt_pm.h"
void reduce_chain(xilinx_srl_pm &pm, int minlen)
void reduce_chain(xilinx_srl_pm &pm)
{
auto &st = pm.st_reduce;
auto &ud = pm.ud_reduce;
if (GetSize(ud.longest_chain) < minlen)
return;
log("Found chain of length %d (%s):\n", GetSize(ud.longest_chain), log_id(st.first->type));
auto last_cell = ud.longest_chain.back();
@ -115,9 +112,14 @@ struct XilinxSrlPass : public Pass {
}
extra_args(args, argidx, design);
auto f = std::bind(reduce_chain, std::placeholders::_1, minlen);
for (auto module : design->selected_modules())
while (xilinx_srl_pm(module, module->selected_cells()).run_reduce(f)) {}
for (auto module : design->selected_modules()) {
bool did_something = false;
do {
auto pm = xilinx_srl_pm(module, module->selected_cells());
pm.ud_reduce.minlen = minlen;
did_something = pm.run_reduce(reduce_chain);
} while (did_something);
}
}
} XilinxSrlPass;

View File

@ -2,6 +2,7 @@ pattern reduce
udata <vector<Cell*>> chain longest_chain
udata <pool<Cell*>> non_first_cells
udata <int> minlen
code
non_first_cells.clear();
@ -38,7 +39,7 @@ code
finally
chain.pop_back();
log_assert(chain.empty());
if (GetSize(longest_chain) > 1)
if (GetSize(longest_chain) >= minlen)
accept;
endcode