systemc: Implement sc_event_finder.
authorGabe Black <gabeblack@google.com>
Tue, 14 Aug 2018 01:14:35 +0000 (18:14 -0700)
committerGabe Black <gabeblack@google.com>
Thu, 20 Sep 2018 01:45:22 +0000 (01:45 +0000)
Change-Id: I22aa0a34eabf13593986a92289155257fa26c7de
Reviewed-on: https://gem5-review.googlesource.com/12082
Reviewed-by: Gabe Black <gabeblack@google.com>
Maintainer: Gabe Black <gabeblack@google.com>

src/systemc/ext/core/sc_event.hh

index c2154967d2b7edd0a768c320bb8d2e00c11f2a5a..f8a32f343ef7d03a902e40e2dc9fc4820ce83950 100644 (file)
 #ifndef __SYSTEMC_EXT_CORE_SC_EVENT_HH__
 #define __SYSTEMC_EXT_CORE_SC_EVENT_HH__
 
+#include <cassert>
 #include <set>
 #include <vector>
 
+#include "sc_port.hh"
 #include "sc_time.hh"
 
 namespace sc_gem5
@@ -58,6 +60,7 @@ class sc_event_finder
 {
   protected:
     void warn_unimpl(const char *func) const;
+    virtual ~sc_event_finder() {}
 
   public:
     // Should be "implementation defined" but used in the tests.
@@ -68,18 +71,27 @@ template <class IF>
 class sc_event_finder_t : public sc_event_finder
 {
   public:
-    sc_event_finder_t(const sc_port_base &,
-                      const sc_event & (IF::*event_method)() const)
+    sc_event_finder_t(const sc_port_base &p,
+                      const sc_event & (IF::*_method)() const) :
+        _method(_method)
     {
-        warn_unimpl(__PRETTY_FUNCTION__);
+        _port = dynamic_cast<const sc_port_b<IF> *>(&p);
+        assert(_port);
     }
 
+    virtual ~sc_event_finder_t() {}
+
     const sc_event &
     find_event(sc_interface *if_p=NULL) const override
     {
-        warn_unimpl(__PRETTY_FUNCTION__);
-        return *(const sc_event *)nullptr;
+        const IF *iface = if_p ? dynamic_cast<const IF *>(if_p) :
+            dynamic_cast<const IF *>(_port->get_interface());
+        return (const_cast<IF *>(iface)->*_method)();
     }
+
+  private:
+    const sc_port_b<IF> *_port;
+    const sc_event &(IF::*_method)() const;
 };
 
 class sc_event_and_list