diff options
author | David Shah <dave@ds0.me> | 2018-11-26 09:22:42 +0000 |
---|---|---|
committer | David Shah <dave@ds0.me> | 2018-11-26 09:22:42 +0000 |
commit | b035cb9fcf3502c74c769560f02e29adcafe6fd8 (patch) | |
tree | 597f9f963f5ed1ab6d6644f8f5d9a21c917e453d | |
parent | 51d1363dfeb7005ec35a2acd10fe9ae2cd8631d5 (diff) | |
download | nextpnr-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>
-rw-r--r-- | common/command.cc | 2 | ||||
-rw-r--r-- | common/log.cc | 10 | ||||
-rw-r--r-- | common/log.h | 3 | ||||
-rw-r--r-- | common/timing.cc | 2 |
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) { |