/[avr-libc]/avr-libc/xml/Atmel2libc.py
ViewVC logotype

Diff of /avr-libc/xml/Atmel2libc.py

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.8 by arcanum, Tue Nov 2 18:16:07 2004 UTC revision 1.9 by joerg_wunsch, Fri Oct 21 20:55:19 2005 UTC
# Line 34  Line 34 
34  #  #
35    
36  import string  import string
37    import re
38  from xml.parsers import expat  from xml.parsers import expat
39    
40  class Element:  class Element:
# Line 142  class Xml2Obj: Line 143  class Xml2Obj:
143      def CharacterData(self,data):      def CharacterData(self,data):
144          'SAX character data event handler'          'SAX character data event handler'
145          if string.strip(data):          if string.strip(data):
146                data = data.replace('&', '&')
147              data = data.encode(Xml2Obj.encoding)              data = data.encode(Xml2Obj.encoding)
148              element = self.nodeStack[-1]              element = self.nodeStack[-1]
149              element.cdata += data              element.cdata += data
# Line 239  def dump_memory_sizes (root): Line 241  def dump_memory_sizes (root):
241          xsram_start, xsram_size)          xsram_start, xsram_size)
242      print '  </memory_sizes>'      print '  </memory_sizes>'
243    
244  def dump_vectors (root):  def dump_vectors (root, tradnames):
245      """Get the interupt vectors.      """Get the interupt vectors.
246      """      """
247    
248      path = [ 'AVRPART', 'INTERRUPT_VECTOR' ]      path = [ 'AVRPART', 'INTERRUPT_VECTOR' ]
249    
250      irqs = root.getSubTree (path)      irqs = root.getSubTree (path)
# Line 250  def dump_vectors (root): Line 253  def dump_vectors (root):
253    
254      vectors = []      vectors = []
255      for i in range (1, nvects+1):      for i in range (1, nvects+1):
256          vect = irqs.getElements ('VECTOR%d' % (i))[0]          try:
257                vect = irqs.getElements ('VECTOR%d' % (i))[0]
258            except IndexError:
259                # some devices have holes in the vector table =:-)
260                vectors.append(())
261                continue
262    
263          name = vect.getElements ('SOURCE')[0].getData ()          name = vect.getElements ('SOURCE')[0].getData ()
264          saddr = vect.getElements ('PROGRAM_ADDRESS')[0].getData ()          saddr = vect.getElements ('PROGRAM_ADDRESS')[0].getData ()
# Line 267  def dump_vectors (root): Line 275  def dump_vectors (root):
275                                                              nvects)                                                              nvects)
276      n = 0      n = 0
277      for v in vectors:      for v in vectors:
278          print '    <vector addr="0x%04x" num="%d" name="%s">' % (v[0], n, v[1])          # we are not really interested in the reset vector
279          print_wrapped ('      ', '<description>%s</description>' % (v[2]))          if n == 0:
280          print '      <sig_name></sig_name>'              n += 1
281          print '    </vector>'              continue
282            try:
283                name = re.sub('[/,-]', '', v[1].upper())
284                name = re.sub(r'\s+', '_', name)
285                if re.match('^[A-Z0-9_]+$', name):
286                    pass
287                else:
288                    raise 'Invalid characters in vector name even after substitution', name
289    
290                print '    <vector addr="0x%04x" num="%d" name="%s">' % (v[0], n, v[1])
291                print_wrapped ('      ', '<description>%s</description>' % (v[2]))
292                print '      <sig_name>%s_vect</sig_name>' % name
293                for altname in tradnames.Vecname(n):
294                    print '      <alt_name>%s</alt_name>' % altname
295                print '    </vector>'
296            except IndexError:
297                # this catches holes in the vector table
298                pass
299          n += 1          n += 1
300      print '  </interrupts>'      print '  </interrupts>'
301    
# Line 340  def dump_ioregs (root): Line 365  def dump_ioregs (root):
365                  reg_desc = ''                  reg_desc = ''
366          except KeyError:          except KeyError:
367              reg_info = None              reg_info = None
368                reg_desc = ''
369    
370          addr = ioreg.getElements ('IO_ADDR')[0].getData ()          addr = ioreg.getElements ('IO_ADDR')[0].getData ()
371          if addr[0] == '$':          if addr[0] == '$':
# Line 389  def dump_boot_info (root): Line 415  def dump_boot_info (root):
415      info = root.getSubTree (path)      info = root.getSubTree (path)
416      if info:      if info:
417          # The device has bootloader support.          # The device has bootloader support.
418                    try:
419          data = info.getElements ('NRWW_START_ADDR')[0].getData ()              data = info.getElements ('NRWW_START_ADDR')[0].getData ()
420          if data[0] == '$':              if data[0] == '$':
421              data = '0x' + data[1:]                  data = '0x' + data[1:]
422          if data == 'x':              if data == 'x':
423                    nrww_start = ''
424                else:
425                    nrww_start = ' nrww_start="0x%x"' % (int (data, 16))
426            except IndexError:
427              nrww_start = ''              nrww_start = ''
428          else:  
429              nrww_start = ' nrww_start="0x%x"' % (int (data, 16))          try:
430                        data = info.getElements ('NRWW_STOP_ADDR')[0].getData ()
431          data = info.getElements ('NRWW_STOP_ADDR')[0].getData ()              if data[0] == '$':
432          if data[0] == '$':                  data = '0x' + data[1:]
433              data = '0x' + data[1:]              if data == 'x':
434          if data == 'x':                  nrww_end = ''
435                else:
436                    nrww_end = ' nrww_end="0x%x"' % (int (data, 16))
437            except IndexError:
438              nrww_end = ''              nrww_end = ''
439          else:  
440              nrww_end = ' nrww_end="0x%x"' % (int (data, 16))          try:
441                        data = info.getElements ('RWW_START_ADDR')[0].getData ()
442          data = info.getElements ('RWW_START_ADDR')[0].getData ()              if data[0] == '$':
443          if data[0] == '$':                  data = '0x' + data[1:]
444              data = '0x' + data[1:]              try:
445          if data == 'x':                  rww_start = ' rww_start="0x%x"' % (int (data, 16))
446                except ValueError:
447                    rww_start = ''
448            except IndexError:
449              rww_start = ''              rww_start = ''
         else:  
             rww_start = ' rww_start="0x%x"' % (int (data, 16))  
