summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorbin Simpson <MostAwesomeDude@gmail.com>2009-10-14 12:51:50 -0700
committerCorbin Simpson <MostAwesomeDude@gmail.com>2009-10-14 12:51:50 -0700
commitb13ef689ffa866c7493c98db501e8bc7d00b1fac (patch)
tree0a28394df6240bdda8324dc2f512744479b223d8
parent86c0b9917af583f3b933ef586da8a60737714e3d (diff)
Move to ElementTree.
-rwxr-xr-xradeonreg.py138
1 files changed, 77 insertions, 61 deletions
diff --git a/radeonreg.py b/radeonreg.py
index a7aeb3f..9ea21ea 100755
--- a/radeonreg.py
+++ b/radeonreg.py
@@ -2,6 +2,7 @@
# -*- coding: utf-8 -*-
import re
+from xml.etree import ElementTree
class RadeonReg:
def __init__(self, unit, name, count, access, addr, stride, desc):
@@ -71,6 +72,7 @@ class RadeonEnum:
return True
enums = []
+
def AddEnum(e):
for i in xrange(len(enums)):
if e.equals(enums[i]):
@@ -82,6 +84,7 @@ enum_regex = re.compile('(\d\d?)( - |: |=)((?:(?!\d\d?(?: - |: |=)).)*)', re.DOT
enum_desc = re.compile('(\d\d?( - |: |=)|POSSIBLE VALUES:)')
enum_ename = re.compile('([A-Za-z0-9_]*)')
reserved_regex = re.compile('[Rr][Ee][Ss][Ee][Rr][Vv][Ee][Dd]')
+
def ExtractEnum(s):
dl = s.split('\n')
d = ''
@@ -111,6 +114,7 @@ subs = [re.compile('^.+ 2008 Advanced Micro Devices, Inc.$'),
re.compile('^[0-9]+.[0-9]+ .* Registers.*$'),
re.compile('^\(Access: [RW]\)')]
stupid_linebreaks = re.compile('-\n0x')
+
def ReadPDFDump(filename):
pdffile = open(filename, 'r')
pdflines = pdffile.readlines()
@@ -130,6 +134,7 @@ def ReadPDFDump(filename):
spaces = re.compile(' +')
spaces_end = re.compile('(^ | $)', re.MULTILINE)
+
def StripSpaces(s):
return spaces_end.sub('', spaces.sub(' ', s))
@@ -205,72 +210,81 @@ def CompareRegs(regs1, regs2):
return [regs_both, regs_a, regs_b]
-def XMLTags(s):
- return s.replace('&', '&amp;').replace('>', '&gt;').replace('<', '&lt;')
-
-def PrintEnum(enum, indent):
- for entry in enums[enum].entries:
- print indent + '<value value="%d" name="%s"><doc>%s</doc></value>' % (entry.val, entry.name, XMLTags(entry.desc))
-
-def XMLGroup(regs, gname, prepend):
- print '<group name="%s" prepend="%s_">' % (gname, prepend)
- for reg in regs:
- indent = ' '
-
- if len(reg.fields) < 1 and reg.desc == '':
- regstr = '<reg32 name="%s" access="%s" offset="0x%%04X" />' % (reg.name, reg.access)
- else:
- regstr = '<reg32 name="%s" access="%s" offset="0x%%04X">' % (reg.name, reg.access)
- regstr += '\n' + indent + ' <doc>%s</doc>' % XMLTags(reg.desc)
-
- if reg.count > 1:
- print ' <stripe offset="0x%04X" stride="0x%04X" length="%d">' % (reg.addr, reg.stride, reg.count)
- print ' ' + regstr % 0
- indent += ' '
- else:
- print ' ' + regstr % reg.addr
-
- for field in reg.fields:
- print indent + ' <bitfield name="%s" high="%d" low="%d">' % (field.name, field.high, field.low)
- print indent + ' <doc>%s</doc>' % XMLTags(field.desc)
-
- if field.enum != None:
- if enums[field.enum].refs == 1:
- PrintEnum(field.enum, indent + ' ')
- else:
- print indent + ' <use-enum ref="ENUM%d" />' % field.enum
-
- print indent + ' </bitfield>'
-
- if len(reg.fields) > 0 or reg.desc != '':
- print indent + '</reg32>'
-
- if reg.count > 1:
- print ' </stripe>'
- print '</group>\n'
-
-def CreateXML(regs, variants):
- print '<?xml version="1.0" encoding="UTF-8"?>'
- print '<database xmlns="http://nouveau.freedesktop.org/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="rules-ng.xsd">'
- print '<domain name="R300" />'
- print ''
- for i in xrange(len(enums)):
- if enums[i].refs > 1:
- print '<enum name="ENUM%d">' % i
- PrintEnum(i, ' ')
- print '</enum>'
- print ''
+def CreateXML(handle, regs, variants):
+ comment = ElementTree.Comment(
+"""
+This file was automatically generated from radeonreg.py.
+
+I strongly suggest running "tidy -m -xml 'name_of_file.xml'" on this file
+before attempting to read it.
+
+~ C.
+""")
+ preamble = ElementTree.PI("xml", "version=\"1.0\" encoding=\"UTF-8\"")
+
+ database_attrs = {
+ "xmlns": "http://nouveau.freedesktop.org/",
+ "xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance",
+ "xsi:schemaLocation": "rules-ng.xsd",
+ }
+ database = ElementTree.Element("database", database_attrs)
+ domain = ElementTree.SubElement(database, "domain", name="R300")
+
+ for i, enum in enumerate(enums):
+ if enum.refs > 1:
+ enum_tag = ElementTree.SubElement(domain, "enum")
+ enum_tag.attrib["name"] = "ENUM%d" % i
+ for entry in enum.entries:
+ value = ElementTree.SubElement(enum_tag, "value")
+ value.attrib["name"] = entry.name
+ value.attrib["value"] = str(entry.val)
+ doc = ElementTree.SubElement(value, "doc")
+ doc.text = entry.desc
for (group, name, prepend) in regs:
- XMLGroup(group, name, prepend)
+ group_tag = ElementTree.SubElement(domain, "group", name=name)
+ group_tag.attrib["prepend"] = "%s_" % prepend
+ for reg in group:
+ if reg.count > 1:
+ stripe = ElementTree.SubElement(group_tag, "stripe")
+ stripe.attrib["addr"] = "0x%04X" % reg.addr
+ stripe.attrib["stride"] = "0x%04X" % reg.stride
+ stripe.attrib["length"] = str(reg.count)
+
+ reg32 = ElementTree.SubElement(stripe, "reg32",
+ name=reg.name, access=reg.access, offset="0x0")
+ else:
+ reg32 = ElementTree.SubElement(group_tag, "reg32",
+ name=reg.name, access=reg.access)
+ reg32.attrib["offset"] = "0x%04X" % reg.addr
+
+ if reg.desc:
+ reg32.text = reg.desc
+
+ for field in reg.fields:
+ bitfield = ElementTree.SubElement(reg32, "bitfield",
+ name=field.name, high=str(field.high), low=str(field.low))
+ ElementTree.SubElement(reg32, "doc").text = field.desc
+ if field.enum:
+ if enums[field.enum].refs == 1:
+ for entry in enums[field.enum].entries:
+ value = ElementTree.SubElement(bitfield, "value")
+ value.attrib["name"] = entry.name
+ value.attrib["value"] = str(entry.val)
+ doc = ElementTree.SubElement(value, "doc")
+ doc.text = entry.desc
+ else:
+ use_enum = ElementTree.SubElement(bitfield, "use-enum")
+ use_enum.attrib["ref"] = "ENUM%d" % field.enum
for (name, groups) in variants:
- print '<variant id="%s">' % name
+ variant = ElementTree.SubElement(database, "variant", name=name)
for group in groups:
- print ' <use-group ref="%s" />' % group
- print '</variant>'
+ ElementTree.SubElement(variant, "use-group", ref=group)
- print '</database>'
+ ElementTree.ElementTree(preamble).write(handle)
+ ElementTree.ElementTree(comment).write(handle)
+ ElementTree.ElementTree(database).write(handle)
def ReferenceEnums(regs):
for reg in regs:
@@ -287,7 +301,8 @@ regs_r500 = finalregs[2]
ReferenceEnums(regs_both)
ReferenceEnums(regs_r300)
ReferenceEnums(regs_r500)
-CreateXML(
+xmlfile = open("r300reg.xml", "w")
+CreateXML(xmlfile,
[
[regs_both, 'rX00_regs', 'R300'],
[regs_r300, 'r300_regs', 'R300'],
@@ -298,3 +313,4 @@ CreateXML(
['r500', ['rX00_regs', 'r500_regs']]
]
)
+xmlfile.close()