Add nonfatal error support and use for timing failures

Signed-off-by: David Shah <dave@ds0.me>
This commit is contained in:
David Shah 2018-11-26 09:22:42 +00:00
parent 51d1363dfe
commit b035cb9fcf
4 changed files with 14 additions and 3 deletions

View File

@ -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,

View File

@ -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)

View File

@ -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();

View File

@ -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) {