| """ 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() |