systemc: Track exports and prim channels, and call their callbacks.
authorGabe Black <gabeblack@google.com>
Thu, 16 Aug 2018 06:35:38 +0000 (23:35 -0700)
committerGabe Black <gabeblack@google.com>
Thu, 20 Sep 2018 01:50:03 +0000 (01:50 +0000)
Also call the callbacks on the ports which were already being tracked.

Change-Id: I5ba8ea366e87fc48b58712f35b93c27bccf92cb3
Reviewed-on: https://gem5-review.googlesource.com/12210
Reviewed-by: Gabe Black <gabeblack@google.com>
Maintainer: Gabe Black <gabeblack@google.com>

src/systemc/core/channel.cc
src/systemc/core/channel.hh
src/systemc/core/kernel.cc
src/systemc/core/module.hh
src/systemc/core/sc_export.cc
src/systemc/ext/core/sc_export.hh
src/systemc/ext/core/sc_port.hh
src/systemc/ext/core/sc_prim.hh

index 4a862b8aa18d44b13851292d3721a3b0a9238202..49d9f6cb78c8eb2caf35f7d70e7f155b1a01f854 100644 (file)
 namespace sc_gem5
 {
 
+Channel::Channel(sc_core::sc_prim_channel *_sc_chan) : _sc_chan(_sc_chan)
+{
+    allChannels.insert(this);
+}
+
+Channel::~Channel()
+{
+    allChannels.erase(this);
+}
+
 void
 Channel::requestUpdate()
 {
@@ -47,4 +57,6 @@ Channel::asyncRequestUpdate()
     scheduler.requestUpdate(this);
 }
 
+std::set<Channel *> allChannels;
+
 } // namespace sc_gem5
index 7ce4375725b84bf1b7b079aea6ad7afd137e6077..6111e3c16957366b60d667962eb0bd423794a874 100644 (file)
@@ -30,6 +30,8 @@
 #ifndef __SYSTEMC_CORE_CHANNEL_HH__
 #define __SYSTEMC_CORE_CHANNEL_HH__
 
+#include <set>
+
 #include "systemc/core/list.hh"
 #include "systemc/ext/core/sc_prim.hh"
 
@@ -39,9 +41,9 @@ namespace sc_gem5
 class Channel : public ListNode
 {
   public:
-    Channel(sc_core::sc_prim_channel *_sc_chan) : _sc_chan(_sc_chan) {}
+    Channel(sc_core::sc_prim_channel *_sc_chan);
 
-    virtual ~Channel() {}
+    virtual ~Channel();
 
     void requestUpdate();
     void asyncRequestUpdate();
@@ -53,6 +55,8 @@ class Channel : public ListNode
     sc_core::sc_prim_channel *_sc_chan;
 };
 
+extern std::set<Channel *> allChannels;
+
 } // namespace sc_gem5
 
 #endif  //__SYSTEMC_CORE_CHANNEL_HH__
index 65a444536c86ef54e091da1b1f19da26f07c65af..84bdfd13f6b45aab05395a976e5a5146e0850900 100644 (file)
@@ -30,6 +30,7 @@
 #include "systemc/core/kernel.hh"
 
 #include "base/logging.hh"
+#include "systemc/core/channel.hh"
 #include "systemc/core/module.hh"
 #include "systemc/core/scheduler.hh"
 
@@ -67,8 +68,14 @@ Kernel::init()
     for (auto m: sc_gem5::allModules) {
         callbackModule(m);
         m->sc_mod()->before_end_of_elaboration();
+        for (auto p: m->ports)
+            p->before_end_of_elaboration();
+        for (auto e: m->exports)
+            e->before_end_of_elaboration();
     }
     callbackModule(nullptr);
+    for (auto c: sc_gem5::allChannels)
+        c->sc_chan()->before_end_of_elaboration();
 
     if (stopAfterCallbacks)
         stopWork();
@@ -82,8 +89,15 @@ Kernel::regStats()
             p->_gem5Finalize();
 
     status(::sc_core::SC_END_OF_ELABORATION);
-    for (auto m: sc_gem5::allModules)
+    for (auto m: sc_gem5::allModules) {
         m->sc_mod()->end_of_elaboration();
+        for (auto p: m->ports)
+            p->end_of_elaboration();
+        for (auto e: m->exports)
+            e->end_of_elaboration();
+    }
+    for (auto c: sc_gem5::allChannels)
+        c->sc_chan()->end_of_elaboration();
 
     if (stopAfterCallbacks)
         stopWork();
