systemc: Distinguish internal events from normal sc_events.
authorGabe Black <gabeblack@google.com>
Sat, 6 Oct 2018 07:10:20 +0000 (00:10 -0700)
committerGabe Black <gabeblack@google.com>
Tue, 16 Oct 2018 01:00:42 +0000 (01:00 +0000)
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>

16 files changed:
src/systemc/core/event.cc
src/systemc/core/event.hh
src/systemc/core/module.cc
src/systemc/core/module.hh
src/systemc/core/process.hh
src/systemc/core/sc_event.cc
src/systemc/core/sc_interface.cc
src/systemc/core/sc_module.cc
src/systemc/core/sc_process_handle.cc
src/systemc/ext/channel/sc_event_queue.hh
src/systemc/ext/channel/sc_fifo.hh
src/systemc/ext/channel/sc_mutex.hh
src/systemc/ext/channel/sc_semaphore.hh
src/systemc/ext/channel/sc_signal.hh
src/systemc/ext/core/sc_event.hh
src/systemc/ext/core/sc_join.hh

index 2e356bdb6c66dc9e86f0f923d89d481fddf5ffe8..de5bc8c32a8b307bccdd36cc4f2aadc372e7d737 100644 (file)
 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 *
index 75687729fbb659928e03b98a06361055a9f29c8d..127e22ae30ea8c41989371035502d68c7bc740f9 100644 (file)
@@ -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();
 
index 8cbde8f7081ebbe5ea8fc4472cdce2d8fa385118..ec6c7761a02c258914839e6af0c7cf498444d870 100644 (file)
@@ -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)
index 8d6df81e6053ad96b0c1bb88ead2deb65f3bde54..b65fdf3bf21361594af623b2c89463e9b83f28f0 100644 (file)
@@ -68,6 +68,8 @@ class UniqueNameGen
     }
 };
 
+extern UniqueNameGen globalNameGen;
+
 class Module
 {
   private:
index a0657f4bee0ef80d15a20ef227ca2c714f2cc5ab..17961c77ff97788aded8163f91de73269107efa5 100644 (file)
@@ -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;
index b2dc0e5252bbab7079bd486d247439c760dcc505..0eeae038f7f2e9049fb459d146aa275ff85845dd 100644 (file)
@@ -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
index 4b3865e132d97c1fee005680678db0226e0a1f2a..93aff6712affd7249b87860e70fabd9bcc7806a9 100644 (file)
@@ -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;
 }
 
index 0b58f32320259ac09c9b4a559b674d2e0a0109f3..77f0f83f32de49a1b79815c1dffbe23772fca1bd 100644 (file)
@@ -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
index 8bf939801db99f094ff1841708e6bb4b3a4216d1..fff406161aef4419adc4bbad9b8ecd4de7cc920e 100644 (file)
@@ -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();
index 05ff46ecb02632259290ff21f6908e1984d569b4..d9b041da9670dab5ea3c35d81b94063caeef7ee4 100644 (file)
@@ -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;
 };
index 02a0ddb9854252762fcb29e14db558d85d4c307b..a1c454a8fa29b7fb5baed15fc18297c1f0a5fc54 100644 (file)
@@ -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;
index 12205da9bc55eea5a999132ea3390614d62eba1b..0b85ca68f0a0fb7d74771a729e936724028f6f8f 100644 (file)
@@ -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
index 31af9c708db5bda3723481113ffb7c3bb780b5d3..3669f771e9a0d94168a71920fc8fb394bcdf54d0 100644 (file)
@@ -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
index 3b2765db52e77a803112a9d35f53b5e58375eded..522638dde5d7a39ed6c24815b07b40962cb6ede0 100644 (file)
@@ -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;
index 90c1911ca37c33c8d753b1838cb90443cd3f10fd..90fd41f2a36a36fccda3cdfdaa288960549dc69e 100644 (file)
@@ -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__
index 49e54ceeeb81a0129546e44f2bd943367fe86eeb..3b227d3110f9b3c42e93134466a93fa0ef21b3c3 100644 (file)
@@ -52,7 +52,7 @@ class sc_join
     void wait_clocked();
 
   private:
-    sc_event joinEvent;
+    sc_gem5::InternalScEvent joinEvent;
     int remaining;
 };