summaryrefslogtreecommitdiff
path: root/src/systemc
diff options
context:
space:
mode:
authorGabe Black <gabeblack@google.com>2018-08-08 01:30:47 -0700
committerGabe Black <gabeblack@google.com>2018-09-20 01:42:09 +0000
commitf9ee9d9b8e37d31eb0541862302d578e7286e61f (patch)
tree2b91a5d877728d7170602ced56f1e1f8d5d54f8a /src/systemc
parentb8aefea27654edb2e37f335914e643c7ae35cd8f (diff)
downloadgem5-f9ee9d9b8e37d31eb0541862302d578e7286e61f.tar.xz
systemc: Add a nonstandard sc_status pretty printer operator.
This operator exists in the Accellera implementation, and is necessary to make the test output match. Change-Id: I266629d6c936d4846e88e35af36555fb392b181c Reviewed-on: https://gem5-review.googlesource.com/12074 Reviewed-by: Gabe Black <gabeblack@google.com> Maintainer: Gabe Black <gabeblack@google.com>
Diffstat (limited to 'src/systemc')
-rw-r--r--src/systemc/core/sc_main.cc60
-rw-r--r--src/systemc/ext/core/sc_main.hh4
2 files changed, 64 insertions, 0 deletions
diff --git a/src/systemc/core/sc_main.cc b/src/systemc/core/sc_main.cc
index 446b7377d..641e0d066 100644
--- a/src/systemc/core/sc_main.cc
+++ b/src/systemc/core/sc_main.cc
@@ -244,4 +244,64 @@ sc_get_status()
return ::sc_gem5::kernel ? ::sc_gem5::kernel->status() : SC_ELABORATION;
}
+std::ostream &
+operator << (std::ostream &os, sc_status s)
+{
+ switch (s) {
+ case SC_ELABORATION:
+ os << "SC_ELABORATION";
+ break;
+ case SC_BEFORE_END_OF_ELABORATION:
+ os << "SC_BEFORE_END_OF_ELABORATION";
+ break;
+ case SC_END_OF_ELABORATION:
+ os << "SC_END_OF_ELABORATION";
+ break;
+ case SC_START_OF_SIMULATION:
+ os << "SC_START_OF_SIMULATION";
+ break;
+ case SC_RUNNING:
+ os << "SC_RUNNING";
+ break;
+ case SC_PAUSED:
+ os << "SC_PAUSED";
+ break;
+ case SC_STOPPED:
+ os << "SC_STOPPED";
+ break;
+ case SC_END_OF_SIMULATION:
+ os << "SC_END_OF_SIMULATION";
+ break;
+
+ // Nonstandard
+ case SC_END_OF_INITIALIZATION:
+ os << "SC_END_OF_INITIALIZATION";
+ break;
+ case SC_END_OF_UPDATE:
+ os << "SC_END_OF_UPDATE";
+ break;
+ case SC_BEFORE_TIMESTEP:
+ os << "SC_BEFORE_TIMESTEP";
+ break;
+
+ default:
+ if (s & SC_STATUS_ANY) {
+ const char *prefix = "(";
+ for (sc_status m = (sc_status)0x1;
+ m < SC_STATUS_ANY; m = (sc_status)(m << 1)) {
+ if (m & s) {
+ os << prefix;
+ prefix = "|";
+ os << m;
+ }
+ }
+ os << ")";
+ } else {
+ ccprintf(os, "%#x", s);
+ }
+ }
+
+ return os;
+}
+
} // namespace sc_core
diff --git a/src/systemc/ext/core/sc_main.hh b/src/systemc/ext/core/sc_main.hh
index b6f5ea13e..10a68ca15 100644
--- a/src/systemc/ext/core/sc_main.hh
+++ b/src/systemc/ext/core/sc_main.hh
@@ -30,6 +30,8 @@
#ifndef __SYSTEMC_EXT_CORE_SC_MAIN_HH__
#define __SYSTEMC_EXT_CORE_SC_MAIN_HH__
+#include <iostream>
+
#include "../dt/int/sc_nbdefs.hh"
#include "sc_time.hh"
@@ -97,6 +99,8 @@ namespace sc_core
};
sc_status sc_get_status();
+
+ std::ostream &operator << (std::ostream &os, sc_status s);
} // namespace sc_core
#endif //__SYSTEMC_EXT_CORE_SC_MAIN_HH__