aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/log.cc
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/log.cc')
-rw-r--r--kernel/log.cc55
1 files changed, 42 insertions, 13 deletions
diff --git a/kernel/log.cc b/kernel/log.cc
index ada2cabb2..fe84184a5 100644
--- a/kernel/log.cc
+++ b/kernel/log.cc
@@ -2,11 +2,11 @@
* yosys -- Yosys Open SYnthesis Suite
*
* Copyright (C) 2012 Clifford Wolf <clifford@clifford.at>
- *
+ *
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
- *
+ *
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
@@ -40,6 +40,8 @@ YOSYS_NAMESPACE_BEGIN
std::vector<FILE*> log_files;
std::vector<std::ostream*> log_streams;
+std::map<std::string, std::set<std::string>> log_hdump;
+bool log_hdump_all = false;
FILE *log_errfile = NULL;
SHA1 *log_hasher = NULL;
@@ -48,10 +50,11 @@ bool log_error_stderr = false;
bool log_cmd_error_throw = false;
bool log_quiet_warnings = false;
int log_verbose_level;
+string log_last_error;
vector<int> header_count;
pool<RTLIL::IdString> log_id_cache;
-vector<string> string_buf;
+vector<shared_str> string_buf;
int string_buf_index = -1;
static struct timeval initial_tv = { 0, 0 };
@@ -135,7 +138,7 @@ void logv(const char *format, va_list ap)
*f << str;
}
-void logv_header(const char *format, va_list ap)
+void logv_header(RTLIL::Design *design, const char *format, va_list ap)
{
bool pop_errfile = false;
@@ -148,12 +151,24 @@ void logv_header(const char *format, va_list ap)
pop_errfile = true;
}
+ std::string header_id;
+
for (int c : header_count)
- log("%d.", c);
- log(" ");
+ header_id += stringf("%s%d", header_id.empty() ? "" : ".", c);
+
+ log("%s. ", header_id.c_str());
logv(format, ap);
log_flush();
+ if (log_hdump_all)
+ log_hdump[header_id].insert("yosys_dump_" + header_id + ".il");
+
+ if (log_hdump.count(header_id) && design != nullptr)
+ for (auto &filename : log_hdump.at(header_id)) {
+ log("Dumping current design to '%s'.\n", filename.c_str());
+ Pass::call(design, {"dump", "-o", filename});
+ }
+
if (pop_errfile)
log_files.pop_back();
}
@@ -173,6 +188,10 @@ void logv_warning(const char *format, va_list ap)
void logv_error(const char *format, va_list ap)
{
+#ifdef EMSCRIPTEN
+ auto backup_log_files = log_files;
+#endif
+
if (log_errfile != NULL)
log_files.push_back(log_errfile);
@@ -181,10 +200,16 @@ void logv_error(const char *format, va_list ap)
if (f == stdout)
f = stderr;
- log("ERROR: ");
- logv(format, ap);
+ log_last_error = vstringf(format, ap);
+ log("ERROR: %s", log_last_error.c_str());
log_flush();
+
+#ifdef EMSCRIPTEN
+ log_files = backup_log_files;
+ throw 0;
+#else
exit(1);
+#endif
}
void log(const char *format, ...)
@@ -195,11 +220,11 @@ void log(const char *format, ...)
va_end(ap);
}
-void log_header(const char *format, ...)
+void log_header(RTLIL::Design *design, const char *format, ...)
{
va_list ap;
va_start(ap, format);
- logv_header(format, ap);
+ logv_header(design, format, ap);
va_end(ap);
}
@@ -224,8 +249,8 @@ void log_cmd_error(const char *format, ...)
va_start(ap, format);
if (log_cmd_error_throw) {
- log("ERROR: ");
- logv(format, ap);
+ log_last_error = vstringf(format, ap);
+ log("ERROR: %s", log_last_error.c_str());
log_flush();
throw log_cmd_error_exception();
}
@@ -253,7 +278,7 @@ void log_pop()
log_flush();
}
-#ifdef __linux__
+#if defined(__linux__) && defined(YOSYS_ENABLE_PLUGINS)
void log_backtrace(const char *prefix, int levels)
{
if (levels <= 0) return;
@@ -365,6 +390,10 @@ void log_flush()
f->flush();
}
+void log_dump_val_worker(RTLIL::IdString v) {
+ log("%s", log_id(v));
+}
+
void log_dump_val_worker(RTLIL::SigSpec v) {
log("%s", log_signal(v));
}