Config: Add support for a Self.all proxy object
authorAli Saidi <Ali.Saidi@ARM.com>
Sun, 10 Jul 2011 17:56:08 +0000 (12:56 -0500)
committerAli Saidi <Ali.Saidi@ARM.com>
Sun, 10 Jul 2011 17:56:08 +0000 (12:56 -0500)
src/python/m5/SimObject.py
src/python/m5/params.py
src/python/m5/proxy.py

index c18d6900c9c9f83c380ba68c84763d7aa04bb5d0..9729fd30fe4243e7668870cda76b587424864389 100644 (file)
@@ -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
 
index 86b4b050455cfc1958c2d8e4f40bffe19b7d47c7..4dd8797836e1168dcfd54e7e00cb0eb4d128e11d 100644 (file)
@@ -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
index e539f14eec64ea6f45515d8bbe74bac9b14f2c59..a2926589293f66ab9d6a3ca73390ab1a1d63de86 100644 (file)
@@ -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)