summaryrefslogtreecommitdiff
path: root/src/systemc
diff options
context:
space:
mode:
authorGabe Black <gabeblack@google.com>2018-10-06 00:10:20 -0700
committerGabe Black <gabeblack@google.com>2018-10-16 01:00:42 +0000
commit05f2a5f4f67c6d6b71497a0b6c75faf728f963f6 (patch)
tree9901e11e6fcefc25d8f4b4e09957e3ee12b69a76 /src/systemc
parente9b366922b6b2dcb9e36bfa87eb58aefc3e138fb (diff)
downloadgem5-05f2a5f4f67c6d6b71497a0b6c75faf728f963f6.tar.xz
systemc: Distinguish internal events from normal sc_events.
The internal events aren't supposed to show up in the namespace or as children of objects. Change-Id: Id04b9bfe2e1f8f216390dd989797558eaf33d715 Reviewed-on: https://gem5-review.googlesource.com/c/13309 Reviewed-by: Gabe Black <gabeblack@google.com> Maintainer: Gabe Black <gabeblack@google.com>
Diffstat (limited to 'src/systemc')
-rw-r--r--src/systemc/core/event.cc57
-rw-r--r--src/systemc/core/event.hh5
-rw-r--r--src/systemc/core/module.cc2
-rw-r--r--src/systemc/core/module.hh2
-rw-r--r--src/systemc/core/process.hh4
-rw-r--r--src/systemc/core/sc_event.cc21
-rw-r--r--src/systemc/core/sc_interface.cc2
-rw-r--r--src/systemc/core/sc_module.cc4
-rw-r--r--src/systemc/core/sc_process_handle.cc4
-rw-r--r--src/systemc/ext/channel/sc_event_queue.hh2
-rw-r--r--src/systemc/ext/channel/sc_fifo.hh4
-rw-r--r--src/systemc/ext/channel/sc_mutex.hh2
-rw-r--r--src/systemc/ext/channel/sc_semaphore.hh2
-rw-r--r--src/systemc/ext/channel/sc_signal.hh6
-rw-r--r--src/systemc/ext/core/sc_event.hh19
-rw-r--r--src/systemc/ext/core/sc_join.hh2
16 files changed, 94 insertions, 44 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 *
diff --git a/src/systemc/core/event.hh b/src/systemc/core/event.hh
index 75687729f..127e22ae3 100644
--- a/src/systemc/core/event.hh
+++ b/src/systemc/core/event.hh
@@ -60,8 +60,9 @@ class Sensitivity;
class Event
{
public:
- Event(sc_core::sc_event *_sc_event);
- Event(sc_core::sc_event *_sc_event, const char *_basename);
+ Event(sc_core::sc_event *_sc_event, bool internal=false);
+ Event(sc_core::sc_event *_sc_event, const char *_basename,
+ bool internal=false);
~Event();
diff --git a/src/systemc/core/module.cc b/src/systemc/core/module.cc
index 8cbde8f70..ec6c7761a 100644
--- a/src/systemc/core/module.cc
+++ b/src/systemc/core/module.cc
@@ -47,6 +47,8 @@ Module *_new_module;
} // anonymous namespace
+UniqueNameGen globalNameGen;
+
Module::Module(const char *name) :
_name(name), _sc_mod(nullptr), _obj(nullptr), _ended(false),
_deprecatedConstructor(false), bindingIndex(0)
diff --git a/src/systemc/core/module.hh b/src/systemc/core/module.hh
index 8d6df81e6..b65fdf3bf 100644
--- a/src/systemc/core/module.hh
+++ b/src/systemc/core/module.hh
@@ -68,6 +68,8 @@ class UniqueNameGen
}
};
+extern UniqueNameGen globalNameGen;
+
class Module
{
private:
diff --git a/src/systemc/core/process.hh b/src/systemc/core/process.hh
index a0657f4be..17961c77f 100644
--- a/src/systemc/core/process.hh
+++ b/src/systemc/core/process.hh
@@ -156,8 +156,8 @@ class Process : public ::sc_core::sc_process_b, public ListNode
clearDynamic();
}
- ::sc_core::sc_event _resetEvent;
- ::sc_core::sc_event _terminatedEvent;
+ InternalScEvent _resetEvent;
+ InternalScEvent _terminatedEvent;
ProcessFuncWrapper *func;
sc_core::sc_curr_proc_kind _procKind;
diff --git a/src/systemc/core/sc_event.cc b/src/systemc/core/sc_event.cc
index b2dc0e525..0eeae038f 100644
--- a/src/systemc/core/sc_event.cc
+++ b/src/systemc/core/sc_event.cc
@@ -389,6 +389,19 @@ sc_event::operator | (const sc_event_or_list &eol) const
return expr;
}
+sc_event::sc_event(bool) :
+ _gem5_event(new ::sc_gem5::Event(
+ this, sc_core::sc_gen_unique_name(
+ "$$$internal kernel event$$$"), true))
+{}
+
+sc_event::sc_event(bool, const char *_name) :
+ _gem5_event(new ::sc_gem5::Event(
+ this,
+ (std::string("$$$internal kernel event$$$") + _name).c_str(),
+ true))
+{}
+
const std::vector<sc_event *> &
sc_get_top_level_events()
{
@@ -404,3 +417,11 @@ sc_find_event(const char *name)
}
} // namespace sc_core
+
+namespace sc_gem5
+{
+
+InternalScEvent::InternalScEvent() : sc_event(true) {}
+InternalScEvent::InternalScEvent(const char *_name) : sc_event(true, _name) {}
+
+} // namespace sc_gem5
diff --git a/src/systemc/core/sc_interface.cc b/src/systemc/core/sc_interface.cc
index 4b3865e13..93aff6712 100644
--- a/src/systemc/core/sc_interface.cc
+++ b/src/systemc/core/sc_interface.cc
@@ -41,7 +41,7 @@ const sc_event &
sc_interface::default_event() const
{
SC_REPORT_WARNING("(W116) channel doesn't have a default event", "");
- static sc_event dummy;
+ static sc_gem5::InternalScEvent dummy;
return dummy;
}
diff --git a/src/systemc/core/sc_module.cc b/src/systemc/core/sc_module.cc
index 0b58f3232..77f0f83f3 100644
--- a/src/systemc/core/sc_module.cc
+++ b/src/systemc/core/sc_module.cc
@@ -97,8 +97,6 @@ newCThreadProcess(const char *name, ProcessFuncWrapper *func)
return p;
}
-UniqueNameGen nameGen;
-
} // namespace sc_gem5
namespace sc_core
@@ -836,7 +834,7 @@ sc_gen_unique_name(const char *seed)
if (p)
return p->uniqueName(seed);
- return ::sc_gem5::nameGen.gen(seed);
+ return ::sc_gem5::globalNameGen.gen(seed);
}
bool
diff --git a/src/systemc/core/sc_process_handle.cc b/src/systemc/core/sc_process_handle.cc
index 8bf939801..fff406161 100644
--- a/src/systemc/core/sc_process_handle.cc
+++ b/src/systemc/core/sc_process_handle.cc
@@ -199,7 +199,7 @@ sc_process_handle::terminated_event() const
if (!_gem5_process) {
SC_REPORT_WARNING("(W570) attempt to use an empty "
"process handle ignored", "terminated_event()");
- static sc_event non_event;
+ static sc_gem5::InternalScEvent non_event;
return non_event;
}
return _gem5_process->terminatedEvent();
@@ -289,7 +289,7 @@ sc_process_handle::reset_event() const
if (!_gem5_process) {
SC_REPORT_WARNING("(W570) attempt to use an empty "
"process handle ignored", "reset()");
- static sc_event non_event;
+ static sc_gem5::InternalScEvent non_event;
return non_event;
}
return _gem5_process->resetEvent();
diff --git a/src/systemc/ext/channel/sc_event_queue.hh b/src/systemc/ext/channel/sc_event_queue.hh
index 05ff46ecb..d9b041da9 100644
--- a/src/systemc/ext/channel/sc_event_queue.hh
+++ b/src/systemc/ext/channel/sc_event_queue.hh
@@ -72,7 +72,7 @@ class sc_event_queue : public sc_event_queue_if, public sc_module
private:
void _trigger();
- sc_event _defaultEvent;
+ sc_gem5::InternalScEvent _defaultEvent;
std::priority_queue<
sc_time, std::vector<sc_time>, std::greater<sc_time> > _times;
};
diff --git a/src/systemc/ext/channel/sc_fifo.hh b/src/systemc/ext/channel/sc_fifo.hh
index 02a0ddb98..a1c454a8f 100644
--- a/src/systemc/ext/channel/sc_fifo.hh
+++ b/src/systemc/ext/channel/sc_fifo.hh
@@ -211,8 +211,8 @@ class sc_fifo : public sc_fifo_in_if<T>,
{}
sc_fifo &operator = (const sc_fifo<T> &) { return *this; }
- sc_event _dataReadEvent;
- sc_event _dataWriteEvent;
+ sc_gem5::InternalScEvent _dataReadEvent;
+ sc_gem5::InternalScEvent _dataWriteEvent;
sc_port_base *_reader;
sc_port_base *_writer;
diff --git a/src/systemc/ext/channel/sc_mutex.hh b/src/systemc/ext/channel/sc_mutex.hh
index 12205da9b..0b85ca68f 100644
--- a/src/systemc/ext/channel/sc_mutex.hh
+++ b/src/systemc/ext/channel/sc_mutex.hh
@@ -56,7 +56,7 @@ class sc_mutex : public sc_mutex_if, public sc_object
sc_mutex &operator = (const sc_mutex &) { return *this; }
sc_process_handle holder;
- sc_event unlockEvent;
+ sc_gem5::InternalScEvent unlockEvent;
};
} // namespace sc_core
diff --git a/src/systemc/ext/channel/sc_semaphore.hh b/src/systemc/ext/channel/sc_semaphore.hh
index 31af9c708..3669f771e 100644
--- a/src/systemc/ext/channel/sc_semaphore.hh
+++ b/src/systemc/ext/channel/sc_semaphore.hh
@@ -59,7 +59,7 @@ class sc_semaphore : public sc_semaphore_if, public sc_object
sc_semaphore &operator = (const sc_semaphore &) { return *this; }
int _value;
- sc_event posted;
+ sc_gem5::InternalScEvent posted;
};
} // namespace sc_core
diff --git a/src/systemc/ext/channel/sc_signal.hh b/src/systemc/ext/channel/sc_signal.hh
index 3b2765db5..522638dde 100644
--- a/src/systemc/ext/channel/sc_signal.hh
+++ b/src/systemc/ext/channel/sc_signal.hh
@@ -71,7 +71,7 @@ class ScSignalBase : public sc_core::sc_prim_channel
virtual sc_core::sc_writer_policy get_writer_policy() const = 0;
- sc_core::sc_event _valueChangedEvent;
+ InternalScEvent _valueChangedEvent;
uint64_t _changeStamp;
sc_core::sc_port_base *_gem5WriterPort;
};
@@ -91,8 +91,8 @@ class ScSignalBaseBinary : public ScSignalBase
bool posedge() const;
bool negedge() const;
- sc_core::sc_event _posedgeEvent;
- sc_core::sc_event _negedgeEvent;
+ InternalScEvent _posedgeEvent;
+ InternalScEvent _negedgeEvent;
uint64_t _posStamp;
uint64_t _negStamp;
diff --git a/src/systemc/ext/core/sc_event.hh b/src/systemc/ext/core/sc_event.hh
index 90c1911ca..90fd41f2a 100644
--- a/src/systemc/ext/core/sc_event.hh
+++ b/src/systemc/ext/core/sc_event.hh
@@ -45,6 +45,7 @@ namespace sc_gem5
class Event;
class DynamicSensitivityEventAndList;
class DynamicSensitivityEventOrList;
+class InternalScEvent;
}
@@ -196,6 +197,10 @@ class sc_event
sc_event_or_expr operator | (const sc_event &) const;
sc_event_or_expr operator | (const sc_event_or_list &) const;
+ protected:
+ explicit sc_event(bool);
+ explicit sc_event(bool, const char *);
+
private:
// Disabled
sc_event(const sc_event &) {}
@@ -235,7 +240,7 @@ class sc_event_finder_t : public sc_event_finder
const sc_event &
find_event(sc_interface *if_p=NULL) const override
{
- static const sc_event none;
+ static const sc_gem5::InternalScEvent none;
const IF *iface = if_p ? dynamic_cast<const IF *>(if_p) :
dynamic_cast<const IF *>(_port->get_interface());
if (!iface) {
@@ -258,4 +263,16 @@ sc_event *sc_find_event(const char *);
} // namespace sc_core
+namespace sc_gem5
+{
+
+class InternalScEvent : public ::sc_core::sc_event
+{
+ public:
+ InternalScEvent();
+ InternalScEvent(const char *);
+};
+
+} // namespace sc_gem5
+
#endif //__SYSTEMC_EXT_CORE_SC_INTERFACE_HH__
diff --git a/src/systemc/ext/core/sc_join.hh b/src/systemc/ext/core/sc_join.hh
index 49e54ceee..3b227d311 100644
--- a/src/systemc/ext/core/sc_join.hh
+++ b/src/systemc/ext/core/sc_join.hh
@@ -52,7 +52,7 @@ class sc_join
void wait_clocked();
private:
- sc_event joinEvent;
+ sc_gem5::InternalScEvent joinEvent;
int remaining;
};