sc_report_handler.cc revision 12997:cfc14d8f4725
1545SN/A/* 211896Ssudhanshu.jha@arm.com * Copyright 2018 Google, Inc. 38948SN/A * 48948SN/A * Redistribution and use in source and binary forms, with or without 58948SN/A * modification, are permitted provided that the following conditions are 68948SN/A * met: redistributions of source code must retain the above copyright 78948SN/A * notice, this list of conditions and the following disclaimer; 88948SN/A * redistributions in binary form must reproduce the above copyright 98948SN/A * notice, this list of conditions and the following disclaimer in the 108948SN/A * documentation and/or other materials provided with the distribution; 118948SN/A * neither the name of the copyright holders nor the names of its 128948SN/A * contributors may be used to endorse or promote products derived from 138948SN/A * this software without specific prior written permission. 142512SN/A * 15545SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 16545SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 17545SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 18545SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 19545SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 20545SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 21545SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22545SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23545SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24545SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 25545SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26545SN/A * 27545SN/A * Authors: Gabe Black 28545SN/A */ 29545SN/A 30545SN/A#include <fstream> 31545SN/A#include <map> 32545SN/A#include <sstream> 33545SN/A#include <string> 34545SN/A 35545SN/A#include "base/logging.hh" 36545SN/A#include "systemc/core/process.hh" 37545SN/A#include "systemc/core/scheduler.hh" 38545SN/A#include "systemc/ext/core/sc_main.hh" 392665SN/A#include "systemc/ext/utils/sc_report_handler.hh" 402665SN/A 412665SN/Anamespace sc_core 429166Sandreas.hansson@arm.com{ 4311010Sandreas.sandberg@arm.com 44545SN/Anamespace 45545SN/A{ 4611010Sandreas.sandberg@arm.com 4711010Sandreas.sandberg@arm.comstd::unique_ptr<std::string> logFileName; 4811010Sandreas.sandberg@arm.comstd::unique_ptr<std::ofstream> logFile; 4911010Sandreas.sandberg@arm.com 503090SN/Astruct ReportCatInfo 518232SN/A{ 529152Satgutier@umich.edu explicit ReportCatInfo(sc_actions actions) : 5311896Ssudhanshu.jha@arm.com actions(actions), count(0), limit(-1) 542901SN/A {} 55545SN/A ReportCatInfo() : ReportCatInfo(SC_UNSPECIFIED) {} 569165Sandreas.hansson@arm.com 5711010Sandreas.sandberg@arm.com bool 5811010Sandreas.sandberg@arm.com checkLimit(sc_actions &actions) 5911010Sandreas.sandberg@arm.com { 602489SN/A if (limit == 0 || count < limit) 612489SN/A return false; 629166Sandreas.hansson@arm.com if (limit != -1) 639166Sandreas.hansson@arm.com actions |= SC_STOP; 649166Sandreas.hansson@arm.com return true; 659166Sandreas.hansson@arm.com } 669166Sandreas.hansson@arm.com 679166Sandreas.hansson@arm.com sc_actions actions; 689166Sandreas.hansson@arm.com int count; 699166Sandreas.hansson@arm.com int limit; 709166Sandreas.hansson@arm.com}; 719166Sandreas.hansson@arm.com 729166Sandreas.hansson@arm.comconst char *severityNames[] = { 739166Sandreas.hansson@arm.com [SC_INFO] = "Info", 749166Sandreas.hansson@arm.com [SC_WARNING] = "Warning", 759166Sandreas.hansson@arm.com [SC_ERROR] = "Error", 769166Sandreas.hansson@arm.com [SC_FATAL] = "Fatal" 779166Sandreas.hansson@arm.com}; 789166Sandreas.hansson@arm.com 799166Sandreas.hansson@arm.comReportCatInfo catForSeverity[SC_MAX_SEVERITY] = 809166Sandreas.hansson@arm.com{ 819166Sandreas.hansson@arm.com [SC_INFO] = ReportCatInfo(SC_DEFAULT_INFO_ACTIONS), 829166Sandreas.hansson@arm.com [SC_WARNING] = ReportCatInfo(SC_DEFAULT_WARNING_ACTIONS), 839166Sandreas.hansson@arm.com [SC_ERROR] = ReportCatInfo(SC_DEFAULT_ERROR_ACTIONS), 849166Sandreas.hansson@arm.com [SC_FATAL] = ReportCatInfo(SC_DEFAULT_FATAL_ACTIONS) 859166Sandreas.hansson@arm.com}; 869166Sandreas.hansson@arm.com 879166Sandreas.hansson@arm.comstd::map<std::string, ReportCatInfo> catForMsgType; 889166Sandreas.hansson@arm.comstd::map<std::pair<std::string, sc_severity>, ReportCatInfo> 899166Sandreas.hansson@arm.com catForSeverityAndMsgType; 909166Sandreas.hansson@arm.com 919166Sandreas.hansson@arm.comint verbosityLevel = SC_MEDIUM; 929452SAndreas.Sandberg@ARM.com 939166Sandreas.hansson@arm.comsc_actions suppressedActions = SC_UNSPECIFIED; 949166Sandreas.hansson@arm.comsc_actions forcedActions = SC_UNSPECIFIED; 959166Sandreas.hansson@arm.comsc_actions catchActions = SC_UNSPECIFIED; 969166Sandreas.hansson@arm.com 979166Sandreas.hansson@arm.comsc_report_handler_proc reportHandlerProc = &sc_report_handler::default_handler; 989166Sandreas.hansson@arm.com 999166Sandreas.hansson@arm.comsc_actions maxAction = SC_ABORT; 1009166Sandreas.hansson@arm.com 1019166Sandreas.hansson@arm.comstd::unique_ptr<sc_report> globalReportCache; 10210913Sandreas.sandberg@arm.com 10310913Sandreas.sandberg@arm.com} // anonymous namespace 1049166Sandreas.hansson@arm.com 1059166Sandreas.hansson@arm.comvoid 1062489SN/Asc_report_handler::report(sc_severity severity, const char *msg_type, 1078975SN/A const char *msg, const char *file, int line) 1082384SN/A{ 10911284Sandreas.hansson@arm.com report(severity, msg_type, msg, SC_MEDIUM, file, line); 11010821Sandreas.hansson@arm.com} 11111284Sandreas.hansson@arm.com 1124435SN/Avoid 1139166Sandreas.hansson@arm.comsc_report_handler::report(sc_severity severity, const char *msg_type, 1142569SN/A const char *msg, int verbosity, const char *file, 1152657SN/A int line) 1162384SN/A{ 117679SN/A if (severity == SC_INFO && verbosity > verbosityLevel) 1184762SN/A return; 1199165Sandreas.hansson@arm.com 1202565SN/A ReportCatInfo &sevInfo = catForSeverity[severity]; 1212384SN/A ReportCatInfo &msgInfo = catForMsgType[msg_type]; 1228851SN/A ReportCatInfo &sevMsgInfo = catForSeverityAndMsgType[ 1238851SN/A std::make_pair(std::string(msg_type), severity)]; 1248851SN/A 1258851SN/A sevInfo.count++; 1268851SN/A msgInfo.count++; 1278851SN/A sevMsgInfo.count++; 1288851SN/A 1298851SN/A sc_actions actions = SC_UNSPECIFIED; 13010913Sandreas.sandberg@arm.com if (sevMsgInfo.actions != SC_UNSPECIFIED) 13110913Sandreas.sandberg@arm.com actions = sevMsgInfo.actions; 1322901SN/A else if (msgInfo.actions != SC_UNSPECIFIED) 13310913Sandreas.sandberg@arm.com actions = msgInfo.actions; 13410913Sandreas.sandberg@arm.com else if (sevInfo.actions != SC_UNSPECIFIED) 13510913Sandreas.sandberg@arm.com actions = sevInfo.actions; 13610913Sandreas.sandberg@arm.com 13710913Sandreas.sandberg@arm.com actions &= ~suppressedActions; 13810913Sandreas.sandberg@arm.com actions |= forcedActions; 1392901SN/A 1402901SN/A if (sevMsgInfo.checkLimit(actions) && msgInfo.checkLimit(actions)) 1412384SN/A sevInfo.checkLimit(actions); 14210713Sandreas.hansson@arm.com 1432489SN/A ::sc_gem5::Process *current = ::sc_gem5::scheduler.current(); 1444435SN/A sc_report report(severity, msg_type, msg, verbosity, file, line, 1459307Sandreas.hansson@arm.com sc_time::from_value(::sc_gem5::scheduler.getCurTick()), 1462489SN/A current ? current->name() : nullptr, -1); 1472641SN/A 14810621SCurtis.Dunham@arm.com if (actions & SC_CACHE_REPORT) { 1492641SN/A if (current) { 1507607SN/A current->lastReport(&report); 1512384SN/A } else { 1529166Sandreas.hansson@arm.com globalReportCache = 1539166Sandreas.hansson@arm.com std::unique_ptr<sc_report>(new sc_report(report)); 1549166Sandreas.hansson@arm.com } 1559016Sandreas.hansson@arm.com } 1562384SN/A 15710621SCurtis.Dunham@arm.com reportHandlerProc(report, actions); 15810621SCurtis.Dunham@arm.com} 15910621SCurtis.Dunham@arm.com 16010621SCurtis.Dunham@arm.comvoid 16110621SCurtis.Dunham@arm.comsc_report_handler::report(sc_severity, int id, const char *msg, 16210621SCurtis.Dunham@arm.com const char *file, int line) 1634451SN/A{ 1649166Sandreas.hansson@arm.com warn("%s:%d %s\n", file, line, msg); 1659814Sandreas.hansson@arm.com warn("%s not implemented.\n", __PRETTY_FUNCTION__); 1662406SN/A} 16710621SCurtis.Dunham@arm.com 16810024Sdam.sunwoo@arm.comsc_actions 1699166Sandreas.hansson@arm.comsc_report_handler::set_actions(sc_severity severity, sc_actions actions) 1702641SN/A{ 1719166Sandreas.hansson@arm.com ReportCatInfo &info = catForSeverity[severity]; 1729166Sandreas.hansson@arm.com sc_actions previous = info.actions; 1739166Sandreas.hansson@arm.com info.actions = actions; 1742641SN/A return previous; 1759166Sandreas.hansson@arm.com} 1762641SN/A 1779166Sandreas.hansson@arm.comsc_actions 1789166Sandreas.hansson@arm.comsc_report_handler::set_actions(const char *msg_type, sc_actions actions) 1799166Sandreas.hansson@arm.com{ 1802384SN/A ReportCatInfo &info = catForMsgType[msg_type]; 1819307Sandreas.hansson@arm.com sc_actions previous = info.actions; 1829307Sandreas.hansson@arm.com info.actions = actions; 1839307Sandreas.hansson@arm.com return previous; 1849307Sandreas.hansson@arm.com} 1859307Sandreas.hansson@arm.com 18610621SCurtis.Dunham@arm.comsc_actions 18710621SCurtis.Dunham@arm.comsc_report_handler::set_actions( 1882384SN/A const char *msg_type, sc_severity severity, sc_actions actions) 1892384SN/A{ 1904435SN/A ReportCatInfo &info = catForSeverityAndMsgType[ 1919166Sandreas.hansson@arm.com std::make_pair(std::string(msg_type), severity)]; 1924435SN/A sc_actions previous = info.actions; 1939166Sandreas.hansson@arm.com info.actions = actions; 1944435SN/A return previous; 1959166Sandreas.hansson@arm.com} 1969166Sandreas.hansson@arm.com 1979166Sandreas.hansson@arm.comint 1989307Sandreas.hansson@arm.comsc_report_handler::stop_after(sc_severity severity, int limit) 1999166Sandreas.hansson@arm.com{ 2009307Sandreas.hansson@arm.com ReportCatInfo &info = catForSeverity[severity]; 2019307Sandreas.hansson@arm.com int previous = info.limit; 2029307Sandreas.hansson@arm.com info.limit = limit; 2039307Sandreas.hansson@arm.com return previous; 2049307Sandreas.hansson@arm.com} 2059307Sandreas.hansson@arm.com 2069307Sandreas.hansson@arm.comint 2079307Sandreas.hansson@arm.comsc_report_handler::stop_after(const char *msg_type, int limit) 2089307Sandreas.hansson@arm.com{ 2099307Sandreas.hansson@arm.com ReportCatInfo &info = catForMsgType[msg_type]; 2109307Sandreas.hansson@arm.com int previous = info.limit; 2119307Sandreas.hansson@arm.com info.limit = limit; 2129307Sandreas.hansson@arm.com return previous; 2139307Sandreas.hansson@arm.com} 2149307Sandreas.hansson@arm.com 2159307Sandreas.hansson@arm.comint 2169307Sandreas.hansson@arm.comsc_report_handler::stop_after( 2179307Sandreas.hansson@arm.com const char *msg_type, sc_severity severity, int limit) 2189307Sandreas.hansson@arm.com{ 2199307Sandreas.hansson@arm.com ReportCatInfo &info = catForSeverityAndMsgType[ 2209307Sandreas.hansson@arm.com std::make_pair(std::string(msg_type), severity)]; 2219307Sandreas.hansson@arm.com int previous = info.limit; 2229307Sandreas.hansson@arm.com info.limit = limit; 2239307Sandreas.hansson@arm.com return previous; 2249307Sandreas.hansson@arm.com} 2259307Sandreas.hansson@arm.com 2269307Sandreas.hansson@arm.comint 2274435SN/Asc_report_handler::get_count(sc_severity severity) 2284435SN/A{ 2292384SN/A return catForSeverity[severity].count; 2304435SN/A} 2312384SN/A 2329166Sandreas.hansson@arm.comint 2332901SN/Asc_report_handler::get_count(const char *msg_type) 2342901SN/A{ 2354435SN/A return catForMsgType[msg_type].count; 2362902SN/A} 2379524SAndreas.Sandberg@ARM.com 2389307Sandreas.hansson@arm.comint 2399307Sandreas.hansson@arm.comsc_report_handler::get_count(const char *msg_type, sc_severity severity) 2409307Sandreas.hansson@arm.com{ 2419307Sandreas.hansson@arm.com return catForSeverityAndMsgType[ 2424435SN/A std::make_pair(std::string(msg_type), severity)].count; 2434435SN/A} 2444435SN/A 2459307Sandreas.hansson@arm.comint 2469524SAndreas.Sandberg@ARM.comsc_report_handler::set_verbosity_level(int vl) 2479307Sandreas.hansson@arm.com{ 2489307Sandreas.hansson@arm.com int previous = verbosityLevel; 2499307Sandreas.hansson@arm.com verbosityLevel = vl; 2509307Sandreas.hansson@arm.com return previous; 2514435SN/A} 2529307Sandreas.hansson@arm.com 2539307Sandreas.hansson@arm.comint 2549307Sandreas.hansson@arm.comsc_report_handler::get_verbosity_level() 2554435SN/A{ 2569307Sandreas.hansson@arm.com return verbosityLevel; 2579307Sandreas.hansson@arm.com} 2589166Sandreas.hansson@arm.com 2599166Sandreas.hansson@arm.com 260545SN/Asc_actions 2618598SN/Asc_report_handler::suppress(sc_actions actions) 2629294Sandreas.hansson@arm.com{ 2639294Sandreas.hansson@arm.com sc_actions previous = suppressedActions; 2648598SN/A suppressedActions = actions; 2658598SN/A return previous; 2668922SN/A} 2678598SN/A 2688922SN/Asc_actions 2698598SN/Asc_report_handler::suppress() 27011010Sandreas.sandberg@arm.com{ 27111010Sandreas.sandberg@arm.com return suppress(SC_UNSPECIFIED); 27211010Sandreas.sandberg@arm.com} 27311010Sandreas.sandberg@arm.com 27411010Sandreas.sandberg@arm.comsc_actions 27511010Sandreas.sandberg@arm.comsc_report_handler::force(sc_actions actions) 27611010Sandreas.sandberg@arm.com{ 27711010Sandreas.sandberg@arm.com sc_actions previous = forcedActions; 27811010Sandreas.sandberg@arm.com forcedActions = actions; 27911010Sandreas.sandberg@arm.com return previous; 28011010Sandreas.sandberg@arm.com} 28111010Sandreas.sandberg@arm.com 28211010Sandreas.sandberg@arm.comsc_actions 28311010Sandreas.sandberg@arm.comsc_report_handler::force() 28411010Sandreas.sandberg@arm.com{ 28511010Sandreas.sandberg@arm.com return force(SC_UNSPECIFIED); 28611010Sandreas.sandberg@arm.com} 28711010Sandreas.sandberg@arm.com 28811010Sandreas.sandberg@arm.com 28911010Sandreas.sandberg@arm.comsc_actions 29011010Sandreas.sandberg@arm.comsc_report_handler::set_catch_actions(sc_actions actions) 29111010Sandreas.sandberg@arm.com{ 29211010Sandreas.sandberg@arm.com sc_actions previous = catchActions; 29311010Sandreas.sandberg@arm.com catchActions = actions; 29411010Sandreas.sandberg@arm.com return previous; 29511010Sandreas.sandberg@arm.com} 29611010Sandreas.sandberg@arm.com 29711010Sandreas.sandberg@arm.comsc_actions 29811010Sandreas.sandberg@arm.comsc_report_handler::get_catch_actions() 29911010Sandreas.sandberg@arm.com{ 30011010Sandreas.sandberg@arm.com return catchActions; 30111010Sandreas.sandberg@arm.com} 30211010Sandreas.sandberg@arm.com 30311010Sandreas.sandberg@arm.com 30411010Sandreas.sandberg@arm.comvoid 30511010Sandreas.sandberg@arm.comsc_report_handler::set_handler(sc_report_handler_proc proc) 30611010Sandreas.sandberg@arm.com{ 30711010Sandreas.sandberg@arm.com reportHandlerProc = proc; 30811010Sandreas.sandberg@arm.com} 30911010Sandreas.sandberg@arm.com 31011010Sandreas.sandberg@arm.comvoid 31111010Sandreas.sandberg@arm.comsc_report_handler::default_handler( 31211010Sandreas.sandberg@arm.com const sc_report &report, const sc_actions &actions) 31311010Sandreas.sandberg@arm.com{ 31411010Sandreas.sandberg@arm.com if (actions & SC_DISPLAY) 31511010Sandreas.sandberg@arm.com cprintf("\n%s\n", sc_report_compose_message(report)); 31611010Sandreas.sandberg@arm.com 31711010Sandreas.sandberg@arm.com if ((actions & SC_LOG) && logFile) { 31811010Sandreas.sandberg@arm.com ccprintf(*logFile, "%s: %s\n", report.get_time().to_string(), 31911010Sandreas.sandberg@arm.com sc_report_compose_message(report)); 32011010Sandreas.sandberg@arm.com } 32111010Sandreas.sandberg@arm.com if (actions & SC_STOP) { 32211010Sandreas.sandberg@arm.com sc_stop_here(report.get_msg_type(), report.get_severity()); 32311010Sandreas.sandberg@arm.com sc_stop(); 32411010Sandreas.sandberg@arm.com } 32511010Sandreas.sandberg@arm.com if (actions & SC_INTERRUPT) 32611010Sandreas.sandberg@arm.com sc_interrupt_here(report.get_msg_type(), report.get_severity()); 32711010Sandreas.sandberg@arm.com if (actions & SC_ABORT) 32811010Sandreas.sandberg@arm.com sc_abort(); 32911010Sandreas.sandberg@arm.com if (actions & SC_THROW) { 33011010Sandreas.sandberg@arm.com ::sc_gem5::Process *current = ::sc_gem5::scheduler.current(); 33111010Sandreas.sandberg@arm.com if (current) 33211010Sandreas.sandberg@arm.com current->isUnwinding(false); 33311010Sandreas.sandberg@arm.com throw report; 33411010Sandreas.sandberg@arm.com } 33511010Sandreas.sandberg@arm.com} 33611010Sandreas.sandberg@arm.com 33711010Sandreas.sandberg@arm.comsc_actions 33811010Sandreas.sandberg@arm.comsc_report_handler::get_new_action_id() 33911010Sandreas.sandberg@arm.com{ 34011010Sandreas.sandberg@arm.com maxAction = maxAction << 1; 34111010Sandreas.sandberg@arm.com return maxAction; 34211010Sandreas.sandberg@arm.com} 34311010Sandreas.sandberg@arm.com 34411010Sandreas.sandberg@arm.comsc_report * 34511010Sandreas.sandberg@arm.comsc_report_handler::get_cached_report() 34611010Sandreas.sandberg@arm.com{ 34711010Sandreas.sandberg@arm.com ::sc_gem5::Process *current = ::sc_gem5::scheduler.current(); 34811010Sandreas.sandberg@arm.com if (current) 34911010Sandreas.sandberg@arm.com return current->lastReport(); 35011010Sandreas.sandberg@arm.com return globalReportCache.get(); 35111010Sandreas.sandberg@arm.com} 35211010Sandreas.sandberg@arm.com 35311010Sandreas.sandberg@arm.comvoid 35411010Sandreas.sandberg@arm.comsc_report_handler::clear_cached_report() 35511010Sandreas.sandberg@arm.com{ 35611010Sandreas.sandberg@arm.com ::sc_gem5::Process *current = ::sc_gem5::scheduler.current(); 35711010Sandreas.sandberg@arm.com if (current) { 35811010Sandreas.sandberg@arm.com current->lastReport(nullptr); 35911010Sandreas.sandberg@arm.com } else { 36011010Sandreas.sandberg@arm.com globalReportCache = nullptr; 36111010Sandreas.sandberg@arm.com } 36211010Sandreas.sandberg@arm.com} 36311010Sandreas.sandberg@arm.com 36411010Sandreas.sandberg@arm.combool 36511010Sandreas.sandberg@arm.comsc_report_handler::set_log_file_name(const char *new_name) 36611010Sandreas.sandberg@arm.com{ 36711010Sandreas.sandberg@arm.com if (!new_name) { 36811010Sandreas.sandberg@arm.com logFile = nullptr; 36911010Sandreas.sandberg@arm.com logFileName = nullptr; 37011010Sandreas.sandberg@arm.com return false; 37111010Sandreas.sandberg@arm.com } else { 37211010Sandreas.sandberg@arm.com if (logFileName) 37311010Sandreas.sandberg@arm.com return false; 37411010Sandreas.sandberg@arm.com logFileName = std::unique_ptr<std::string>(new std::string(new_name)); 37511896Ssudhanshu.jha@arm.com logFile = std::unique_ptr<std::ofstream>(new std::ofstream(new_name)); 37611896Ssudhanshu.jha@arm.com return true; 37711896Ssudhanshu.jha@arm.com } 37811896Ssudhanshu.jha@arm.com} 37911896Ssudhanshu.jha@arm.com 38011896Ssudhanshu.jha@arm.comconst char * 38111896Ssudhanshu.jha@arm.comsc_report_handler::get_log_file_name() 38211896Ssudhanshu.jha@arm.com{ 38311896Ssudhanshu.jha@arm.com if (!logFileName) 38411896Ssudhanshu.jha@arm.com return nullptr; 38511896Ssudhanshu.jha@arm.com else 38611896Ssudhanshu.jha@arm.com return logFileName->c_str(); 38711896Ssudhanshu.jha@arm.com} 38811896Ssudhanshu.jha@arm.com 38911896Ssudhanshu.jha@arm.comvoid 39011896Ssudhanshu.jha@arm.comsc_interrupt_here(const char *msg_type, sc_severity) 39111896Ssudhanshu.jha@arm.com{ 39211896Ssudhanshu.jha@arm.com // Purposefully empty, for setting breakpoints supposedly. 39311896Ssudhanshu.jha@arm.com} 39411896Ssudhanshu.jha@arm.com 39511896Ssudhanshu.jha@arm.comvoid 39611896Ssudhanshu.jha@arm.comsc_stop_here(const char *msg_type, sc_severity) 39711896Ssudhanshu.jha@arm.com{ 39811896Ssudhanshu.jha@arm.com // Purposefully empty, for setting breakpoints supposedly. 39911896Ssudhanshu.jha@arm.com} 40011896Ssudhanshu.jha@arm.com 40111896Ssudhanshu.jha@arm.comconst std::string 40211896Ssudhanshu.jha@arm.comsc_report_compose_message(const sc_report &report) 40311896Ssudhanshu.jha@arm.com{ 40411896Ssudhanshu.jha@arm.com std::ostringstream str; 40511896Ssudhanshu.jha@arm.com 40611896Ssudhanshu.jha@arm.com const char *sevName = severityNames[report.get_severity()]; 40711896Ssudhanshu.jha@arm.com int id = report.get_id(); 40811896Ssudhanshu.jha@arm.com 40911010Sandreas.sandberg@arm.com str << sevName << ": "; 41011010Sandreas.sandberg@arm.com if (id >= 0) { 41111010Sandreas.sandberg@arm.com ccprintf(str, "(%c%d) ", sevName[0], id); 41211010Sandreas.sandberg@arm.com } 41311010Sandreas.sandberg@arm.com str << report.get_msg_type(); 41411010Sandreas.sandberg@arm.com 41511010Sandreas.sandberg@arm.com const char *msg = report.get_msg(); 41611010Sandreas.sandberg@arm.com if (msg[0]) 41711010Sandreas.sandberg@arm.com str << ": " << msg; 41811010Sandreas.sandberg@arm.com 41911010Sandreas.sandberg@arm.com if (report.get_severity() > SC_INFO) { 42011010Sandreas.sandberg@arm.com ccprintf(str, "\nIn file: %s:%d", report.get_file_name(), 42111010Sandreas.sandberg@arm.com report.get_line_number()); 42211010Sandreas.sandberg@arm.com 42311010Sandreas.sandberg@arm.com ::sc_gem5::Process *current = ::sc_gem5::scheduler.current(); 42411010Sandreas.sandberg@arm.com const char *name = report.get_process_name(); 42511010Sandreas.sandberg@arm.com if (current && sc_is_running() && name) { 42611010Sandreas.sandberg@arm.com ccprintf(str, "\nIn process: %s @ %s", name, 42711010Sandreas.sandberg@arm.com report.get_time().to_string()); 42811010Sandreas.sandberg@arm.com } 42911010Sandreas.sandberg@arm.com } 43011010Sandreas.sandberg@arm.com 43111010Sandreas.sandberg@arm.com return str.str(); 43211010Sandreas.sandberg@arm.com} 43311010Sandreas.sandberg@arm.com 43411010Sandreas.sandberg@arm.combool 43511010Sandreas.sandberg@arm.comsc_report_close_default_log() 43611010Sandreas.sandberg@arm.com{ 43711010Sandreas.sandberg@arm.com if (logFile) { 43811010Sandreas.sandberg@arm.com logFile = nullptr; 43911010Sandreas.sandberg@arm.com logFileName = nullptr; 44011010Sandreas.sandberg@arm.com return false; 44111010Sandreas.sandberg@arm.com } 44211010Sandreas.sandberg@arm.com return true; 44311010Sandreas.sandberg@arm.com} 44411010Sandreas.sandberg@arm.com 44511010Sandreas.sandberg@arm.com} // namespace sc_core 44611010Sandreas.sandberg@arm.com