#!/usr/bin/env python3
# Run `python3 -m unittest lib.rr_graph.tests.test_graph`
import unittest

from .. import graph, P, Size
from ..graph import (
    Pin, PinClass, PinClassDirection, Block, BlockGrid, BlockType, Segment,
    Switch, SwitchType, RoutingGraph, RoutingGraphPrinter
)

import lxml.etree as ET


class TestGraph(unittest.TestCase):
    def test_parse_net(self):
        # Fully specified
        self.assertEqual(('a', 'b', [0]), graph.parse_net('a.b[0]'))
        self.assertEqual(('c', 'd', [1]), graph.parse_net('c.d[1]'))
        self.assertEqual(('c', 'd', [40]), graph.parse_net('c.d[40]'))
        self.assertEqual(
            ('VPR_PAD', 'outpad', [0]), graph.parse_net('VPR_PAD.outpad[0]')
        )
        # Complex block names
        self.assertEqual(('a.b', 'c', [0]), graph.parse_net('a.b.c[0]'))
        self.assertEqual(('c-d', 'e', [11]), graph.parse_net('c-d.e[11]'))
        # Block names w/ square brackets
        self.assertEqual(('a.b[2]', 'c', [0]), graph.parse_net('a.b[2].c[0]'))
        self.assertEqual(
            ('c-d[3]', 'e', [11]), graph.parse_net('c-d[3].e[11]')
        )
        # Fully specified range of pins
        self.assertEqual(
            ('a', 'b', [8, 9, 10, 11]), graph.parse_net('a.b[11:8]')
        )
        self.assertEqual(
            ('c', 'd', [8, 9, 10, 11]), graph.parse_net('c.d[8:11]')
        )
        # Net with no block
        self.assertEqual((None, 'outpad', [10]), graph.parse_net('outpad[10]'))
        self.assertEqual(
            (None, 'outpad', [10, 11, 12]), graph.parse_net('outpad[10:12]')
        )
        self.assertEqual(
            (None, 'outpad', [10, 11, 12]), graph.parse_net('outpad[12:10]')
        )
        # No block or pin index
        self.assertEqual((None, 'outpad', None), graph.parse_net('outpad'))
        self.assertEqual((None, 'outpad0', None), graph.parse_net('outpad0'))
        self.assertEqual((None, '0outpad', None), graph.parse_net('0outpad'))
        self.assertEqual((None, None, [0]), graph.parse_net('0'))

    def test_pin_from_text(self):
        self.assertEqual('None(0)->None[None]', str(Pin.from_text(None, '0')))
        self.assertEqual(
            'None(10)->None[None]', str(Pin.from_text(None, '10'))
        )
        self.assertEqual(
            'bt(None)->outpad[2]', str(Pin.from_text(None, 'bt.outpad[2]'))
        )
        self.assertEqual(
            'bt[3](None)->outpad[2]',
            str(Pin.from_text(None, 'bt[3].outpad[2]'))
        )

    def test_pin_from_xml(self):
        pc = PinClass(BlockType(name="bt"), direction=PinClassDirection.INPUT)
        xml_string = '<pin ptc="1">bt.outpad[2]</pin>'
        pin = Pin.from_xml(pc, ET.fromstring(xml_string))
        self.assertEqual('bt(1)->outpad[2]', str(pin))
        self.assertEqual(1, pin.ptc)

    def test_pinclass_port_name(self):
        bg = BlockGrid()
        bt = BlockType(g=bg, id=0, name="B")
        c1 = PinClass(block_type=bt, direction=PinClassDirection.OUTPUT)
        c2 = PinClass(block_type=bt, direction=PinClassDirection.OUTPUT)
        c3 = PinClass(block_type=bt, direction=PinClassDirection.OUTPUT)
        Pin(pin_class=c1, port_name="P1", port_index=0)
        Pin(pin_class=c2, port_name="P1", port_index=1)
        Pin(pin_class=c2, port_name="P1", port_index=2)
        Pin(pin_class=c2, port_name="P1", port_index=3)
        Pin(pin_class=c3, port_name="P2", port_index=0)
        self.assertEqual('P1[0]', c1.port_name)
        self.assertEqual('P1[3:1]', c2.port_name)
        self.assertEqual('P2[0]', c3.port_name)

    def test_pinclass_from_xml(self):
        bt = BlockType(name="bt")
        xml_string1 = '''
        <pin_class type="INPUT">
            <pin ptc="2">bt.outpad[3]</pin>
            <pin ptc="3">bt.outpad[4]</pin>
        </pin_class>
        '''
        pc = PinClass.from_xml(bt, ET.fromstring(xml_string1))
        self.assertEqual(2, len(pc.pins))
        self.assertEqual('outpad[4:3]', pc.port_name)

        bt = BlockType(name="a")
        xml_string2 = '''
        <pin_class type="INPUT">
            <pin ptc="0">a.b[1]</pin>
        </pin_class>
        '''
        pc = PinClass.from_xml(bt, ET.fromstring(xml_string2))
        self.assertEqual(1, len(pc.pins))

        xml_string3 = '''
        <pin_class type="OUTPUT">
            <pin ptc="2">a.b[5]</pin>
            <pin ptc="3">a.b[6]</pin>
            <pin ptc="4">a.b[7]</pin>
        </pin_class>
        '''
        pc = PinClass.from_xml(bt, ET.fromstring(xml_string3))
        self.assertEqual(3, len(pc.pins))

    def test_blocktype_from_xml(self):
        xml_string = '''
        <block_type id="1" name="VPR_PAD" width="2" height="3">
            <pin_class type="OUTPUT">
                <pin ptc="0">VPR_PAD.outpad[0]</pin>
            </pin_class>
            <pin_class type="OUTPUT">
                <pin ptc="1">VPR_PAD.outpad[1]</pin>
            </pin_class>
            <pin_class type="INPUT">
                <pin ptc="2">VPR_PAD.inpad[0]</pin>
            </pin_class>
        </block_type>
        '''
        bt = BlockType.from_xml(None, ET.fromstring(xml_string))
        self.assertEqual(3, len(bt.pin_classes))
        self.assertEqual('PCD.OUTPUT', str(bt.pin_classes[0].direction))
        self.assertEqual('PCD.INPUT', str(bt.pin_classes[2].direction))

        # Multiple pins in a single pinclass
        xml_string = '''
        <block_type id="1" name="VPR_PAD" width="2" height="3">
            <pin_class type="OUTPUT">
                <pin ptc="0">VPR_PAD.outpad[0]</pin>
                <pin ptc="1">VPR_PAD.outpad[1]</pin>
            </pin_class>
            <pin_class type="INPUT">
                <pin ptc="2">VPR_PAD.inpad[0]</pin>
            </pin_class>
        </block_type>
        '''
        bt = BlockType.from_xml(None, ET.fromstring(xml_string))
        self.assertEqual(3, len(bt.pins_index))
        self.assertEqual(2, len(bt.pin_classes))
        self.assertEqual(2, len(bt.pin_classes[0].pins))

        # Multiple subblocks within a block_type
        xml_string = '''
        <block_type id="1" name="VPR_PAD" width="2" height="3">
            <pin_class type="OUTPUT">
                <pin ptc="0">VPR_PAD[0].outpad[0]</pin>
            </pin_class>
            <pin_class type="INPUT">
                <pin ptc="1">VPR_PAD[0].inpad[0]</pin>
            </pin_class>
            <pin_class type="OUTPUT">
                <pin ptc="2">VPR_PAD[1].outpad[0]</pin>
            </pin_class>
            <pin_class type="INPUT">
                <pin ptc="3">VPR_PAD[1].inpad[0]</pin>
            </pin_class>
        </block_type>
        '''
        bt = BlockType.from_xml(None, ET.fromstring(xml_string))
        self.assertEqual(4, len(bt.pins_index))
        self.assertEqual(4, len(bt.pin_classes))
        # Each pin class should only have one pin
        self.assertEqual(1, len(bt.pin_classes[0].pins))

    def test_blocktype_add_pin(self):
        pc = PinClass(direction=PinClassDirection.INPUT)
        self.assertEqual(0, len(pc.pins))
        pc._add_pin(Pin())
        self.assertEqual(1, len(pc.pins))
        bt = BlockType()
        self.assertEqual(0, len(bt.pins_index))
        bt._add_pin_class(pc)
        self.assertEqual(1, len(bt.pins_index))

    def test_block_from_xml(self):
        g = BlockGrid()
        g.add_block_type(BlockType(id=0, name="bt"))
        xml_string = '''
        <grid_loc x="2" y="5" block_type_id="0" width_offset="1" height_offset="2"/>
        '''
        bl1 = Block.from_xml(g, ET.fromstring(xml_string))
        self.assertEqual(2, bl1.position.x)
        self.assertEqual(5, bl1.position.y)
        self.assertEqual(1, bl1.offset.w)
        self.assertEqual(2, bl1.offset.h)

    def test_segment_from_xml(self):
        xml_string = '''
        <segment id="0" name="span">
            <timing R_per_meter="101" C_per_meter="2.25000005e-14"/>
        </segment>
        '''
        segment = Segment.from_xml(ET.fromstring(xml_string))
        self.assertEqual(101, segment.timing.R_per_meter)
        self.assertEqual(2.25000005e-14, segment.timing.C_per_meter)

    def test_switch_from_xml(self):
        xml_string = '''
        <switch id="0" type="mux" name="buffer">
            <timing R="551" Cin="7.70000012e-16" Cout="4.00000001e-15" Tdel="5.80000006e-11"/>
            <sizing mux_trans_size="2.63073993" buf_size="27.6459007"/>
        </switch>
        '''
        sw = Switch.from_xml(ET.fromstring(xml_string))
        self.assertEqual('buffer', sw.name)
        self.assertEqual(551, sw.timing.R)
        self.assertEqual(7.70000012e-16, sw.timing.Cin)
        self.assertEqual(4.00000001e-15, sw.timing.Cout)
        self.assertEqual(5.80000006e-11, sw.timing.Tdel)
        self.assertEqual(2.63073993, sw.sizing.mux_trans_size)
        self.assertEqual(27.6459007, sw.sizing.buf_size)

    def test_routinggraphprinter_node(self):
        self.assertEqual(
            '0 X000Y003[00].SINK-<',
            RoutingGraphPrinter.node(
                ET.fromstring(
                    '''
        <node id="0" type="SINK" capacity="1">
            <loc xlow="0" ylow="3" xhigh="0" yhigh="3" ptc="0"/>
            <timing R="0" C="0"/>
        </node>
        '''
                )
            )
        )
        self.assertEqual(
            '1 X001Y002[01].SRC-->',
            RoutingGraphPrinter.node(
                ET.fromstring(
                    '''
            <node id="1" type="SOURCE" capacity="1">
                <loc xlow="1" ylow="2" xhigh="1" yhigh="2" ptc="1"/>
                <timing R="0" C="0"/>
            </node>
            '''
                )
            )
        )
        self.assertEqual(
            '2 X002Y001[00].T-PIN<',
            RoutingGraphPrinter.node(
                ET.fromstring(
                    '''
            <node id="2" type="IPIN" capacity="1">
                <loc xlow="2" ylow="1" xhigh="2" yhigh="1" side="TOP" ptc="0"/>
                <timing R="0" C="0"/>
            </node>
            '''
                )
            )
        )
        self.assertEqual(
            '6 X003Y000[01].R-PIN>',
            RoutingGraphPrinter.node(
                ET.fromstring(
                    '''
            <node id="6" type="OPIN" capacity="1">
                <loc xlow="3" ylow="0" xhigh="3" yhigh="0" side="RIGHT" ptc="1"/>
                <timing R="0" C="0"/>
            </node>
            '''
                )
            )
        )
        # With a block graph, the name will include the block type
        bg = graph.simple_test_block_grid()
        self.assertEqual(
            '0 X000Y003_INBLOCK[00].C[3:0]-SINK-<',
            RoutingGraphPrinter.node(
                ET.fromstring(
                    '''
            <node id="0" type="SINK" capacity="1">
                <loc xlow="0" ylow="3" xhigh="0" yhigh="3" ptc="0"/>
                <timing R="0" C="0"/>
            </node>
            '''
                ), bg
            )
        )
        self.assertEqual(
            '1 X001Y002_DUALBLK[01].B[0]-SRC-->',
            RoutingGraphPrinter.node(
                ET.fromstring(
                    '''
            <node id="1" type="SOURCE" capacity="1">
                <loc xlow="1" ylow="2" xhigh="1" yhigh="2" ptc="1"/>
                <timing R="0" C="0"/>
            </node>
            '''
                ), bg
            )
        )
        self.assertEqual(
            '2 X002Y001_DUALBLK[00].A[0]-T-PIN<',
            RoutingGraphPrinter.node(
                ET.fromstring(
                    '''
            <node id="2" type="IPIN" capacity="1">
                <loc xlow="2" ylow="1" xhigh="2" yhigh="1" side="TOP" ptc="0"/>
                <timing R="0" C="0"/>
            </node>
            '''
                ), bg
            )
        )
        self.assertEqual(
            '6 X003Y000_OUTBLOK[01].D[1]-R-PIN>',
            RoutingGraphPrinter.node(
                ET.fromstring(
                    '''
            <node id="6" type="OPIN" capacity="1">
                <loc xlow="3" ylow="0" xhigh="3" yhigh="0" side="RIGHT" ptc="1"/>
                <timing R="0" C="0"/>
            </node>
            '''
                ), bg
            )
        )
        # Edges don't require a block graph, as they have the full information on the node.
        self.assertEqual(
            '372 X003Y000--04->X003Y000',
            RoutingGraphPrinter.node(
                ET.fromstring(
                    '''
            <node capacity="1" direction="INC_DIR" id="372" type="CHANX">
                <loc ptc="4" xhigh="3" xlow="3" yhigh="0" ylow="0"/>
                <timing C="2.72700004e-14" R="101"/>
                <segment segment_id="1"/>
            </node>
            '''
                )
            )
        )
        self.assertEqual(
            '373 X003Y000<|05||X003Y000',
            RoutingGraphPrinter.node(
                ET.fromstring(
                    '''
            <node capacity="1" direction="DEC_DIR" id="373" type="CHANY">
                <loc ptc="5" xhigh="3" xlow="3" yhigh="0" ylow="0"/>
                <timing C="2.72700004e-14" R="101"/>
                <segment segment_id="1"/>
            </node>
            '''
                )
            )
        )
        self.assertEqual(
            '374 X003Y000<-05->X003Y000',
            RoutingGraphPrinter.node(
                ET.fromstring(
                    '''
            <node capacity="1" direction="BI_DIR" id="374" type="CHANX">
                <loc ptc="5" xhigh="3" xlow="3" yhigh="0" ylow="0"/>
                <timing C="2.72700004e-14" R="101"/>
                <segment segment_id="1"/>
            </node>
            '''
                )
            )
        )

    def test_routinggraphprinter_edge(self):
        bg = graph.simple_test_block_grid()
        xml_string1 = '''
        <rr_graph>
            <rr_nodes>
                <node id="0" type="SOURCE" capacity="1">
                    <loc xlow="0" ylow="3" xhigh="0" yhigh="3" ptc="0"/>
                    <timing R="0" C="0"/>
                </node>
                <node capacity="1" direction="INC_DIR" id="1" type="CHANY">
                    <loc ptc="5" xhigh="3" xlow="0" yhigh="0" ylow="3"/>
                    <timing C="2.72700004e-14" R="101"/>
                    <segment segment_id="1"/>
                </node>
            </rr_nodes>
        <rr_edges />
        <switches />
        </rr_graph>
        '''
        rg = RoutingGraph(xml_graph=ET.fromstring(xml_string1))
        self.assertEqual(
            '0 X000Y003[00].SRC--> ->>- 1 X000Y003||05|>X003Y000',
            RoutingGraphPrinter.edge(
                rg,
                ET.fromstring(
                    '''
            <edge sink_node="1" src_node="0" switch_id="1"/>
            '''
                )
            )
        )
        self.assertEqual(
            '0 X000Y003_INBLOCK[00].C[3:0]-SRC--> ->>- 1 X000Y003||05|>X003Y000',
            RoutingGraphPrinter.edge(
                rg,
                ET.fromstring(
                    '''
            <edge sink_node="1" src_node="0" switch_id="1"/>
            '''
                ), bg
            )
        )

    def test_routinggraph_set_metadata(self):
        r = graph.simple_test_routing()
        sw = Switch(id=0, type=SwitchType.MUX, name="sw")
        r.create_edge_with_ids(0, 1, sw)
        e1 = r.get_edge_by_id(4)
        self.assertEqual(':-(', e1.get_metadata("test", default=":-("))
        e1.set_metadata("test", "123")
        self.assertEqual('123', e1.get_metadata("test", default=":-("))
        # Or via the routing object
        r.set_metadata(e1, "test", "234")
        self.assertEqual('234', r.get_metadata(e1, "test", "234"))
        # Exception if no default provided
        with self.assertRaises(ValueError):
            r.get_metadata(e1, "not_found")

        r.set_metadata(e1, "test", 1)
        # Works with nodes
        n1 = r.get_node_by_id(0)
        # Call directly on the node
        self.assertEqual(':-(', n1.get_metadata("test", default=":-("))
        n1.set_metadata("test", "123")
        self.assertEqual('123', n1.get_metadata("test", default=":-("))
        # Or via the routing object
        r.set_metadata(n1, "test", "234")
        self.assertEqual('234', r.get_metadata(n1, "test"))

    def test_routinggraph_get_node_by_id(self):
        r = graph.simple_test_routing()
        self.assertEqual(
            '0 X000Y000[00].SRC-->',
            RoutingGraphPrinter.node(r.get_node_by_id(0))
        )
        self.assertEqual(
            '1 X000Y000[00].R-PIN>',
            RoutingGraphPrinter.node(r.get_node_by_id(1))
        )
        self.assertEqual(
            '2 X000Y000<-00->X000Y010',
            RoutingGraphPrinter.node(r.get_node_by_id(2))
        )
        self.assertEqual(
            '3 X000Y010[00].L-PIN<',
            RoutingGraphPrinter.node(r.get_node_by_id(3))
        )
        self.assertEqual(
            '4 X000Y010[00].SINK-<',
            RoutingGraphPrinter.node(r.get_node_by_id(4))
        )
        with self.assertRaises(KeyError):
            RoutingGraphPrinter.node(r.get_node_by_id(5))

    def test_routinggraph_get_edge_by_id(self):
        r = graph.simple_test_routing()
        self.assertEqual(
            '0 X000Y000[00].SRC--> ->>- 1 X000Y000[00].R-PIN>',
            RoutingGraphPrinter.edge(r, r.get_edge_by_id(0))
        )
        self.assertEqual(
            '1 X000Y000[00].R-PIN> ->>- 2 X000Y000<-00->X000Y010',
            RoutingGraphPrinter.edge(r, r.get_edge_by_id(1))
        )
        self.assertEqual(
            '2 X000Y000<-00->X000Y010 ->>- 3 X000Y010[00].L-PIN<',
            RoutingGraphPrinter.edge(r, r.get_edge_by_id(2))
        )
        self.assertEqual(
            '3 X000Y010[00].L-PIN< ->>- 4 X000Y010[00].SINK-<',
            RoutingGraphPrinter.edge(r, r.get_edge_by_id(3))
        )
        with self.assertRaises(KeyError):
            r.get_edge_by_id(4)

    def test_routinggraph_node_ids_for_edge(self):
        e = ET.fromstring('<edge src_node="0" sink_node="1" switch_id="1"/>')
        self.assertEqual((0, 1), RoutingGraph.node_ids_for_edge(e))

    def test_routinggraph_nodes_for_edge(self):
        r = graph.simple_test_routing()
        e1 = r.get_edge_by_id(0)
        self.assertEqual(
            '0 X000Y000[00].SRC--> ->>- 1 X000Y000[00].R-PIN>',
            RoutingGraphPrinter.edge(r, e1)
        )
        self.assertEqual(
            ['0 X000Y000[00].SRC-->', '1 X000Y000[00].R-PIN>'],
            [RoutingGraphPrinter.node(n) for n in r.nodes_for_edge(e1)]
        )
        e2 = r.get_edge_by_id(1)
        self.assertEqual(
            '1 X000Y000[00].R-PIN> ->>- 2 X000Y000<-00->X000Y010',
            RoutingGraphPrinter.edge(r, e2)
        )
        self.assertEqual(
            ['1 X000Y000[00].R-PIN>', '2 X000Y000<-00->X000Y010'],
            [RoutingGraphPrinter.node(n) for n in r.nodes_for_edge(e2)]
        )

    def test_routinggraph_edges_for_node(self):
        r = graph.simple_test_routing()
        self.assertEqual(
            [
                '0 X000Y000[00].SRC--> ->>- 1 X000Y000[00].R-PIN>',
                '1 X000Y000[00].R-PIN> ->>- 2 X000Y000<-00->X000Y010'
            ], [
                RoutingGraphPrinter.edge(r, e)
                for e in r.edges_for_node(r.get_node_by_id(1))
            ]
        )
        self.assertEqual(
            [
                '1 X000Y000[00].R-PIN> ->>- 2 X000Y000<-00->X000Y010',
                '2 X000Y000<-00->X000Y010 ->>- 3 X000Y010[00].L-PIN<'
            ], [
                RoutingGraphPrinter.edge(r, e)
                for e in r.edges_for_node(r.get_node_by_id(2))
            ]
        )

    def test_routinggraph_create_edge_with_ids(self):
        r = graph.simple_test_routing()
        sw = Switch(id=0, type=SwitchType.MUX, name="sw")
        r.create_edge_with_ids(0, 1, sw)
        e1 = r.get_edge_by_id(4)
        self.assertEqual(
            '0 X000Y000[00].SRC--> ->>- 1 X000Y000[00].R-PIN>',
            RoutingGraphPrinter.edge(r, e1)
        )
        # The code protects against invalid edge creation
        with self.assertRaises(TypeError):
            r.create_edge_with_ids(0, 2, sw)

        with self.assertRaises(TypeError):
            r.create_edge_with_ids(1, 4, sw)

    def test_graph_constructor(self):
        # Look at the segments via name or ID number
        g = graph.simple_test_graph()
        self.assertEqual('local', g.segments[0].name)
        self.assertEqual(0, g.segments['local'].id)
        # Look at the switches via name or ID number
        g = graph.simple_test_graph()
        self.assertEqual('mux', g.switches[0].name)
        self.assertEqual(0, g.switches['mux'].id)
        self.assertEqual('__vpr_delayless_switch__', g.switches[1].name)
        self.assertEqual(1, g.switches['__vpr_delayless_switch__'].id)
        # Look at the block grid
        g = graph.simple_test_graph()
        self.assertEqual(Size(w=4, h=3), g.block_grid.size)
        self.assertEqual(P(x=0, y=0), g.block_grid[P(0, 0)].position)
        self.assertEqual(P(x=2, y=1), g.block_grid[P(2, 1)].position)
        with self.assertRaises(KeyError):
            g.block_grid[P(4, 4)]

        self.assertEqual(1, g.block_grid.block_types["IBUF"].id)
        self.assertEqual('OBUF', g.block_grid.block_types[2].name)


if __name__ == "__main__":
    unittest.main()
