diff options
Diffstat (limited to 'src/systemc')
-rw-r--r-- | src/systemc/utils/report.cc | 3 | ||||
-rw-r--r-- | src/systemc/utils/report.hh | 3 | ||||
-rw-r--r-- | src/systemc/utils/sc_report.cc | 63 | ||||
-rw-r--r-- | src/systemc/utils/sc_report_handler.cc | 14 |
4 files changed, 66 insertions, 17 deletions
diff --git a/src/systemc/utils/report.cc b/src/systemc/utils/report.cc index 413726eb7..9c26edea3 100644 --- a/src/systemc/utils/report.cc +++ b/src/systemc/utils/report.cc @@ -48,6 +48,7 @@ ReportSevInfo reportSevInfos[sc_core::SC_MAX_SEVERITY] = }; std::map<std::string, ReportMsgInfo> reportMsgInfoMap; +std::map<int, std::string> reportIdToMsgMap; int reportVerbosityLevel = sc_core::SC_MEDIUM; @@ -60,4 +61,6 @@ sc_core::sc_report_handler_proc reportHandlerProc = std::unique_ptr<sc_core::sc_report> globalReportCache; +bool reportWarningsAsErrors = false; + } // namespace sc_gem5 diff --git a/src/systemc/utils/report.hh b/src/systemc/utils/report.hh index ea0201ff8..e0b2e2598 100644 --- a/src/systemc/utils/report.hh +++ b/src/systemc/utils/report.hh @@ -92,6 +92,7 @@ struct ReportSevInfo extern const char *reportSeverityNames[sc_core::SC_MAX_SEVERITY]; extern ReportSevInfo reportSevInfos[sc_core::SC_MAX_SEVERITY]; extern std::map<std::string, ReportMsgInfo> reportMsgInfoMap; +extern std::map<int, std::string> reportIdToMsgMap; extern int reportVerbosityLevel; @@ -103,6 +104,8 @@ extern sc_core::sc_report_handler_proc reportHandlerProc; extern std::unique_ptr<sc_core::sc_report> globalReportCache; +extern bool reportWarningsAsErrors; + } // namespace sc_gem5 #endif // __SYSTEMC_UTILS_REPORT_HH__ diff --git a/src/systemc/utils/sc_report.cc b/src/systemc/utils/sc_report.cc index 77da92b57..83e066269 100644 --- a/src/systemc/utils/sc_report.cc +++ b/src/systemc/utils/sc_report.cc @@ -32,6 +32,7 @@ #include "base/logging.hh" #include "systemc/ext/utils/sc_report.hh" #include "systemc/ext/utils/sc_report_handler.hh" +#include "systemc/utils/report.hh" namespace sc_core { @@ -87,45 +88,81 @@ sc_report::what() const throw() const char * sc_report::get_message(int id) { - warn("%s not implemented.\n", __PRETTY_FUNCTION__); - return ""; + auto it = sc_gem5::reportIdToMsgMap.find(id); + if (it == sc_gem5::reportIdToMsgMap.end()) + return "unknown id"; + else + return it->second.c_str(); } bool sc_report::is_suppressed(int id) { - warn("%s not implemented.\n", __PRETTY_FUNCTION__); - return false; + auto it = sc_gem5::reportIdToMsgMap.find(id); + if (it == sc_gem5::reportIdToMsgMap.end()) + return false; + + return sc_gem5::reportMsgInfoMap[it->second].actions == SC_DO_NOTHING; } void -sc_report::make_warnings_errors(bool) +sc_report::make_warnings_errors(bool val) { - warn("%s not implemented.\n", __PRETTY_FUNCTION__); + sc_gem5::reportWarningsAsErrors = val; } void sc_report::register_id(int id, const char *msg) { - warn("%s not implemented.\n", __PRETTY_FUNCTION__); + if (id < 0) { + SC_REPORT_ERROR("(E800) register_id failed", "invalid report id"); + return; + } + if (!msg) { + SC_REPORT_ERROR("(E800) register_id failed", "invalid report message"); + return; + } + auto p = sc_gem5::reportIdToMsgMap.insert( + std::pair<int, std::string>(id, msg)); + if (!p.second) { + SC_REPORT_ERROR("(E800) register_id failed", + "report id already exists"); + } else { + sc_gem5::reportMsgInfoMap[msg].id = id; + } } void -sc_report::suppress_id(int id, bool) +sc_report::suppress_id(int id, bool suppress) { - warn("%s not implemented.\n", __PRETTY_FUNCTION__); + auto it = sc_gem5::reportIdToMsgMap.find(id); + if (it == sc_gem5::reportIdToMsgMap.end()) + return; + + if (suppress) + sc_gem5::reportMsgInfoMap[it->second].actions = SC_DO_NOTHING; + else + sc_gem5::reportMsgInfoMap[it->second].actions = SC_UNSPECIFIED; } void -sc_report::suppress_infos(bool) +sc_report::suppress_infos(bool suppress) { - warn("%s not implemented.\n", __PRETTY_FUNCTION__); + if (suppress) + sc_gem5::reportSevInfos[SC_INFO].actions = SC_DO_NOTHING; + else + sc_gem5::reportSevInfos[SC_INFO].actions = SC_DEFAULT_INFO_ACTIONS; } void -sc_report::suppress_warnings(bool) +sc_report::suppress_warnings(bool suppress) { - warn("%s not implemented.\n", __PRETTY_FUNCTION__); + if (suppress) { + sc_gem5::reportSevInfos[SC_WARNING].actions = SC_DO_NOTHING; + } else { + sc_gem5::reportSevInfos[SC_WARNING].actions = + SC_DEFAULT_WARNING_ACTIONS; + } } void diff --git a/src/systemc/utils/sc_report_handler.cc b/src/systemc/utils/sc_report_handler.cc index a8cdc363a..46ee84704 100644 --- a/src/systemc/utils/sc_report_handler.cc +++ b/src/systemc/utils/sc_report_handler.cc @@ -89,7 +89,7 @@ sc_report_handler::report(sc_severity severity, const char *msg_type, ::sc_gem5::Process *current = ::sc_gem5::scheduler.current(); sc_report report(severity, msg_type, msg, verbosity, file, line, sc_time::from_value(::sc_gem5::scheduler.getCurTick()), - current ? current->name() : nullptr, -1); + current ? current->name() : nullptr, msgInfo.id); if (actions & SC_CACHE_REPORT) { if (current) { @@ -104,11 +104,17 @@ sc_report_handler::report(sc_severity severity, const char *msg_type, } void -sc_report_handler::report(sc_severity, int id, const char *msg, +sc_report_handler::report(sc_severity severity, int id, const char *msg, const char *file, int line) { - warn("%s:%d %s\n", file, line, msg); - warn("%s not implemented.\n", __PRETTY_FUNCTION__); + std::string &msg_type = sc_gem5::reportIdToMsgMap[id]; + if (msg_type == "") + msg_type = "unknown id"; + + if (sc_gem5::reportWarningsAsErrors && severity == SC_WARNING) + severity = SC_ERROR; + + report(severity, msg_type.c_str(), msg, file, line); } sc_actions |