PageRenderTime 32ms CodeModel.GetById 0ms RepoModel.GetById 0ms app.codeStats 0ms

/utils/makesfrnames.py

http://github.com/samueltardieu/rforth1
Python | 88 lines | 75 code | 8 blank | 5 comment | 11 complexity | a6bfbafb33ffef09e81e4888259a05b8 MD5 | raw file
Possible License(s): GPL-2.0
  1. #! /usr/bin/env python
  2. #
  3. # Usage: makesfrname.py < gpasm-header-file > forth-file
  4. #
  5. import re, sys
  6. sep = re.compile (';(----- |=====)')
  7. regs = re.compile (';----- Register Files')
  8. bits = re.compile (';----- ((.*) Bits|PORT.)')
  9. reg = re.compile ("(\S+)\s+EQU\s+H'0([0-9A-F]{3})'\s*;?\s*(.*)")
  10. port = re.compile ("(\S+)\s+EQU\s+(\d)\s*;?\s*(.*)")
  11. all_regs = []
  12. all_bits = []
  13. def split (lines):
  14. before, lines = lines[:1], lines[1:]
  15. while True:
  16. if not lines: return before, []
  17. if sep.match (lines[0]): return before, lines
  18. before.append (lines[0])
  19. del lines[0]
  20. def output_regs (lines):
  21. print()
  22. print("\\ Registers names")
  23. print()
  24. for l in lines:
  25. x = reg.match (l)
  26. if x:
  27. name, addr = x.group(1), x.group(2)
  28. all_regs.append (name)
  29. print("0x%s constant %s" % (addr.lower (), name))
  30. def output_bits (lines):
  31. regname = bits.match(lines[0]).group(1).split()[0]
  32. if 'n' in regname:
  33. # CAN constants
  34. regs = regname.split (', ')
  35. if regs[-1][:4] == 'and ':
  36. regs = regs[:-1] + [regs[-1][4:]]
  37. for r in regs:
  38. prefix = r.split('n')[0]
  39. for i in range (8):
  40. name = r.replace ('n', str(i))
  41. if name in all_regs:
  42. output_bits_for_reg (name, lines, prefix + str(i))
  43. else:
  44. output_bits_for_reg (regname, lines)
  45. def output_bits_for_reg (regname, lines, prefix = ''):
  46. print()
  47. print("\\ %s bits" % regname)
  48. print()
  49. for l in lines:
  50. x = reg.match (l)
  51. if not x: x = port.match (l)
  52. if x:
  53. name, bit, comment = x.group(1), int(x.group(2)), x.group(3)
  54. if name[:4] == 'NOT_': name = '/%s' % name[4:]
  55. if name == 'TO': continue
  56. if prefix + name in all_bits: continue
  57. if name[:4] == prefix[:4]: name = name[4:]
  58. all_bits.append (name)
  59. d = "%s %d bit %s%s" % (regname, bit, prefix, name)
  60. if comment:
  61. print("%-30s \ %s" % (d, comment))
  62. else:
  63. print(d)
  64. def output (lines):
  65. print('\ This file has been automatically generated')
  66. print('\ Do not edit by hand')
  67. while lines:
  68. if not lines: break
  69. before, lines = split (lines)
  70. if before and regs.match (before[0]):
  71. output_regs (before)
  72. elif before and bits.match (before[0]):
  73. output_bits (before)
  74. def main ():
  75. lines = [l.rstrip('\r\n') for l in sys.stdin]
  76. output (lines)
  77. if __name__ == '__main__': main ()