| #!/usr/bin/env python3 | |
| # | |
| # Copyright (C) 2015 Clifford Wolf <clifford@clifford.at> | |
| # | |
| # Permission to use, copy, modify, and/or distribute this software for any | |
| # purpose with or without fee is hereby granted, provided that the above | |
| # copyright notice and this permission notice appear in all copies. | |
| # | |
| # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |
| # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |
| # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |
| # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |
| # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |
| # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |
| # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |
| # | |
| import icebox | |
| import sys | |
| import re | |
| if len(sys.argv) != 3: | |
| print(""" | |
| Usage: icebox_diff bitmap1.asc bitmap2.asc | |
| """) | |
| sys.exit(0) | |
| print("Reading file '%s'.." % sys.argv[1]) | |
| ic1 = icebox.iceconfig() | |
| ic1.read_file(sys.argv[1]) | |
| print("Reading file '%s'.." % sys.argv[2]) | |
| ic2 = icebox.iceconfig() | |
| ic2.read_file(sys.argv[2]) | |
| def format_bits(line_nr, this_line, other_line): | |
| text = "" | |
| for i in range(len(this_line)): | |
| if this_line[i] != other_line[i]: | |
| if this_line[i] == "1": | |
| text += "%8s" % ("B%d[%d]" % (line_nr, i)) | |
| else: | |
| text += "%8s" % "" | |
| return text | |
| def explained_bits(db, tile): | |
| bits = set() | |
| mapped_bits = set() | |
| for k, line in enumerate(tile): | |
| for i in range(len(line)): | |
| if line[i] == "1": | |
| bits.add("B%d[%d]" % (k, i)) | |
| else: | |
| bits.add("!B%d[%d]" % (k, i)) | |
| text = set() | |
| for entry in db: | |
| if re.match(r"LC_", entry[1]): | |
| continue | |
| if entry[1] in ("routing", "buffer"): | |
| continue | |
| match = True | |
| for bit in entry[0]: | |
| if not bit in bits: | |
| match = False | |
| if match: | |
| text.add("<%s> %s" % (",".join(entry[0]), " ".join(entry[1:]))) | |
| return text | |
| def diff_tiles(stmt, tiles1, tiles2): | |
| for i in sorted(set(list(tiles1.keys()) + list(tiles2.keys()))): | |
| if not i in tiles1: | |
| print("+ %s %d %d" % (stmt, i[0], i[1])) | |
| for line in tiles2[i]: | |
| print("+ %s" % line) | |
| print() | |
| continue | |
| if not i in tiles2: | |
| print("- %s %d %d" % (stmt, i[0], i[1])) | |
| for line in tiles1[i]: | |
| print("- %s" % line) | |
| print() | |
| continue | |
| if tiles1[i] == tiles2[i]: | |
| continue | |
| print(" %s %d %d" % (stmt, i[0], i[1])) | |
| for c in range(len(tiles1[i])): | |
| if tiles1[i][c] == tiles2[i][c]: | |
| print(" %s" % tiles1[i][c]) | |
| else: | |
| print("- %s%s" % (tiles1[i][c], format_bits(c, tiles1[i][c], tiles2[i][c]))) | |
| print("+ %s%s" % (tiles2[i][c], format_bits(c, tiles2[i][c], tiles1[i][c]))) | |
| bits1 = explained_bits(ic1.tile_db(i[0], i[1]), tiles1[i]) | |
| bits2 = explained_bits(ic2.tile_db(i[0], i[1]), tiles2[i]) | |
| for bit in sorted(bits1): | |
| if bit not in bits2: | |
| print("- %s" % bit) | |
| for bit in sorted(bits2): | |
| if bit not in bits1: | |
| print("+ %s" % bit) | |
| print() | |
| diff_tiles(".io_tile", ic1.io_tiles, ic2.io_tiles) | |
| diff_tiles(".logic_tile", ic1.logic_tiles, ic2.logic_tiles) | |
| diff_tiles(".ramb_tile", ic1.ramb_tiles, ic2.ramb_tiles) | |
| diff_tiles(".ramt_tile", ic1.ramt_tiles, ic2.ramt_tiles) | |