From d14871f69690c640a439f00e1c7a88355f5eca63 Mon Sep 17 00:00:00 2001 From: Oscar Gustafsson <oscar.gustafsson@gmail.com> Date: Sun, 16 Mar 2025 11:06:46 +0100 Subject: [PATCH] Add functions taking GraphComponent instead of TypeName --- b_asic/GUI/main_window.py | 4 +- b_asic/schedule.py | 14 +- b_asic/scheduler.py | 12 +- b_asic/signal_flow_graph.py | 89 ++++- .../auto_scheduling_with_custom_io_times.py | 8 +- examples/fivepointwinograddft.py | 12 +- examples/folding_example_with_architecture.py | 8 +- examples/ldlt_matrix_inverse.py | 8 +- examples/memory_constrained_scheduling.py | 8 +- examples/scheduling_pipelining_retiming.py | 8 +- examples/secondorderdirectformiir.py | 8 +- .../secondorderdirectformiir_architecture.py | 8 +- examples/thirdorderblwdf.py | 8 +- examples/threepointwinograddft.py | 8 +- test/fixtures/schedule.py | 26 +- test/integration/test_sfg_to_architecture.py | 16 +- test/unit/test_architecture.py | 10 +- test/unit/test_list_schedulers.py | 342 +++++++++--------- test/unit/test_schedule.py | 152 +++++--- test/unit/test_scheduler.py | 48 +-- test/unit/test_scheduler_gui.py | 4 +- test/unit/test_sfg.py | 57 ++- test/unit/test_sfg_generators.py | 3 + 23 files changed, 500 insertions(+), 361 deletions(-) diff --git a/b_asic/GUI/main_window.py b/b_asic/GUI/main_window.py index d26b14ad..f0c05be7 100644 --- a/b_asic/GUI/main_window.py +++ b/b_asic/GUI/main_window.py @@ -413,8 +413,8 @@ class SFGMainWindow(QMainWindow): if dequelen > 0: for i in range(dequelen): action = self._recent_files_actions[i] - action.setText(rfp[i]) - action.setData(QFileInfo(rfp[i])) + action.setText(str(rfp[i])) + action.setData(QFileInfo(str(rfp[i]))) action.setVisible(True) for i in range(dequelen, self._max_recent_files): diff --git a/b_asic/schedule.py b/b_asic/schedule.py index 8525a937..33a629b3 100644 --- a/b_asic/schedule.py +++ b/b_asic/schedule.py @@ -624,7 +624,7 @@ class Schedule: self._schedule_time = self._schedule_time // factor return self - def set_execution_time_of_type( + def set_execution_time_of_type_name( self, type_name: TypeName, execution_time: int ) -> None: """ @@ -638,9 +638,9 @@ class Schedule: execution_time : int The execution time of the operation. """ - self._sfg.set_execution_time_of_type(type_name, execution_time) + self._sfg.set_execution_time_of_type_name(type_name, execution_time) - def set_latency_of_type(self, type_name: TypeName, latency: int) -> None: + def set_latency_of_type_name(self, type_name: TypeName, latency: int) -> None: """ Set the latency of all operations with the given type name. @@ -948,15 +948,15 @@ class Schedule: def _remove_delays_no_laps(self) -> None: """Remove delay elements without updating laps. Used when loading schedule.""" - delay_list = self._sfg.find_by_type_name(Delay.type_name()) + delay_list = self._sfg.find_by_type(Delay) while delay_list: delay_op = cast(Delay, delay_list[0]) self._sfg = cast(SFG, self._sfg.remove_operation(delay_op.graph_id)) - delay_list = self._sfg.find_by_type_name(Delay.type_name()) + delay_list = self._sfg.find_by_type(Delay) def remove_delays(self) -> None: """Remove delay elements and update laps. Used after scheduling algorithm.""" - delay_list = self._sfg.find_by_type_name(Delay.type_name()) + delay_list = self._sfg.find_by_type(Delay) while delay_list: delay_op = cast(Delay, delay_list[0]) delay_input_id = delay_op.input(0).signals[0].graph_id @@ -965,7 +965,7 @@ class Schedule: for output_id in delay_output_ids: self._laps[output_id] += 1 + self._laps[delay_input_id] del self._laps[delay_input_id] - delay_list = self._sfg.find_by_type_name(Delay.type_name()) + delay_list = self._sfg.find_by_type(Delay) def _reintroduce_delays(self) -> SFG: """ diff --git a/b_asic/scheduler.py b/b_asic/scheduler.py index 6ab4057f..874d6494 100644 --- a/b_asic/scheduler.py +++ b/b_asic/scheduler.py @@ -29,7 +29,7 @@ class Scheduler(ABC): def _handle_outputs( self, schedule: "Schedule", non_schedulable_ops: list["GraphID"] | None = [] ) -> None: - for output in schedule.sfg.find_by_type_name(Output.type_name()): + for output in schedule.sfg.find_by_type(Output): output = cast(Output, output) source_port = cast(OutputPort, output.inputs[0].signals[0].source) if source_port.operation.graph_id in non_schedulable_ops: @@ -145,7 +145,7 @@ class ALAPScheduler(Scheduler): self.op_laps = {} # move all outputs ALAP before operations - for output in schedule.sfg.find_by_type_name(Output.type_name()): + for output in schedule.sfg.find_by_type(Output): output = cast(Output, output) self.op_laps[output.graph_id] = 0 schedule.move_operation_alap(output.graph_id) @@ -712,7 +712,7 @@ class ListScheduler(Scheduler): end = self._schedule._schedule_time else: end = self._schedule.get_max_end_time() - for output in self._sfg.find_by_type_name(Output.type_name()): + for output in self._sfg.find_by_type(Output): output = cast(Output, output) if output.graph_id in self._output_delta_times: delta_time = self._output_delta_times[output.graph_id] @@ -742,10 +742,10 @@ class ListScheduler(Scheduler): self._logger.debug("--- Output placement optimization starting ---") min_slack = min( self._schedule.backward_slack(op.graph_id) - for op in self._sfg.find_by_type_name(Output.type_name()) + for op in self._sfg.find_by_type(Output) ) if min_slack != 0: - for output in self._sfg.find_by_type_name(Output.type_name()): + for output in self._sfg.find_by_type(Output): if self._schedule._cyclic and self._schedule._schedule_time is not None: self._schedule.move_operation(output.graph_id, -min_slack) else: @@ -770,7 +770,7 @@ class ListScheduler(Scheduler): def _handle_dont_cares(self) -> None: # schedule all dont cares ALAP - for dc_op in self._sfg.find_by_type_name(DontCare.type_name()): + for dc_op in self._sfg.find_by_type(DontCare): self._schedule.start_times[dc_op.graph_id] = 0 self._schedule.place_operation( dc_op, self._schedule.forward_slack(dc_op.graph_id), self._op_laps diff --git a/b_asic/signal_flow_graph.py b/b_asic/signal_flow_graph.py index bf07f04a..72c4a316 100644 --- a/b_asic/signal_flow_graph.py +++ b/b_asic/signal_flow_graph.py @@ -571,6 +571,24 @@ class SFG(AbstractOperation): ] return components + def find_by_type(self, component_type: GraphComponent) -> Sequence[GraphComponent]: + """ + Find all components in this graph with the specified type. + + Returns an empty sequence if no components were found. + + Parameters + ---------- + component_type : GraphComponent + The TypeName of the desired components. + """ + components = [ + comp + for comp in self._components_dfs_order + if isinstance(comp, component_type) + ] + return sorted(list(set(components)), key=lambda c: c.name or c.graph_id) + def find_by_id(self, graph_id: GraphID) -> GraphComponent | None: """ Find the graph component with the specified ID. @@ -824,9 +842,9 @@ class SFG(AbstractOperation): """ sfg_copy = self() - no_of_delays = len(sfg_copy.find_by_type_name(Delay.type_name())) + no_of_delays = len(sfg_copy.find_by_type(Delay)) while True: - for delay_element in sfg_copy.find_by_type_name(Delay.type_name()): + for delay_element in sfg_copy.find_by_type(Delay): neighboring_delays = [] if len(delay_element.inputs[0].signals) > 0: for signal in delay_element.inputs[0].signals[0].source.signals: @@ -843,9 +861,9 @@ class SFG(AbstractOperation): delay.input(0).remove_signal(in_sig) in_sig.source.remove_signal(in_sig) sfg_copy = sfg_copy() - if no_of_delays <= len(sfg_copy.find_by_type_name(Delay.type_name())): + if no_of_delays <= len(sfg_copy.find_by_type(Delay)): break - no_of_delays = len(sfg_copy.find_by_type_name(Delay.type_name())) + no_of_delays = len(sfg_copy.find_by_type(Delay)) return sfg_copy @@ -964,7 +982,7 @@ class SFG(AbstractOperation): # Find all operations with only outputs and no inputs. no_input_ops = list(filter(lambda op: op.input_count == 0, self.operations)) - delay_ops = self.find_by_type_name(Delay.type_name()) + delay_ops = self.find_by_type(Delay) # Find all first iter output ports for precedence first_iter_ports = [ @@ -1183,7 +1201,7 @@ class SFG(AbstractOperation): self._operations_topological_order = top_order return self._operations_topological_order - def set_latency_of_type(self, type_name: TypeName, latency: int) -> None: + def set_latency_of_type_name(self, type_name: TypeName, latency: int) -> None: """ Set the latency of all components with the given type name. @@ -1198,7 +1216,21 @@ class SFG(AbstractOperation): for op in self.find_by_type_name(type_name): cast(Operation, op).set_latency(latency) - def set_execution_time_of_type( + def set_latency_of_type(self, operation_type: Operation, latency: int) -> None: + """ + Set the latency of all operations with the given type. + + Parameters + ---------- + operation_type : Operation + The operation type. For example, ``Addition``. + latency : int + The latency of the operation. + """ + for op in self.find_by_type(operation_type): + cast(Operation, op).set_latency(latency) + + def set_execution_time_of_type_name( self, type_name: TypeName, execution_time: int ) -> None: """ @@ -1215,7 +1247,23 @@ class SFG(AbstractOperation): for op in self.find_by_type_name(type_name): cast(Operation, op).execution_time = execution_time - def set_latency_offsets_of_type( + def set_execution_time_of_type( + self, operation_type: Operation, execution_time: int + ) -> None: + """ + Set the latency of all operations with the given type. + + Parameters + ---------- + operation_type : Operation + The operation type. For example, ``Addition``. + execution_time : int + The execution time of the operation. + """ + for op in self.find_by_type(operation_type): + cast(Operation, op).execution_time = execution_time + + def set_latency_offsets_of_type_name( self, type_name: TypeName, latency_offsets: dict[str, int] ) -> None: """ @@ -1232,6 +1280,22 @@ class SFG(AbstractOperation): for op in self.find_by_type_name(type_name): cast(Operation, op).set_latency_offsets(latency_offsets) + def set_latency_offsets_of_type( + self, operation_type: Operation, latency_offsets: dict[str, int] + ) -> None: + """ + Set the latency offsets of all operations with the given type. + + Parameters + ---------- + operation_type : Operation + The operation type. For example, ``Addition``. + latency_offsets : {"in1": int, ...} + The latency offsets of the inputs and outputs. + """ + for op in self.find_by_type(operation_type): + cast(Operation, op).set_latency_offsets(latency_offsets) + def _traverse_for_precedence_list( self, first_iter_ports: list[OutputPort] ) -> list[list[OutputPort]]: @@ -1739,12 +1803,13 @@ class SFG(AbstractOperation): continue fringe.append((next_state, path + [next_state])) - def resource_lower_bound(self, type_name: str, schedule_time: int) -> int: - """Return the lowest amount of resources of the given type needed to reach the scheduling time. + def resource_lower_bound(self, type_name: TypeName, schedule_time: int) -> int: + """ + Return the lowest amount of resources of the given type needed to reach the scheduling time. Parameters ---------- - type_name : str + type_name : TypeName Type name of the given resource. schedule_time : int Scheduling time to evaluate for. @@ -2114,7 +2179,7 @@ class SFG(AbstractOperation): # Remove all delay elements in the SFG and replace each one # with one input operation and one output operation - for delay in sfg.find_by_type_name(Delay.type_name()): + for delay in sfg.find_by_type(Delay): i = Input(name="input_" + delay.graph_id) o = Output( src0=delay.input(0).signals[0].source, name="output_" + delay.graph_id diff --git a/examples/auto_scheduling_with_custom_io_times.py b/examples/auto_scheduling_with_custom_io_times.py index 2b08cc96..3e70b052 100644 --- a/examples/auto_scheduling_with_custom_io_times.py +++ b/examples/auto_scheduling_with_custom_io_times.py @@ -21,10 +21,10 @@ sfg # %% # Set latencies and execution times. -sfg.set_latency_of_type(Butterfly.type_name(), 1) -sfg.set_latency_of_type(ConstantMultiplication.type_name(), 3) -sfg.set_execution_time_of_type(Butterfly.type_name(), 1) -sfg.set_execution_time_of_type(ConstantMultiplication.type_name(), 1) +sfg.set_latency_of_type_name(Butterfly.type_name(), 1) +sfg.set_latency_of_type_name(ConstantMultiplication.type_name(), 3) +sfg.set_execution_time_of_type_name(Butterfly.type_name(), 1) +sfg.set_execution_time_of_type_name(ConstantMultiplication.type_name(), 1) # %% # Generate an ASAP schedule for reference. diff --git a/examples/fivepointwinograddft.py b/examples/fivepointwinograddft.py index d2156151..33ba72bc 100644 --- a/examples/fivepointwinograddft.py +++ b/examples/fivepointwinograddft.py @@ -67,12 +67,12 @@ sfg # %% # Set latencies and execution times -sfg.set_latency_of_type(ConstantMultiplication.type_name(), 2) -sfg.set_latency_of_type(AddSub.type_name(), 1) -sfg.set_latency_of_type(Butterfly.type_name(), 1) -sfg.set_execution_time_of_type(ConstantMultiplication.type_name(), 1) -sfg.set_execution_time_of_type(AddSub.type_name(), 1) -sfg.set_execution_time_of_type(Butterfly.type_name(), 1) +sfg.set_latency_of_type_name(ConstantMultiplication.type_name(), 2) +sfg.set_latency_of_type_name(AddSub.type_name(), 1) +sfg.set_latency_of_type_name(Butterfly.type_name(), 1) +sfg.set_execution_time_of_type_name(ConstantMultiplication.type_name(), 1) +sfg.set_execution_time_of_type_name(AddSub.type_name(), 1) +sfg.set_execution_time_of_type_name(Butterfly.type_name(), 1) # %% # Generate schedule diff --git a/examples/folding_example_with_architecture.py b/examples/folding_example_with_architecture.py index 43bdc798..0777e459 100644 --- a/examples/folding_example_with_architecture.py +++ b/examples/folding_example_with_architecture.py @@ -42,10 +42,10 @@ sfg # %% # Set latencies and execution times -sfg.set_latency_of_type(ConstantMultiplication.type_name(), 2) -sfg.set_latency_of_type(Addition.type_name(), 1) -sfg.set_execution_time_of_type(ConstantMultiplication.type_name(), 1) -sfg.set_execution_time_of_type(Addition.type_name(), 1) +sfg.set_latency_of_type_name(ConstantMultiplication.type_name(), 2) +sfg.set_latency_of_type_name(Addition.type_name(), 1) +sfg.set_execution_time_of_type_name(ConstantMultiplication.type_name(), 1) +sfg.set_execution_time_of_type_name(Addition.type_name(), 1) # %% # Create schedule diff --git a/examples/ldlt_matrix_inverse.py b/examples/ldlt_matrix_inverse.py index 4681fd53..11a9684f 100644 --- a/examples/ldlt_matrix_inverse.py +++ b/examples/ldlt_matrix_inverse.py @@ -28,10 +28,10 @@ sfg # %% # Set latencies and execution times. -sfg.set_latency_of_type(MADS.type_name(), 3) -sfg.set_latency_of_type(Reciprocal.type_name(), 2) -sfg.set_execution_time_of_type(MADS.type_name(), 1) -sfg.set_execution_time_of_type(Reciprocal.type_name(), 1) +sfg.set_latency_of_type_name(MADS.type_name(), 3) +sfg.set_latency_of_type_name(Reciprocal.type_name(), 2) +sfg.set_execution_time_of_type_name(MADS.type_name(), 1) +sfg.set_execution_time_of_type_name(Reciprocal.type_name(), 1) # %% # Create an ASAP schedule. diff --git a/examples/memory_constrained_scheduling.py b/examples/memory_constrained_scheduling.py index c459a972..66cb3db1 100644 --- a/examples/memory_constrained_scheduling.py +++ b/examples/memory_constrained_scheduling.py @@ -21,10 +21,10 @@ sfg # %% # Set latencies and execution times. -sfg.set_latency_of_type(Butterfly.type_name(), 3) -sfg.set_latency_of_type(ConstantMultiplication.type_name(), 2) -sfg.set_execution_time_of_type(Butterfly.type_name(), 1) -sfg.set_execution_time_of_type(ConstantMultiplication.type_name(), 1) +sfg.set_latency_of_type_name(Butterfly.type_name(), 3) +sfg.set_latency_of_type_name(ConstantMultiplication.type_name(), 2) +sfg.set_execution_time_of_type_name(Butterfly.type_name(), 1) +sfg.set_execution_time_of_type_name(ConstantMultiplication.type_name(), 1) # # %% # Generate an ASAP schedule for reference diff --git a/examples/scheduling_pipelining_retiming.py b/examples/scheduling_pipelining_retiming.py index 38a9601f..562d4fc5 100644 --- a/examples/scheduling_pipelining_retiming.py +++ b/examples/scheduling_pipelining_retiming.py @@ -31,10 +31,10 @@ sfg # %% # Set latencies and execution times of the operations. -sfg.set_latency_of_type(Addition.type_name(), 1) -sfg.set_latency_of_type(ConstantMultiplication.type_name(), 3) -sfg.set_execution_time_of_type(Addition.type_name(), 1) -sfg.set_execution_time_of_type(ConstantMultiplication.type_name(), 1) +sfg.set_latency_of_type_name(Addition.type_name(), 1) +sfg.set_latency_of_type_name(ConstantMultiplication.type_name(), 3) +sfg.set_execution_time_of_type_name(Addition.type_name(), 1) +sfg.set_execution_time_of_type_name(ConstantMultiplication.type_name(), 1) # %% # Print the critical path Tcp and the iteration period bound Tmin. diff --git a/examples/secondorderdirectformiir.py b/examples/secondorderdirectformiir.py index aa84c26b..ce7d3a29 100644 --- a/examples/secondorderdirectformiir.py +++ b/examples/secondorderdirectformiir.py @@ -36,10 +36,10 @@ sfg # %% # Set latencies and execution times -sfg.set_latency_of_type(ConstantMultiplication.type_name(), 2) -sfg.set_latency_of_type(Addition.type_name(), 1) -sfg.set_execution_time_of_type(ConstantMultiplication.type_name(), 1) -sfg.set_execution_time_of_type(Addition.type_name(), 1) +sfg.set_latency_of_type_name(ConstantMultiplication.type_name(), 2) +sfg.set_latency_of_type_name(Addition.type_name(), 1) +sfg.set_execution_time_of_type_name(ConstantMultiplication.type_name(), 1) +sfg.set_execution_time_of_type_name(Addition.type_name(), 1) # %% # Create schedule diff --git a/examples/secondorderdirectformiir_architecture.py b/examples/secondorderdirectformiir_architecture.py index a7d72fb3..32188569 100644 --- a/examples/secondorderdirectformiir_architecture.py +++ b/examples/secondorderdirectformiir_architecture.py @@ -36,10 +36,10 @@ sfg # %% # Set latencies and execution times. -sfg.set_latency_of_type(ConstantMultiplication.type_name(), 2) -sfg.set_latency_of_type(Addition.type_name(), 1) -sfg.set_execution_time_of_type(ConstantMultiplication.type_name(), 1) -sfg.set_execution_time_of_type(Addition.type_name(), 1) +sfg.set_latency_of_type_name(ConstantMultiplication.type_name(), 2) +sfg.set_latency_of_type_name(Addition.type_name(), 1) +sfg.set_execution_time_of_type_name(ConstantMultiplication.type_name(), 1) +sfg.set_execution_time_of_type_name(Addition.type_name(), 1) # %% # Create schedule. diff --git a/examples/thirdorderblwdf.py b/examples/thirdorderblwdf.py index d29fd215..20fcabd3 100644 --- a/examples/thirdorderblwdf.py +++ b/examples/thirdorderblwdf.py @@ -33,10 +33,10 @@ sfg # %% # Set latencies and execution times -sfg.set_latency_of_type(SymmetricTwoportAdaptor.type_name(), 4) -sfg.set_latency_of_type(Addition.type_name(), 1) -sfg.set_execution_time_of_type(SymmetricTwoportAdaptor.type_name(), 1) -sfg.set_execution_time_of_type(Addition.type_name(), 1) +sfg.set_latency_of_type_name(SymmetricTwoportAdaptor.type_name(), 4) +sfg.set_latency_of_type_name(Addition.type_name(), 1) +sfg.set_execution_time_of_type_name(SymmetricTwoportAdaptor.type_name(), 1) +sfg.set_execution_time_of_type_name(Addition.type_name(), 1) # %% # Simulate diff --git a/examples/threepointwinograddft.py b/examples/threepointwinograddft.py index 7e7a58ac..b93b1e5e 100644 --- a/examples/threepointwinograddft.py +++ b/examples/threepointwinograddft.py @@ -48,10 +48,10 @@ sfg # %% # Set latencies and execution times -sfg.set_latency_of_type(ConstantMultiplication.type_name(), 2) -sfg.set_latency_of_type(AddSub.type_name(), 1) -sfg.set_execution_time_of_type(ConstantMultiplication.type_name(), 1) -sfg.set_execution_time_of_type(AddSub.type_name(), 1) +sfg.set_latency_of_type_name(ConstantMultiplication.type_name(), 2) +sfg.set_latency_of_type_name(AddSub.type_name(), 1) +sfg.set_execution_time_of_type_name(ConstantMultiplication.type_name(), 1) +sfg.set_execution_time_of_type_name(AddSub.type_name(), 1) # %% # Generate schedule diff --git a/test/fixtures/schedule.py b/test/fixtures/schedule.py index 39b375ed..e844ed92 100644 --- a/test/fixtures/schedule.py +++ b/test/fixtures/schedule.py @@ -8,8 +8,10 @@ from b_asic.signal_flow_graph import SFG @pytest.fixture def secondorder_iir_schedule(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) + precedence_sfg_delays.set_latency_of_type_name(Addition.type_name(), 4) + precedence_sfg_delays.set_latency_of_type_name( + ConstantMultiplication.type_name(), 3 + ) schedule = Schedule(precedence_sfg_delays, scheduler=ASAPScheduler()) return schedule @@ -17,10 +19,12 @@ def secondorder_iir_schedule(precedence_sfg_delays): @pytest.fixture def secondorder_iir_schedule_with_execution_times(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) - precedence_sfg_delays.set_execution_time_of_type(Addition.type_name(), 2) - precedence_sfg_delays.set_execution_time_of_type( + precedence_sfg_delays.set_latency_of_type_name(Addition.type_name(), 4) + precedence_sfg_delays.set_latency_of_type_name( + ConstantMultiplication.type_name(), 3 + ) + precedence_sfg_delays.set_execution_time_of_type_name(Addition.type_name(), 2) + precedence_sfg_delays.set_execution_time_of_type_name( ConstantMultiplication.type_name(), 1 ) @@ -30,12 +34,14 @@ def secondorder_iir_schedule_with_execution_times(precedence_sfg_delays): @pytest.fixture def schedule_direct_form_iir_lp_filter(sfg_direct_form_iir_lp_filter: SFG): - sfg_direct_form_iir_lp_filter.set_latency_of_type(Addition.type_name(), 4) - sfg_direct_form_iir_lp_filter.set_latency_of_type( + sfg_direct_form_iir_lp_filter.set_latency_of_type_name(Addition.type_name(), 4) + sfg_direct_form_iir_lp_filter.set_latency_of_type_name( ConstantMultiplication.type_name(), 3 ) - sfg_direct_form_iir_lp_filter.set_execution_time_of_type(Addition.type_name(), 2) - sfg_direct_form_iir_lp_filter.set_execution_time_of_type( + sfg_direct_form_iir_lp_filter.set_execution_time_of_type_name( + Addition.type_name(), 2 + ) + sfg_direct_form_iir_lp_filter.set_execution_time_of_type_name( ConstantMultiplication.type_name(), 1 ) schedule = Schedule( diff --git a/test/integration/test_sfg_to_architecture.py b/test/integration/test_sfg_to_architecture.py index 9401a391..6eebe152 100644 --- a/test/integration/test_sfg_to_architecture.py +++ b/test/integration/test_sfg_to_architecture.py @@ -17,10 +17,10 @@ from b_asic.special_operations import Input, Output def test_pe_constrained_schedule(): sfg = ldlt_matrix_inverse(N=5) - sfg.set_latency_of_type(MADS.type_name(), 3) - sfg.set_latency_of_type(Reciprocal.type_name(), 2) - sfg.set_execution_time_of_type(MADS.type_name(), 1) - sfg.set_execution_time_of_type(Reciprocal.type_name(), 1) + sfg.set_latency_of_type_name(MADS.type_name(), 3) + sfg.set_latency_of_type_name(Reciprocal.type_name(), 2) + sfg.set_execution_time_of_type_name(MADS.type_name(), 1) + sfg.set_execution_time_of_type_name(Reciprocal.type_name(), 1) resources = {MADS.type_name(): 2, Reciprocal.type_name(): 1} @@ -94,10 +94,10 @@ def test_pe_constrained_schedule(): def test_pe_and_memory_constrained_chedule(): sfg = radix_2_dif_fft(points=16) - sfg.set_latency_of_type(Butterfly.type_name(), 3) - sfg.set_latency_of_type(ConstantMultiplication.type_name(), 2) - sfg.set_execution_time_of_type(Butterfly.type_name(), 1) - sfg.set_execution_time_of_type(ConstantMultiplication.type_name(), 1) + sfg.set_latency_of_type_name(Butterfly.type_name(), 3) + sfg.set_latency_of_type_name(ConstantMultiplication.type_name(), 2) + sfg.set_execution_time_of_type_name(Butterfly.type_name(), 1) + sfg.set_execution_time_of_type_name(ConstantMultiplication.type_name(), 1) # generate a schedule to ensure that schedule can be overwritten without bugs schedule = Schedule(sfg, scheduler=ASAPScheduler()) diff --git a/test/unit/test_architecture.py b/test/unit/test_architecture.py index ce2d7bcf..b0721419 100644 --- a/test/unit/test_architecture.py +++ b/test/unit/test_architecture.py @@ -247,10 +247,12 @@ def test_move_process(schedule_direct_form_iir_lp_filter: Schedule): def test_resource_errors(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) - precedence_sfg_delays.set_execution_time_of_type(Addition.type_name(), 1) - precedence_sfg_delays.set_execution_time_of_type( + precedence_sfg_delays.set_latency_of_type_name(Addition.type_name(), 1) + precedence_sfg_delays.set_latency_of_type_name( + ConstantMultiplication.type_name(), 3 + ) + precedence_sfg_delays.set_execution_time_of_type_name(Addition.type_name(), 1) + precedence_sfg_delays.set_execution_time_of_type_name( ConstantMultiplication.type_name(), 1 ) diff --git a/test/unit/test_list_schedulers.py b/test/unit/test_list_schedulers.py index 7821a2bb..076c2d05 100644 --- a/test/unit/test_list_schedulers.py +++ b/test/unit/test_list_schedulers.py @@ -41,10 +41,10 @@ class TestEarliestDeadlineScheduler: def test_direct_form_1_iir(self): sfg = direct_form_1_iir([1, 2, 3], [1, 2, 3]) - sfg.set_latency_of_type(ConstantMultiplication.type_name(), 2) - sfg.set_execution_time_of_type(ConstantMultiplication.type_name(), 1) - sfg.set_latency_of_type(Addition.type_name(), 3) - sfg.set_execution_time_of_type(Addition.type_name(), 1) + sfg.set_latency_of_type_name(ConstantMultiplication.type_name(), 2) + sfg.set_execution_time_of_type_name(ConstantMultiplication.type_name(), 1) + sfg.set_latency_of_type_name(Addition.type_name(), 3) + sfg.set_execution_time_of_type_name(Addition.type_name(), 1) resources = { Addition.type_name(): 1, @@ -73,14 +73,14 @@ class TestEarliestDeadlineScheduler: _validate_recreated_sfg_filter(sfg, schedule) def test_direct_form_2_iir_1_add_1_mul(self, sfg_direct_form_iir_lp_filter): - sfg_direct_form_iir_lp_filter.set_latency_of_type( + sfg_direct_form_iir_lp_filter.set_latency_of_type_name( ConstantMultiplication.type_name(), 3 ) - sfg_direct_form_iir_lp_filter.set_latency_of_type(Addition.type_name(), 2) - sfg_direct_form_iir_lp_filter.set_execution_time_of_type( + sfg_direct_form_iir_lp_filter.set_latency_of_type_name(Addition.type_name(), 2) + sfg_direct_form_iir_lp_filter.set_execution_time_of_type_name( ConstantMultiplication.type_name(), 1 ) - sfg_direct_form_iir_lp_filter.set_execution_time_of_type( + sfg_direct_form_iir_lp_filter.set_execution_time_of_type_name( Addition.type_name(), 1 ) @@ -113,14 +113,14 @@ class TestEarliestDeadlineScheduler: _validate_recreated_sfg_filter(sfg_direct_form_iir_lp_filter, schedule) def test_direct_form_2_iir_2_add_3_mul(self, sfg_direct_form_iir_lp_filter): - sfg_direct_form_iir_lp_filter.set_latency_of_type( + sfg_direct_form_iir_lp_filter.set_latency_of_type_name( ConstantMultiplication.type_name(), 3 ) - sfg_direct_form_iir_lp_filter.set_latency_of_type(Addition.type_name(), 2) - sfg_direct_form_iir_lp_filter.set_execution_time_of_type( + sfg_direct_form_iir_lp_filter.set_latency_of_type_name(Addition.type_name(), 2) + sfg_direct_form_iir_lp_filter.set_execution_time_of_type_name( ConstantMultiplication.type_name(), 1 ) - sfg_direct_form_iir_lp_filter.set_execution_time_of_type( + sfg_direct_form_iir_lp_filter.set_execution_time_of_type_name( Addition.type_name(), 1 ) @@ -155,10 +155,10 @@ class TestEarliestDeadlineScheduler: def test_radix_2_fft_8_points(self): sfg = radix_2_dif_fft(points=8) - sfg.set_latency_of_type(ConstantMultiplication.type_name(), 2) - sfg.set_execution_time_of_type(ConstantMultiplication.type_name(), 1) - sfg.set_latency_of_type(Butterfly.type_name(), 1) - sfg.set_execution_time_of_type(Butterfly.type_name(), 1) + sfg.set_latency_of_type_name(ConstantMultiplication.type_name(), 2) + sfg.set_execution_time_of_type_name(ConstantMultiplication.type_name(), 1) + sfg.set_latency_of_type_name(Butterfly.type_name(), 1) + sfg.set_execution_time_of_type_name(Butterfly.type_name(), 1) resources = { Butterfly.type_name(): 2, @@ -219,10 +219,10 @@ class TestLeastSlackTimeScheduler: def test_direct_form_1_iir(self): sfg = direct_form_1_iir([1, 2, 3], [1, 2, 3]) - sfg.set_latency_of_type(ConstantMultiplication.type_name(), 2) - sfg.set_execution_time_of_type(ConstantMultiplication.type_name(), 1) - sfg.set_latency_of_type(Addition.type_name(), 3) - sfg.set_execution_time_of_type(Addition.type_name(), 1) + sfg.set_latency_of_type_name(ConstantMultiplication.type_name(), 2) + sfg.set_execution_time_of_type_name(ConstantMultiplication.type_name(), 1) + sfg.set_latency_of_type_name(Addition.type_name(), 3) + sfg.set_execution_time_of_type_name(Addition.type_name(), 1) resources = { Addition.type_name(): 1, @@ -251,14 +251,14 @@ class TestLeastSlackTimeScheduler: _validate_recreated_sfg_filter(sfg, schedule) def test_direct_form_2_iir_1_add_1_mul(self, sfg_direct_form_iir_lp_filter): - sfg_direct_form_iir_lp_filter.set_latency_of_type( + sfg_direct_form_iir_lp_filter.set_latency_of_type_name( ConstantMultiplication.type_name(), 3 ) - sfg_direct_form_iir_lp_filter.set_latency_of_type(Addition.type_name(), 2) - sfg_direct_form_iir_lp_filter.set_execution_time_of_type( + sfg_direct_form_iir_lp_filter.set_latency_of_type_name(Addition.type_name(), 2) + sfg_direct_form_iir_lp_filter.set_execution_time_of_type_name( ConstantMultiplication.type_name(), 1 ) - sfg_direct_form_iir_lp_filter.set_execution_time_of_type( + sfg_direct_form_iir_lp_filter.set_execution_time_of_type_name( Addition.type_name(), 1 ) @@ -291,14 +291,14 @@ class TestLeastSlackTimeScheduler: _validate_recreated_sfg_filter(sfg_direct_form_iir_lp_filter, schedule) def test_direct_form_2_iir_2_add_3_mul(self, sfg_direct_form_iir_lp_filter): - sfg_direct_form_iir_lp_filter.set_latency_of_type( + sfg_direct_form_iir_lp_filter.set_latency_of_type_name( ConstantMultiplication.type_name(), 3 ) - sfg_direct_form_iir_lp_filter.set_latency_of_type(Addition.type_name(), 2) - sfg_direct_form_iir_lp_filter.set_execution_time_of_type( + sfg_direct_form_iir_lp_filter.set_latency_of_type_name(Addition.type_name(), 2) + sfg_direct_form_iir_lp_filter.set_execution_time_of_type_name( ConstantMultiplication.type_name(), 1 ) - sfg_direct_form_iir_lp_filter.set_execution_time_of_type( + sfg_direct_form_iir_lp_filter.set_execution_time_of_type_name( Addition.type_name(), 1 ) @@ -333,10 +333,10 @@ class TestLeastSlackTimeScheduler: def test_radix_2_fft_8_points(self): sfg = radix_2_dif_fft(points=8) - sfg.set_latency_of_type(ConstantMultiplication.type_name(), 2) - sfg.set_execution_time_of_type(ConstantMultiplication.type_name(), 1) - sfg.set_latency_of_type(Butterfly.type_name(), 1) - sfg.set_execution_time_of_type(Butterfly.type_name(), 1) + sfg.set_latency_of_type_name(ConstantMultiplication.type_name(), 2) + sfg.set_execution_time_of_type_name(ConstantMultiplication.type_name(), 1) + sfg.set_latency_of_type_name(Butterfly.type_name(), 1) + sfg.set_execution_time_of_type_name(Butterfly.type_name(), 1) resources = { Butterfly.type_name(): 2, @@ -397,10 +397,10 @@ class TestMaxFanOutScheduler: def test_direct_form_1_iir(self): sfg = direct_form_1_iir([1, 2, 3], [1, 2, 3]) - sfg.set_latency_of_type(ConstantMultiplication.type_name(), 2) - sfg.set_execution_time_of_type(ConstantMultiplication.type_name(), 1) - sfg.set_latency_of_type(Addition.type_name(), 3) - sfg.set_execution_time_of_type(Addition.type_name(), 1) + sfg.set_latency_of_type_name(ConstantMultiplication.type_name(), 2) + sfg.set_execution_time_of_type_name(ConstantMultiplication.type_name(), 1) + sfg.set_latency_of_type_name(Addition.type_name(), 3) + sfg.set_execution_time_of_type_name(Addition.type_name(), 1) resources = {Addition.type_name(): 1, ConstantMultiplication.type_name(): 1} schedule = Schedule(sfg, scheduler=MaxFanOutScheduler(max_resources=resources)) @@ -424,10 +424,10 @@ class TestMaxFanOutScheduler: def test_ldlt_inverse_3x3(self): sfg = ldlt_matrix_inverse(N=3) - sfg.set_latency_of_type(MADS.type_name(), 3) - sfg.set_latency_of_type(Reciprocal.type_name(), 2) - sfg.set_execution_time_of_type(MADS.type_name(), 1) - sfg.set_execution_time_of_type(Reciprocal.type_name(), 1) + sfg.set_latency_of_type_name(MADS.type_name(), 3) + sfg.set_latency_of_type_name(Reciprocal.type_name(), 2) + sfg.set_execution_time_of_type_name(MADS.type_name(), 1) + sfg.set_execution_time_of_type_name(Reciprocal.type_name(), 1) resources = {MADS.type_name(): 1, Reciprocal.type_name(): 1} schedule = Schedule(sfg, scheduler=MaxFanOutScheduler(resources)) @@ -484,10 +484,10 @@ class TestHybridScheduler: def test_direct_form_1_iir(self): sfg = direct_form_1_iir([1, 2, 3], [1, 2, 3]) - sfg.set_latency_of_type(ConstantMultiplication.type_name(), 2) - sfg.set_execution_time_of_type(ConstantMultiplication.type_name(), 1) - sfg.set_latency_of_type(Addition.type_name(), 3) - sfg.set_execution_time_of_type(Addition.type_name(), 1) + sfg.set_latency_of_type_name(ConstantMultiplication.type_name(), 2) + sfg.set_execution_time_of_type_name(ConstantMultiplication.type_name(), 1) + sfg.set_latency_of_type_name(Addition.type_name(), 3) + sfg.set_execution_time_of_type_name(Addition.type_name(), 1) resources = {Addition.type_name(): 1, ConstantMultiplication.type_name(): 1} schedule = Schedule(sfg, scheduler=HybridScheduler(max_resources=resources)) @@ -511,10 +511,10 @@ class TestHybridScheduler: def test_radix_2_fft_8_points(self): sfg = radix_2_dif_fft(points=8) - sfg.set_latency_of_type(ConstantMultiplication.type_name(), 2) - sfg.set_execution_time_of_type(ConstantMultiplication.type_name(), 1) - sfg.set_latency_of_type(Butterfly.type_name(), 1) - sfg.set_execution_time_of_type(Butterfly.type_name(), 1) + sfg.set_latency_of_type_name(ConstantMultiplication.type_name(), 2) + sfg.set_execution_time_of_type_name(ConstantMultiplication.type_name(), 1) + sfg.set_latency_of_type_name(Butterfly.type_name(), 1) + sfg.set_execution_time_of_type_name(Butterfly.type_name(), 1) resources = { Butterfly.type_name(): 2, @@ -565,10 +565,10 @@ class TestHybridScheduler: def test_radix_2_fft_8_points_one_output(self): sfg = radix_2_dif_fft(points=8) - sfg.set_latency_of_type(ConstantMultiplication.type_name(), 2) - sfg.set_execution_time_of_type(ConstantMultiplication.type_name(), 1) - sfg.set_latency_of_type(Butterfly.type_name(), 1) - sfg.set_execution_time_of_type(Butterfly.type_name(), 1) + sfg.set_latency_of_type_name(ConstantMultiplication.type_name(), 2) + sfg.set_execution_time_of_type_name(ConstantMultiplication.type_name(), 1) + sfg.set_latency_of_type_name(Butterfly.type_name(), 1) + sfg.set_execution_time_of_type_name(Butterfly.type_name(), 1) resources = { Butterfly.type_name(): 2, @@ -621,10 +621,10 @@ class TestHybridScheduler: def test_radix_2_fft_8_points_specified_IO_times_cyclic(self): sfg = radix_2_dif_fft(points=8) - sfg.set_latency_of_type(Butterfly.type_name(), 3) - sfg.set_latency_of_type(ConstantMultiplication.type_name(), 2) - sfg.set_execution_time_of_type(Butterfly.type_name(), 1) - sfg.set_execution_time_of_type(ConstantMultiplication.type_name(), 1) + sfg.set_latency_of_type_name(Butterfly.type_name(), 3) + sfg.set_latency_of_type_name(ConstantMultiplication.type_name(), 2) + sfg.set_execution_time_of_type_name(Butterfly.type_name(), 1) + sfg.set_execution_time_of_type_name(ConstantMultiplication.type_name(), 1) resources = { Butterfly.type_name(): 1, @@ -725,10 +725,10 @@ class TestHybridScheduler: def test_radix_2_fft_8_points_specified_IO_times_non_cyclic(self): sfg = radix_2_dif_fft(points=8) - sfg.set_latency_of_type(Butterfly.type_name(), 3) - sfg.set_latency_of_type(ConstantMultiplication.type_name(), 2) - sfg.set_execution_time_of_type(Butterfly.type_name(), 1) - sfg.set_execution_time_of_type(ConstantMultiplication.type_name(), 1) + sfg.set_latency_of_type_name(Butterfly.type_name(), 3) + sfg.set_latency_of_type_name(ConstantMultiplication.type_name(), 2) + sfg.set_execution_time_of_type_name(Butterfly.type_name(), 1) + sfg.set_execution_time_of_type_name(ConstantMultiplication.type_name(), 1) resources = {Butterfly.type_name(): 1, ConstantMultiplication.type_name(): 1} input_times = { @@ -800,10 +800,10 @@ class TestHybridScheduler: def test_ldlt_inverse_2x2(self): sfg = ldlt_matrix_inverse(N=2) - sfg.set_latency_of_type(MADS.type_name(), 3) - sfg.set_latency_of_type(Reciprocal.type_name(), 2) - sfg.set_execution_time_of_type(MADS.type_name(), 1) - sfg.set_execution_time_of_type(Reciprocal.type_name(), 1) + sfg.set_latency_of_type_name(MADS.type_name(), 3) + sfg.set_latency_of_type_name(Reciprocal.type_name(), 2) + sfg.set_execution_time_of_type_name(MADS.type_name(), 1) + sfg.set_execution_time_of_type_name(Reciprocal.type_name(), 1) resources = { MADS.type_name(): 1, @@ -838,10 +838,10 @@ class TestHybridScheduler: def test_ldlt_inverse_2x2_specified_IO_times_cyclic(self): sfg = ldlt_matrix_inverse(N=2) - sfg.set_latency_of_type(MADS.type_name(), 3) - sfg.set_latency_of_type(Reciprocal.type_name(), 2) - sfg.set_execution_time_of_type(MADS.type_name(), 1) - sfg.set_execution_time_of_type(Reciprocal.type_name(), 1) + sfg.set_latency_of_type_name(MADS.type_name(), 3) + sfg.set_latency_of_type_name(Reciprocal.type_name(), 2) + sfg.set_execution_time_of_type_name(MADS.type_name(), 1) + sfg.set_execution_time_of_type_name(Reciprocal.type_name(), 1) resources = {MADS.type_name(): 1, Reciprocal.type_name(): 1} input_times = { @@ -899,10 +899,10 @@ class TestHybridScheduler: def test_invalid_max_resources(self): sfg = ldlt_matrix_inverse(N=2) - sfg.set_latency_of_type(MADS.type_name(), 3) - sfg.set_latency_of_type(Reciprocal.type_name(), 2) - sfg.set_execution_time_of_type(MADS.type_name(), 1) - sfg.set_execution_time_of_type(Reciprocal.type_name(), 1) + sfg.set_latency_of_type_name(MADS.type_name(), 3) + sfg.set_latency_of_type_name(Reciprocal.type_name(), 2) + sfg.set_execution_time_of_type_name(MADS.type_name(), 1) + sfg.set_execution_time_of_type_name(Reciprocal.type_name(), 1) resources = 2 with pytest.raises( @@ -937,10 +937,10 @@ class TestHybridScheduler: def test_invalid_max_concurrent_writes(self): sfg = ldlt_matrix_inverse(N=2) - sfg.set_latency_of_type(MADS.type_name(), 3) - sfg.set_latency_of_type(Reciprocal.type_name(), 2) - sfg.set_execution_time_of_type(MADS.type_name(), 1) - sfg.set_execution_time_of_type(Reciprocal.type_name(), 1) + sfg.set_latency_of_type_name(MADS.type_name(), 3) + sfg.set_latency_of_type_name(Reciprocal.type_name(), 2) + sfg.set_execution_time_of_type_name(MADS.type_name(), 1) + sfg.set_execution_time_of_type_name(Reciprocal.type_name(), 1) max_concurrent_writes = "5" with pytest.raises( @@ -972,10 +972,10 @@ class TestHybridScheduler: def test_invalid_max_concurrent_reads(self): sfg = ldlt_matrix_inverse(N=2) - sfg.set_latency_of_type(MADS.type_name(), 3) - sfg.set_latency_of_type(Reciprocal.type_name(), 2) - sfg.set_execution_time_of_type(MADS.type_name(), 1) - sfg.set_execution_time_of_type(Reciprocal.type_name(), 1) + sfg.set_latency_of_type_name(MADS.type_name(), 3) + sfg.set_latency_of_type_name(Reciprocal.type_name(), 2) + sfg.set_execution_time_of_type_name(MADS.type_name(), 1) + sfg.set_execution_time_of_type_name(Reciprocal.type_name(), 1) max_concurrent_reads = "5" with pytest.raises( @@ -1007,10 +1007,10 @@ class TestHybridScheduler: def test_invalid_input_times(self): sfg = ldlt_matrix_inverse(N=2) - sfg.set_latency_of_type(MADS.type_name(), 3) - sfg.set_latency_of_type(Reciprocal.type_name(), 2) - sfg.set_execution_time_of_type(MADS.type_name(), 1) - sfg.set_execution_time_of_type(Reciprocal.type_name(), 1) + sfg.set_latency_of_type_name(MADS.type_name(), 3) + sfg.set_latency_of_type_name(Reciprocal.type_name(), 2) + sfg.set_execution_time_of_type_name(MADS.type_name(), 1) + sfg.set_execution_time_of_type_name(Reciprocal.type_name(), 1) input_times = 5 with pytest.raises( @@ -1051,10 +1051,10 @@ class TestHybridScheduler: def test_invalid_output_delta_times(self): sfg = ldlt_matrix_inverse(N=2) - sfg.set_latency_of_type(MADS.type_name(), 3) - sfg.set_latency_of_type(Reciprocal.type_name(), 2) - sfg.set_execution_time_of_type(MADS.type_name(), 1) - sfg.set_execution_time_of_type(Reciprocal.type_name(), 1) + sfg.set_latency_of_type_name(MADS.type_name(), 3) + sfg.set_latency_of_type_name(Reciprocal.type_name(), 2) + sfg.set_execution_time_of_type_name(MADS.type_name(), 1) + sfg.set_execution_time_of_type_name(Reciprocal.type_name(), 1) output_delta_times = 10 with pytest.raises( @@ -1107,10 +1107,10 @@ class TestHybridScheduler: def test_resource_not_in_sfg(self): sfg = ldlt_matrix_inverse(N=3) - sfg.set_latency_of_type(MADS.type_name(), 3) - sfg.set_latency_of_type(Reciprocal.type_name(), 2) - sfg.set_execution_time_of_type(MADS.type_name(), 1) - sfg.set_execution_time_of_type(Reciprocal.type_name(), 1) + sfg.set_latency_of_type_name(MADS.type_name(), 3) + sfg.set_latency_of_type_name(Reciprocal.type_name(), 2) + sfg.set_execution_time_of_type_name(MADS.type_name(), 1) + sfg.set_execution_time_of_type_name(Reciprocal.type_name(), 1) resources = { MADS.type_name(): 1, @@ -1126,10 +1126,10 @@ class TestHybridScheduler: def test_input_not_in_sfg(self): sfg = ldlt_matrix_inverse(N=2) - sfg.set_latency_of_type(MADS.type_name(), 3) - sfg.set_latency_of_type(Reciprocal.type_name(), 2) - sfg.set_execution_time_of_type(MADS.type_name(), 1) - sfg.set_execution_time_of_type(Reciprocal.type_name(), 1) + sfg.set_latency_of_type_name(MADS.type_name(), 3) + sfg.set_latency_of_type_name(Reciprocal.type_name(), 2) + sfg.set_execution_time_of_type_name(MADS.type_name(), 1) + sfg.set_execution_time_of_type_name(Reciprocal.type_name(), 1) input_times = {"in100": 4} with pytest.raises( @@ -1141,10 +1141,10 @@ class TestHybridScheduler: def test_output_not_in_sfg(self): sfg = ldlt_matrix_inverse(N=2) - sfg.set_latency_of_type(MADS.type_name(), 3) - sfg.set_latency_of_type(Reciprocal.type_name(), 2) - sfg.set_execution_time_of_type(MADS.type_name(), 1) - sfg.set_execution_time_of_type(Reciprocal.type_name(), 1) + sfg.set_latency_of_type_name(MADS.type_name(), 3) + sfg.set_latency_of_type_name(Reciprocal.type_name(), 2) + sfg.set_execution_time_of_type_name(MADS.type_name(), 1) + sfg.set_execution_time_of_type_name(Reciprocal.type_name(), 1) output_delta_times = {"out90": 2} with pytest.raises( @@ -1158,10 +1158,10 @@ class TestHybridScheduler: def test_ldlt_inverse_3x3_read_and_write_constrained(self): sfg = ldlt_matrix_inverse(N=3) - sfg.set_latency_of_type(MADS.type_name(), 3) - sfg.set_latency_of_type(Reciprocal.type_name(), 2) - sfg.set_execution_time_of_type(MADS.type_name(), 1) - sfg.set_execution_time_of_type(Reciprocal.type_name(), 1) + sfg.set_latency_of_type_name(MADS.type_name(), 3) + sfg.set_latency_of_type_name(Reciprocal.type_name(), 2) + sfg.set_execution_time_of_type_name(MADS.type_name(), 1) + sfg.set_execution_time_of_type_name(Reciprocal.type_name(), 1) resources = {MADS.type_name(): 1, Reciprocal.type_name(): 1} @@ -1183,10 +1183,10 @@ class TestHybridScheduler: POINTS = 32 sfg = radix_2_dif_fft(POINTS) - sfg.set_latency_of_type(Butterfly.type_name(), 1) - sfg.set_latency_of_type(ConstantMultiplication.type_name(), 3) - sfg.set_execution_time_of_type(Butterfly.type_name(), 1) - sfg.set_execution_time_of_type(ConstantMultiplication.type_name(), 1) + sfg.set_latency_of_type_name(Butterfly.type_name(), 1) + sfg.set_latency_of_type_name(ConstantMultiplication.type_name(), 3) + sfg.set_execution_time_of_type_name(Butterfly.type_name(), 1) + sfg.set_execution_time_of_type_name(ConstantMultiplication.type_name(), 1) resources = {Butterfly.type_name(): 1, ConstantMultiplication.type_name(): 1} input_times = {f"in{i}": i for i in range(POINTS)} @@ -1209,10 +1209,10 @@ class TestHybridScheduler: # POINTS = 64 # sfg = radix_2_dif_fft(POINTS) - # sfg.set_latency_of_type(Butterfly.type_name(), 1) - # sfg.set_latency_of_type(ConstantMultiplication.type_name(), 3) - # sfg.set_execution_time_of_type(Butterfly.type_name(), 1) - # sfg.set_execution_time_of_type(ConstantMultiplication.type_name(), 1) + # sfg.set_latency_of_type_name(Butterfly.type_name(), 1) + # sfg.set_latency_of_type_name(ConstantMultiplication.type_name(), 3) + # sfg.set_execution_time_of_type_name(Butterfly.type_name(), 1) + # sfg.set_execution_time_of_type_name(ConstantMultiplication.type_name(), 1) # resources = {Butterfly.type_name(): 1, ConstantMultiplication.type_name(): 1} # input_times = {f"in{i}": i for i in range(POINTS)} @@ -1237,10 +1237,10 @@ class TestHybridScheduler: POINTS = 32 sfg = radix_2_dif_fft(POINTS) - sfg.set_latency_of_type(Butterfly.type_name(), 1) - sfg.set_latency_of_type(ConstantMultiplication.type_name(), 3) - sfg.set_execution_time_of_type(Butterfly.type_name(), 1) - sfg.set_execution_time_of_type(ConstantMultiplication.type_name(), 1) + sfg.set_latency_of_type_name(Butterfly.type_name(), 1) + sfg.set_latency_of_type_name(ConstantMultiplication.type_name(), 3) + sfg.set_execution_time_of_type_name(Butterfly.type_name(), 1) + sfg.set_execution_time_of_type_name(ConstantMultiplication.type_name(), 1) resources = {Butterfly.type_name(): 1, ConstantMultiplication.type_name(): 1} input_times = {f"in{i}": i for i in range(POINTS)} @@ -1269,10 +1269,10 @@ class TestHybridScheduler: def test_cyclic_scheduling(self): sfg = radix_2_dif_fft(points=4) - sfg.set_latency_of_type(Butterfly.type_name(), 1) - sfg.set_latency_of_type(ConstantMultiplication.type_name(), 3) - sfg.set_execution_time_of_type(Butterfly.type_name(), 1) - sfg.set_execution_time_of_type(ConstantMultiplication.type_name(), 1) + sfg.set_latency_of_type_name(Butterfly.type_name(), 1) + sfg.set_latency_of_type_name(ConstantMultiplication.type_name(), 3) + sfg.set_execution_time_of_type_name(Butterfly.type_name(), 1) + sfg.set_execution_time_of_type_name(ConstantMultiplication.type_name(), 1) resources = { Butterfly.type_name(): 1, @@ -1420,10 +1420,10 @@ class TestHybridScheduler: def test_resources_not_enough(self): sfg = ldlt_matrix_inverse(N=3) - sfg.set_latency_of_type(MADS.type_name(), 3) - sfg.set_latency_of_type(Reciprocal.type_name(), 2) - sfg.set_execution_time_of_type(MADS.type_name(), 1) - sfg.set_execution_time_of_type(Reciprocal.type_name(), 1) + sfg.set_latency_of_type_name(MADS.type_name(), 3) + sfg.set_latency_of_type_name(Reciprocal.type_name(), 2) + sfg.set_execution_time_of_type_name(MADS.type_name(), 1) + sfg.set_execution_time_of_type_name(Reciprocal.type_name(), 1) resources = {MADS.type_name(): 1, Reciprocal.type_name(): 1} with pytest.raises( @@ -1440,10 +1440,10 @@ class TestHybridScheduler: sfg = radix_2_dif_fft(points=8) - sfg.set_latency_of_type(Butterfly.type_name(), 1) - sfg.set_latency_of_type(ConstantMultiplication.type_name(), 3) - sfg.set_execution_time_of_type(Butterfly.type_name(), 1) - sfg.set_execution_time_of_type(ConstantMultiplication.type_name(), 1) + sfg.set_latency_of_type_name(Butterfly.type_name(), 1) + sfg.set_latency_of_type_name(ConstantMultiplication.type_name(), 3) + sfg.set_execution_time_of_type_name(Butterfly.type_name(), 1) + sfg.set_execution_time_of_type_name(ConstantMultiplication.type_name(), 1) resources = { Butterfly.type_name(): 1, @@ -1465,10 +1465,10 @@ class TestHybridScheduler: def test_scheduling_time_not_enough(self): sfg = ldlt_matrix_inverse(N=3) - sfg.set_latency_of_type(MADS.type_name(), 3) - sfg.set_latency_of_type(Reciprocal.type_name(), 2) - sfg.set_execution_time_of_type(MADS.type_name(), 1) - sfg.set_execution_time_of_type(Reciprocal.type_name(), 1) + sfg.set_latency_of_type_name(MADS.type_name(), 3) + sfg.set_latency_of_type_name(Reciprocal.type_name(), 2) + sfg.set_execution_time_of_type_name(MADS.type_name(), 1) + sfg.set_execution_time_of_type_name(Reciprocal.type_name(), 1) resources = {MADS.type_name(): 10, Reciprocal.type_name(): 10} with pytest.raises( @@ -1486,10 +1486,10 @@ class TestHybridScheduler: def test_cyclic_scheduling_write_and_read_constrained(self): sfg = radix_2_dif_fft(points=4) - sfg.set_latency_of_type(Butterfly.type_name(), 1) - sfg.set_latency_of_type(ConstantMultiplication.type_name(), 3) - sfg.set_execution_time_of_type(Butterfly.type_name(), 1) - sfg.set_execution_time_of_type(ConstantMultiplication.type_name(), 1) + sfg.set_latency_of_type_name(Butterfly.type_name(), 1) + sfg.set_latency_of_type_name(ConstantMultiplication.type_name(), 3) + sfg.set_execution_time_of_type_name(Butterfly.type_name(), 1) + sfg.set_execution_time_of_type_name(ConstantMultiplication.type_name(), 1) resources = { Butterfly.type_name(): 1, @@ -1543,10 +1543,10 @@ class TestHybridScheduler: def test_cyclic_scheduling_several_inputs_and_outputs(self): sfg = radix_2_dif_fft(points=4) - sfg.set_latency_of_type(Butterfly.type_name(), 1) - sfg.set_latency_of_type(ConstantMultiplication.type_name(), 3) - sfg.set_execution_time_of_type(Butterfly.type_name(), 1) - sfg.set_execution_time_of_type(ConstantMultiplication.type_name(), 1) + sfg.set_latency_of_type_name(Butterfly.type_name(), 1) + sfg.set_latency_of_type_name(ConstantMultiplication.type_name(), 3) + sfg.set_execution_time_of_type_name(Butterfly.type_name(), 1) + sfg.set_execution_time_of_type_name(ConstantMultiplication.type_name(), 1) resources = { Butterfly.type_name(): 1, @@ -1564,10 +1564,10 @@ class TestHybridScheduler: def test_invalid_output_delta_time(self): sfg = radix_2_dif_fft(points=4) - sfg.set_latency_of_type(Butterfly.type_name(), 1) - sfg.set_latency_of_type(ConstantMultiplication.type_name(), 3) - sfg.set_execution_time_of_type(Butterfly.type_name(), 1) - sfg.set_execution_time_of_type(ConstantMultiplication.type_name(), 1) + sfg.set_latency_of_type_name(Butterfly.type_name(), 1) + sfg.set_latency_of_type_name(ConstantMultiplication.type_name(), 3) + sfg.set_execution_time_of_type_name(Butterfly.type_name(), 1) + sfg.set_execution_time_of_type_name(ConstantMultiplication.type_name(), 1) resources = { Butterfly.type_name(): 1, @@ -1592,10 +1592,10 @@ class TestHybridScheduler: def test_iteration_period_bound(self): sfg = direct_form_1_iir([1, 2, 3], [1, 2, 3]) - sfg.set_latency_of_type(ConstantMultiplication.type_name(), 2) - sfg.set_execution_time_of_type(ConstantMultiplication.type_name(), 1) - sfg.set_latency_of_type(Addition.type_name(), 3) - sfg.set_execution_time_of_type(Addition.type_name(), 1) + sfg.set_latency_of_type_name(ConstantMultiplication.type_name(), 2) + sfg.set_execution_time_of_type_name(ConstantMultiplication.type_name(), 1) + sfg.set_latency_of_type_name(Addition.type_name(), 3) + sfg.set_execution_time_of_type_name(Addition.type_name(), 1) resources = { Addition.type_name(): 1, @@ -1716,7 +1716,7 @@ class TestListScheduler: b, a = signal.butter(N, Wc, btype="lowpass", output="ba") sfg = direct_form_1_iir(b, a) - sfg.set_latency_of_type(ConstantMultiplication.type_name(), 2) + sfg.set_latency_of_type_name(ConstantMultiplication.type_name(), 2) resources = { Addition.type_name(): 1, @@ -1737,7 +1737,7 @@ class TestListScheduler: ), ) - sfg.set_latency_offsets_of_type(Addition.type_name(), {"in0": 0, "in1": 0}) + sfg.set_latency_offsets_of_type_name(Addition.type_name(), {"in0": 0, "in1": 0}) with pytest.raises( ValueError, match="Output port 0 of operation add4 has no latency-offset.", @@ -1750,9 +1750,9 @@ class TestListScheduler: ), ) - sfg.set_latency_of_type(Addition.type_name(), 3) - sfg.set_execution_time_of_type(ConstantMultiplication.type_name(), None) - sfg.set_execution_time_of_type(Addition.type_name(), None) + sfg.set_latency_of_type_name(Addition.type_name(), 3) + sfg.set_execution_time_of_type_name(ConstantMultiplication.type_name(), None) + sfg.set_execution_time_of_type_name(Addition.type_name(), None) with pytest.raises( ValueError, @@ -1766,7 +1766,7 @@ class TestListScheduler: ), ) - sfg.set_execution_time_of_type(ConstantMultiplication.type_name(), 1) + sfg.set_execution_time_of_type_name(ConstantMultiplication.type_name(), 1) with pytest.raises( ValueError, @@ -1780,7 +1780,7 @@ class TestListScheduler: ), ) - sfg.set_execution_time_of_type(Addition.type_name(), 1) + sfg.set_execution_time_of_type_name(Addition.type_name(), 1) Schedule( sfg, @@ -1808,10 +1808,10 @@ class TestRecursiveListScheduler: b, a = signal.butter(N, Wc, btype="lowpass", output="ba") sfg = direct_form_1_iir(b, a) - sfg.set_latency_of_type(ConstantMultiplication.type_name(), 2) - sfg.set_execution_time_of_type(ConstantMultiplication.type_name(), 1) - sfg.set_latency_of_type(Addition.type_name(), 3) - sfg.set_execution_time_of_type(Addition.type_name(), 1) + sfg.set_latency_of_type_name(ConstantMultiplication.type_name(), 2) + sfg.set_execution_time_of_type_name(ConstantMultiplication.type_name(), 1) + sfg.set_latency_of_type_name(Addition.type_name(), 3) + sfg.set_execution_time_of_type_name(Addition.type_name(), 1) resources = { Addition.type_name(): 1, @@ -1833,10 +1833,10 @@ class TestRecursiveListScheduler: b, a = signal.butter(N, Wc, btype="lowpass", output="ba") sfg = direct_form_2_iir(b, a) - sfg.set_latency_of_type(ConstantMultiplication.type_name(), 2) - sfg.set_execution_time_of_type(ConstantMultiplication.type_name(), 1) - sfg.set_latency_of_type(Addition.type_name(), 3) - sfg.set_execution_time_of_type(Addition.type_name(), 1) + sfg.set_latency_of_type_name(ConstantMultiplication.type_name(), 2) + sfg.set_execution_time_of_type_name(ConstantMultiplication.type_name(), 1) + sfg.set_latency_of_type_name(Addition.type_name(), 3) + sfg.set_execution_time_of_type_name(Addition.type_name(), 1) resources = { Addition.type_name(): 1, @@ -1858,10 +1858,10 @@ class TestRecursiveListScheduler: b, a = signal.butter(N, Wc, btype="lowpass", output="ba") sfg = direct_form_2_iir(b, a) - sfg.set_latency_of_type(ConstantMultiplication.type_name(), 2) - sfg.set_execution_time_of_type(ConstantMultiplication.type_name(), 1) - sfg.set_latency_of_type(Addition.type_name(), 3) - sfg.set_execution_time_of_type(Addition.type_name(), 1) + sfg.set_latency_of_type_name(ConstantMultiplication.type_name(), 2) + sfg.set_execution_time_of_type_name(ConstantMultiplication.type_name(), 1) + sfg.set_latency_of_type_name(Addition.type_name(), 3) + sfg.set_execution_time_of_type_name(Addition.type_name(), 1) resources = { Addition.type_name(): 1, @@ -1894,10 +1894,10 @@ class TestRecursiveListScheduler: y = Output(a2) sfg = SFG([x], [y]) - sfg.set_latency_of_type(Addition.type_name(), 1) - sfg.set_latency_of_type(ConstantMultiplication.type_name(), 2) - sfg.set_execution_time_of_type(Addition.type_name(), 1) - sfg.set_execution_time_of_type(ConstantMultiplication.type_name(), 1) + sfg.set_latency_of_type_name(Addition.type_name(), 1) + sfg.set_latency_of_type_name(ConstantMultiplication.type_name(), 2) + sfg.set_execution_time_of_type_name(Addition.type_name(), 1) + sfg.set_execution_time_of_type_name(ConstantMultiplication.type_name(), 1) resources = { Addition.type_name(): 1, diff --git a/test/unit/test_schedule.py b/test/unit/test_schedule.py index f712a96e..ac767ff9 100644 --- a/test/unit/test_schedule.py +++ b/test/unit/test_schedule.py @@ -18,8 +18,10 @@ from b_asic.special_operations import Delay, Input, Output class TestInit: def test_simple_filter_normal_latency(self, sfg_simple_filter): - sfg_simple_filter.set_latency_of_type(Addition.type_name(), 5) - sfg_simple_filter.set_latency_of_type(ConstantMultiplication.type_name(), 4) + sfg_simple_filter.set_latency_of_type_name(Addition.type_name(), 5) + sfg_simple_filter.set_latency_of_type_name( + ConstantMultiplication.type_name(), 4 + ) schedule = Schedule(sfg_simple_filter, scheduler=ASAPScheduler()) @@ -37,8 +39,10 @@ class TestInit: schedule.start_time_of_operation("foo") def test_complicated_single_outputs_normal_latency(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) + precedence_sfg_delays.set_latency_of_type_name(Addition.type_name(), 4) + precedence_sfg_delays.set_latency_of_type_name( + ConstantMultiplication.type_name(), 3 + ) schedule = Schedule(precedence_sfg_delays, scheduler=ASAPScheduler()) @@ -67,8 +71,10 @@ class TestInit: def test_complicated_single_outputs_normal_latency_alap( 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) + precedence_sfg_delays.set_latency_of_type_name(Addition.type_name(), 4) + precedence_sfg_delays.set_latency_of_type_name( + ConstantMultiplication.type_name(), 3 + ) schedule = Schedule(precedence_sfg_delays, scheduler=ALAPScheduler()) @@ -97,8 +103,10 @@ class TestInit: def test_complicated_single_outputs_normal_latency_alap_with_schedule_time( 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) + precedence_sfg_delays.set_latency_of_type_name(Addition.type_name(), 4) + precedence_sfg_delays.set_latency_of_type_name( + ConstantMultiplication.type_name(), 3 + ) schedule = Schedule( precedence_sfg_delays, schedule_time=25, scheduler=ALAPScheduler() @@ -129,8 +137,10 @@ class TestInit: def test_complicated_single_outputs_normal_latency_alap_too_short_schedule_time( 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) + precedence_sfg_delays.set_latency_of_type_name(Addition.type_name(), 4) + precedence_sfg_delays.set_latency_of_type_name( + ConstantMultiplication.type_name(), 3 + ) with pytest.raises(ValueError, match="Too short schedule time. Minimum is 21."): Schedule(precedence_sfg_delays, schedule_time=19, scheduler=ALAPScheduler()) @@ -160,7 +170,7 @@ class TestInit: assert secondorder_iir_schedule.schedule_time == 21 def test_complicated_single_outputs_complex_latencies(self, precedence_sfg_delays): - precedence_sfg_delays.set_latency_offsets_of_type( + precedence_sfg_delays.set_latency_offsets_of_type_name( ConstantMultiplication.type_name(), {"in0": 3, "out0": 5} ) @@ -250,10 +260,10 @@ class TestInit: def test_provided_schedule(self): sfg = direct_form_1_iir([1, 2, 3], [1, 2, 3]) - sfg.set_latency_of_type(Addition.type_name(), 1) - sfg.set_latency_of_type(ConstantMultiplication.type_name(), 3) - sfg.set_execution_time_of_type(Addition.type_name(), 1) - sfg.set_execution_time_of_type(ConstantMultiplication.type_name(), 1) + sfg.set_latency_of_type_name(Addition.type_name(), 1) + sfg.set_latency_of_type_name(ConstantMultiplication.type_name(), 3) + sfg.set_execution_time_of_type_name(Addition.type_name(), 1) + sfg.set_execution_time_of_type_name(ConstantMultiplication.type_name(), 1) start_times = { "in0": 1, @@ -294,8 +304,10 @@ class TestInit: class TestSlacks: def test_forward_backward_slack_normal_latency(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) + precedence_sfg_delays.set_latency_of_type_name(Addition.type_name(), 1) + precedence_sfg_delays.set_latency_of_type_name( + ConstantMultiplication.type_name(), 3 + ) schedule = Schedule(precedence_sfg_delays, scheduler=ASAPScheduler()) assert ( @@ -323,8 +335,10 @@ class TestSlacks: ) def test_slacks_normal_latency(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) + precedence_sfg_delays.set_latency_of_type_name(Addition.type_name(), 1) + precedence_sfg_delays.set_latency_of_type_name( + ConstantMultiplication.type_name(), 3 + ) schedule = Schedule(precedence_sfg_delays, scheduler=ASAPScheduler()) assert schedule.slacks( @@ -335,8 +349,10 @@ class TestSlacks: ) == (16, 0) def test_print_slacks(self, capsys, 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) + precedence_sfg_delays.set_latency_of_type_name(Addition.type_name(), 1) + precedence_sfg_delays.set_latency_of_type_name( + ConstantMultiplication.type_name(), 3 + ) schedule = Schedule(precedence_sfg_delays, scheduler=ASAPScheduler()) schedule.print_slacks() @@ -361,8 +377,10 @@ class TestSlacks: assert captured.err == "" def test_print_slacks_sorting(self, capsys, 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) + precedence_sfg_delays.set_latency_of_type_name(Addition.type_name(), 1) + precedence_sfg_delays.set_latency_of_type_name( + ConstantMultiplication.type_name(), 3 + ) schedule = Schedule(precedence_sfg_delays, scheduler=ASAPScheduler()) schedule.print_slacks(1) @@ -387,8 +405,10 @@ class TestSlacks: assert captured.err == "" def test_slacks_errors(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) + precedence_sfg_delays.set_latency_of_type_name(Addition.type_name(), 1) + precedence_sfg_delays.set_latency_of_type_name( + ConstantMultiplication.type_name(), 3 + ) schedule = Schedule(precedence_sfg_delays, scheduler=ASAPScheduler()) with pytest.raises( @@ -407,8 +427,10 @@ class TestSlacks: 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) + precedence_sfg_delays.set_latency_of_type_name(Addition.type_name(), 4) + precedence_sfg_delays.set_latency_of_type_name( + ConstantMultiplication.type_name(), 3 + ) schedule = Schedule(precedence_sfg_delays, scheduler=ASAPScheduler()) @@ -444,8 +466,10 @@ class TestRescheduling: schedule.move_operation("foo", 0) 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) + precedence_sfg_delays.set_latency_of_type_name(Addition.type_name(), 1) + precedence_sfg_delays.set_latency_of_type_name( + ConstantMultiplication.type_name(), 3 + ) schedule = Schedule(precedence_sfg_delays, scheduler=ASAPScheduler()) add3_id = precedence_sfg_delays.find_by_name("ADD3")[0].graph_id @@ -466,8 +490,10 @@ class TestRescheduling: assert schedule.backward_slack(a2_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) + precedence_sfg_delays.set_latency_of_type_name(Addition.type_name(), 1) + precedence_sfg_delays.set_latency_of_type_name( + ConstantMultiplication.type_name(), 3 + ) schedule = Schedule(precedence_sfg_delays, scheduler=ASAPScheduler()) with pytest.raises( @@ -479,8 +505,10 @@ class TestRescheduling: ) 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) + precedence_sfg_delays.set_latency_of_type_name(Addition.type_name(), 1) + precedence_sfg_delays.set_latency_of_type_name( + ConstantMultiplication.type_name(), 3 + ) schedule = Schedule(precedence_sfg_delays, scheduler=ASAPScheduler()) with pytest.raises( @@ -492,8 +520,10 @@ class TestRescheduling: ) def test_move_operation_asap(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) + precedence_sfg_delays.set_latency_of_type_name(Addition.type_name(), 1) + precedence_sfg_delays.set_latency_of_type_name( + ConstantMultiplication.type_name(), 3 + ) schedule = Schedule(precedence_sfg_delays, scheduler=ASAPScheduler()) assert schedule.backward_slack('cmul5') == 16 @@ -505,8 +535,10 @@ class TestRescheduling: assert schedule.forward_slack('cmul5') == 16 def test_move_input_asap_does_not_mess_up_laps(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) + precedence_sfg_delays.set_latency_of_type_name(Addition.type_name(), 1) + precedence_sfg_delays.set_latency_of_type_name( + ConstantMultiplication.type_name(), 3 + ) schedule = Schedule(precedence_sfg_delays, scheduler=ASAPScheduler()) old_laps = schedule.laps['in0'] @@ -521,7 +553,7 @@ class TestRescheduling: out0 = Output(a) d <<= a sfg = SFG([in0], [out0]) - sfg.set_latency_of_type(Addition.type_name(), 1) + sfg.set_latency_of_type_name(Addition.type_name(), 1) schedule = Schedule(sfg, scheduler=ASAPScheduler(), cyclic=True) # Check initial conditions @@ -574,10 +606,12 @@ class TestRescheduling: def test_reintroduce_delays( self, precedence_sfg_delays, sfg_direct_form_iir_lp_filter ): - precedence_sfg_delays.set_latency_of_type(Addition.type_name(), 1) - precedence_sfg_delays.set_latency_of_type(ConstantMultiplication.type_name(), 3) - sfg_direct_form_iir_lp_filter.set_latency_of_type(Addition.type_name(), 1) - sfg_direct_form_iir_lp_filter.set_latency_of_type( + precedence_sfg_delays.set_latency_of_type_name(Addition.type_name(), 1) + precedence_sfg_delays.set_latency_of_type_name( + ConstantMultiplication.type_name(), 3 + ) + sfg_direct_form_iir_lp_filter.set_latency_of_type_name(Addition.type_name(), 1) + sfg_direct_form_iir_lp_filter.set_latency_of_type_name( ConstantMultiplication.type_name(), 3 ) @@ -788,8 +822,10 @@ class TestErrors: Schedule(sfg, scheduler=ASAPScheduler()) def test_too_short_schedule_time(self, sfg_simple_filter): - sfg_simple_filter.set_latency_of_type(Addition.type_name(), 5) - sfg_simple_filter.set_latency_of_type(ConstantMultiplication.type_name(), 4) + sfg_simple_filter.set_latency_of_type_name(Addition.type_name(), 5) + sfg_simple_filter.set_latency_of_type_name( + ConstantMultiplication.type_name(), 4 + ) with pytest.raises(ValueError, match="Too short schedule time. Minimum is 9."): Schedule(sfg_simple_filter, scheduler=ASAPScheduler(), schedule_time=3) @@ -801,8 +837,8 @@ class TestErrors: schedule.set_schedule_time(3) # def test_incorrect_scheduling_algorithm(self, sfg_simple_filter): - # sfg_simple_filter.set_latency_of_type(Addition.type_name(), 1) - # sfg_simple_filter.set_latency_of_type(ConstantMultiplication.type_name(), 2) + # sfg_simple_filter.set_latency_of_type_name(Addition.type_name(), 1) + # sfg_simple_filter.set_latency_of_type_name(ConstantMultiplication.type_name(), 2) # with pytest.raises( # NotImplementedError, match="No algorithm with name: foo defined." # ): @@ -813,16 +849,20 @@ class TestErrors: Schedule(1) def test_provided_no_start_times(self, sfg_simple_filter): - sfg_simple_filter.set_latency_of_type(Addition.type_name(), 1) - sfg_simple_filter.set_latency_of_type(ConstantMultiplication.type_name(), 2) + sfg_simple_filter.set_latency_of_type_name(Addition.type_name(), 1) + sfg_simple_filter.set_latency_of_type_name( + ConstantMultiplication.type_name(), 2 + ) with pytest.raises( ValueError, match="Must provide start_times when using 'provided'" ): Schedule(sfg_simple_filter) def test_provided_no_laps(self, sfg_simple_filter): - sfg_simple_filter.set_latency_of_type(Addition.type_name(), 1) - sfg_simple_filter.set_latency_of_type(ConstantMultiplication.type_name(), 2) + sfg_simple_filter.set_latency_of_type_name(Addition.type_name(), 1) + sfg_simple_filter.set_latency_of_type_name( + ConstantMultiplication.type_name(), 2 + ) with pytest.raises(ValueError, match="Must provide laps when using 'provided'"): Schedule(sfg_simple_filter, start_times={'in0': 0}) @@ -839,8 +879,10 @@ class TestGetUsedTypeNames: class TestYLocations: def test_provided_no_laps(self, sfg_simple_filter): - sfg_simple_filter.set_latency_of_type(Addition.type_name(), 1) - sfg_simple_filter.set_latency_of_type(ConstantMultiplication.type_name(), 2) + sfg_simple_filter.set_latency_of_type_name(Addition.type_name(), 1) + sfg_simple_filter.set_latency_of_type_name( + ConstantMultiplication.type_name(), 2 + ) schedule = Schedule(sfg_simple_filter, ASAPScheduler()) assert schedule._y_locations == {"in0": 1, "cmul0": 0, "add0": 2, "out0": 3} @@ -850,8 +892,10 @@ class TestYLocations: assert schedule._y_locations == {"in0": 2, "cmul0": 0, "add0": 1, "out0": 1} def test_reset(self, sfg_simple_filter): - sfg_simple_filter.set_latency_of_type(Addition.type_name(), 1) - sfg_simple_filter.set_latency_of_type(ConstantMultiplication.type_name(), 2) + sfg_simple_filter.set_latency_of_type_name(Addition.type_name(), 1) + sfg_simple_filter.set_latency_of_type_name( + ConstantMultiplication.type_name(), 2 + ) schedule = Schedule(sfg_simple_filter, ASAPScheduler()) assert schedule._y_locations == {"in0": 1, "cmul0": 0, "add0": 2, "out0": 3} diff --git a/test/unit/test_scheduler.py b/test/unit/test_scheduler.py index 90bf6f54..374f5021 100644 --- a/test/unit/test_scheduler.py +++ b/test/unit/test_scheduler.py @@ -16,10 +16,10 @@ class TestASAPScheduler: def test_direct_form_1_iir(self): sfg = direct_form_1_iir([1, 2, 3], [1, 2, 3]) - sfg.set_latency_of_type(ConstantMultiplication.type_name(), 2) - sfg.set_execution_time_of_type(ConstantMultiplication.type_name(), 1) - sfg.set_latency_of_type(Addition.type_name(), 3) - sfg.set_execution_time_of_type(Addition.type_name(), 1) + sfg.set_latency_of_type_name(ConstantMultiplication.type_name(), 2) + sfg.set_execution_time_of_type_name(ConstantMultiplication.type_name(), 1) + sfg.set_latency_of_type_name(Addition.type_name(), 3) + sfg.set_execution_time_of_type_name(Addition.type_name(), 1) schedule = Schedule(sfg, scheduler=ASAPScheduler()) @@ -39,8 +39,8 @@ class TestASAPScheduler: assert schedule.schedule_time == 11 def test_direct_form_2_iir(self, sfg_direct_form_iir_lp_filter): - sfg_direct_form_iir_lp_filter.set_latency_of_type(Addition.type_name(), 5) - sfg_direct_form_iir_lp_filter.set_latency_of_type( + sfg_direct_form_iir_lp_filter.set_latency_of_type_name(Addition.type_name(), 5) + sfg_direct_form_iir_lp_filter.set_latency_of_type_name( ConstantMultiplication.type_name(), 4 ) @@ -64,8 +64,8 @@ class TestASAPScheduler: def test_direct_form_2_iir_with_scheduling_time( self, sfg_direct_form_iir_lp_filter ): - sfg_direct_form_iir_lp_filter.set_latency_of_type(Addition.type_name(), 5) - sfg_direct_form_iir_lp_filter.set_latency_of_type( + sfg_direct_form_iir_lp_filter.set_latency_of_type_name(Addition.type_name(), 5) + sfg_direct_form_iir_lp_filter.set_latency_of_type_name( ConstantMultiplication.type_name(), 4 ) @@ -91,10 +91,10 @@ class TestASAPScheduler: def test_radix_2_fft_8_points(self): sfg = radix_2_dif_fft(points=8) - sfg.set_latency_of_type(ConstantMultiplication.type_name(), 2) - sfg.set_execution_time_of_type(ConstantMultiplication.type_name(), 1) - sfg.set_latency_of_type(Butterfly.type_name(), 1) - sfg.set_execution_time_of_type(Butterfly.type_name(), 1) + sfg.set_latency_of_type_name(ConstantMultiplication.type_name(), 2) + sfg.set_execution_time_of_type_name(ConstantMultiplication.type_name(), 1) + sfg.set_latency_of_type_name(Butterfly.type_name(), 1) + sfg.set_execution_time_of_type_name(Butterfly.type_name(), 1) schedule = Schedule(sfg, scheduler=ASAPScheduler()) @@ -146,10 +146,10 @@ class TestALAPScheduler: def test_direct_form_1_iir(self): sfg = direct_form_1_iir([1, 2, 3], [1, 2, 3]) - sfg.set_latency_of_type(ConstantMultiplication.type_name(), 2) - sfg.set_execution_time_of_type(ConstantMultiplication.type_name(), 1) - sfg.set_latency_of_type(Addition.type_name(), 3) - sfg.set_execution_time_of_type(Addition.type_name(), 1) + sfg.set_latency_of_type_name(ConstantMultiplication.type_name(), 2) + sfg.set_execution_time_of_type_name(ConstantMultiplication.type_name(), 1) + sfg.set_latency_of_type_name(Addition.type_name(), 3) + sfg.set_execution_time_of_type_name(Addition.type_name(), 1) schedule = Schedule(sfg, scheduler=ALAPScheduler()) @@ -169,8 +169,8 @@ class TestALAPScheduler: assert schedule.schedule_time == 11 def test_direct_form_2_iir(self, sfg_direct_form_iir_lp_filter): - sfg_direct_form_iir_lp_filter.set_latency_of_type(Addition.type_name(), 5) - sfg_direct_form_iir_lp_filter.set_latency_of_type( + sfg_direct_form_iir_lp_filter.set_latency_of_type_name(Addition.type_name(), 5) + sfg_direct_form_iir_lp_filter.set_latency_of_type_name( ConstantMultiplication.type_name(), 4 ) @@ -194,8 +194,8 @@ class TestALAPScheduler: def test_direct_form_2_iir_with_scheduling_time( self, sfg_direct_form_iir_lp_filter ): - sfg_direct_form_iir_lp_filter.set_latency_of_type(Addition.type_name(), 5) - sfg_direct_form_iir_lp_filter.set_latency_of_type( + sfg_direct_form_iir_lp_filter.set_latency_of_type_name(Addition.type_name(), 5) + sfg_direct_form_iir_lp_filter.set_latency_of_type_name( ConstantMultiplication.type_name(), 4 ) @@ -221,10 +221,10 @@ class TestALAPScheduler: def test_radix_2_fft_8_points(self): sfg = radix_2_dif_fft(points=8) - sfg.set_latency_of_type(ConstantMultiplication.type_name(), 2) - sfg.set_execution_time_of_type(ConstantMultiplication.type_name(), 1) - sfg.set_latency_of_type(Butterfly.type_name(), 1) - sfg.set_execution_time_of_type(Butterfly.type_name(), 1) + sfg.set_latency_of_type_name(ConstantMultiplication.type_name(), 2) + sfg.set_execution_time_of_type_name(ConstantMultiplication.type_name(), 1) + sfg.set_latency_of_type_name(Butterfly.type_name(), 1) + sfg.set_execution_time_of_type_name(Butterfly.type_name(), 1) schedule = Schedule(sfg, scheduler=ALAPScheduler()) diff --git a/test/unit/test_scheduler_gui.py b/test/unit/test_scheduler_gui.py index 02e9d36e..0df333f9 100644 --- a/test/unit/test_scheduler_gui.py +++ b/test/unit/test_scheduler_gui.py @@ -18,8 +18,8 @@ def test_start(qtbot): def test_load_schedule(qtbot, sfg_simple_filter): - sfg_simple_filter.set_latency_of_type(Addition.type_name(), 5) - sfg_simple_filter.set_latency_of_type(ConstantMultiplication.type_name(), 4) + sfg_simple_filter.set_latency_of_type_name(Addition.type_name(), 5) + sfg_simple_filter.set_latency_of_type_name(ConstantMultiplication.type_name(), 4) widget = ScheduleMainWindow() qtbot.addWidget(widget) diff --git a/test/unit/test_sfg.py b/test/unit/test_sfg.py index 7dd05ab0..50f0fb9d 100644 --- a/test/unit/test_sfg.py +++ b/test/unit/test_sfg.py @@ -1169,7 +1169,7 @@ class TestSaveLoadSFG: class TestGetComponentsOfType: - def test_get_no_operations_of_type(self, sfg_two_inputs_two_outputs): + def test_get_no_operations_of_type_name(self, sfg_two_inputs_two_outputs): assert [ op.name for op in sfg_two_inputs_two_outputs.find_by_type_name( @@ -1177,7 +1177,7 @@ class TestGetComponentsOfType: ) ] == [] - def test_get_multiple_operations_of_type(self, sfg_two_inputs_two_outputs): + def test_get_multiple_operations_of_type_name(self, sfg_two_inputs_two_outputs): assert [ op.name for op in sfg_two_inputs_two_outputs.find_by_type_name(Addition.type_name()) @@ -1193,6 +1193,25 @@ class TestGetComponentsOfType: for op in sfg_two_inputs_two_outputs.find_by_type_name(Output.type_name()) ] == ["OUT1", "OUT2"] + def test_get_no_operations_of_type(self, sfg_two_inputs_two_outputs): + assert [ + op.name for op in sfg_two_inputs_two_outputs.find_by_type(Multiplication) + ] == [] + + def test_get_multiple_operations_of_type(self, sfg_two_inputs_two_outputs): + assert ( + [op.name for op in sfg_two_inputs_two_outputs.find_by_type(Addition)] + ) == ["ADD1", "ADD2"] + + assert ([op.name for op in sfg_two_inputs_two_outputs.find_by_type(Input)]) == [ + "IN1", + "IN2", + ] + + assert ( + [op.name for op in sfg_two_inputs_two_outputs.find_by_type(Output)] + ) == ["OUT1", "OUT2"] + class TestPrecedenceGraph: def test_precedence_graph(self, sfg_simple_filter): @@ -1487,10 +1506,10 @@ class TestInputDuplicationBug: class TestCriticalPath: def test_single_accumulator(self, sfg_simple_accumulator: SFG): - sfg_simple_accumulator.set_latency_of_type(Addition.type_name(), 5) + sfg_simple_accumulator.set_latency_of_type_name(Addition.type_name(), 5) assert sfg_simple_accumulator.critical_path_time() == 5 - sfg_simple_accumulator.set_latency_of_type(Addition.type_name(), 6) + sfg_simple_accumulator.set_latency_of_type_name(Addition.type_name(), 6) assert sfg_simple_accumulator.critical_path_time() == 6 @@ -1822,10 +1841,10 @@ class TestResourceLowerBound: assert sfg_simple_accumulator.resource_lower_bound("bfly", 1000) == 0 def test_negative_schedule_time(self, precedence_sfg_delays): - precedence_sfg_delays.set_latency_of_type("add", 2) - precedence_sfg_delays.set_latency_of_type("cmul", 3) - precedence_sfg_delays.set_execution_time_of_type("add", 1) - precedence_sfg_delays.set_execution_time_of_type("cmul", 1) + precedence_sfg_delays.set_latency_of_type_name("add", 2) + precedence_sfg_delays.set_latency_of_type_name("cmul", 3) + precedence_sfg_delays.set_execution_time_of_type_name("add", 1) + precedence_sfg_delays.set_execution_time_of_type_name("cmul", 1) with pytest.raises( ValueError, @@ -1840,7 +1859,7 @@ class TestResourceLowerBound: precedence_sfg_delays.resource_lower_bound("cmul", -1) def test_accumulator(self, sfg_simple_accumulator): - sfg_simple_accumulator.set_latency_of_type('add', 2) + sfg_simple_accumulator.set_latency_of_type_name('add', 2) with pytest.raises( ValueError, @@ -1848,20 +1867,20 @@ class TestResourceLowerBound: ): sfg_simple_accumulator.resource_lower_bound("add", 2) - sfg_simple_accumulator.set_execution_time_of_type("add", 2) + sfg_simple_accumulator.set_execution_time_of_type_name("add", 2) assert sfg_simple_accumulator.resource_lower_bound("add", 2) == 1 assert sfg_simple_accumulator.resource_lower_bound("add", 1) == 2 def test_secondorder_iir(self, precedence_sfg_delays): - precedence_sfg_delays.set_latency_of_type("add", 2) - precedence_sfg_delays.set_latency_of_type("cmul", 3) + precedence_sfg_delays.set_latency_of_type_name("add", 2) + precedence_sfg_delays.set_latency_of_type_name("cmul", 3) - precedence_sfg_delays.set_execution_time_of_type("add", 1) + precedence_sfg_delays.set_execution_time_of_type_name("add", 1) assert precedence_sfg_delays.resource_lower_bound("add", 1) == 4 assert precedence_sfg_delays.resource_lower_bound("add", 2) == 2 assert precedence_sfg_delays.resource_lower_bound("add", 4) == 1 - precedence_sfg_delays.set_execution_time_of_type("cmul", 1) + precedence_sfg_delays.set_execution_time_of_type_name("cmul", 1) assert precedence_sfg_delays.resource_lower_bound("cmul", 1) == 7 assert precedence_sfg_delays.resource_lower_bound("cmul", 2) == 4 assert precedence_sfg_delays.resource_lower_bound("cmul", 4) == 2 @@ -1870,7 +1889,7 @@ class TestResourceLowerBound: class TestIterationPeriodBound: def test_accumulator(self, sfg_simple_accumulator): - sfg_simple_accumulator.set_latency_of_type('add', 2) + sfg_simple_accumulator.set_latency_of_type_name('add', 2) assert sfg_simple_accumulator.iteration_period_bound() == 2 def test_no_latency(self, sfg_simple_accumulator): @@ -1881,8 +1900,8 @@ class TestIterationPeriodBound: sfg_simple_accumulator.iteration_period_bound() def test_secondorder_iir(self, precedence_sfg_delays): - precedence_sfg_delays.set_latency_of_type('add', 2) - precedence_sfg_delays.set_latency_of_type('cmul', 3) + precedence_sfg_delays.set_latency_of_type_name('add', 2) + precedence_sfg_delays.set_latency_of_type_name('cmul', 3) assert precedence_sfg_delays.iteration_period_bound() == 10 def test_fractional_value(self): @@ -1902,8 +1921,8 @@ class TestIterationPeriodBound: y = Output(a2) sfg = SFG([x], [y]) - sfg.set_latency_of_type(Addition.type_name(), 1) - sfg.set_latency_of_type(ConstantMultiplication.type_name(), 1) + sfg.set_latency_of_type_name(Addition.type_name(), 1) + sfg.set_latency_of_type_name(ConstantMultiplication.type_name(), 1) assert sfg.iteration_period_bound() == 4 / 2 sfg = sfg.insert_operation_before("t0", ConstantMultiplication(10)) diff --git a/test/unit/test_sfg_generators.py b/test/unit/test_sfg_generators.py index bbd8916e..77397971 100644 --- a/test/unit/test_sfg_generators.py +++ b/test/unit/test_sfg_generators.py @@ -256,6 +256,9 @@ class TestDirectFormIIRType1: amount_of_muls = len(sfg.find_by_type_name(ConstantMultiplication.type_name())) assert amount_of_muls == 2 * N + 1 + amount_of_muls = len(sfg.find_by_type(ConstantMultiplication)) + assert amount_of_muls == 2 * N + 1 + amount_of_adds = len(sfg.find_by_type_name(Addition.type_name())) assert amount_of_adds == 2 * N -- GitLab