""" 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('NodeType: {}'.format(graph_node_type))
    print('Wires ({}):'.format(len(wires)))
    for tile, wire in wires:
        print('  {}/{}'.format(tile, wire))


if __name__ == "__main__":
    main()

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

add graph node id to inode_lookup library