diff options
author | Corbin Simpson <MostAwesomeDude@gmail.com> | 2009-10-14 12:51:50 -0700 |
---|---|---|
committer | Corbin Simpson <MostAwesomeDude@gmail.com> | 2009-10-14 12:51:50 -0700 |
commit | b13ef689ffa866c7493c98db501e8bc7d00b1fac (patch) | |
tree | 0a28394df6240bdda8324dc2f512744479b223d8 | |
parent | 86c0b9917af583f3b933ef586da8a60737714e3d (diff) |
Move to ElementTree.
-rwxr-xr-x | radeonreg.py | 138 |
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('&', '&').replace('>', '>').replace('<', '<') - -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() |