X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fsoc%2Fdecoder%2Fpower_fields.py;h=58df625b94e4faa5eaafc4eef78ae3a287a09d5c;hb=dd0c9bc29d663ab695e2c19964f23d475b8c2b22;hp=6fd2508514d0b9bb3d282d34a84cc7f2ba8de1e7;hpb=334c2ed237e3cb5fe66a782afaa2354d577841ba;p=soc.git diff --git a/src/soc/decoder/power_fields.py b/src/soc/decoder/power_fields.py index 6fd25085..58df625b 100644 --- a/src/soc/decoder/power_fields.py +++ b/src/soc/decoder/power_fields.py @@ -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)