blob: 5218504bdb4f157894172e72e291d356ee536903 [file] [log] [blame]
#!/usr/bin/env python3
import lib.rr_graph.graph as graph
def print_block_types(g):
'''Sequentially list block types'''
bg = g.block_grid
for type_id, bt in bg.block_types._ids.items():
print(
"{:4} ".format(type_id), "{:40s}".format(bt.to_string()),
bt.to_string(extra=True)
)
def print_grid(g):
'''ASCII diagram displaying XY layout'''
bg = g.block_grid
grid = bg.size
# print('Grid %dw x %dh' % (grid.width, grid.height))
col_widths = []
for x in range(0, grid.width):
col_widths.append(
max(len(bt.name) for bt in bg.block_types_for(col=x))
)
print(" ", end=" ")
for x in range(0, grid.width):
print("{: ^{width}d}".format(x, width=col_widths[x]), end=" ")
print()
print(" /", end="-")
for x in range(0, grid.width):
print("-" * col_widths[x], end="-+-")
print()
for y in reversed(range(0, grid.height)):
print("{: 3d} |".format(y), end=" ")
for x, bt in enumerate(bg.block_types_for(row=y)):
assert x < len(col_widths), (x, bt)
print(
"{: ^{width}}".format(bt.name, width=col_widths[x]), end=" | "
)
print()
def print_nodes(g, lim=None):
'''Display source/sink edges on all XML nodes'''
def node_name(node):
return graph.RoutingGraphPrinter.node(node, g.block_grid)
def edge_name(node, flip=False):
return graph.RoutingGraphPrinter.edge(
g.routing, node, block_grid=g.block_grid, flip=flip
)
routing = g.routing
print(
'Nodes: {}, edges {}'.format(
len(routing._ids_map(graph.RoutingNode)),
len(routing._ids_map(graph.RoutingEdge))
)
)
nodemap = routing._ids_map(graph.RoutingNode)
edgemap = routing._ids_map(graph.RoutingEdge)
node2edges = routing.edges_for_allnodes()
for i, node_id in enumerate(sorted(node2edges.keys())):
node = nodemap[node_id]
print()
if lim and i >= lim:
print('...')
break
print('{} - {} ({})'.format(i, node_name(node), node_id))
srcs = []
snks = []
for e in node2edges[node_id]:
edge = edgemap[e]
src, snk = routing.nodes_for_edge(edge)
if src == node:
srcs.append(edge)
elif snk == node:
snks.append(edge)
else:
print("!?@", edge_name(edge))
print(" Sources:")
for e in srcs:
print(" ", edge_name(e))
if not srcs:
print(" ", None)
print(" Sink:")
for e in snks:
print(" ", edge_name(e, flip=True))
if not snks:
print(" ", None)
def print_graph(g, lim=0):
print()
print_block_types(g)
print()
print_grid(g)
print()
print_nodes(g, lim=lim)
print()
def main():
import argparse
parser = argparse.ArgumentParser("Print rr_graph.xml file")
parser.add_argument("--lim", type=int, default=0)
parser.add_argument("rr_graph")
args = parser.parse_args()
g = graph.Graph(args.rr_graph)
print_graph(g, lim=args.lim)
if __name__ == "__main__":
main()