sim: Add a getPort function to SimObject.
authorGabe Black <gabeblack@google.com>
Thu, 7 Mar 2019 08:46:29 +0000 (00:46 -0800)
committerGabe Black <gabeblack@google.com>
Tue, 19 Mar 2019 10:21:14 +0000 (10:21 +0000)
This will retrieve a Port object from a given SimObject (which might
not be a MemObject) no matter what flavor of Port it is.

Change-Id: I636b85e9d4929a05a769e165849106bcb5f3e9c1
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/17037
Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com>
Maintainer: Andreas Sandberg <andreas.sandberg@arm.com>

src/python/m5/SimObject.py
src/sim/sim_object.cc
src/sim/sim_object.hh

index b74e93a87ffad2f46a33f44e44695e5a22558fdc..0e29980c67a319e2697b6184bd59fc4737e39358 100644 (file)
@@ -1642,6 +1642,10 @@ class SimObject(object):
     def getValue(self):
         return self.getCCObject()
 
+    @cxxMethod(return_value_policy="reference")
+    def getPort(self, if_name, idx):
+        pass
+
     # Create C++ port connections corresponding to the connections in
     # _port_refs
     def connectPorts(self):
index ab92ae55a368ad609ebf5db400836f9a1edd4f1a..7b794a0b746f45a14437988d739bc848bebf809a 100644 (file)
@@ -133,6 +133,12 @@ SimObject::getProbeManager()
     return probeManager;
 }
 
+Port &
+SimObject::getPort(const std::string &if_name, PortID idx)
+{
+    fatal("%s does not have any port named %s\n", name(), if_name);
+}
+
 //
 // static function: serialize all SimObjects.
 //
index 42a19bbe7cc8ddfafca16a960a6ee96dac01c008..5c9bf0019d7312fd11fe593155b62b0e29465ad9 100644 (file)
@@ -56,6 +56,7 @@
 #include "sim/drain.hh"
 #include "sim/eventq.hh"
 #include "sim/eventq_impl.hh"
+#include "sim/port.hh"
 #include "sim/serialize.hh"
 
 class EventManager;
@@ -169,6 +170,18 @@ class SimObject : public EventManager, public Serializable, public Drainable
      */
     ProbeManager *getProbeManager();
 
+    /**
+     * Get a port with a given name and index. This is used at binding time
+     * and returns a reference to a protocol-agnostic port.
+     *
+     * @param if_name Port name
+     * @param idx Index in the case of a VectorPort
+     *
+     * @return A reference to the given port
+     */
+    virtual Port &getPort(const std::string &if_name,
+                          PortID idx=InvalidPortID);
+
     /**
      * startup() is the final initialization call before simulation.
      * All state is initialized (including unserialized state, if any,