| #!/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) |
| |