diff --git a/b_asic/signal_flow_graph.py b/b_asic/signal_flow_graph.py
index af4ae35333c00aacff67829e8b2259736d0a0d5d..dc867e093355a35cc9ab10208e73f2204792b336 100644
--- a/b_asic/signal_flow_graph.py
+++ b/b_asic/signal_flow_graph.py
@@ -177,13 +177,17 @@ class SFG(AbstractOperation):
                     raise ValueError(
                         f"Duplicate input operation {input_op!r} in SFG"
                     )
-                new_input_op = self._add_component_unconnected_copy(input_op)
+                new_input_op = cast(
+                    Input, self._add_component_unconnected_copy(input_op)
+                )
                 for signal in input_op.output(0).signals:
                     assert signal not in self._original_components_to_new, (
                         "Duplicate input signals connected to input ports"
                         " supplied to SFG constructor."
                     )
-                    new_signal = self._add_component_unconnected_copy(signal)
+                    new_signal = cast(
+                        Signal, self._add_component_unconnected_copy(signal)
+                    )
                     new_signal.set_source(new_input_op.output(0))
                     self._original_input_signals_to_indices[
                         signal
@@ -229,11 +233,14 @@ class SFG(AbstractOperation):
                 for signal in output_op.input(0).signals:
                     if signal in self._original_components_to_new:
                         # Signal was already added when setting up inputs.
-                        new_signal = self._original_components_to_new[signal]
+                        new_signal = cast(
+                            Signal, self._original_components_to_new[signal]
+                        )
                     else:
                         # New signal has to be created.
-                        new_signal = self._add_component_unconnected_copy(
-                            signal
+                        new_signal = cast(
+                            Signal,
+                            self._add_component_unconnected_copy(signal),
                         )
 
                     new_signal.set_destination(new_output_op.input(0))
@@ -267,16 +274,17 @@ class SFG(AbstractOperation):
                     )
             elif new_signal.destination.operation in output_operations_set:
                 # Add directly connected input to output to ordered list.
+                source = cast(OutputPort, new_signal.source)
                 self._components_dfs_order.extend(
                     [
-                        new_signal.source.operation,
+                        source.operation,
                         new_signal,
                         new_signal.destination.operation,
                     ]
                 )
                 self._operations_dfs_order.extend(
                     [
-                        new_signal.source.operation,
+                        source.operation,
                         new_signal.destination.operation,
                     ]
                 )
@@ -287,7 +295,7 @@ class SFG(AbstractOperation):
             output_index,
         ) in self._original_output_signals_to_indices.items():
             # Check if already added source.
-            new_signal = self._original_components_to_new[signal]
+            new_signal = cast(Signal, self._original_components_to_new[signal])
             if new_signal.source is None:
                 if signal.source is None:
                     raise ValueError(
@@ -428,21 +436,23 @@ class SFG(AbstractOperation):
             return False
 
         # For each input_signal, connect it to the corresponding operation
-        for port, input_operation in zip(self.inputs, self.input_operations):
+        for input_port, input_operation in zip(
+            self.inputs, self.input_operations
+        ):
             dest = input_operation.output(0).signals[0].destination
             if dest is None:
                 raise ValueError("Missing destination in signal.")
             dest.clear()
-            port.signals[0].set_destination(dest)
+            input_port.signals[0].set_destination(dest)
         # For each output_signal, connect it to the corresponding operation
-        for port, output_operation in zip(
+        for output_port, output_operation in zip(
             self.outputs, self.output_operations
         ):
             src = output_operation.input(0).signals[0].source
             if src is None:
                 raise ValueError("Missing soruce in signal.")
             src.clear()
-            port.signals[0].set_source(src)
+            output_port.signals[0].set_source(src)
         return True
 
     @property
@@ -762,16 +772,12 @@ class SFG(AbstractOperation):
             ports = p_list[i]
             for port in ports:
                 for signal in port.signals:
-                    if (
-                        signal.destination.operation.type_name()
-                        == Delay.type_name()
-                    ):
-                        dest_node = (
-                            signal.destination.operation.graph_id + "In"
-                        )
+                    destination = cast(InputPort, signal.destination)
+                    if destination.operation.type_name() == Delay.type_name():
+                        dest_node = destination.operation.graph_id + "In"
                     else:
-                        dest_node = signal.destination.operation.graph_id
-                    dest_label = signal.destination.operation.graph_id
+                        dest_node = destination.operation.graph_id
+                    dest_label = destination.operation.graph_id
                     node_node = f"{port.operation.graph_id}.{port.index}"
                     pg.edge(node_node, dest_node)
                     pg.node(dest_node, label=dest_label, shape="square")
@@ -1138,18 +1144,21 @@ class SFG(AbstractOperation):
                                 "Dangling signal without source in SFG"
                             )
 
-                        new_signal = self._add_component_unconnected_copy(
-                            original_signal
+                        new_signal = cast(
+                            Signal,
+                            self._add_component_unconnected_copy(
+                                original_signal
+                            ),
                         )
                         new_signal.set_source(
                             new_op.output(original_output_port.index)
                         )
 
                         self._components_dfs_order.append(new_signal)
-
-                        original_connected_op = (
-                            original_signal.destination.operation
+                        original_destination = cast(
+                            InputPort, original_signal.destination
                         )
+                        original_connected_op = original_destination.operation
                         if original_connected_op is None:
                             raise ValueError(
                                 "Signal without destination in SFG"
@@ -1161,20 +1170,26 @@ class SFG(AbstractOperation):
                         ):
                             # Set destination to the already connected operations port.
                             new_signal.set_destination(
-                                self._original_components_to_new[
-                                    original_connected_op
-                                ].input(original_signal.destination.index)
+                                cast(
+                                    Operation,
+                                    self._original_components_to_new[
+                                        original_connected_op
+                                    ],
+                                ).input(original_destination.index)
                             )
                         else:
                             # Create new operation, set destination to it.
-                            new_connected_op = (
-                                self._add_component_unconnected_copy(
-                                    original_connected_op
-                                )
+                            new_connected_op = cast(
+                                Operation,
+                                (
+                                    self._add_component_unconnected_copy(
+                                        original_connected_op
+                                    )
+                                ),
                             )
                             new_signal.set_destination(
                                 new_connected_op.input(
-                                    original_signal.destination.index
+                                    original_destination.index
                                 )
                             )
 
@@ -1288,16 +1303,18 @@ class SFG(AbstractOperation):
             dg.engine = engine
         for op in self._components_by_id.values():
             if isinstance(op, Signal):
+                source = cast(OutputPort, op.source)
+                destination = cast(InputPort, op.destination)
                 if show_id:
                     dg.edge(
-                        op.source.operation.graph_id,
-                        op.destination.operation.graph_id,
+                        source.operation.graph_id,
+                        destination.operation.graph_id,
                         label=op.graph_id,
                     )
                 else:
                     dg.edge(
-                        op.source.operation.graph_id,
-                        op.destination.operation.graph_id,
+                        source.operation.graph_id,
+                        destination.operation.graph_id,
                     )
             else:
                 if op.type_name() == Delay.type_name():