aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kernel/log.cc24
-rw-r--r--kernel/log.h1
-rw-r--r--passes/opt/opt_muxtree.cc1
-rw-r--r--passes/opt/wreduce.cc6
4 files changed, 26 insertions, 6 deletions
diff --git a/kernel/log.cc b/kernel/log.cc
index a7820950c..08ebe7af7 100644
--- a/kernel/log.cc
+++ b/kernel/log.cc
@@ -61,7 +61,7 @@ int log_force_debug = 0;
int log_debug_suppressed = 0;
vector<int> header_count;
-pool<RTLIL::IdString> log_id_cache;
+vector<char*> log_id_cache;
vector<shared_str> string_buf;
int string_buf_index = -1;
@@ -69,6 +69,13 @@ static struct timeval initial_tv = { 0, 0 };
static bool next_print_log = false;
static int log_newline_count = 0;
+static void log_id_cache_clear()
+{
+ for (auto p : log_id_cache)
+ free(p);
+ log_id_cache.clear();
+}
+
#if defined(_WIN32) && !defined(__MINGW32__)
// this will get time information and return it in timeval, simulating gettimeofday()
int gettimeofday(struct timeval *tv, struct timezone *tz)
@@ -414,12 +421,19 @@ void log_push()
void log_pop()
{
header_count.pop_back();
- log_id_cache.clear();
+ log_id_cache_clear();
string_buf.clear();
string_buf_index = -1;
log_flush();
}
+void log_checkpoint()
+{
+ log_id_cache_clear();
+ IdString::checkpoint();
+ log_flush();
+}
+
#if (defined(__linux__) || defined(__FreeBSD__)) && defined(YOSYS_ENABLE_PLUGINS)
void log_backtrace(const char *prefix, int levels)
{
@@ -521,7 +535,7 @@ void log_reset_stack()
{
while (header_count.size() > 1)
header_count.pop_back();
- log_id_cache.clear();
+ log_id_cache_clear();
string_buf.clear();
string_buf_index = -1;
log_flush();
@@ -580,8 +594,8 @@ const char *log_const(const RTLIL::Const &value, bool autoint)
const char *log_id(RTLIL::IdString str)
{
- log_id_cache.insert(str);
- const char *p = str.c_str();
+ log_id_cache.push_back(strdup(str.c_str()));
+ const char *p = log_id_cache.back();
if (p[0] != '\\')
return p;
if (p[1] == '$' || p[1] == '\\' || p[1] == 0)
diff --git a/kernel/log.h b/kernel/log.h
index 3e1facae8..3328018f3 100644
--- a/kernel/log.h
+++ b/kernel/log.h
@@ -130,6 +130,7 @@ void log_spacer();
void log_push();
void log_pop();
+void log_checkpoint();
void log_backtrace(const char *prefix, int levels);
void log_reset_stack();
void log_flush();
diff --git a/passes/opt/opt_muxtree.cc b/passes/opt/opt_muxtree.cc
index 6511e091b..79f0e9639 100644
--- a/passes/opt/opt_muxtree.cc
+++ b/passes/opt/opt_muxtree.cc
@@ -204,6 +204,7 @@ struct OptMuxtreeWorker
log(" Analyzing evaluation results.\n");
log_assert(glob_abort_cnt > 0);
+ log_checkpoint();
for (auto &mi : mux2info)
{
diff --git a/passes/opt/wreduce.cc b/passes/opt/wreduce.cc
index 1fbc41082..65068238b 100644
--- a/passes/opt/wreduce.cc
+++ b/passes/opt/wreduce.cc
@@ -430,6 +430,7 @@ struct WreduceWorker
for (auto w : module->wires())
complete_wires.insert(mi.sigmap(w));
+ std::vector<std::pair<Wire*,Wire*>> swap_wire_names;
for (auto w : module->selected_wires())
{
int unused_top_bits = 0;
@@ -454,9 +455,12 @@ struct WreduceWorker
log("Removed top %d bits (of %d) from wire %s.%s.\n", unused_top_bits, GetSize(w), log_id(module), log_id(w));
Wire *nw = module->addWire(NEW_ID, GetSize(w) - unused_top_bits);
module->connect(nw, SigSpec(w).extract(0, GetSize(nw)));
- module->swap_names(w, nw);
+ swap_wire_names.emplace_back(w, nw);
}
+ for (const auto &i : swap_wire_names)
+ module->swap_names(i.first, i.second);
+
if (!remove_init_bits.empty()) {
for (auto w : module->wires()) {
if (w->attributes.count("\\init")) {