@@ -93,8 +107,15 @@ void
 Kernel::startup()
 {
     status(::sc_core::SC_START_OF_SIMULATION);
-    for (auto m: sc_gem5::allModules)
+    for (auto m: sc_gem5::allModules) {
         m->sc_mod()->start_of_simulation();
+        for (auto p: m->ports)
+            p->start_of_simulation();
+        for (auto e: m->exports)
+            e->start_of_simulation();
+    }
+    for (auto c: sc_gem5::allChannels)
+        c->sc_chan()->start_of_simulation();
 
     startComplete = true;
 
@@ -121,8 +142,15 @@ void
 Kernel::stopWork()
 {
     status(::sc_core::SC_END_OF_SIMULATION);
-    for (auto m: sc_gem5::allModules)
+    for (auto m: sc_gem5::allModules) {
         m->sc_mod()->end_of_simulation();
+        for (auto p: m->ports)
+            p->end_of_simulation();
+        for (auto e: m->exports)
+            e->end_of_simulation();
+    }
+    for (auto c: sc_gem5::allChannels)
+        c->sc_chan()->end_of_simulation();
 
     endComplete = true;
 
index 0a6d9b7bb4484e1cd9c1fef7384b09b6126e4e39..e988b9667e9c17c927737d47de539cd75ac0bd05 100644 (file)
@@ -44,6 +44,7 @@ namespace sc_core
 {
 
 class sc_port_base;
+class sc_export_base;
 
 } // namespace sc_core
 
@@ -111,6 +112,7 @@ class Module
     const char *uniqueName(const char *seed) { return nameGen.gen(seed); }
 
     std::vector<::sc_core::sc_port_base *> ports;
+    std::vector<::sc_core::sc_export_base *> exports;
 };
 
 Module *currentModule();
index 8340cf9c6c269131054f5c885c87c035ace2df14..383552b1ad2ca0849555021a6dbc0be9a88f68f0 100644 (file)
  */
 
 #include "base/logging.hh"
+#include "systemc/core/module.hh"
 #include "systemc/ext/core/sc_export.hh"
 
 namespace sc_core
 {
 
-sc_export_base::sc_export_base(const char *n) : sc_object(n) {}
+sc_export_base::sc_export_base(const char *n) : sc_object(n)
+{
+    ::sc_gem5::Module *m = ::sc_gem5::currentModule();
+    m->exports.push_back(this);
+}
 sc_export_base::~sc_export_base() {}
 
 } // namespace sc_core
index f3cf816194b43402fa14000ee62e1a586279ef58..f5ce894b87bc53b8f37f4843155ff97152edf652 100644 (file)
@@ -46,6 +46,14 @@ class sc_export_base : public sc_object
 
     virtual sc_interface *get_iterface() = 0;
     virtual const sc_interface *get_interface() const = 0;
+
+  protected:
+    friend class sc_gem5::Kernel;
+
+    virtual void before_end_of_elaboration() = 0;
+    virtual void end_of_elaboration() = 0;
+    virtual void start_of_simulation() = 0;
+    virtual void end_of_simulation() = 0;
 };
 
 template <class IF>
@@ -74,10 +82,10 @@ class sc_export : public sc_export_base
     const sc_interface *get_interface() const override { return interface; }
 
   protected:
-    virtual void before_end_of_elaboration() {}
-    virtual void end_of_elaboration() {}
-    virtual void start_of_simulation() {}
-    virtual void end_of_simulation() {}
+    void before_end_of_elaboration() {}
+    void end_of_elaboration() {}
+    void start_of_simulation() {}
+    void end_of_simulation() {}
 
   private:
     IF *interface;
index 6031d549502bb8402609f03ac7a3290b9df03d4b..73f5362b64ef75c16afec16d4ed4f02f01bd0e0b 100644 (file)
@@ -75,6 +75,11 @@ class sc_port_base : public sc_object
     virtual int vbind(sc_interface &) = 0;
     virtual int vbind(sc_port_base &) = 0;
 
+    virtual void before_end_of_elaboration() = 0;
+    virtual void end_of_elaboration() = 0;
+    virtual void start_of_simulation() = 0;
+    virtual void end_of_simulation() = 0;
+
   private:
     friend class ::sc_gem5::PendingSensitivityPort;
     friend class ::sc_gem5::Kernel;
@@ -110,10 +115,10 @@ class sc_port_b : public sc_port_base
     const sc_interface *get_interface() const { return _interfaces.at(0); }
 
   protected:
-    virtual void before_end_of_elaboration() {}
-    virtual void end_of_elaboration() {}
-    virtual void start_of_elaboration() {}
-    virtual void end_of_simulation() {}
+    void before_end_of_elaboration() {}
+    void end_of_elaboration() {}
+    void start_of_simulation() {}
+    void end_of_simulation() {}
 
     explicit sc_port_b(int n, sc_port_policy p) :
             sc_port_base(sc_gen_unique_name("port"), n, p)
index 106489280224b021ef413fcdcf5a59404fcfb7c0..99e23145681f11f02fb738452b2569582ea0b720 100644 (file)
@@ -91,6 +91,8 @@ class sc_prim_channel : public sc_object
     void wait(const sc_time &, const sc_event_and_list &);
     void wait(double, sc_time_unit, const sc_event_and_list &);
 
+    friend class sc_gem5::Kernel;
+
     virtual void before_end_of_elaboration() {}
     virtual void end_of_elaboration() {}
     virtual void start_of_simulation() {}