450    
451          data = info.getElements ('RWW_STOP_ADDR')[0].getData ()          try:
452          if data[0] == '$':              data = info.getElements ('RWW_STOP_ADDR')[0].getData ()
453              data = '0x' + data[1:]              if data[0] == '$':
454          if data == 'x':                  data = '0x' + data[1:]
455                try:
456                    rww_end = ' rww_end="0x%x"' % (int (data, 16))
457                except ValueError:
458                    rww_end = ''
459            except IndexError:
460              rww_end = ''              rww_end = ''
         else:  
             rww_end = ' rww_end="0x%x"' % (int (data, 16))  
461    
462          # The Atmel files give the pagesize in words, we need it in bytes.          # The Atmel files give the pagesize in words, we need it in bytes.
463            
464          pagesize = 'pagesize="%d"' % ( \          pagesize = 'pagesize="%d"' % ( \
465              2 * int (info.getElements ('PAGESIZE')[0].getData ()))              2 * int (info.getElements ('PAGESIZE')[0].getData ()))
466    
# Line 454  def dump_boot_info (root): Line 491  def dump_boot_info (root):
491    
492          print '  </bootloader>'          print '  </bootloader>'
493    
494    class HeaderToVec:
495        'Parse header file for traditional vector names'
496    
497        def __init__(self):
498            self.vects = {}
499    
500        def Read(self, fname):
501            'Read header file'
502            f = open(fname)
503            r = re.compile(r'#\s*define\s+(SIG_[A-Z0-9_]+)\s+_VECTOR[(](\d+)[)]')
504            for line in f:
505                m = r.match(line)
506                if m != None:
507                    intno = int(m.group(2))
508                    try:
509                        x = self.vects[intno]
510                    except KeyError:
511                        x = []
512                    x.append(m.group(1))
513                    self.vects[intno] = x
514            f.close()
515    
516        def Vecname(self, idx):
517            try:
518                return self.vects[idx]
519            except KeyError:
520                return ''
521    
522    
523  if __name__ == '__main__':  if __name__ == '__main__':
524      import sys      import sys
525    
526      parser = Xml2Obj()      parser = Xml2Obj()
527      root = parser.Parse(sys.argv[1])      root = parser.Parse(sys.argv[1])
528    
529        tradheader = HeaderToVec()
530        tradheader.Read(sys.argv[2])
531    
532      dump_header (root)      dump_header (root)
533      dump_memory_sizes (root)      dump_memory_sizes (root)
534      dump_vectors (root)      dump_vectors (root, tradheader)
535      dump_ioregs (root)      dump_ioregs (root)
536      dump_boot_info (root)      dump_boot_info (root)
537      dump_footer (root)      dump_footer (root)

Legend:
Removed from v.1.8  
changed lines
  Added in v.1.9

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26