blob: 35ff3166801a187c800e1d2defed5f40e010987c [file] [log] [blame]
#!/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
from icebox import re_match_cached
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 ramb_tile_nets")
print(" icebox_maps -m ramt_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()
if len(args) != 0:
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_cached("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, key=icebox.key_netname):
match = re_match_cached(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(".ramb_tile_bitmap", icebox.rambtile_db, 42)
print_tilemap(".ramt_tile_bitmap", icebox.ramttile_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 == "ramb_tile_nets":
print_db_nets(".ramb_tile_nets", icebox.ramtile_db, "c")
elif mode == "ramt_tile_nets":
print_db_nets(".ramt_tile_nets", icebox.ramtile_db, "c")
else:
usage()