3
# Copyright (c) 2004 Theodore A. Roth
6
# Redistribution and use in source and binary forms, with or without
7
# modification, are permitted provided that the following conditions are met:
9
# * Redistributions of source code must retain the above copyright
10
# notice, this list of conditions and the following disclaimer.
12
# * Redistributions in binary form must reproduce the above copyright
13
# notice, this list of conditions and the following disclaimer in
14
# the documentation and/or other materials provided with the
17
# * Neither the name of the copyright holders nor the names of
18
# contributors may be used to endorse or promote products derived
19
# from this software without specific prior written permission.
21
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
25
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31
# POSSIBILITY OF SUCH DAMAGE.
33
# $Id: Descparser.py,v 1.1 2005/10/21 21:00:01 joerg_wunsch Exp $
38
from xml.sax import make_parser
39
from xml.sax.handler import ContentHandler
43
def __init__ (self, attrs):
45
for name in attrs.getNames ():
46
if attrs.getType (name) == 'CDATA':
47
self.xml_members.append (name)
48
setattr (self, name, attrs.getValue (name))
51
def create_child (self, name, attrs):
52
return self.children[name] (attrs)
54
def add_child (self, name, obj):
55
self.xml_members.append (name)
56
setattr (self, name, obj)
58
def characters (self, ch):
62
s = '[ data = "%s"; ' % (self.data)
63
for member in self.xml_members:
64
s += '%s = %s; ' % (member, str (getattr (self, member)))
68
class PCData (XML_Mixin):
70
return '"%s"' % (self.data)
72
class MemorySizes (XML_Mixin):
75
'eeprom_size': PCData,
76
'int_sram_size': PCData,
77
'ext_sram_size': PCData
80
class Vector (XML_Mixin):
82
'description': PCData,
86
def add_child (self, name, obj):
87
if name == "alt_name":
89
x = getattr (self, name)
90
x.data.append(obj.data)
91
setattr (self, name, x)
92
except AttributeError:
95
self.xml_members.append (name)
96
setattr (self, name, obj)
98
self.xml_members.append (name)
99
setattr (self, name, obj)
102
class Interrupts (dict, XML_Mixin):
107
def __init__ (self, attrs):
109
XML_Mixin.__init__ (self, attrs)
111
def add_child (self, name, obj):
112
# Use the Vector 'num' attr as the key for the child object.
113
if self.has_key (obj.num):
114
raise 'Duplicate vector entry', obj
117
class BitField (XML_Mixin):
119
'description': PCData,
123
class IORegister (XML_Mixin):
125
'description': PCData,
127
'bit_field': BitField,
130
def add_child (self, name, obj):
131
if name == 'bit_field':
132
if not hasattr (self, name):
133
setattr (self, name, {})
134
# Use the BitField 'bit' attr as the key for the child object.
135
self.bit_field[obj.bit] = obj
137
XML_Mixin.add_child (self, name, obj)
139
class IORegisterDict (dict, XML_Mixin):
144
def __init__ (self, attrs):
146
XML_Mixin.__init__ (self, attrs)
148
def add_child (self, name, obj):
149
# Use the IORegister 'name' attr as the key for the child object.
150
if self.has_key (obj.name):
151
raise 'Duplicate io register entry', obj
154
class BootMode (XML_Mixin):
157
class BootLoader (dict, XML_Mixin):
162
def __init__ (self, attrs):
164
XML_Mixin.__init__ (self, attrs)
166
def add_child (self, name, obj):
167
# Use the BootMode 'num' attr as the key for the child object.
168
if self.has_key (obj.num):
169
raise 'Duplicate boot mode entry', obj
173
class Device (XML_Mixin):
176
'description': PCData,
177
'memory_sizes': MemorySizes,
178
'interrupts': Interrupts,
179
'ioregisters': IORegisterDict,
180
'bootloader': BootLoader
183
class DescHandler (ContentHandler):
184
"""Content Handler for the device description xml files.
191
def push (self, name, obj):
192
self.stack.append ([name, obj])
195
return self.stack.pop ()
197
def get_curr_obj (self):
198
return self.stack[-1][1]
200
def startElement (self, name, attrs):
205
# Look up the elements class in the parent's children dict.
206
parent = self.get_curr_obj ()
207
obj = parent.create_child (name, attrs)
209
self.push (name, obj)
212
def endElement (self, name):
215
# Pull the current element off the stack and add it to the parent.
216
(cname, cobj) = self.pop ()
218
cobj.data = ' '.join (cobj.data.split ())
221
parent = self.get_curr_obj ()
222
parent.add_child (cname, cobj)
224
# We're back at the root element, so we're done.
227
#print '%s%s %s' % (' '*self.depth, cname, cobj)
229
def characters (self, ch):
230
self.get_curr_obj().characters (ch)
232
def endDocument (self):
236
if __name__ == '__main__':
237
parser = make_parser ()
239
handler = DescHandler ()
240
parser.setContentHandler (handler)
242
if len(sys.argv) > 1:
243
parser.parse (open (sys.argv[1]))
245
parser.parse (open ('desc-90s1200.xml'))
247
l = parser.getContentHandler().dev.interrupts.keys()
248
l.sort(lambda x, y: cmp(int(x), int(y)))
250
ele = parser.getContentHandler().dev.interrupts[key]
251
print "/* " + ele.description.data + " */"
252
print "#define " + ele.sig_name.data + "\t_VECTOR(" + key + ")"
253
for x in ele.alt_name.data:
254
print "#define " + x + "\t_VECTOR(" + key + ")"