summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/python/m5/SimObject.py15
-rw-r--r--src/python/m5/params.py5
-rw-r--r--src/python/m5/proxy.py11
3 files changed, 30 insertions, 1 deletions
diff --git a/src/python/m5/SimObject.py b/src/python/m5/SimObject.py
index c18d6900c..9729fd30f 100644
--- a/src/python/m5/SimObject.py
+++ b/src/python/m5/SimObject.py
@@ -746,6 +746,21 @@ class SimObject(object):
found_obj = match_obj
return found_obj, found_obj != None
+ def find_all(self, ptype):
+ all = {}
+ # search children
+ for child in self._children.itervalues():
+ if isinstance(child, ptype) and not isproxy(child) and \
+ not isNullPointer(child):
+ all[child] = True
+ # search param space
+ for pname,pdesc in self._params.iteritems():
+ if issubclass(pdesc.ptype, ptype):
+ match_obj = self._values[pname]
+ if not isproxy(match_obj) and not isNullPointer(match_obj):
+ all[match_obj] = True
+ return all.keys(), True
+
def unproxy(self, base):
return self
diff --git a/src/python/m5/params.py b/src/python/m5/params.py
index 86b4b0504..4dd879783 100644
--- a/src/python/m5/params.py
+++ b/src/python/m5/params.py
@@ -184,7 +184,10 @@ class VectorParamValue(list):
return [ v.getValue() for v in self ]
def unproxy(self, base):
- return [v.unproxy(base) for v in self]
+ if len(self) == 1 and isinstance(self[0], AllProxy):
+ return self[0].unproxy(base)
+ else:
+ return [v.unproxy(base) for v in self]
class SimObjectVector(VectorParamValue):
# support clone operation
diff --git a/src/python/m5/proxy.py b/src/python/m5/proxy.py
index e539f14ee..a29265892 100644
--- a/src/python/m5/proxy.py
+++ b/src/python/m5/proxy.py
@@ -184,6 +184,13 @@ class AnyProxy(BaseProxy):
def path(self):
return 'any'
+class AllProxy(BaseProxy):
+ def find(self, obj):
+ return obj.find_all(self._pdesc.ptype)
+
+ def path(self):
+ return 'all'
+
def isproxy(obj):
if isinstance(obj, (BaseProxy, params.EthernetAddr)):
return True
@@ -201,6 +208,10 @@ class ProxyFactory(object):
def __getattr__(self, attr):
if attr == 'any':
return AnyProxy(self.search_self, self.search_up)
+ elif attr == 'all':
+ if self.search_up:
+ assert("Parant.all is not supported")
+ return AllProxy(self.search_self, self.search_up)
else:
return AttrProxy(self.search_self, self.search_up, attr)