fix address must convert to SelectableInt
[soc.git] / src / soc / decoder / power_fields.py
index 6fd2508514d0b9bb3d282d34a84cc7f2ba8de1e7..58df625b94e4faa5eaafc4eef78ae3a287a09d5c 100644 (file)
@@ -1,5 +1,5 @@
 from collections import OrderedDict, namedtuple
-from soc.decoder.power_enums import download_wiki_file
+from soc.decoder.power_enums import find_wiki_file
 
 
 class BitRange(OrderedDict):
@@ -8,9 +8,9 @@ class BitRange(OrderedDict):
 
     def __getitem__(self, subscript):
         if isinstance(subscript, slice):
-            return list(self)[subscript]
+            return list(self.values())[subscript]
         else:
-            return self[subscript]
+            return OrderedDict.__getitem__(self, subscript)
 
 
 def decode_instructions(form):
@@ -108,14 +108,23 @@ def decode_form(form):
 
 class DecodeFields:
 
-    def __init__(self, bitkls=BitRange, bitargs=(), fname="fields.txt"):
+    def __init__(self, bitkls=BitRange, bitargs=(), fname=None,
+                 name_on_wiki=None):
         self.bitkls = bitkls
         self.bitargs = bitargs
-        self.fname = download_wiki_file(fname)
+        if fname is None:
+            assert name_on_wiki is None
+            fname = "fields.txt"
+            name_on_wiki = "fields.text"
+        self.fname = find_wiki_file(name_on_wiki)
+
+    @property
+    def form_names(self):
+        return self.instrs.keys()
 
     def create_specs(self):
         self.forms, self.instrs = self.decode_fields()
-        self.form_names = forms = self.instrs.keys()
+        forms = self.form_names
         #print ("specs", self.forms, forms)
         for form in forms:
             fields = self.instrs[form]
@@ -142,7 +151,7 @@ class DecodeFields:
             "LK": self.FormI.LK,
             "AA": self.FormB.AA,
             "Rc": self.FormX.Rc,
-            "OE": self.FormXO.Rc,
+            "OE": self.FormXO.OE,
             "BD": self.FormB.BD,
             "BF": self.FormX.BF,
             "CR": self.FormXL.XO,
@@ -183,7 +192,7 @@ class DecodeFields:
                 assert l[0] == '#'
                 heading = l[1:].strip()
                 # if heading.startswith('1.6.28'): # skip instr fields for now
-                # break
+                #     break
                 heading = heading.split(' ')[-1]
                 reading_data = True
                 forms[heading] = []
@@ -197,16 +206,26 @@ class DecodeFields:
                 for form, field in i.items():
                     inst[form] = self.decode_instruction_fields(field)
             # else:
-            #    res[hdr] = decode_form(form)
+            #     res[hdr] = decode_form(form)
         return res, inst
 
     def decode_instruction_fields(self, fields):
         res = {}
         for field in fields:
             f, spec = field.strip().split(" ")
+            ss = spec[1:-1].split(",")
+            fs = f.split(",")
+            if len(fs) > 1:
+                individualfields = []
+                for f0, s0 in zip(fs, ss):
+                    txt = "%s (%s)" % (f0, s0)
+                    individualfields.append(txt)
+                if len(fs) > 1:
+                    res.update(self.decode_instruction_fields(
+                        individualfields))
             d = self.bitkls(*self.bitargs)
             idx = 0
-            for s in spec[1:-1].split(","):
+            for s in ss:
                 s = s.split(':')
                 if len(s) == 1:
                     d[idx] = int(s[0])
@@ -229,3 +248,7 @@ if __name__ == '__main__':
     dec = DecodeFields()
     dec.create_specs()
     forms, instrs = dec.forms, dec.instrs
+    for form, fields in instrs.items():
+        print("Form", form)
+        for field, bits in fields.items():
+            print("\tfield", field, bits)