| 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 |