123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 |
- #! /usr/bin/env python3
- # -*- coding: utf-8 -*-
- #
- # Alexander Shiryaev, 2019.05
- #
- import sys
- def getKV (l):
- k, v = l.split('EQU')
- k = k.strip()
- assert 'H' in v
- v = v.split("'")[1]
- v = int(v, 16)
- return k, v
- def load (fileName):
- fh = open(fileName, 'rb')
- banks = {}
- allSfrs = {}
- allBits = {}
- s = 0
- lineNo = 0
- vOld = None
- while True:
- l = fh.readline()
- if l == b'':
- break
- l = l.strip().decode('ascii')
- if s == 0:
- if l.startswith(';') and ('Bank' in l):
- cmtBank = int(l.split('Bank')[1].split('-')[0])
- s = 1
- elif s == 1:
- if 'EQU' in l:
- k, v = getKV(l)
- k0 = k.replace('_', '')
- bank = v // 128
- if vOld != None:
- assert vOld <= v
- vOld = v
- if bank != cmtBank:
- print(lineNo, l, cmtBank, bank)
- assert False
- if bank in banks:
- d = banks[bank]
- else:
- d = {}
- banks[bank] = d
- assert k0 not in d
- q = [ k, v, {} ]
- d[k0] = q
- assert k0 not in allSfrs
- allSfrs[k0] = q
- elif l == '':
- pass
- elif l.startswith(';') and ('Bank' in l):
- cmtBank = int(l.split('Bank')[1].split('-')[0])
- elif l.startswith(';') and ('Bits' in l):
- cmtSfr = l[1:].split('Bits')[0].replace('-', '').strip()
- s = 2
- else:
- s = 3
- elif s == 2:
- if 'EQU' in l:
- k, v = getKV(l)
- k0 = k.replace('_', '')
- assert (v >= 0) and (v <= 7)
- bits = None
- for b, sfrs in banks.items():
- for sfr, q in sfrs.items():
- if q[0] == cmtSfr:
- bits = q[2]
- assert bits != None
- assert k0 not in bits
- q = [ k, v ]
- if k0 in allBits:
- assert allBits[k0] == q
- bits[k0] = [ k, v, 1 ] # duplicate
- else:
- allBits[k0] = q
- bits[k0] = [ k, v, 0 ] # first occurence
- elif l == '':
- pass
- elif l.startswith(';') and ('Bits' in l):
- cmtSfr = l[1:].split('Bits')[0].replace('-', '').strip()
- else:
- s = 3
- lineNo += 1
- fh.close()
- return banks
- def optimizeBits (sfr, bits):
- reject = []
- for k, v in bits.items():
- if k.endswith('0'):
- baseName = k[:-1]
- y = []
- for x in range(8):
- name = baseName + str(x)
- if name in bits.keys():
- if bits[name][1] == x:
- y.append(x)
- else:
- y = []
- break
- if (y == [0, 1, 2, 3]) or (y == [0, 1, 2, 3, 4]) or (y == [0, 1, 2, 3, 4, 5]) or (y == [0, 1, 2, 3, 4, 5, 6]) or (y == [0, 1, 2, 3, 4, 5, 6, 7]):
- for yy in y:
- name = baseName + str(yy)
- reject.append(name)
- elif k.endswith('8'):
- baseName = k[:-1]
- y = []
- for x in range(8):
- name = baseName + str(x + 8)
- if name in bits.keys():
- if bits[name][1] == x:
- y.append(x)
- else:
- y = []
- break
- if y == [0, 1, 2, 3, 4, 5, 6, 7]:
- for yy in y:
- name = baseName + str(yy + 8)
- reject.append(name)
- newBits = {}
- for k, v in bits.items():
- q = [ v[0], v[1], v[2] ]
- if k in reject:
- q[2] += 2 # rejected
- newBits[k] = q
- return newBits
- def optimize (banks):
- r = {}
- for bank, sfrs in banks.items():
- d = {}
- r[bank] = d
- for sfr0, q in sfrs.items():
- sfr, addr, bits = q
- d[sfr0] = [ sfr, addr, optimizeBits(sfr, bits) ]
- return r
- def formatBank (bank, sfrs):
- r = [ "(* Bank %s *)" % (bank,) ]
- rr = []
- for k, v in sfrs.items():
- rr.append( (k, v) )
- # rr.sort(key=lambda x: x[1][1])
- for k, v in rr:
- if v[0] != k:
- s2 = " (* %s *)" % (v[0],)
- else:
- s2 = ''
- r.append(' enter1("%s", var, setT, 0%XH);%s' % (k, v[1], s2))
- for k1, v1 in v[2].items():
- if v1[0] != k1:
- s2 = " (* %s *)" % (v1[0],)
- else:
- s2 = ''
- s = 'enter1("%s", con, intT, %s);%s' % (k1, v1[1], s2)
- if v1[2] == 0:
- pass
- elif v1[2] == 1:
- s = None
- else:
- # s = "(* " + s + " *)"
- s = None
- if s != None:
- r.append(' ' + s)
- return r
- def format (banks):
- r = []
- bank = min(banks.keys())
- while bank <= max(banks.keys()):
- if bank in banks:
- r.extend(formatBank(bank, banks[bank]))
- bank += 1
- return '\n'.join(r)
- def main ():
- data = load(sys.argv[1])
- data = optimize(data)
- s = format(data)
- print(s)
- if __name__ == '__main__':
- main()
|