power_insn: support PPC multi-records
[openpower-isa.git] / src / openpower / decoder / power_fields.py
index 4b7d03654713d518c74ac131d77de7ccd75d9658..48cd23d45dd2f8f02fd265462a76ac1f31ff8278 100644 (file)
@@ -127,6 +127,19 @@ class FieldMeta(type):
     def __len__(cls):
         return len(cls.__members__)
 
+    def __getitem__(cls, selector):
+        if isinstance(selector, int):
+            selector = (selector,)
+
+        items = []
+        for idx in selector:
+            if not isinstance(idx, int):
+                raise ValueError(selector)
+            item = cls.__members__[idx]
+            items.append(item)
+
+        return cls.__class__(cls.__name__, (Field,), {}, items=items)
+
     def remap(cls, scheme):
         if isinstance(scheme, type) and issubclass(scheme, Mapping):
             scheme = range(len(scheme))
@@ -317,6 +330,19 @@ class MappingMeta(type):
             length = max(length, len(field))
         return length
 
+    def __getitem__(cls, selector):
+        best_min = 0
+        best_max = 0
+        for field in cls.__members__.values():
+            length = len(field)
+            best_min = min(best_min, length)
+            best_max = max(best_max, length)
+
+        items = tuple(range(best_min, best_max))
+        field = FieldMeta(cls.__name__, (Field,), {}, items=items)
+
+        return field[selector]
+
     def remap(cls, scheme):
         ns = {}
         annotations = {}