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