3939YOSYS_NAMESPACE_BEGIN
4040
4141std::vector<FILE*> log_files;
42- std::vector<std::ostream*> log_streams;
42+ std::vector<std::ostream*> log_streams, log_warning_streams ;
4343std::vector<std::string> log_scratchpads;
4444std::map<std::string, std::set<std::string>> log_hdump;
4545std::vector<std::regex> log_warn_regexes, log_nowarn_regexes, log_werror_regexes;
@@ -102,7 +102,7 @@ int gettimeofday(struct timeval *tv, struct timezone *tz)
102102}
103103#endif
104104
105- void logv (const char *format, va_list ap)
105+ void logv (LogSeverity severity, const char *format, va_list ap)
106106{
107107 while (format[0 ] == ' \n ' && format[1 ] != 0 ) {
108108 log (" \n " );
@@ -159,6 +159,10 @@ void logv(const char *format, va_list ap)
159159
160160 for (auto f : log_streams)
161161 *f << time_str;
162+
163+ if (severity >= LogSeverity::WARNING)
164+ for (auto f : log_warning_streams)
165+ *f << time_str;
162166 }
163167
164168 for (auto f : log_files)
@@ -167,6 +171,12 @@ void logv(const char *format, va_list ap)
167171 for (auto f : log_streams)
168172 *f << str;
169173
174+ if (severity >= LogSeverity::WARNING)
175+ for (auto f : log_warning_streams) {
176+ *f << str;
177+ f->flush ();
178+ }
179+
170180 RTLIL::Design *design = yosys_get_design ();
171181 if (design != nullptr )
172182 for (auto &scratchpad : log_scratchpads)
@@ -223,7 +233,7 @@ void logv_header(RTLIL::Design *design, const char *format, va_list ap)
223233 header_id += stringf (" %s%d" , header_id.empty () ? " " : " ." , c);
224234
225235 log (" %s. " , header_id.c_str ());
226- logv (format, ap);
236+ logv (LogSeverity::INFO, format, ap);
227237 log_flush ();
228238
229239 if (log_hdump_all)
@@ -289,7 +299,7 @@ static void logv_warning_with_prefix(const char *prefix,
289299 if (log_errfile != NULL && !log_quiet_warnings)
290300 log_files.push_back (log_errfile);
291301
292- log (" %s%s" , prefix, message.c_str ());
302+ log (LogSeverity::WARNING, " %s%s" , prefix, message.c_str ());
293303 log_flush ();
294304
295305 if (log_errfile != NULL && !log_quiet_warnings)
@@ -333,7 +343,7 @@ void log_file_info(const std::string &filename, int lineno,
333343 va_start (ap, format);
334344 std::string fmt = stringf (" %s:%d: Info: %s" ,
335345 filename.c_str (), lineno, format);
336- logv (fmt.c_str (), ap);
346+ logv (LogSeverity::INFO, fmt.c_str (), ap);
337347 va_end (ap);
338348}
339349
@@ -357,7 +367,7 @@ static void logv_error_with_prefix(const char *prefix,
357367 f = stderr;
358368
359369 log_last_error = vstringf (format, ap);
360- log (" %s%s" , prefix, log_last_error.c_str ());
370+ log (LogSeverity::ERROR, " %s%s" , prefix, log_last_error.c_str ());
361371 log_flush ();
362372
363373 log_make_debug = bak_log_make_debug;
@@ -415,10 +425,18 @@ void log(const char *format, ...)
415425{
416426 va_list ap;
417427 va_start (ap, format);
418- logv (format, ap);
428+ logv (LogSeverity::INFO, format, ap);
419429 va_end (ap);
420430}
421431
432+ void log (LogSeverity severity, const char *format, ...)
433+ {
434+ va_list ap;
435+ va_start (ap, format);
436+ logv (severity, format, ap);
437+ va_end (ap);
438+ }
439+
422440void log_header (RTLIL::Design *design, const char *format, ...)
423441{
424442 va_list ap;
@@ -479,7 +497,7 @@ void log_cmd_error(const char *format, ...)
479497 pop_errfile = true ;
480498 }
481499
482- log (" ERROR: %s" , log_last_error.c_str ());
500+ log (LogSeverity::ERROR, " ERROR: %s" , log_last_error.c_str ());
483501 log_flush ();
484502
485503 if (pop_errfile)
0 commit comments