From ca9176cd0f7268fabd5bc9f56a66b4cfc09936d7 Mon Sep 17 00:00:00 2001 From: "Emil J. Tywoniak" Date: Mon, 10 Mar 2025 17:55:04 +0100 Subject: [PATCH] share: bail better on too many patterns --- passes/opt/share.cc | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/passes/opt/share.cc b/passes/opt/share.cc index 20ec8d358..7bb48eddc 100644 --- a/passes/opt/share.cc +++ b/passes/opt/share.cc @@ -856,18 +856,20 @@ struct ShareWorker } template - void insert_capped(pool& cache, Iterator begin_pattern, Iterator end_pattern) + bool insert_capped(pool& cache, Iterator begin_pattern, Iterator end_pattern) { if (cache.size() + std::distance(begin_pattern, end_pattern) > config.pattern_limit) { cache.clear(); cache.insert(ssc_pair_t()); + return false; } else { cache.insert(begin_pattern, end_pattern); } + return true; } - void insert_capped(pool& cache, ssc_pair_t pattern) + bool insert_capped(pool& cache, ssc_pair_t pattern) { - insert_capped(cache, &pattern, &pattern + 1); + return insert_capped(cache, &pattern, &pattern + 1); } const pool &find_cell_activation_patterns(RTLIL::Cell *cell, const char *indent) @@ -926,20 +928,29 @@ struct ShareWorker for (int i = 0; i < GetSize(sig_s); i++) p.first.append(sig_s[i]), p.second.bits().push_back(RTLIL::State::S0); if (sort_check_activation_pattern(p)) - insert_capped(activation_patterns_cache[cell], p); + if (!insert_capped(activation_patterns_cache[cell], p)) { + recursion_state.erase(cell); + return activation_patterns_cache[cell]; + } } for (int idx : used_in_b_parts) for (auto p : c_patterns) { p.first.append(sig_s[idx]), p.second.bits().push_back(RTLIL::State::S1); if (sort_check_activation_pattern(p)) - insert_capped(activation_patterns_cache[cell], p); + if (!insert_capped(activation_patterns_cache[cell], p)) { + recursion_state.erase(cell); + return activation_patterns_cache[cell]; + } } } for (auto c : driven_cells) { const pool &c_patterns = find_cell_activation_patterns(c, indent); - insert_capped(activation_patterns_cache[cell], c_patterns.begin(), c_patterns.end()); + if (!insert_capped(activation_patterns_cache[cell], c_patterns.begin(), c_patterns.end())) { + recursion_state.erase(cell); + return activation_patterns_cache[cell]; + } } log_assert(recursion_state.count(cell) != 0);