diff options
author | Joakim Sindholt <opensource@zhasha.com> | 2009-10-14 21:32:46 +0200 |
---|---|---|
committer | Joakim Sindholt <opensource@zhasha.com> | 2009-10-14 21:32:46 +0200 |
commit | 3c8c2e15a03fe31ba0163cde38e310a68f44cbb5 (patch) | |
tree | 8468ee28c77202b6ca96a6699d753103938024d1 | |
parent | 86c0b9917af583f3b933ef586da8a60737714e3d (diff) |
Make things more python and fix reference counting
Sadly, this doesn't change the output, but thanks MAD for the input
-rwxr-xr-x | radeonreg.py | 101 |
1 files changed, 54 insertions, 47 deletions
diff --git a/radeonreg.py b/radeonreg.py index a7aeb3f..919c10b 100755 --- a/radeonreg.py +++ b/radeonreg.py @@ -1,6 +1,7 @@ #!/usr/bin/python # -*- coding: utf-8 -*- +import itertools import re class RadeonReg: @@ -14,7 +15,10 @@ class RadeonReg: self.fields = [] self.stride = stride - def equals(self, rhs): + def __ne__(self, rhs): return not (self == rhs) + def __eq__(self, rhs): + if (not isinstance(rhs, RadeonReg)): return False + if self.unit != rhs.unit or \ self.name != rhs.name or \ self.desc != rhs.desc or \ @@ -25,7 +29,7 @@ class RadeonReg: len(self.fields) != len(rhs.fields): return False for i in xrange(len(self.fields)): - if not self.fields[i].equals(rhs.fields[i]): return False + if self.fields[i] != rhs.fields[i]: return False return True @@ -37,7 +41,10 @@ class RadeonField: self.high = high if high >= low else low self.enum = None - def equals(self, rhs): + def __ne__(self, rhs): return not (self == rhs) + def __eq__(self, rhs): + if (not isinstance(rhs, RadeonField)): return False + if self.name == rhs.name and \ self.desc == rhs.desc and \ self.low == rhs.low and \ @@ -50,6 +57,15 @@ class EnumEntry: self.val = val self.name = name self.desc = desc + + def __ne__(self, rhs): return not (self == rhs) + def __eq__(self, rhs): + if (not isinstance(rhs, EnumEntry)): return False + + if self.val == rhs.val and \ + self.name == rhs.name and \ + self.desc == rhs.desc: return True + return False class RadeonEnum: def __init__(self): @@ -59,23 +75,29 @@ class RadeonEnum: def add(self, val, name, desc): self.entries.append(EnumEntry(val, name, desc)) - def reference(self): - self.refs = self.refs + 1 + def reference(self): self.refs += 1 + def dereference(self): self.refs -= 1 - def equals(self, rhs): + def __ne__(self, rhs): return not (self == rhs) + def __eq__(self, rhs): + if (not isinstance(rhs, RadeonEnum)): return False + if len(self.entries) != len(rhs.entries): return False + for i in xrange(len(self.entries)): - if self.entries[i].val != rhs.entries[i].val: return False - if self.entries[i].name != rhs.entries[i].name: return False - if self.entries[i].desc != rhs.entries[i].desc: return False + if self.entries[i] != rhs.entries[i]: return False + return True enums = [] def AddEnum(e): for i in xrange(len(enums)): - if e.equals(enums[i]): + if e == enums[i]: + enums[i].reference() return i + enums.append(e) + enums[-1].reference() return len(enums)-1 enum_regex = re.compile('(\d\d?)( - |: |=)((?:(?!\d\d?(?: - |: |=)).)*)', re.DOTALL) @@ -160,48 +182,42 @@ def FormatPDFDump(pdf): stride = ((addr[1] - addr[0]) / (count - 1)) if count > 1 else 4 desc = StripSpaces(reg[11].replace('\n', ' ')) regs.append(RadeonReg(unit, name, count, access, addr[0], stride, desc)) + creg = regs[-1] f = field_regex.findall(reg[13]) for field in f: fname = field[0] fbits = [ int(field[1]), int(field[3]) if field[3] != '' else int(field[1]) ] fdesc = StripSpaces(field[5]) - regs[-1].fields.append(RadeonField(fname, fbits[1], fbits[0], fdesc)) + creg.fields.append(RadeonField(fname, fbits[1], fbits[0], "")) + cfield = creg.fields[-1] e = ExtractEnum(fdesc) - regs[-1].fields[-1].desc = e[0] - if e[1] != None: regs[-1].fields[-1].enum = AddEnum(e[1]) + cfield.desc = e[0] + if e[1] != None: cfield.enum = AddEnum(e[1]) - if len(regs[-1].fields) > 0: - if regs[-1].fields[0].low == 0 and regs[-1].fields[0].high == 31: - regs[-1].fields = [] + if len(creg.fields) > 0: + if creg.fields[0].low == 0 and creg.fields[0].high == 31: + creg.fields = [] return regs -def CompareRegs(regs1, regs2): - regs_a = [] - regs_b = [] - regs_both = [] - - for r1r in regs1: - for r2r in regs2: - if r1r.equals(r2r): regs_both.append(r1r) +def RegInArray(r1, regs): + for r2 in regs: + if r1 == r2: return True - for r1r in regs1: - inboth = False - for rb in regs_both: - if r1r.equals(rb): inboth = True - - if not inboth: - regs_a.append(r1r) + return False - for r2r in regs2: - inboth = False - for rb in regs_both: - if r2r.equals(rb): inboth = True - - if not inboth: - regs_b.append(r2r) +def CompareRegs(regs1, regs2): + regs_both = [] + for (r1r, r2r) in itertools.product(regs1, regs2): + if r1r == r2r: + regs_both.append(r1r) + for bf in regs_both[-1].fields: + if bf.enum != None: enums[bf.enum].dereference() + + regs_a = [reg for reg in regs1 if not RegInArray(reg, regs_both)] + regs_b = [reg for reg in regs2 if not RegInArray(reg, regs_both)] return [regs_both, regs_a, regs_b] @@ -272,21 +288,12 @@ def CreateXML(regs, variants): print '</database>' -def ReferenceEnums(regs): - for reg in regs: - for field in reg.fields: - if field.enum != None: - enums[field.enum].reference() - r300regs = FormatPDFDump(ReadPDFDump('R3xx_3D_Registers.txt')) r500regs = FormatPDFDump(ReadPDFDump('R5xx_Acceleration_v1.3.txt')) finalregs = CompareRegs(r300regs, r500regs) regs_both = finalregs[0] regs_r300 = finalregs[1] regs_r500 = finalregs[2] -ReferenceEnums(regs_both) -ReferenceEnums(regs_r300) -ReferenceEnums(regs_r500) CreateXML( [ [regs_both, 'rX00_regs', 'R300'], |