From 6068b8902f1e182a404423cdf686643719bbfdd7 Mon Sep 17 00:00:00 2001 From: Clifford Wolf Date: Sat, 10 Aug 2013 15:03:13 +0200 Subject: [PATCH] freduce performance fix --- passes/sat/freduce.cc | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/passes/sat/freduce.cc b/passes/sat/freduce.cc index 00968c730..d57fdd321 100644 --- a/passes/sat/freduce.cc +++ b/passes/sat/freduce.cc @@ -178,7 +178,7 @@ struct FreduceHelper return true; } - bool toproot_helper(RTLIL::SigSpec cursor, RTLIL::SigSpec stoplist, int level) + bool toproot_helper(RTLIL::SigSpec cursor, RTLIL::SigSpec stoplist, RTLIL::SigSpec &donelist, int level) { // log(" %*schecking %s: %s\n", level*2, "", log_signal(cursor), log_signal(stoplist)); @@ -187,13 +187,17 @@ struct FreduceHelper return false; } + if (donelist.extract(cursor).width != 0) + return true; + stoplist.append(cursor); std::set next = source_signals.find(cursor); for (auto &it : next) - if (!toproot_helper(it, stoplist, level+1)) + if (!toproot_helper(it, stoplist, donelist, level+1)) return false; + donelist.append(cursor); return true; } @@ -204,10 +208,10 @@ struct FreduceHelper sig.expand(); // log(" finding topological root in %s:\n", log_signal(sig)); for (auto &c : sig.chunks) { - RTLIL::SigSpec stoplist = sig; + RTLIL::SigSpec stoplist = sig, donelist; stoplist.remove(c); // log(" testing %s as root:\n", log_signal(c)); - if (toproot_helper(c, stoplist, 0)) + if (toproot_helper(c, stoplist, donelist, 0)) return c; } return RTLIL::SigSpec();