| #!/usr/bin/env python3 | |
| import sys, os, re | |
| # Compare the output of a Lattice `bstool` dump with ecpunpack and note discrepancies | |
| if len(sys.argv) < 3: | |
| print("Usage: compare_bits.py lattice_dump.txt ecpunpack.out") | |
| sys.exit(2) | |
| ecpup_re = re.compile(r'\((\d+), (\d+)\)') | |
| lat_re = re.compile(r'^[A-Za-z0-9_/]+ \((\d+), (\d+)\)$') | |
| ecpup_bits = [] | |
| lat_bits = [] | |
| with open(sys.argv[1], 'r') as latf: | |
| for line in latf: | |
| m = lat_re.match(line) | |
| if m: | |
| lat_bits.append((int(m.group(1)), int(m.group(2)))) | |
| print("Read {} bits from {}".format(len(lat_bits), sys.argv[1])) | |
| with open(sys.argv[2], 'r') as upf: | |
| for line in upf: | |
| m = ecpup_re.match(line) | |
| if m: | |
| ecpup_bits.append((int(m.group(1)), int(m.group(2)))) | |
| print("Read {} bits from {}".format(len(ecpup_bits), sys.argv[2])) | |
| ok = True | |
| for b in ecpup_bits: | |
| if b not in lat_bits: | |
| print("In ecpunpack but not Lattice: ({}, {})".format(b[0], b[1])) | |
| ok = False | |
| for b in lat_bits: | |
| if b not in ecpup_bits: | |
| print("In Lattice but not ecpunpack: ({}, {})".format(b[0], b[1])) | |
| ok = False | |
| if ok: | |
| print("ecpunpack and Lattice match ({} bits compared)".format(len(ecpup_bits))) | |
| else: | |
| sys.exit(1) |