summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoakim Sindholt <opensource@zhasha.com>2009-10-14 21:32:46 +0200
committerCorbin Simpson <MostAwesomeDude@gmail.com>2009-10-14 13:30:27 -0700
commit26a63a4fc71fb5ca083d963fca1f29129206d8d8 (patch)
treefc94ad496fadd487b36af8dbf7ab3c1feab43b79
parentcba8fafaffc2c6a86c543730c707f3c58a39d0b7 (diff)
Make things more python and fix reference counting
Sadly, this doesn't change the output, but thanks MAD for the input Cherry-picked and hand-edited for safe merging. ~ C.
-rwxr-xr-xradeonreg.py101
1 files changed, 54 insertions, 47 deletions
diff --git a/radeonreg.py b/radeonreg.py
index ca7e87d..2e4d474 100755
--- a/radeonreg.py
+++ b/radeonreg.py
@@ -1,6 +1,7 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
+import itertools
import re
from xml.etree import ElementTree
@@ -15,7 +16,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 \
@@ -26,7 +30,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
@@ -38,7 +42,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 \
@@ -51,6 +58,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):
@@ -60,24 +76,30 @@ 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)
@@ -165,48 +187,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 = []
+def RegInArray(r1, regs):
+ for r2 in regs:
+ if r1 == r2: return True
- for r1r in regs1:
- for r2r in regs2:
- if r1r.equals(r2r): regs_both.append(r1r)
-
- 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]
@@ -293,21 +309,12 @@ before attempting to read it.
ElementTree.ElementTree(comment).write(handle)
ElementTree.ElementTree(database).write(handle)
-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)
xmlfile = open("r300reg.xml", "w")
CreateXML(xmlfile,
[