| import unittest | |
| from copy import deepcopy | |
| from ..graph2 import SwitchTiming, SwitchSizing, Switch, SwitchType, \ | |
| Graph, SegmentTiming, Segment, PinClass, Pin, PinType, \ | |
| BlockType, GridLoc, NodeTiming, NodeSegment, Node, NodeType, \ | |
| NodeDirection, NodeLoc | |
| from ..tracks import Track, Direction | |
| class Graph2Tests(unittest.TestCase): | |
| def setUp(self): | |
| switch_timing = SwitchTiming( | |
| r=0, c_in=1, c_out=2, t_del=0, c_internal=0 | |
| ) | |
| switch_sizing = SwitchSizing(mux_trans_size=0, buf_size=1) | |
| delayless = Switch( | |
| id=0, | |
| name='__vpr_delayless_switch__', | |
| type=SwitchType.SHORT, | |
| timing=switch_timing, | |
| sizing=switch_sizing | |
| ) | |
| self.graph = Graph([delayless], [], [], [], []) | |
| def test_init(self): | |
| switch_timing = SwitchTiming( | |
| r=0, c_in=1, c_out=2, t_del=0, c_internal=0 | |
| ) | |
| switch_sizing = SwitchSizing(mux_trans_size=0, buf_size=1) | |
| self.switches = [ | |
| Switch( | |
| id=0, | |
| name='mux', | |
| type=SwitchType.MUX, | |
| timing=switch_timing, | |
| sizing=switch_sizing | |
| ), | |
| Switch( | |
| id=1, | |
| name='__vpr_delayless_switch__', | |
| type=SwitchType.SHORT, | |
| timing=switch_timing, | |
| sizing=switch_sizing | |
| ), | |
| ] | |
| seg_timing = SegmentTiming(r_per_meter=1, c_per_meter=1) | |
| self.segments = [Segment(id=0, name='s0', timing=seg_timing)] | |
| pin_classes = [ | |
| PinClass(type=PinType.INPUT, pin=[Pin(ptc=0, name='p1')]), | |
| PinClass(type=PinType.OUTPUT, pin=[Pin(ptc=1, name='p2')]), | |
| ] | |
| self.block_types = [ | |
| BlockType( | |
| id=0, name='b0', width=1, height=1, pin_class=pin_classes | |
| ) | |
| ] | |
| self.grid = [ | |
| GridLoc( | |
| x=0, y=0, block_type_id=0, width_offset=0, height_offset=0 | |
| ), | |
| ] | |
| node_timing = NodeTiming(r=0, c=0) | |
| self.nodes = [ | |
| Node( | |
| id=0, | |
| type=NodeType.IPIN, | |
| direction=NodeDirection.NO_DIR, | |
| capacity=1, | |
| loc=NodeLoc( | |
| x_low=0, | |
| x_high=0, | |
| y_low=0, | |
| y_high=0, | |
| side=Direction.LEFT, | |
| ptc=0 | |
| ), | |
| timing=node_timing, | |
| metadata=None, | |
| segment=NodeSegment(segment_id=0), | |
| ), | |
| Node( | |
| id=1, | |
| type=NodeType.SINK, | |
| direction=NodeDirection.NO_DIR, | |
| capacity=1, | |
| loc=NodeLoc( | |
| x_low=0, | |
| x_high=0, | |
| y_low=0, | |
| y_high=0, | |
| side=Direction.NO_SIDE, | |
| ptc=0 | |
| ), | |
| timing=node_timing, | |
| metadata=None, | |
| segment=NodeSegment(segment_id=0), | |
| ), | |
| Node( | |
| id=2, | |
| type=NodeType.OPIN, | |
| direction=NodeDirection.NO_DIR, | |
| capacity=1, | |
| loc=NodeLoc( | |
| x_low=0, | |
| x_high=0, | |
| y_low=0, | |
| y_high=0, | |
| side=Direction.LEFT, | |
| ptc=1 | |
| ), | |
| timing=node_timing, | |
| metadata=None, | |
| segment=NodeSegment(segment_id=0), | |
| ), | |
| Node( | |
| id=3, | |
| type=NodeType.SOURCE, | |
| direction=NodeDirection.NO_DIR, | |
| capacity=1, | |
| loc=NodeLoc( | |
| x_low=0, | |
| x_high=0, | |
| y_low=0, | |
| y_high=0, | |
| side=Direction.NO_SIDE, | |
| ptc=1 | |
| ), | |
| timing=node_timing, | |
| metadata=None, | |
| segment=NodeSegment(segment_id=0), | |
| ), | |
| ] | |
| self.graph = Graph( | |
| self.switches, self.segments, self.block_types, self.grid, | |
| deepcopy(self.nodes) | |
| ) | |
| def test_add_track(self): | |
| trk = Track(direction='Y', x_low=2, x_high=2, y_low=1, y_high=3) | |
| segment_id = -1 | |
| node_id = self.graph.add_track(trk, segment_id) | |
| self.assertEqual(len(self.graph.tracks), 1) | |
| self.assertEqual(len(self.graph.nodes), 1) | |
| node = self.graph.nodes[node_id] | |
| self.assertEqual(node.id, len(self.graph.nodes) - 1) | |
| self.assertEqual(node.type, NodeType.CHANY) | |
| self.assertEqual(node.direction, NodeDirection.BI_DIR) | |
| self.assertEqual(node.capacity, 1) | |
| def test_add_edge(self): | |
| trk = Track(direction='Y', x_low=2, x_high=2, y_low=1, y_high=3) | |
| segment_id = -1 | |
| self.graph.add_track(trk, segment_id) | |
| trk = Track(direction='X', x_low=1, x_high=3, y_low=1, y_high=1) | |
| segment_id = -1 | |
| self.graph.add_track(trk, segment_id) | |
| trk = Track(direction='X', x_low=1, x_high=3, y_low=3, y_high=3) | |
| segment_id = -1 | |
| self.graph.add_track(trk, segment_id) | |
| idx = self.graph.add_edge(1, 2, 0) | |
| self.assertEqual(self.graph.edges[idx].src_node, 1) | |
| self.assertEqual(self.graph.edges[idx].sink_node, 2) | |
| self.assertEqual(self.graph.edges[idx].switch_id, 0) | |
| self.assertEqual(self.graph.edges[idx].metadata, None) | |
| def test_add_switch(self): | |
| idx = self.graph.add_switch( | |
| Switch( | |
| id=None, | |
| name='mux', | |
| type=SwitchType.MUX, | |
| timing=None, | |
| sizing=SwitchSizing(mux_trans_size=1, buf_size=0) | |
| ) | |
| ) | |
| self.assertEqual(idx, len(self.graph.switches) - 1) | |
| self.assertTrue('mux' in self.graph.switch_name_map.keys()) | |
| def test_check_ptc(self): | |
| self.graph.check_ptc() | |
| trk = Track(direction='Y', x_low=2, x_high=2, y_low=1, y_high=3) | |
| segment_id = -1 | |
| self.graph.add_track(trk, segment_id) | |
| with self.assertRaises(AssertionError): | |
| self.graph.check_ptc() | |
| def test_set_track_ptc(self): | |
| trk = Track(direction='Y', x_low=2, x_high=2, y_low=1, y_high=3) | |
| segment_id = -1 | |
| node_id = self.graph.add_track(trk, segment_id) | |
| with self.assertRaises(AssertionError): | |
| self.graph.check_ptc() | |
| self.graph.set_track_ptc(node_id, 0) | |
| self.graph.check_ptc() | |
| def test_block_type_at_loc_asserts(self): | |
| loc = (0, 0) | |
| with self.assertRaises(KeyError): | |
| self.graph.block_type_at_loc(loc) | |
| def test_get_switch_id(self): | |
| with self.assertRaises(KeyError): | |
| self.graph.get_switch_id('mux') | |
| idx = self.graph.add_switch( | |
| Switch( | |
| id=None, | |
| name='mux', | |
| type=SwitchType.MUX, | |
| timing=None, | |
| sizing=SwitchSizing(mux_trans_size=1, buf_size=0) | |
| ) | |
| ) | |
| lu_idx = self.graph.get_switch_id('mux') | |
| self.assertEqual(idx, lu_idx) | |
| class Graph2MediumTests(unittest.TestCase): | |
| def setUp(self): | |
| switch_timing = SwitchTiming( | |
| r=0, c_in=1, c_out=2, t_del=0, c_internal=0 | |
| ) | |
| switch_sizing = SwitchSizing(mux_trans_size=0, buf_size=1) | |
| self.switches = [ | |
| Switch( | |
| id=0, | |
| name='mux', | |
| type=SwitchType.MUX, | |
| timing=switch_timing, | |
| sizing=switch_sizing | |
| ), | |
| Switch( | |
| id=1, | |
| name='__vpr_delayless_switch__', | |
| type=SwitchType.SHORT, | |
| timing=switch_timing, | |
| sizing=switch_sizing | |
| ), | |
| ] | |
| seg_timing = SegmentTiming(r_per_meter=1, c_per_meter=1) | |
| self.segments = [Segment(id=0, name='s0', timing=seg_timing)] | |
| pin_classes0 = [ | |
| PinClass(type=PinType.INPUT, pin=[Pin(ptc=0, name='p1')]), | |
| PinClass(type=PinType.OUTPUT, pin=[Pin(ptc=1, name='p2')]), | |
| ] | |
| pin_classes1 = [ | |
| PinClass(type=PinType.OUTPUT, pin=[Pin(ptc=1, name='p3')]), | |
| ] | |
| self.block_types = [ | |
| BlockType( | |
| id=0, name='b0', width=1, height=1, pin_class=pin_classes0 | |
| ), | |
| BlockType( | |
| id=1, name='b1', width=1, height=1, pin_class=pin_classes1 | |
| ), | |
| ] | |
| self.grid = [ | |
| GridLoc( | |
| x=0, y=0, block_type_id=0, width_offset=0, height_offset=0 | |
| ), | |
| ] | |
| node_timing = NodeTiming(r=0, c=0) | |
| self.nodes = [ | |
| Node( | |
| id=0, | |
| type=NodeType.IPIN, | |
| direction=NodeDirection.NO_DIR, | |
| capacity=1, | |
| loc=NodeLoc( | |
| x_low=0, | |
| x_high=0, | |
| y_low=0, | |
| y_high=0, | |
| side=Direction.LEFT, | |
| ptc=0 | |
| ), | |
| timing=node_timing, | |
| metadata=None, | |
| segment=NodeSegment(segment_id=0), | |
| ), | |
| Node( | |
| id=1, | |
| type=NodeType.SINK, | |
| direction=NodeDirection.NO_DIR, | |
| capacity=1, | |
| loc=NodeLoc( | |
| x_low=0, | |
| x_high=0, | |
| y_low=0, | |
| y_high=0, | |
| side=Direction.NO_SIDE, | |
| ptc=0 | |
| ), | |
| timing=node_timing, | |
| metadata=None, | |
| segment=NodeSegment(segment_id=0), | |
| ), | |
| Node( | |
| id=2, | |
| type=NodeType.OPIN, | |
| direction=NodeDirection.NO_DIR, | |
| capacity=1, | |
| loc=NodeLoc( | |
| x_low=0, | |
| x_high=0, | |
| y_low=0, | |
| y_high=0, | |
| side=Direction.LEFT, | |
| ptc=1 | |
| ), | |
| timing=node_timing, | |
| metadata=None, | |
| segment=NodeSegment(segment_id=0), | |
| ), | |
| Node( | |
| id=3, | |
| type=NodeType.SOURCE, | |
| direction=NodeDirection.NO_DIR, | |
| capacity=1, | |
| loc=NodeLoc( | |
| x_low=0, | |
| x_high=0, | |
| y_low=0, | |
| y_high=0, | |
| side=Direction.NO_SIDE, | |
| ptc=1 | |
| ), | |
| timing=node_timing, | |
| metadata=None, | |
| segment=NodeSegment(segment_id=0), | |
| ), | |
| ] | |
| self.graph = Graph( | |
| self.switches, self.segments, self.block_types, self.grid, | |
| deepcopy(self.nodes) | |
| ) | |
| def test_block_type_at_loc(self): | |
| loc = (0, 0) | |
| name = self.graph.block_type_at_loc(loc) | |
| self.assertEqual(name, 'b0') | |
| def test_get_nodes_for_pin(self): | |
| nodes = self.graph.get_nodes_for_pin((0, 0), 'p1') | |
| self.assertEqual(nodes, [ | |
| (0, Direction.LEFT), | |
| ]) | |
| with self.assertRaises(KeyError): | |
| self.graph.get_nodes_for_pin((0, 0), 'd1') | |
| with self.assertRaises(AssertionError): | |
| self.graph.get_nodes_for_pin((0, 0), 'p3') | |
| def test_create_channels(self): | |
| pass |