| """ Convert rrgraph inode back into graph_node_pkey and print some information. |
| |
| This is useful for examining router behavior. E.g. what tile is this rr graph |
| inode from? |
| |
| """ |
| import argparse |
| import pickle |
| import sqlite3 |
| from lib.rr_graph.graph2 import NodeType |
| |
| |
| def main(): |
| parser = argparse.ArgumentParser(description=__doc__) |
| parser.add_argument('--rrgraph_node_map', required=True) |
| parser.add_argument('--connection_database', required=True) |
| parser.add_argument('--inode', type=int, required=True) |
| |
| args = parser.parse_args() |
| |
| with open(args.rrgraph_node_map, 'rb') as f: |
| node_map = pickle.load(f) |
| |
| inode_to_graph_map = {} |
| for graph_node_pkey, rr_inode in node_map.items(): |
| assert rr_inode not in inode_to_graph_map |
| inode_to_graph_map[rr_inode] = graph_node_pkey |
| |
| conn = sqlite3.connect( |
| 'file:{}?mode=ro'.format(args.connection_database), uri=True |
| ) |
| |
| graph_node_pkey = inode_to_graph_map[args.inode] |
| |
| cur = conn.cursor() |
| cur2 = conn.cursor() |
| cur.execute( |
| """ |
| SELECT graph_node_type, track_pkey, node_pkey FROM graph_node WHERE pkey = ? |
| """, (graph_node_pkey, ) |
| ) |
| result = cur.fetchone() |
| assert result is not None, graph_node_pkey |
| graph_node_type_int, track_pkey, node_pkey = result |
| |
| graph_node_type = NodeType(graph_node_type_int) |
| |
| wires = [] |
| for wire_pkey, wire_in_tile_pkey, phy_tile_pkey in cur.execute(""" |
| SELECT pkey, wire_in_tile_pkey, phy_tile_pkey FROM wire WHERE node_pkey = ? |
| """, (node_pkey, )): |
| cur2.execute( |
| """ |
| SELECT name FROM wire_in_tile WHERE pkey = ? |
| """, (wire_in_tile_pkey, ) |
| ) |
| wire = cur2.fetchone()[0] |
| |
| cur2.execute( |
| """ |
| SELECT name FROM phy_tile WHERE pkey = ? |
| """, (phy_tile_pkey, ) |
| ) |
| tile = cur2.fetchone()[0] |
| |
| wires.append((tile, wire)) |
| |
| print('rr inode: {}'.format(args.inode)) |
| print('graph_node_pkey inode: {}'.format(graph_node_pkey)) |
| print('NodeType: {}'.format(graph_node_type)) |
| print('Wires ({}):'.format(len(wires))) |
| for tile, wire in wires: |
| print(' {}/{}'.format(tile, wire)) |
| |
| |
| if __name__ == "__main__": |
| main() |