aboutsummaryrefslogtreecommitdiffstats
path: root/icebox/icebox_maps.py
diff options
context:
space:
mode:
authorClifford Wolf <clifford@clifford.at>2015-07-18 13:05:02 +0200
committerClifford Wolf <clifford@clifford.at>2015-07-18 13:05:02 +0200
commitdfeb92a46b2228b4f3886a9c06502ccd0dde5562 (patch)
tree20cebe482ae2954f4597489658b27828f5316921 /icebox/icebox_maps.py
downloadicestorm-dfeb92a46b2228b4f3886a9c06502ccd0dde5562.tar.gz
icestorm-dfeb92a46b2228b4f3886a9c06502ccd0dde5562.tar.bz2
icestorm-dfeb92a46b2228b4f3886a9c06502ccd0dde5562.zip
Import of icestorm-snapshot-150322.zip
Diffstat (limited to 'icebox/icebox_maps.py')
-rwxr-xr-xicebox/icebox_maps.py152
1 files changed, 152 insertions, 0 deletions
diff --git a/icebox/icebox_maps.py b/icebox/icebox_maps.py
new file mode 100755
index 0000000..81ce919
--- /dev/null
+++ b/icebox/icebox_maps.py
@@ -0,0 +1,152 @@
+#!/usr/bin/python
+#
+# 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.
+#
+
+from __future__ import division
+from __future__ import print_function
+
+import icebox
+import getopt, sys, re
+
+mode = None
+
+def usage():
+ print("Usage:")
+ print(" icebox_maps -m bitmaps")
+ print(" icebox_maps -m io_tile_nets_l")
+ print(" icebox_maps -m io_tile_nets_r")
+ print(" icebox_maps -m io_tile_nets_t")
+ print(" icebox_maps -m io_tile_nets_b")
+ print(" icebox_maps -m logic_tile_nets")
+ print(" icebox_maps -m ram_tile_nets")
+ sys.exit(0)
+
+try:
+ opts, args = getopt.getopt(sys.argv[1:], "m:")
+except:
+ usage()
+
+for o, a in opts:
+ if o == "-m":
+ mode = a.strip()
+ else:
+ usage()
+
+def get_bit_group(x, y, db):
+ bit = "B%d[%d]" % (y, x)
+ nbit = "!B%d[%d]" % (y, x)
+ funcs = set()
+ for entry in db:
+ if bit in entry[0] or nbit in entry[0]:
+ if entry[1] in ("IOB_0", "IOB_1", "IoCtrl"):
+ funcs.add("i")
+ elif entry[1] == "routing":
+ funcs.add("r")
+ elif entry[1] == "buffer":
+ funcs.add("b")
+ elif re.match("LC_", entry[1]):
+ funcs.add("l")
+ elif entry[1] == "NegClk":
+ funcs.add("N")
+ elif entry[1] == "ColBufCtrl":
+ funcs.add("o")
+ elif entry[1] == "CarryInSet":
+ funcs.add("C")
+ elif entry[1] == "Cascade":
+ funcs.add("a")
+ else:
+ funcs.add("?")
+ if len(funcs) == 1:
+ return funcs.pop()
+ if len(funcs) > 1:
+ return "X"
+ return "-"
+
+def print_tilemap(stmt, db, n):
+ print()
+ print(stmt)
+ for y in range(16):
+ for x in range(n):
+ print(get_bit_group(x, y, db), end="")
+ print()
+
+def print_db_nets(stmt, db, pos):
+ print()
+ print(stmt, end="")
+ netnames = set()
+ for entry in db:
+ if entry[1] in ("routing", "buffer"):
+ if icebox.pos_has_net(pos[0], entry[2]): netnames.add(entry[2])
+ if icebox.pos_has_net(pos[0], entry[3]): netnames.add(entry[3])
+ last_prefix = ""
+ for net in sorted(netnames, icebox.cmp_netnames):
+ match = re.match(r"(.*?)(\d+)$", net)
+ if match:
+ if last_prefix == match.group(1):
+ print(",%s" % match.group(2), end="")
+ else:
+ print()
+ print(net, end="")
+ last_prefix = match.group(1)
+ else:
+ print()
+ print(net, end="")
+ last_prefix = "*"
+ print()
+
+if mode == "bitmaps":
+ print_tilemap(".io_tile_bitmap_l", icebox.iotile_l_db, 18)
+ print_tilemap(".io_tile_bitmap_r", icebox.iotile_r_db, 18)
+ print_tilemap(".io_tile_bitmap_t", icebox.iotile_t_db, 18)
+ print_tilemap(".io_tile_bitmap_b", icebox.iotile_b_db, 18)
+ print_tilemap(".logic_tile_bitmap", icebox.logictile_db, 54)
+ print_tilemap(".ram_tile_bitmap", icebox.ramtile_db, 42)
+ print()
+ print(".bitmap_legend")
+ print("- ... unknown bit")
+ print("? ... unknown bit type")
+ print("X ... database conflict")
+ print("i ... IOB_0 IOB_1 IoCtrl")
+ print("a ... Carry_In_Mux Cascade")
+ print("r ... routing")
+ print("b ... buffer")
+ print("l ... logic bits")
+ print("o ... ColBufCtrl")
+ print("C ... CarryInSet")
+ print("N ... NegClk")
+ print()
+
+elif mode == "io_tile_nets_l":
+ print_db_nets(".io_tile_nets_l", icebox.iotile_l_db, "l")
+
+elif mode == "io_tile_nets_r":
+ print_db_nets(".io_tile_nets_r", icebox.iotile_r_db, "r")
+
+elif mode == "io_tile_nets_t":
+ print_db_nets(".io_tile_nets_t", icebox.iotile_t_db, "t")
+
+elif mode == "io_tile_nets_b":
+ print_db_nets(".io_tile_nets_b", icebox.iotile_b_db, "b")
+
+elif mode == "logic_tile_nets":
+ print_db_nets(".logic_tile_nets", icebox.logictile_db, "c")
+
+elif mode == "ram_tile_nets":
+ print_db_nets(".ram_tile_nets", icebox.ramtile_db, "c")
+
+else:
+ usage()
+