diff --git a/b_asic/schema.py b/b_asic/schema.py index 3c1ca16285f7ec913767b8a9880584bd8f21cb94..4603c8976005995a87cd4de9b7d2c10d68f20c49 100644 --- a/b_asic/schema.py +++ b/b_asic/schema.py @@ -14,7 +14,6 @@ import io from b_asic.signal_flow_graph import SFG from b_asic.graph_component import GraphID -from b_asic.operation import Operation from b_asic.special_operations import Delay, Output @@ -108,6 +107,22 @@ class Schema: def schedule_time(self) -> int: return self._schedule_time + def increase_time_resolution(self, factor: int) -> None: + raise NotImplementedError + + def decrease_time_resolution(self, factor: int) -> None: + raise NotImplementedError + + def move_operation(self, op_id: GraphID, time: int) -> None: + assert op_id in self._start_times, "No operation with the specified op_id in this schema." + if time < 0: + if -time > self.backward_slack(op_id): + raise ValueError + else: + if time > self.forward_slack(op_id): + raise ValueError + self._start_times[op_id] += time + def _remove_delays(self) -> None: delay_list = self._sfg.find_by_type_name(Delay.type_name()) while delay_list: @@ -270,6 +285,7 @@ class Schema: plt.show() def _repr_svg_(self): + plt.figure() self._plot_schedule() f = io.StringIO() plt.savefig(f, format='svg') diff --git a/test/test_schema.py b/test/test_schema.py index 40f2cc3e50c907a0a5956f320309822e8dd39a2d..dfba112b628f7de50b20b44e41e99b97434ff992 100644 --- a/test/test_schema.py +++ b/test/test_schema.py @@ -1,6 +1,7 @@ """ B-ASIC test suite for the schema module and Schema class. """ +import pytest from b_asic import Schema, Addition, ConstantMultiplication @@ -77,3 +78,58 @@ class TestInit: assert schema.forward_slack(precedence_sfg_delays.find_by_name("A2")[0].graph_id) == 0 assert schema.backward_slack(precedence_sfg_delays.find_by_name("A2")[0].graph_id) == 16 + + +class TestRescheduling: + def test_move_operation(self, precedence_sfg_delays): + precedence_sfg_delays.set_latency_of_type(Addition.type_name(), 4) + precedence_sfg_delays.set_latency_of_type(ConstantMultiplication.type_name(), 3) + + schema = Schema(precedence_sfg_delays, scheduling_alg="ASAP") + + schema.move_operation(precedence_sfg_delays.find_by_name("ADD3")[0].graph_id, 4) + schema.move_operation(precedence_sfg_delays.find_by_name("A2")[0].graph_id, 2) + + start_times_names = dict() + for op_id, start_time in schema._start_times.items(): + op_name = precedence_sfg_delays.find_by_id(op_id).name + start_times_names[op_name] = start_time + + assert start_times_names == {"IN1": 0, "C0": 0, "B1": 0, "B2": 0, "ADD2": 3, "ADD1": 7, "Q1": 11, + "A0": 14, "A1": 0, "A2": 2, "ADD3": 7, "ADD4": 17, "OUT1": 21} + + def test_move_operation_slack_after_rescheduling(self, precedence_sfg_delays): + precedence_sfg_delays.set_latency_of_type(Addition.type_name(), 1) + precedence_sfg_delays.set_latency_of_type(ConstantMultiplication.type_name(), 3) + + schema = Schema(precedence_sfg_delays, scheduling_alg="ASAP") + schema.move_operation(precedence_sfg_delays.find_by_name("ADD3")[0].graph_id, 4) + assert schema.forward_slack(precedence_sfg_delays.find_by_name("ADD3")[0].graph_id) == 3 + assert schema.backward_slack(precedence_sfg_delays.find_by_name("ADD3")[0].graph_id) == 4 + + assert schema.forward_slack(precedence_sfg_delays.find_by_name("A2")[0].graph_id) == 4 + assert schema.backward_slack(precedence_sfg_delays.find_by_name("A2")[0].graph_id) == 16 + + schema.move_operation(precedence_sfg_delays.find_by_name("A2")[0].graph_id, 2) + + assert schema.backward_slack(precedence_sfg_delays.find_by_name("ADD3")[0].graph_id) == 3 + assert schema.backward_slack(precedence_sfg_delays.find_by_name("ADD3")[0].graph_id) == 2 + + assert schema.forward_slack(precedence_sfg_delays.find_by_name("A2")[0].graph_id) == 2 + assert schema.backward_slack(precedence_sfg_delays.find_by_name("A2")[0].graph_id) == 18 + + def test_move_operation_incorrect_move_backward(self, precedence_sfg_delays): + precedence_sfg_delays.set_latency_of_type(Addition.type_name(), 1) + precedence_sfg_delays.set_latency_of_type(ConstantMultiplication.type_name(), 3) + + schema = Schema(precedence_sfg_delays, scheduling_alg="ASAP") + with pytest.raises(ValueError): + schema.move_operation(precedence_sfg_delays.find_by_name("ADD3")[0].graph_id, -4) + + def test_move_operation_incorrect_move_forward(self, precedence_sfg_delays): + precedence_sfg_delays.set_latency_of_type(Addition.type_name(), 1) + precedence_sfg_delays.set_latency_of_type(ConstantMultiplication.type_name(), 3) + + schema = Schema(precedence_sfg_delays, scheduling_alg="ASAP") + with pytest.raises(ValueError): + schema.move_operation(precedence_sfg_delays.find_by_name("ADD3")[0].graph_id, 10)