aboutsummaryrefslogtreecommitdiffstats
path: root/common
diff options
context:
space:
mode:
authorDavid Shah <dave@ds0.me>2018-11-26 09:22:42 +0000
committerDavid Shah <dave@ds0.me>2018-11-26 09:22:42 +0000
commitb035cb9fcf3502c74c769560f02e29adcafe6fd8 (patch)
tree597f9f963f5ed1ab6d6644f8f5d9a21c917e453d /common
parent51d1363dfeb7005ec35a2acd10fe9ae2cd8631d5 (diff)
downloadnextpnr-b035cb9fcf3502c74c769560f02e29adcafe6fd8.tar.gz
nextpnr-b035cb9fcf3502c74c769560f02e29adcafe6fd8.tar.bz2
nextpnr-b035cb9fcf3502c74c769560f02e29adcafe6fd8.zip
Add nonfatal error support and use for timing failures
Signed-off-by: David Shah <dave@ds0.me>
Diffstat (limited to 'common')
-rw-r--r--common/command.cc2
-rw-r--r--common/log.cc10
-rw-r--r--common/log.h3
-rw-r--r--common/timing.cc2
4 files changed, 14 insertions, 3 deletions
diff --git a/common/command.cc b/common/command.cc
index fd634df4..6cc9fbe7 100644
--- a/common/command.cc
+++ b/common/command.cc
@@ -270,7 +270,7 @@ int CommandHandler::executeMain(std::unique_ptr<Context> ctx)
deinit_python();
#endif
- return 0;
+ return had_nonfatal_error ? 1 : 0;
}
void CommandHandler::conflicting_options(const boost::program_options::variables_map &vm, const char *opt1,
diff --git a/common/log.cc b/common/log.cc
index 19873148..82e09fec 100644
--- a/common/log.cc
+++ b/common/log.cc
@@ -39,6 +39,7 @@ std::string log_last_error;
void (*log_error_atexit)() = NULL;
static int log_newline_count = 0;
+bool had_nonfatal_error = false;
std::string stringf(const char *fmt, ...)
{
@@ -177,6 +178,15 @@ void log_break()
log("\n");
}
+void log_nonfatal_error(const char *format, ...)
+{
+ va_list ap;
+ va_start(ap, format);
+ logv_prefixed("ERROR: ", format, ap, LogLevel::ERROR);
+ va_end(ap);
+ had_nonfatal_error = true;
+}
+
void log_flush()
{
for (auto f : log_streams)
diff --git a/common/log.h b/common/log.h
index de5aa85c..f1727ac6 100644
--- a/common/log.h
+++ b/common/log.h
@@ -56,6 +56,7 @@ extern log_write_type log_write_function;
extern std::string log_last_error;
extern void (*log_error_atexit)();
+extern bool had_nonfatal_error;
std::string stringf(const char *fmt, ...);
std::string vstringf(const char *fmt, va_list ap);
@@ -66,7 +67,7 @@ void log_always(const char *format, ...) NPNR_ATTRIBUTE(format(printf, 1, 2));
void log_info(const char *format, ...) NPNR_ATTRIBUTE(format(printf, 1, 2));
void log_warning(const char *format, ...) NPNR_ATTRIBUTE(format(printf, 1, 2));
NPNR_NORETURN void log_error(const char *format, ...) NPNR_ATTRIBUTE(format(printf, 1, 2), noreturn);
-
+void log_nonfatal_error(const char *format, ...) NPNR_ATTRIBUTE(format(printf, 1, 2));
void log_break();
void log_flush();
diff --git a/common/timing.cc b/common/timing.cc
index afe14e21..8bbf2bca 100644
--- a/common/timing.cc
+++ b/common/timing.cc
@@ -698,7 +698,7 @@ void timing_analysis(Context *ctx, bool print_histogram, bool print_fmax, bool p
log_info("Max frequency for clock %*s'%s': %.02f MHz (%s at %.02f MHz)\n", width, "",
clock_name.c_str(), clock_fmax[clock.first], passed ? "PASS" : "FAIL", target);
else
- log_warning("Max frequency for clock %*s'%s': %.02f MHz (%s at %.02f MHz)\n", width, "",
+ log_nonfatal_error("Max frequency for clock %*s'%s': %.02f MHz (%s at %.02f MHz)\n", width, "",
clock_name.c_str(), clock_fmax[clock.first], passed ? "PASS" : "FAIL", target);
}
for (auto &eclock : empty_clocks) {