| """ | |
| """ | |
| import argparse | |
| import functools | |
| import pickle | |
| import re | |
| import sqlite3 | |
| import sys | |
| def create_lookup_inode(conn, inode_to_graph_map): | |
| cur = conn.cursor() | |
| @functools.lru_cache(maxsize=1024 * 1024) | |
| def lookup_inode(inode): | |
| if inode not in inode_to_graph_map: | |
| return '{}'.format(inode) | |
| else: | |
| cur.execute( | |
| """ | |
| SELECT phy_tile.name, wire_in_tile.name | |
| FROM graph_node | |
| INNER JOIN wire ON graph_node.node_pkey = wire.node_pkey | |
| INNER JOIN wire_in_tile ON wire.wire_in_tile_pkey = wire_in_tile.pkey | |
| INNER JOIN phy_tile ON wire.phy_tile_pkey = phy_tile.pkey | |
| WHERE graph_node.pkey = ? | |
| LIMIT 1;""", (inode_to_graph_map[inode], ) | |
| ) | |
| tile, wire = cur.fetchone() | |
| return '{}/{} ({})'.format(tile, wire, inode) | |
| return lookup_inode | |
| def main(): | |
| parser = argparse.ArgumentParser(description=__doc__) | |
| parser.add_argument('--rrgraph_node_map', required=True) | |
| parser.add_argument('--connection_database', 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 | |
| ) | |
| lookup_inode = create_lookup_inode(conn, inode_to_graph_map) | |
| def replace_inode(match): | |
| return match.group(1) + ' ' + lookup_inode(int(match.group(2))) | |
| NODE_RE = re.compile('(node|rt_node:) ([1-9][0-9]*)') | |
| for line in sys.stdin: | |
| sys.stdout.write(NODE_RE.sub(replace_inode, line)) | |
| if __name__ == "__main__": | |
| main() |