systemc: When sensitive to an event finder, find on all interfaces.
authorGabe Black <gabeblack@google.com>
Thu, 30 Aug 2018 06:02:21 +0000 (23:02 -0700)
committerGabe Black <gabeblack@google.com>
Wed, 3 Oct 2018 00:15:57 +0000 (00:15 +0000)
When a process is sensitive to an event finder and that finder is
attached to a port which is bound to multiple interfaces, the process
is supposed to be made sensitive to the event finder function's result
when called on each interface, not just the first one.

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

src/systemc/core/process.hh
src/systemc/ext/core/sc_event.hh
src/systemc/ext/core/sc_port.hh

index 0d852afdb2e57d221ab5f83a53be44256745cd12..2ec75dc06c60d1083e9bf66b9ab7b194d5416e55 100644 (file)
@@ -37,6 +37,7 @@
 #include "base/fiber.hh"
 #include "sim/eventq.hh"
 #include "systemc/core/bindinfo.hh"
+#include "systemc/core/event.hh"
 #include "systemc/core/list.hh"
 #include "systemc/core/object.hh"
 #include "systemc/core/sched_event.hh"
@@ -259,7 +260,13 @@ class PendingSensitivityFinder : public PendingSensitivity
     void
     finalize(Sensitivities &s) override
     {
-        s.push_back(new SensitivityEvent(process, &finder->find_event()));
+        const ::sc_core::sc_port_base *port = finder->port();
+        int size = port->size();
+        for (int i = 0; i < size; i++) {
+            ::sc_core::sc_interface *interface = port->_gem5Interface(i);
+            const ::sc_core::sc_event *event = &finder->find_event(interface);
+            s.push_back(new SensitivityEvent(process, event));
+        }
     }
 };
 
index a5ac2d4f0316afdd894e66f39e1f9030f6d4331c..e9748cb9508d55d82133d0f675e0359f8e0a7dd2 100644 (file)
@@ -64,6 +64,7 @@ class sc_event_finder
   public:
     // Should be "implementation defined" but used in the tests.
     virtual const sc_event &find_event(sc_interface *if_p=NULL) const = 0;
+    virtual const sc_port_base *port() const = 0;
 };
 
 template <class IF>
@@ -80,6 +81,8 @@ class sc_event_finder_t : public sc_event_finder
 
     virtual ~sc_event_finder_t() {}
 
+    const sc_port_base *port() const { return _port; }
+
     const sc_event &
     find_event(sc_interface *if_p=NULL) const override
     {
index b392359602e484081db353d569b880c1fc3573af..50c45dc0cd69c6ae162f1ea496656b3c93acc80c 100644 (file)
@@ -42,6 +42,7 @@ namespace sc_gem5
 class BindInfo;
 class Module;
 class PendingSensitivityPort;
+class PendingSensitivityFinder;
 
 };
 
@@ -85,6 +86,7 @@ class sc_port_base : public sc_object
 
   private:
     friend class ::sc_gem5::PendingSensitivityPort;
+    friend class ::sc_gem5::PendingSensitivityFinder;
     friend class ::sc_gem5::Kernel;
 
     void _gem5Finalize();