systemc: Add missing sc_interface::register_port, and add calls to it.
authorGabe Black <gabeblack@google.com>
Mon, 1 Oct 2018 09:33:55 +0000 (02:33 -0700)
committerGabe Black <gabeblack@google.com>
Tue, 16 Oct 2018 00:43:35 +0000 (00:43 +0000)
This function is standard and supposed to be on sc_interface, but it
was somehow left out. This change adds it, and makes sure it's called
by the port binding code. The default implementation does nothing, as
it's supposed to according to the spec.

Also note that only the ports farthest from the interfaces are suppose
to call register_port. As the port bindings are completed, we keep
track of whether a port has been bound to another port. If it has, the
source port is farther from the interfaces than the target port (since
it has to go "through" the target port to get to them, and so the
target port should not call register_port.

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

src/systemc/core/kernel.cc
src/systemc/core/port.cc
src/systemc/core/port.hh
src/systemc/core/sc_interface.cc
src/systemc/ext/core/sc_interface.hh
src/systemc/ext/core/sc_port.hh

index ff8e24e6a13e57350227181c241cb7047fcccf03..5804f9683721a0572cac974556bce01fe95302f7 100644 (file)
@@ -93,6 +93,8 @@ Kernel::regStats()
     try {
         for (auto p: allPorts)
             p->finalize();
+        for (auto p: allPorts)
+            p->regPort();
 
         status(::sc_core::SC_END_OF_ELABORATION);
         for (auto p: allPorts)
index 8ee0549a4193cac3250cdc3d241407d2d264c753..db025bbfeff7cfe907817c9c1e6f651ed2a059a0 100644 (file)
@@ -120,6 +120,16 @@ Port::finalize()
     sensitivities.clear();
 }
 
+void
+Port::regPort()
+{
+    if (!regPortNeeded)
+        return;
+
+    for (int i = 0; i < size(); i++)
+        getInterface(i)->register_port(*portBase, portBase->_ifTypeName());
+}
+
 std::list<Port *> allPorts;
 
 } // namespace sc_gem5
index bf3b73a84aa869410392face8db363880e287dfe..8c09ad0d36eb673967aabf5f43fb998b615aee96 100644 (file)
@@ -31,6 +31,7 @@
 #define __SYSTEMC_CORE_PORT_HH__
 
 #include <list>
+#include <typeinfo>
 #include <vector>
 
 #include "base/cprintf.hh"
@@ -57,6 +58,8 @@ class Port
     int _maxSize;
     int _size;
 
+    bool regPortNeeded;
+
     void finalizePort(StaticSensitivityPort *port);
     void finalizeFinder(StaticSensitivityFinder *finder);
     void finalizeReset(ResetSensitivityPort *reset);
@@ -80,6 +83,8 @@ class Port
     void
     addInterfaces(::sc_core::sc_port_base *pb)
     {
+        // Only the ports farthest from the interfaces call register_port.
+        pb->_gem5Port->regPortNeeded = false;
         for (int i = 0; i < pb->size(); i++)
             addInterface(pb->_gem5Interface(i));
     }
@@ -136,7 +141,8 @@ class Port
     ::sc_core::sc_port_base *sc_port_base() { return portBase; }
 
     Port(::sc_core::sc_port_base *port_base, int max) :
-        portBase(port_base), finalized(false), _maxSize(max), _size(0)
+        portBase(port_base), finalized(false), _maxSize(max), _size(0),
+        regPortNeeded(true)
     {
         allPorts.push_front(this);
     }
@@ -161,6 +167,7 @@ class Port
     void sensitive(ResetSensitivityPort *reset);
 
     void finalize();
+    void regPort();
 
     int size() { return _size; }
     int maxSize() { return _maxSize; }
index a236126837c89bf687e9e79e82c4a1fdfd1be91d..4b3865e132d97c1fee005680678db0226e0a1f2a 100644 (file)
@@ -35,6 +35,8 @@
 namespace sc_core
 {
 
+void sc_interface::register_port(sc_port_base &, const char *) {}
+
 const sc_event &
 sc_interface::default_event() const
 {
index 3c6a27deae6d7f904875c2c91cdaff9674e15b51..3b5abdf09e2490989f52c2dcb6eb735d3be046ea 100644 (file)
@@ -39,6 +39,7 @@ class sc_event;
 class sc_interface
 {
   public:
+    virtual void register_port(sc_port_base &, const char *);
     virtual const sc_event &default_event() const;
     virtual ~sc_interface() {};
 
index 3586fec73c91f2f6ca4f7ce9946e1fc36393f18c..904d35b8e2fedb57fa140a5f63d35c4ed52ce8f4 100644 (file)
@@ -30,6 +30,7 @@
 #ifndef __SYSTEMC_EXT_CORE_SC_PORT_HH__
 #define __SYSTEMC_EXT_CORE_SC_PORT_HH__
 
+#include <typeinfo>
 #include <vector>
 
 #include "../utils/sc_report_handler.hh"
@@ -108,6 +109,7 @@ class sc_port_base : public sc_object
     virtual void _gem5AddInterface(sc_interface *i) = 0;
 
     ::sc_gem5::Port *_gem5Port;
+    virtual const char *_ifTypeName() const = 0;
 };
 
 template <class IF>
@@ -210,6 +212,8 @@ class sc_port_b : public sc_port_base
         _interfaces.push_back(interface);
     }
 
+    const char *_ifTypeName() const { return typeid(IF).name(); }
+
     // Disabled
     sc_port_b() {}
     sc_port_b(const sc_port_b<IF> &) {}