diff --git a/kernel/modtools.h b/kernel/modtools.h index 27ba98d7d..b0446d454 100644 --- a/kernel/modtools.h +++ b/kernel/modtools.h @@ -78,6 +78,7 @@ struct ModIndex : public RTLIL::Monitor SigMap sigmap; RTLIL::Module *module; std::map database; + int reload_counter; int auto_reload_counter; bool auto_reload_module; @@ -106,6 +107,10 @@ struct ModIndex : public RTLIL::Monitor void reload_module(bool reset_sigmap = true) { + reload_counter++; + if (reload_counter % 10 == 0) + log_warning("ModIndex::reload_module() called %d times.\n", reload_counter); + if (reset_sigmap) { sigmap.clear(); sigmap.set(module); @@ -231,6 +236,7 @@ struct ModIndex : public RTLIL::Monitor ModIndex(RTLIL::Module *_m) : sigmap(_m), module(_m) { + reload_counter = 0; auto_reload_counter = 0; auto_reload_module = true; module->monitors.insert(this); diff --git a/passes/opt/wreduce.cc b/passes/opt/wreduce.cc index 9e710d525..187b296a6 100644 --- a/passes/opt/wreduce.cc +++ b/passes/opt/wreduce.cc @@ -78,6 +78,8 @@ struct WreduceWorker for (int i = GetSize(sig_y)-1; i >= 0; i--) { auto info = mi.query(sig_y[i]); + if (info == nullptr) + return; if (!info->is_output && GetSize(info->ports) <= 1 && !keep_bits.count(mi.sigmap(sig_y[i]))) { bits_removed.push_back(State::Sx); continue; @@ -408,6 +410,8 @@ struct WreduceWorker break; auto info = mi.query(bit); + if (info == nullptr) + return; if (info->is_output || GetSize(info->ports) > 1) break; @@ -566,6 +570,10 @@ struct WreduceWorker for (int i = GetSize(w)-1; i >= 0; i--) { SigBit bit(w, i); auto info = mi.query(bit); + if (info == nullptr) { + unused_top_bits = 0; + break; + } if (info && (info->is_input || info->is_output || GetSize(info->ports) > 0)) break; unused_top_bits++;