Giacomo Travaglini has submitted this change and it was merged. ( https://gem5-review.googlesource.com/c/public/gem5/+/11969 )

Change subject: sim: Add System method for MasterID lookup
......................................................................

sim: Add System method for MasterID lookup

A new method (lookupMasterId) has been added to the System. A client
should use it when querying the System for the MasterID of a particular
master. It changes from getMasterId since it is
not registering a new MasterID if the master is not found in the
master's list.

Change-Id: I701158d22e235085bba9ab91154fbb702cae1467
Signed-off-by: Giacomo Travaglini <[email protected]>
Reviewed-on: https://gem5-review.googlesource.com/11969
Reviewed-by: Jason Lowe-Power <[email protected]>
Maintainer: Jason Lowe-Power <[email protected]>
---
M src/sim/system.cc
M src/sim/system.hh
2 files changed, 73 insertions(+), 8 deletions(-)

Approvals:
  Jason Lowe-Power: Looks good to me, approved; Looks good to me, approved



diff --git a/src/sim/system.cc b/src/sim/system.cc
index 74bc94e..fc2578f 100644
--- a/src/sim/system.cc
+++ b/src/sim/system.cc
@@ -491,8 +491,55 @@
     System::printSystems();
 }

+std::string
+System::stripSystemName(const std::string& master_name) const
+{
+    if (startswith(master_name, name())) {
+        return master_name.substr(name().size());
+    } else {
+        return master_name;
+    }
+}
+
 MasterID
-System::getGlobalMasterId(std::string master_name)
+System::lookupMasterId(const SimObject* obj) const
+{
+    MasterID id = Request::invldMasterId;
+
+    // number of occurrences of the SimObject pointer
+    // in the master list.
+    auto obj_number = 0;
+
+    for (int i = 0; i < masters.size(); i++) {
+        if (masters[i].obj == obj) {
+            id = i;
+            obj_number++;
+        }
+    }
+
+    fatal_if(obj_number > 1,
+        "Cannot lookup MasterID by SimObject pointer: "
+        "More than one master is sharing the same SimObject\n");
+
+    return id;
+}
+
+MasterID
+System::lookupMasterId(const std::string& master_name) const
+{
+    std::string name = stripSystemName(master_name);
+
+    for (int i = 0; i < masters.size(); i++) {
+        if (masters[i].masterName == name) {
+            return i;
+        }
+    }
+
+    return Request::invldMasterId;
+}
+
+MasterID
+System::getGlobalMasterId(const std::string& master_name)
 {
     return _getMasterId(nullptr, master_name);
 }
@@ -505,14 +552,13 @@
 }

 MasterID
-System::_getMasterId(const SimObject* master, std::string master_name)
+System::_getMasterId(const SimObject* master, const std::string& master_name)
 {
-    if (startswith(master_name, name()))
-        master_name = master_name.erase(0, name().size() + 1);
+    std::string name = stripSystemName(master_name);

     // CPUs in switch_cpus ask for ids again after switching
     for (int i = 0; i < masters.size(); i++) {
-        if (masters[i].masterName == master_name) {
+        if (masters[i].masterName == name) {
             return i;
         }
     }
@@ -530,7 +576,7 @@
     MasterID master_id = masters.size();

     // Append the new Master metadata to the group of system Masters.
-    masters.emplace_back(master, master_name, master_id);
+    masters.emplace_back(master, name, master_id);

     return masters.back().masterId;
 }
diff --git a/src/sim/system.hh b/src/sim/system.hh
index 0d26ffa..878c812 100644
--- a/src/sim/system.hh
+++ b/src/sim/system.hh
@@ -325,6 +325,12 @@

     ThermalModel * thermalModel;

+  protected:
+    /**
+     * Strips off the system name from a master name
+     */
+    std::string stripSystemName(const std::string& master_name) const;
+
   public:

     /**
@@ -370,19 +376,32 @@
      * @param masterName full name of the master
      * @return the master's ID.
      */
-    MasterID getGlobalMasterId(std::string master_name);
+    MasterID getGlobalMasterId(const std::string& master_name);

     /**
      * Get the name of an object for a given request id.
      */
     std::string getMasterName(MasterID master_id);

+    /**
+     * Looks up the MasterID for a given SimObject
+     * returns an invalid MasterID (invldMasterId) if not found.
+     */
+    MasterID lookupMasterId(const SimObject* obj) const;
+
+    /**
+     * Looks up the MasterID for a given object name string
+     * returns an invalid MasterID (invldMasterId) if not found.
+     */
+    MasterID lookupMasterId(const std::string& name) const;
+
     /** Get the number of masters registered in the system */
     MasterID maxMasters() { return masters.size(); }

   protected:
     /** helper function for getMasterId */
- MasterID _getMasterId(const SimObject* master, std::string master_name);
+    MasterID _getMasterId(const SimObject* master,
+                          const std::string& master_name);

     /**
      * Helper function for constructing the full (sub)master name

--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/11969
To unsubscribe, or for help writing mail filters, visit https://gem5-review.googlesource.com/settings

Gerrit-Project: public/gem5
Gerrit-Branch: master
Gerrit-Change-Id: I701158d22e235085bba9ab91154fbb702cae1467
Gerrit-Change-Number: 11969
Gerrit-PatchSet: 5
Gerrit-Owner: Giacomo Travaglini <[email protected]>
Gerrit-Reviewer: Andreas Sandberg <[email protected]>
Gerrit-Reviewer: Gabe Black <[email protected]>
Gerrit-Reviewer: Giacomo Travaglini <[email protected]>
Gerrit-Reviewer: Jason Lowe-Power <[email protected]>
Gerrit-Reviewer: Nikos Nikoleris <[email protected]>
Gerrit-MessageType: merged
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to