Giacomo Travaglini has uploaded this change for review. (
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]>
---
M src/sim/system.cc
M src/sim/system.hh
2 files changed, 73 insertions(+), 8 deletions(-)
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: 1
Gerrit-Owner: Giacomo Travaglini <[email protected]>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev