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