sim: Add System method for MasterID lookup
authorGiacomo Travaglini <giacomo.travaglini@arm.com>
Thu, 10 May 2018 13:37:27 +0000 (14:37 +0100)
committerGiacomo Travaglini <giacomo.travaglini@arm.com>
Fri, 7 Sep 2018 13:16:20 +0000 (13:16 +0000)
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 <giacomo.travaglini@arm.com>
Reviewed-on: https://gem5-review.googlesource.com/11969
Reviewed-by: Jason Lowe-Power <jason@lowepower.com>
Maintainer: Jason Lowe-Power <jason@lowepower.com>

src/sim/system.cc
src/sim/system.hh

index 74bc94ee848b78f49bd10c54b722c60c1779bd9c..fc2578f861f2fc366531b6b950f7a64d15f9adfa 100644 (file)
@@ -491,8 +491,55 @@ printSystems()
     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::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(std::string master_name)
+System::getGlobalMasterId(const std::string& master_name)
 {
     return _getMasterId(nullptr, master_name);
 }
@@ -505,14 +552,13 @@ System::getMasterId(const SimObject* master, std::string submaster)
 }
 
 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 @@ System::_getMasterId(const SimObject* master, std::string master_name)
     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;
 }
index 0d26ffa0d71930b61adf9ff60668180c8649a225..878c8125279d113a6097281c15aae821e8ef3fc2 100644 (file)
@@ -325,6 +325,12 @@ class System : public MemObject
 
     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 @@ class System : public MemObject
      * @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