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