diff --git a/b_asic/schedule.py b/b_asic/schedule.py index 6d05778ef35e08a79d51b4a20f24590b76abc1c3..925615cbc9c261a3f46fedd4987f631b389cba66 100644 --- a/b_asic/schedule.py +++ b/b_asic/schedule.py @@ -182,22 +182,28 @@ class Schedule: start_time = self._start_times[graph_id] operation = cast(Operation, self._sfg.find_by_id(graph_id)) for output_port in operation.outputs: - output_slacks = {} - available_time = start_time + cast(int, output_port.latency_offset) - if available_time > self._schedule_time: - available_time -= self._schedule_time - - for signal in output_port.signals: - destination = cast(InputPort, signal.destination) - usage_time = ( - cast(int, destination.latency_offset) - + self._start_times[destination.operation.graph_id] - + self._schedule_time * self._laps[signal.graph_id] - ) - output_slacks[signal] = usage_time - available_time - ret[output_port] = output_slacks + ret[output_port] = self._output_slacks(output_port, start_time) return ret + def _output_slacks( + self, output_port: "OutputPort", start_time: Optional[int] = None + ) -> Dict[Signal, int]: + if start_time is None: + start_time = self._start_times[output_port.operation.graph_id] + output_slacks = {} + available_time = start_time + cast(int, output_port.latency_offset) + if available_time > self._schedule_time: + available_time -= self._schedule_time + for signal in output_port.signals: + destination = cast(InputPort, signal.destination) + usage_time = ( + cast(int, destination.latency_offset) + + self._start_times[destination.operation.graph_id] + + self._schedule_time * self._laps[signal.graph_id] + ) + output_slacks[signal] = usage_time - available_time + return output_slacks + def backward_slack(self, graph_id: GraphID) -> int: """ Return how much an operation can be moved backward in time. @@ -234,22 +240,28 @@ class Schedule: start_time = self._start_times[graph_id] operation = cast(Operation, self._sfg.find_by_id(graph_id)) for input_port in operation.inputs: - input_slacks = {} - usage_time = start_time + cast(int, input_port.latency_offset) - - for signal in input_port.signals: - source = cast(OutputPort, signal.source) - available_time = ( - cast(int, source.latency_offset) - + self._start_times[source.operation.graph_id] - - self._schedule_time * self._laps[signal.graph_id] - ) - if available_time > self._schedule_time: - available_time -= self._schedule_time - input_slacks[signal] = usage_time - available_time - ret[input_port] = input_slacks + ret[input_port] = self._input_slacks(input_port, start_time) return ret + def _input_slacks( + self, input_port: InputPort, start_time: Optional[int] = None + ) -> Dict[Signal, int]: + if start_time is None: + start_time = self._start_times[input_port.operation.graph_id] + input_slacks = {} + usage_time = start_time + cast(int, input_port.latency_offset) + for signal in input_port.signals: + source = cast(OutputPort, signal.source) + available_time = ( + cast(int, source.latency_offset) + + self._start_times[source.operation.graph_id] + - self._schedule_time * self._laps[signal.graph_id] + ) + if available_time > self._schedule_time: + available_time -= self._schedule_time + input_slacks[signal] = usage_time - available_time + return input_slacks + def slacks(self, graph_id: GraphID) -> Tuple[int, int]: """ Return the backward and forward slacks of operation *graph_id*. That is, how