summaryrefslogtreecommitdiff
path: root/src/systemc/core/event.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/systemc/core/event.cc')
-rw-r--r--src/systemc/core/event.cc57
1 files changed, 33 insertions, 24 deletions
diff --git a/src/systemc/core/event.cc b/src/systemc/core/event.cc
index 2e356bdb6..de5bc8c32 100644
--- a/src/systemc/core/event.cc
+++ b/src/systemc/core/event.cc
@@ -43,38 +43,47 @@
namespace sc_gem5
{
-Event::Event(sc_core::sc_event *_sc_event) : Event(_sc_event, nullptr) {}
+Event::Event(sc_core::sc_event *_sc_event, bool internal) :
+ Event(_sc_event, nullptr, internal)
+{}
-Event::Event(sc_core::sc_event *_sc_event, const char *_basename_cstr) :
+Event::Event(sc_core::sc_event *_sc_event, const char *_basename_cstr,
+ bool internal) :
_sc_event(_sc_event), _basename(_basename_cstr ? _basename_cstr : ""),
- delayedNotify([this]() { this->notify(); }), _triggeredStamp(~0ULL)
+ _inHierarchy(!internal), delayedNotify([this]() { this->notify(); }),
+ _triggeredStamp(~0ULL)
{
if (_basename == "" && ::sc_core::sc_is_running())
_basename = ::sc_core::sc_gen_unique_name("event");
- parent = pickParentObj();
+ parent = internal ? nullptr : pickParentObj();
- std::string original_name = _basename;
- _basename = pickUniqueName(parent, _basename);
-
- if (parent) {
- Object *obj = Object::getFromScObject(parent);
- obj->addChildEvent(_sc_event);
+ if (internal) {
+ _basename = globalNameGen.gen(_basename);
+ _name = _basename;
} else {
- topLevelEvents.emplace(topLevelEvents.end(), _sc_event);
- }
-
- std::string path = parent ? (std::string(parent->name()) + ".") : "";
-
- if (original_name != "" && _basename != original_name) {
- std::string message = path + original_name +
- ". Latter declaration will be renamed to " +
- path + _basename;
- SC_REPORT_WARNING("(W505) object already exists", message.c_str());
+ std::string original_name = _basename;
+ _basename = pickUniqueName(parent, _basename);
+
+ if (parent) {
+ Object *obj = Object::getFromScObject(parent);
+ obj->addChildEvent(_sc_event);
+ } else {
+ topLevelEvents.emplace(topLevelEvents.end(), _sc_event);
+ }
+
+ std::string path = parent ? (std::string(parent->name()) + ".") : "";
+
+ if (original_name != "" && _basename != original_name) {
+ std::string message = path + original_name +
+ ". Latter declaration will be renamed to " +
+ path + _basename;
+ SC_REPORT_WARNING("(W505) object already exists", message.c_str());
+ }
+
+ _name = path + _basename;
}
- _name = path + _basename;
-
allEvents.emplace(allEvents.end(), _sc_event);
// Determine if we're in the hierarchy (created once initialization starts
@@ -86,7 +95,7 @@ Event::~Event()
if (parent) {
Object *obj = Object::getFromScObject(parent);
obj->delChildEvent(_sc_event);
- } else {
+ } else if (inHierarchy()) {
EventsIt it = find(topLevelEvents.begin(), topLevelEvents.end(),
_sc_event);
assert(it != topLevelEvents.end());
@@ -117,7 +126,7 @@ Event::basename() const
bool
Event::inHierarchy() const
{
- return _name.length() != 0;
+ return _inHierarchy;
}
sc_core::sc_object *