diff options
-rw-r--r-- | src/python/m5/SimObject.py | 15 | ||||
-rw-r--r-- | src/python/m5/params.py | 5 | ||||
-rw-r--r-- | src/python/m5/proxy.py | 11 |
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) |