summaryrefslogtreecommitdiff
path: root/passes/sat
diff options
context:
space:
mode:
authorClifford Wolf <clifford@clifford.at>2015-06-30 17:11:46 +0200
committerClifford Wolf <clifford@clifford.at>2015-06-30 17:11:46 +0200
commitee9188a5b4013f22d2694d4c3e5bb7d08438bfb3 (patch)
treea4e32f15bd722916e6b2c2dd7f1b4addaeab5fd3 /passes/sat
parent7987f232003ea30ac9200e4ba0f5d14eae69505c (diff)
Added logic-loop error handling to freduce
Diffstat (limited to 'passes/sat')
-rw-r--r--passes/sat/freduce.cc11
1 files changed, 11 insertions, 0 deletions
diff --git a/passes/sat/freduce.cc b/passes/sat/freduce.cc
index 8a5301ec..a60de4ee 100644
--- a/passes/sat/freduce.cc
+++ b/passes/sat/freduce.cc
@@ -229,6 +229,7 @@ struct PerformReduction
SigMap &sigmap;
drivers_t &drivers;
std::set<std::pair<RTLIL::SigBit, RTLIL::SigBit>> &inv_pairs;
+ pool<SigBit> recursion_guard;
ezSatPtr ez;
SatGen satgen;
@@ -246,6 +247,15 @@ struct PerformReduction
if (sigdepth.count(out) != 0)
return sigdepth.at(out);
+ if (recursion_guard.count(out)) {
+ string loop_signals;
+ for (auto loop_bit : recursion_guard)
+ loop_signals += string(" ") + log_signal(loop_bit);
+ log_error("Found logic loop:%s\n", loop_signals.c_str());
+ }
+
+ recursion_guard.insert(out);
+
if (drivers.count(out) != 0) {
std::pair<RTLIL::Cell*, std::set<RTLIL::SigBit>> &drv = drivers.at(out);
if (celldone.count(drv.first) == 0) {
@@ -264,6 +274,7 @@ struct PerformReduction
sigdepth[out] = 0;
}
+ recursion_guard.erase(out);
return sigdepth.at(out);
}