diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index a17158a2bfd860b971103467703e9dd33b3a0b8e..45cb3385d1fb16f9c2b17370373c280f0e1d5509 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,6 +1,6 @@
 stages:
- - test
- - deploy
+  - test
+  - deploy
 
 before_script:
   - apt-get update --yes
@@ -29,13 +29,12 @@ before_script:
     # - lcov --list coverage.info
     # - find . -name '*.gc*' -delete
   artifacts:
-      reports:
-        coverage_report:
-          coverage_format: cobertura
-          path: cov.xml
+    reports:
+      coverage_report:
+        coverage_format: cobertura
+        path: cov.xml
   coverage: /(?i)total.*? (100(?:\.0+)?\%|[1-9]?\d(?:\.\d+)?\%)$/
 
-
 run-test-3.8-pyside2:
   variables:
     QT_API: pyside2
@@ -107,11 +106,11 @@ run-vhdl-tests:
   image: python:3.10
   stage: test
   script:
-      - pytest
-      - pip install vunit_hdl
-      - apt install -y ghdl
-      - cd b_asic/codegen/testbench
-      - python test.py
+    - pytest
+    - pip install vunit_hdl
+    - apt install -y ghdl
+    - cd b_asic/codegen/testbench
+    - python test.py
 
 run-doc-test:
   variables:
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 4aa7b14f63a505c077a5da061ce029caaae57b77..c3a591f41fdd3f15b8372ae1f535e9bf49aa5a0d 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -1,29 +1,57 @@
 repos:
--   repo: https://github.com/pre-commit/pre-commit-hooks
-    rev: v2.3.0
-    hooks:
-    - id: check-added-large-files
-    - id: check-docstring-first
-    - id: check-yaml
-    - id: end-of-file-fixer
-      exclude_types: [svg]
-    - id: trailing-whitespace
-      exclude_types: [svg]
--   repo: https://github.com/psf/black
-    rev: 22.10.0
-    hooks:
-    - id: black
--   repo: https://github.com/pycqa/isort
+  - repo: https://github.com/pre-commit/pre-commit-hooks
+    rev: v4.4.0
+    hooks:
+      - id: mixed-line-ending
+        exclude_types: [svg]
+      - id: check-added-large-files
+      - id: check-docstring-first
+      - id: check-yaml
+      - id: end-of-file-fixer
+        exclude_types: [svg]
+      - id: trailing-whitespace
+        exclude_types: [svg]
+      - id: check-toml
+
+  - repo: https://github.com/psf/black
+    rev: 23.3.0
+    hooks:
+      - id: black
+
+  - repo: https://github.com/pycqa/isort
     rev: 5.12.0
     hooks:
       - id: isort
         name: isort (python)
--   repo: https://github.com/Carreau/velin
+
+  - repo: https://github.com/Carreau/velin
     rev: 0.0.11
     hooks:
-    - id: velin
--   repo: https://github.com/charliermarsh/ruff-pre-commit
+      - id: velin
+
+  - repo: https://github.com/charliermarsh/ruff-pre-commit
     # Ruff version.
-    rev: "v0.0.265"
+    rev: "v0.0.267"
     hooks:
       - id: ruff
+
+  - repo: https://github.com/adamchainz/blacken-docs
+    rev: 1.13.0
+    hooks:
+      - id: blacken-docs
+
+  - repo: https://github.com/asottile/pyupgrade
+    rev: v3.4.0
+    hooks:
+      - id: pyupgrade
+        args: [--py38-plus]
+
+  - repo: https://github.com/pre-commit/mirrors-prettier
+    rev: v3.0.0-alpha.9-for-vscode
+    hooks:
+      - id: prettier
+        files: \.(html|md|yml|yaml|toml)
+        args: [--prose-wrap=preserve]
+        additional_dependencies:
+          - prettier@2.7.1
+          - prettier-plugin-toml@0.3.1
diff --git a/b_asic/GUI/arrow.py b/b_asic/GUI/arrow.py
index 66cfaae4dc1e2ae30495320591741c1d72eecc68..2fa24b15eca302ed6af7424b5010f775e4f75ed7 100644
--- a/b_asic/GUI/arrow.py
+++ b/b_asic/GUI/arrow.py
@@ -53,7 +53,14 @@ class Arrow(QGraphicsPathItem):
         self._destination_port_button.moved.connect(self.update_arrow)
 
     def contextMenuEvent(self, event):
-        """Open right-click menu."""
+        """
+        Open right-click menu.
+
+        Parameters
+        ----------
+        event : QEvent
+            The event.
+        """
         menu = QMenu()
         menu.addAction("Delete", self.remove)
         menu.exec_(self.cursor().pos())
@@ -99,11 +106,11 @@ class Arrow(QGraphicsPathItem):
         return cast("InputPort", self._destination_port_button.port)
 
     def set_source_operation(self, source: "Operation"):
-        """Set operation of the source DragButton"""
+        """Set operation of the source DragButton."""
         self._source_port_button._operation_button.operation = source
 
     def set_destination_operation(self, destination: "Operation"):
-        """Set operation of the destination DragButton"""
+        """Set operation of the destination DragButton."""
         self._destination_port_button._operation_button.operation = destination
 
     def remove(self):
diff --git a/b_asic/GUI/drag_button.py b/b_asic/GUI/drag_button.py
index 0aae12557640a298bf80878408cc9d2a26997aad..cb6a9ca0a32b8a1bb149c8f8a887fc32e491434c 100644
--- a/b_asic/GUI/drag_button.py
+++ b/b_asic/GUI/drag_button.py
@@ -37,7 +37,8 @@ class DragButton(QPushButton):
         Whether to show the name.
     window : SFGMainWindow
         Parent MainWindow.
-    parent
+    parent : unknown, optional
+        Passed to QPushButton.
     """
 
     connectionRequested = Signal(QPushButton)
diff --git a/b_asic/GUI/main_window.py b/b_asic/GUI/main_window.py
index e6c5e19258f3cff5cf7053db241d4f43c5c7863f..1fa80a41874910a13a785f65ec48b02885f6100a 100644
--- a/b_asic/GUI/main_window.py
+++ b/b_asic/GUI/main_window.py
@@ -834,7 +834,6 @@ class SFGMainWindow(QMainWindow):
         Returns
         -------
         None.
-
         """
         signal_exists = (
             signal
diff --git a/b_asic/GUI/port_button.py b/b_asic/GUI/port_button.py
index b41b301c872a22f77ccd94568de90c6ac17c0026..92f2696caa2154208bec98ca38d2268a628853a6 100644
--- a/b_asic/GUI/port_button.py
+++ b/b_asic/GUI/port_button.py
@@ -20,8 +20,11 @@ class PortButton(QPushButton):
     Parameters
     ----------
     name : str
+        The name of the button.
     operation_button : :class:`~b_asic.GUI.drag_button.DragButton`
+        The parent DragButton.
     port : :class:`~b_asic.port.Port`
+        The SFG Port.
     """
 
     connectionRequested = Signal(QPushButton)
@@ -109,11 +112,6 @@ class PortButton(QPushButton):
         ----------
         modifiers : optional
             Qt keyboard modifier.
-
-        Returns
-        -------
-
-
         """
         if modifiers != Qt.KeyboardModifier.ControlModifier:
             for port in self._window._pressed_ports:
@@ -121,7 +119,6 @@ class PortButton(QPushButton):
 
             self._toggle_port(self.pressed)
             self._window._pressed_ports = [self]
-
         else:
             self._toggle_port(self.pressed)
             if self in self._window._pressed_ports:
diff --git a/b_asic/GUI/signal_generator_input.py b/b_asic/GUI/signal_generator_input.py
index 7fb3008172c38284cc67c51ba981d000b1ffe0ea..2927bdcaa08ac4b1454e9e1ab593819c8e227ee9 100644
--- a/b_asic/GUI/signal_generator_input.py
+++ b/b_asic/GUI/signal_generator_input.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
 from qtpy.QtWidgets import (
     QFileDialog,
     QGridLayout,
@@ -66,7 +65,7 @@ class DelayInput(SignalGeneratorInput):
 
 class ImpulseInput(DelayInput):
     """
-    Class for graphically configuring and generating a
+    Class for graphically configuring and generating an
     :class:`~b_asic.signal_generators.Impulse` signal generator.
     """
 
diff --git a/b_asic/architecture.py b/b_asic/architecture.py
index f33300ae5f0f1b51614d969116797b4707e11acb..97928ca123cc75444257a197e679bfa6af3f54ae 100644
--- a/b_asic/architecture.py
+++ b/b_asic/architecture.py
@@ -150,7 +150,6 @@ class Resource(HardwareBlock):
         The process collection containing processes to be mapped to resource.
     entity_name : str, optional
         The name of the resulting entity.
-
     """
 
     def __init__(
@@ -220,7 +219,7 @@ class Resource(HardwareBlock):
         ax : Axes
             Matplotlib Axes to plot in.
         **kwargs
-            Passed to :meth:`b_asic.resources.ProcessCollection.plot`
+            Passed to :meth:`b_asic.resources.ProcessCollection.plot`.
         """
         if not self.is_assigned:
             self._collection.plot(ax, **kwargs)
@@ -238,7 +237,7 @@ class Resource(HardwareBlock):
         ----------
         title : str, optional
         **kwargs
-            Passed to :meth:`b_asic.resources.ProcessCollection.plot`
+            Passed to :meth:`b_asic.resources.ProcessCollection.plot`.
         """
         fig, ax = plt.subplots()
         self.plot_content(ax, **kwargs)
@@ -254,7 +253,15 @@ class Resource(HardwareBlock):
         """
         Perform assignment of processes to resource.
 
-        See the specific resource types for more information.
+        Parameters
+        ----------
+        heuristic : str
+            See the specific resource types for more information.
+
+        See Also
+        --------
+        Memory.assign
+        ProcessingElement.assign
         """
         raise NotImplementedError()
 
@@ -418,7 +425,6 @@ class Memory(Resource):
         Number of write ports for memory.
     assign : bool, default False
         Perform assignment when creating the Memory (using the default properties).
-
     """
 
     _color = f"#{''.join(f'{v:0>2X}' for v in MEMORY_COLOR)}"
@@ -681,8 +687,9 @@ of :class:`~b_asic.architecture.ProcessingElement`
         List[Dict[Tuple[Resource, int], int]], List[Dict[Tuple[Resource, int], int]]
     ]:
         """
-        Return lists of dictionaries with interconnect information for a
-        ProcessingElement.
+        Return with interconnect information for a ProcessingElement.
+
+        The information is tuple, where each element is a lists of dictionaries.
 
         Parameters
         ----------
@@ -697,7 +704,6 @@ of :class:`~b_asic.architecture.ProcessingElement`
         list
             List of dictionaries indicating the sources for each outport and the
             frequency of accesses.
-
         """
         if isinstance(pe, str):
             pe = cast(ProcessingElement, self.resource_from_name(pe))
diff --git a/b_asic/codegen/vhdl/common.py b/b_asic/codegen/vhdl/common.py
index a1ac777c108c0ba2614ba8bb9846375a37bfa20c..abd7f1e3c373737d9103f766a032f005bb2d7a83 100644
--- a/b_asic/codegen/vhdl/common.py
+++ b/b_asic/codegen/vhdl/common.py
@@ -93,15 +93,15 @@ def signal_declaration(
         Signal name.
     signal_type : str
         Signal type.
-    default_value : string, optional
+    default_value : str, optional
         An optional default value to the signal.
     name_pad : int, optional
         An optional left padding value applied to the name.
-    vivado_ram_style : string, optional
+    vivado_ram_style : str, optional
         An optional Xilinx Vivado RAM style attribute to apply to this signal
         declaration. If set, exactly one of: "block", "distributed", "registers",
         "ultra", "mixed" or "auto".
-    quartus_ram_style : string, optional
+    quartus_ram_style : str, optional
         An optional Quartus Prime RAM style attribute to apply to this signal
         declaration. If set, exactly one of: "M4K", "M9K", "M10K", "M20K", "M144K",
         "MLAB" or "logic".
diff --git a/b_asic/core_operations.py b/b_asic/core_operations.py
index bd3ae9de640028b1fa345f23fd8e60cee7e96a76..17e762e770c6a076b74fb3f3c645aba863d4d5d2 100644
--- a/b_asic/core_operations.py
+++ b/b_asic/core_operations.py
@@ -30,7 +30,6 @@ class Constant(AbstractOperation):
         The constant value.
     name : Name, optional
         Operation name.
-
     """
 
     _execution_time = 0
@@ -105,7 +104,6 @@ class Addition(AbstractOperation):
     See also
     ========
     AddSub
-
     """
 
     is_linear = True
@@ -319,7 +317,6 @@ class Multiplication(AbstractOperation):
     See Also
     ========
     ConstantMultiplication
-
     """
     is_swappable = True
 
@@ -573,7 +570,6 @@ class SquareRoot(AbstractOperation):
         operator starts. If not provided and *latency* is provided, set to zero.
     execution_time : int, optional
         Operation execution time (time units before operator can be reused).
-
     """
 
     def __init__(
@@ -625,7 +621,6 @@ class ComplexConjugate(AbstractOperation):
         operator starts. If not provided and *latency* is provided, set to zero.
     execution_time : int, optional
         Operation execution time (time units before operator can be reused).
-
     """
 
     def __init__(
@@ -677,7 +672,6 @@ class Absolute(AbstractOperation):
         operator starts. If not provided and *latency* is provided, set to zero.
     execution_time : int, optional
         Operation execution time (time units before operator can be reused).
-
     """
 
     def __init__(
@@ -868,7 +862,9 @@ class MAD(AbstractOperation):
         Operation execution time (time units before operator can be reused).
 
     See Also
-
+    --------
+    Multiplication
+    Addition
     """
     is_swappable = True
 
diff --git a/b_asic/operation.py b/b_asic/operation.py
index b93482332c437e429668e3dbd096203696b4bb19..2d0c8972a8b33c43aaf209190c51f70766e2bf38 100644
--- a/b_asic/operation.py
+++ b/b_asic/operation.py
@@ -65,7 +65,7 @@ class Operation(GraphComponent, SignalSourceProvider):
     @abstractmethod
     def __add__(self, src: Union[SignalSourceProvider, Num]) -> "Addition":
         """
-        Overloads the addition operator to make it return a new Addition operation
+        Overload the addition operator to make it return a new Addition operation
         object that is connected to the self and other objects.
         """
         raise NotImplementedError
@@ -73,7 +73,7 @@ class Operation(GraphComponent, SignalSourceProvider):
     @abstractmethod
     def __radd__(self, src: Union[SignalSourceProvider, Num]) -> "Addition":
         """
-        Overloads the addition operator to make it return a new Addition operation
+        Overload the addition operator to make it return a new Addition operation
         object that is connected to the self and other objects.
         """
         raise NotImplementedError
@@ -81,7 +81,7 @@ class Operation(GraphComponent, SignalSourceProvider):
     @abstractmethod
     def __sub__(self, src: Union[SignalSourceProvider, Num]) -> "Subtraction":
         """
-        Overloads the subtraction operator to make it return a new Subtraction
+        Overload the subtraction operator to make it return a new Subtraction
         operation object that is connected to the self and other objects.
         """
         raise NotImplementedError
@@ -99,7 +99,7 @@ class Operation(GraphComponent, SignalSourceProvider):
         self, src: Union[SignalSourceProvider, Num]
     ) -> Union["Multiplication", "ConstantMultiplication"]:
         """
-        Overloads the multiplication operator to make it return a new Multiplication
+        Overload the multiplication operator to make it return a new Multiplication
         operation object that is connected to the self and other objects.
 
         If *src* is a number, then returns a ConstantMultiplication operation object
@@ -112,7 +112,7 @@ class Operation(GraphComponent, SignalSourceProvider):
         self, src: Union[SignalSourceProvider, Num]
     ) -> Union["Multiplication", "ConstantMultiplication"]:
         """
-        Overloads the multiplication operator to make it return a new Multiplication
+        Overload the multiplication operator to make it return a new Multiplication
         operation object that is connected to the self and other objects.
 
         If *src* is a number, then returns a ConstantMultiplication operation object
@@ -123,7 +123,7 @@ class Operation(GraphComponent, SignalSourceProvider):
     @abstractmethod
     def __truediv__(self, src: Union[SignalSourceProvider, Num]) -> "Division":
         """
-        Overloads the division operator to make it return a new Division operation
+        Overload the division operator to make it return a new Division operation
         object that is connected to the self and other objects.
         """
         raise NotImplementedError
@@ -133,7 +133,7 @@ class Operation(GraphComponent, SignalSourceProvider):
         self, src: Union[SignalSourceProvider, Num]
     ) -> Union["Division", "Reciprocal"]:
         """
-        Overloads the division operator to make it return a new Division operation
+        Overload the division operator to make it return a new Division operation
         object that is connected to the self and other objects.
         """
         raise NotImplementedError
@@ -141,7 +141,7 @@ class Operation(GraphComponent, SignalSourceProvider):
     @abstractmethod
     def __lshift__(self, src: SignalSourceProvider) -> Signal:
         """
-        Overloads the left shift operator to make it connect the provided signal source
+        Overload the left shift operator to make it connect the provided signal source
         to this operation's input, assuming it has exactly 1 input port.
         Returns the new signal.
         """
@@ -185,8 +185,9 @@ class Operation(GraphComponent, SignalSourceProvider):
     @abstractmethod
     def input_signals(self) -> Sequence[Signal]:
         """
-        Get all the signals that are connected to this operation's input ports,
-        in no particular order.
+        Get all the signals that are connected to this operation's input ports.
+
+        The signals are ore not ordered.
         """
         raise NotImplementedError
 
@@ -194,16 +195,19 @@ class Operation(GraphComponent, SignalSourceProvider):
     @abstractmethod
     def output_signals(self) -> Sequence[Signal]:
         """
-        Get all the signals that are connected to this operation's output ports,
-        in no particular order.
+        Get all the signals that are connected to this operation's output ports.
+
+        The signals are ore not ordered.
         """
         raise NotImplementedError
 
     @abstractmethod
     def key(self, index: int, prefix: str = "") -> ResultKey:
         """
-        Get the key used to access the output of a certain output of this operation
-        from the output parameter passed to current_output(s) or evaluate_output(s).
+        Get the key used to access the output of a certain index.
+
+        This keu can be used to access the simulation results and used as
+        the *output* parameter passed to current_output(s) or evaluate_output(s).
         """
         raise NotImplementedError
 
@@ -292,7 +296,10 @@ class Operation(GraphComponent, SignalSourceProvider):
     ) -> Sequence[Num]:
         """
         Evaluate all outputs of this operation given the input values.
-        See evaluate_output for more information.
+
+        See Also
+        --------
+        evaluate_output
         """
         raise NotImplementedError
 
@@ -354,20 +361,27 @@ class Operation(GraphComponent, SignalSourceProvider):
     @abstractmethod
     def set_latency(self, latency: int) -> None:
         """
-        Sets the latency of the operation to the specified integer value.
+        Set the latency of the operation to the specified integer value.
 
         This is done by setting the latency-offsets of operations input ports to 0
         and the latency-offsets of the operations output ports to the specified value.
 
+        The latency is the time it takes to produce an output from the corresponding
+        input of the underlying operator.
+
         The latency cannot be a negative integer.
+
+        Parameters
+        ----------
+        latency : int
+            Non-negative int corresponding to the latency of the operation.
         """
         raise NotImplementedError
 
     @abstractmethod
     def set_latency_offsets(self, latency_offsets: Dict[str, int]) -> None:
         """
-        Sets the latency-offsets for the operations ports specified in the
-        latency_offsets dictionary.
+        Set the latency-offsets for the operations port.
 
         The latency offsets dictionary should be {'in0': 2, 'out1': 4} if you want to
         set the latency offset for the input port with index 0 to 2, and the latency
@@ -381,17 +395,27 @@ class Operation(GraphComponent, SignalSourceProvider):
         """
         Get the execution time of the operation.
 
-        This is the time it takes before the processing element implementing the
-        operation can be reused for starting another operation.
+        The execution time is the time between executing two operations on the
+        underlying operator. This is also called initiation interval.
         """
         raise NotImplementedError
 
     @execution_time.setter
     @abstractmethod
-    def execution_time(self, latency: Optional[int]) -> None:
+    def execution_time(self, execution_time: Optional[int]) -> None:
         """
-        Sets the execution time of the operation to the specified integer
-        value. The execution time cannot be a negative integer.
+        Set the execution time of the operation.
+
+        The execution time is the time between executing two operations on the
+        underlying operator. This is also called initiation interval.
+
+        The execution time cannot be a negative integer.
+
+        Parameters
+        ----------
+        execution_time : int or None
+            Non-negative integer corresponding to the execution time of the operation.
+            Unset execution time by passing ``None``.
         """
         raise NotImplementedError
 
@@ -400,7 +424,9 @@ class Operation(GraphComponent, SignalSourceProvider):
         self,
     ) -> Tuple[Tuple[Tuple[float, float], ...], Tuple[Tuple[float, float], ...]]:
         """
-        Return a tuple containing coordinates for the two polygons outlining
+        Return coordinates for the latency and execution time polygons.
+
+        This returns a tuple containing coordinates for the two polygons outlining
         the latency and execution time of the operation.
         The polygons are corresponding to a start time of 0 and are of height 1.
         """
@@ -412,6 +438,7 @@ class Operation(GraphComponent, SignalSourceProvider):
     ) -> Tuple[Tuple[float, float], ...]:
         """
         Return coordinates for inputs.
+
         These maps to the polygons and are corresponding to a start time of 0
         and height 1.
 
@@ -427,13 +454,13 @@ class Operation(GraphComponent, SignalSourceProvider):
     ) -> Tuple[Tuple[float, float], ...]:
         """
         Return coordinates for outputs.
+
         These maps to the polygons and are corresponding to a start time of 0
         and height 1.
 
         See Also
         --------
         get_input_coordinates
-
         """
         raise NotImplementedError
 
@@ -442,6 +469,7 @@ class Operation(GraphComponent, SignalSourceProvider):
     def source(self) -> OutputPort:
         """
         Return the OutputPort if there is only one output port.
+
         If not, raise a TypeError.
         """
         raise NotImplementedError
@@ -451,6 +479,7 @@ class Operation(GraphComponent, SignalSourceProvider):
     def destination(self) -> InputPort:
         """
         Return the InputPort if there is only one input port.
+
         If not, raise a TypeError.
         """
         raise NotImplementedError
@@ -487,8 +516,10 @@ class Operation(GraphComponent, SignalSourceProvider):
     @abstractmethod
     def is_swappable(self) -> bool:
         """
-        Return True if the inputs (and outputs) to the operation can be swapped and
-        retain the same function.
+        Return True if the inputs (and outputs) to the operation can be swapped.
+
+        Swapping require that the operation retains the same function, but it is allowed
+        to modify values to do so.
         """
         raise NotImplementedError
 
@@ -586,8 +617,12 @@ class AbstractOperation(Operation, AbstractGraphComponent):
     @abstractmethod
     def evaluate(self, *inputs):  # pylint: disable=arguments-differ
         """
-        Evaluate the operation and generate a list of output values given a
-        list of input values.
+        Evaluate the operation and generate a list of output values.
+
+        Parameters
+        ----------
+        *inputs
+            List of input values.
         """
         raise NotImplementedError
 
diff --git a/b_asic/port.py b/b_asic/port.py
index 51b0173dc15ebd3e20035350e51b44ce466214c9..709a018ba542e37c265942e137a296a6bdf2c003 100644
--- a/b_asic/port.py
+++ b/b_asic/port.py
@@ -67,9 +67,15 @@ class Port(ABC):
     @abstractmethod
     def add_signal(self, signal: Signal) -> None:
         """
-        Connect this port to the entered signal. If the entered signal is not
-        connected to this port then connect the entered signal to the port as
-        well.
+        Connect this port to the entered signal.
+
+        If the entered signal is not connected to this port then connect the entered
+        signal to the port as well.
+
+        Parameters
+        ----------
+        signal : Signal
+            Signal to add.
         """
         raise NotImplementedError
 
@@ -77,6 +83,7 @@ class Port(ABC):
     def remove_signal(self, signal: Signal) -> None:
         """
         Remove the signal that was entered from the Ports signals.
+
         If the entered signal still is connected to this port then disconnect the
         entered signal from the port as well.
 
@@ -96,8 +103,9 @@ class Port(ABC):
     @abstractmethod
     def name(self) -> str:
         """
-        Return a name consisting of *graph_id* of the related operation and the port
-        number.
+        Return a name of the port.
+
+        This name consists of *graph_id* of the related operation and the port number.
         """
 
 
@@ -203,14 +211,16 @@ class InputPort(AbstractPort):
     @property
     def connected_source(self) -> Optional["OutputPort"]:
         """
-        Get the output port that is currently connected to this input port,
-        or None if it is unconnected.
+        Get the output port that is currently connected to this input port.
+
+        Return None if it is unconnected.
         """
         return None if self._source_signal is None else self._source_signal.source
 
     def connect(self, src: SignalSourceProvider, name: Name = Name("")) -> Signal:
         """
         Connect the provided signal source to this input port by creating a new signal.
+
         Returns the new signal.
         """
         if self._source_signal is not None:
diff --git a/b_asic/quantization.py b/b_asic/quantization.py
index 5de9a51720da2340247b255aa5aadbab546bbe28..c1cc35960d6b85c961a61c0ffacb10fd77608ff2 100644
--- a/b_asic/quantization.py
+++ b/b_asic/quantization.py
@@ -10,34 +10,49 @@ class Quantization(Enum):
     """Quantization types."""
 
     ROUNDING = 1
-    "Standard two's complement rounding, i.e, tie rounds towards infinity."
+    """
+    Standard two's complement rounding, i.e, tie rounds towards infinity.
+    """
 
     TRUNCATION = 2
-    "Two's complement truncation, i.e., round towards negative infinity."
+    """
+    Two's complement truncation, i.e., round towards negative infinity.
+    """
 
     MAGNITUDE_TRUNCATION = 3
-    "Magnitude truncation, i.e., round towards zero."
+    """
+    Magnitude truncation, i.e., round towards zero.
+    """
 
     JAMMING = 4
-    "Jamming/von Neumann rounding, i.e., set the LSB to one."
+    """
+    Jamming/von Neumann rounding, i.e., set the LSB to one.
+    """
 
     UNBIASED_ROUNDING = 5
-    "Unbiased rounding, i.e., tie rounds towards even."
+    """
+    Unbiased rounding, i.e., tie rounds towards even.
+    """
 
     UNBIASED_JAMMING = 6
-    "Unbiased jamming/von Neumann rounding."
+    """
+    Unbiased jamming/von Neumann rounding.
+    """
 
 
 class Overflow(Enum):
     """Overflow types."""
 
     TWOS_COMPLEMENT = 1
-    "Two's complement overflow, i.e., remove the more significant bits."
+    """
+    Two's complement overflow, i.e., remove the more significant bits.
+    """
 
     SATURATION = 2
     """
-    Two's complement saturation, i.e., overflow return the most positive/negative
-    number.
+    Two's complement saturation.
+
+    Overflow return the most positive/negative number.
     """
 
 
@@ -96,7 +111,6 @@ def quantize(
     0.9375
     >>> quantize(0.3, 4, -1)  # Three bits in total, will overflow
     -0.25
-
     """
     if isinstance(value, complex):
         return complex(
diff --git a/b_asic/research/interleaver.py b/b_asic/research/interleaver.py
index 2ff6084f5c89d5228cb9acb05dd6da237bd0e141..3bb7a4bacbcadf4d3d0dc1551324492d115a7d89 100644
--- a/b_asic/research/interleaver.py
+++ b/b_asic/research/interleaver.py
@@ -32,8 +32,7 @@ def generate_random_interleaver(
     size: int, min_lifetime: int = 0, cyclic: bool = True, parallelism: int = 1
 ) -> ProcessCollection:
     """
-    Generate a ProcessCollection with memory variable corresponding to a random
-    interleaver with length *size*.
+    Generate a ProcessCollection for a random interleaver.
 
     Parameters
     ----------
@@ -41,7 +40,7 @@ def generate_random_interleaver(
         The size of the random interleaver sequence.
     min_lifetime : int, default: 0
         The minimum lifetime for a memory variable. Default is 0 meaning that at least
-        one variable is passed from the input to the output directly,
+        one variable is passed from the input to the output directly.
     cyclic : bool, default: True
         If the interleaver should operate continuously in a cyclic manner. That is,
         start a new interleaving operation directly after the previous.
@@ -51,7 +50,6 @@ def generate_random_interleaver(
     Returns
     -------
     ProcessCollection
-
     """
     inputorders = list(product(range(size), range(parallelism)))
     outputorders = inputorders[:]
@@ -79,9 +77,11 @@ def generate_matrix_transposer(
     parallelism: int = 1,
 ) -> ProcessCollection:
     r"""
-    Generate a ProcessCollection with memory variable corresponding to transposing a
-    matrix of size *rows* :math:`\times` *cols*. If *cols* is not provided, a
-    square matrix of size *rows* :math:`\times` *rows* is used.
+    Generate a ProcessCollection for a matrix transposer.
+
+    The transposer is transposing a matrix of size *rows* :math:`\times` *cols*.
+    If *cols* is not provided, a square matrix of size *rows* :math:`\times` *rows*
+    is used.
 
     Parameters
     ----------
@@ -92,7 +92,7 @@ def generate_matrix_transposer(
         to *rows*, i.e., a square matrix.
     min_lifetime : int, default: 0
         The minimum lifetime for a memory variable. Default is 0 meaning that at
-        least one variable is passed from the input to the output directly,
+        least one variable is passed from the input to the output directly.
     cyclic : bool, default: True
         If the interleaver should operate continuously in a cyclic manner. That is,
         start a new interleaving operation directly after the previous.
diff --git a/b_asic/resources.py b/b_asic/resources.py
index 212be2c291f0b3d35d38ebe34d38ca445dead1bb..8fb2d6f275779053437bb59658a0b178c96e7ed4 100644
--- a/b_asic/resources.py
+++ b/b_asic/resources.py
@@ -61,7 +61,7 @@ def _sanitize_port_option(
     write_ports : int, optional
         The number of write ports.
     total_ports : int, optional
-        The total number of ports
+        The total number of ports.
 
     Returns
     -------
@@ -69,7 +69,6 @@ def _sanitize_port_option(
     input, or sanitized if one of the input equals None. If total_ports is set to None
     at the input, it is set to read_ports+write_ports at the output. If read_ports or
     write_ports is set to None at the input, it is set to total_ports at the output.
-
     """
     if total_ports is None:
         if read_ports is None or write_ports is None:
@@ -112,9 +111,9 @@ def draw_exclusion_graph_coloring(
         _, ax = plt.subplots()
         collection = ProcessCollection(...)
         exclusion_graph = collection.create_exclusion_graph_from_ports(
-            read_ports = 1,
-            write_ports = 1,
-            total_ports = 2,
+            read_ports=1,
+            write_ports=1,
+            total_ports=2,
         )
         coloring = nx.greedy_color(exclusion_graph)
         draw_exclusion_graph_coloring(exclusion_graph, coloring, ax=ax)
@@ -468,8 +467,7 @@ class ProcessCollection:
 
     def add_process(self, process: Process):
         """
-        Add a new :class:`~b_asic.process.Process` to this
-        :class:`~b_asic.resources.ProcessCollection`.
+        Add a :class:`~b_asic.process.Process`.
 
         Parameters
         ----------
@@ -482,8 +480,7 @@ class ProcessCollection:
 
     def remove_process(self, process: Process):
         """
-        Remove a :class:`~b_asic.process.Process` from this
-        :class:`~b_asic.resources.ProcessCollection`.
+        Remove a :class:`~b_asic.process.Process`.
 
         Raises :class:`KeyError` if the specified :class:`~b_asic.process.Process` is
         not in this collection.
@@ -514,6 +511,8 @@ class ProcessCollection:
         allow_excessive_lifetimes: bool = False,
     ):
         """
+        Plot lifetime diagram.
+
         Plot all :class:`~b_asic.process.Process` objects of this
         :class:`~b_asic.resources.ProcessCollection` in a lifetime diagram.
 
@@ -553,7 +552,8 @@ class ProcessCollection:
 
         Returns
         -------
-        ax : Associated Matplotlib Axes (or array of Axes) object
+        ax : :class:`matplotlib.axes.Axes`
+            Associated Matplotlib Axes (or array of Axes) object
         """
 
         # Set up the Axes object
@@ -677,8 +677,7 @@ class ProcessCollection:
         title: Optional[str] = None,
     ) -> None:
         """
-        Display this :class:`~b_asic.resources.ProcessCollection` using the current
-        Matplotlib backend.
+        Display lifetime diagram using the current Matplotlib backend.
 
         Equivalent to creating a Matplotlib figure, passing it and arguments to
         :meth:`plot` and invoking :py:meth:`matplotlib.figure.Figure.show`.
@@ -725,9 +724,7 @@ class ProcessCollection:
         total_ports: Optional[int] = None,
     ) -> nx.Graph:
         """
-        Create an exclusion graph from a given number of read and write ports based on
-        concurrent read and write accesses to this
-        :class:`~b_asic.resources.ProcessCollection`.
+        Create an exclusion graph based on concurrent read and write accesses.
 
         Parameters
         ----------
@@ -743,8 +740,8 @@ class ProcessCollection:
 
         Returns
         -------
-        A :class:`networkx.Graph` object.
-
+        :class:`networkx.Graph`
+            An undirected exclusion graph.
         """
         read_ports, write_ports, total_ports = _sanitize_port_option(
             read_ports, write_ports, total_ports
@@ -766,9 +763,9 @@ class ProcessCollection:
         exclusion_graph = nx.Graph()
         exclusion_graph.add_nodes_from(self._collection)
         for node1 in exclusion_graph:
-            node1_stop_times = set(
+            node1_stop_times = {
                 read_time % self.schedule_time for read_time in node1.read_times
-            )
+            }
             node1_start_time = node1.start_time % self.schedule_time
             if total_ports == 1 and node1.start_time in node1_stop_times:
                 print(node1.start_time, node1_stop_times)
@@ -800,7 +797,7 @@ class ProcessCollection:
 
         Returns
         -------
-        A :class:`networkx.Graph` object.
+        :class:`networkx.Graph`
         """
         exclusion_graph = nx.Graph()
         exclusion_graph.add_nodes_from(self._collection)
@@ -855,7 +852,7 @@ class ProcessCollection:
         coloring_strategy: str = "saturation_largest_first",
     ) -> List["ProcessCollection"]:
         """
-        Split a ProcessCollection based on overlapping execution time.
+        Split based on overlapping execution time.
 
         Parameters
         ----------
@@ -895,7 +892,7 @@ class ProcessCollection:
         total_ports: Optional[int] = None,
     ) -> List["ProcessCollection"]:
         """
-        Split this process storage based on concurrent read/write times according.
+        Split based on concurrent read and write accesses.
 
         Different heuristic methods can be used.
 
@@ -1002,8 +999,9 @@ class ProcessCollection:
 
     def _repr_svg_(self) -> str:
         """
-        Generate an SVG_ of the resource collection. This is automatically displayed in
-        e.g. Jupyter Qt console.
+        Generate an SVG_ of the resource collection.
+
+        This is automatically displayed in e.g. Jupyter Qt console.
         """
         fig, ax = plt.subplots()
         self.plot(ax=ax, show_markers=False)
@@ -1048,7 +1046,6 @@ class ProcessCollection:
         Returns
         -------
         List[ProcessCollection]
-
         """
         for process in self:
             if process.execution_time > self.schedule_time:
@@ -1258,7 +1255,7 @@ class ProcessCollection:
         self, length: int = 0
     ) -> Tuple["ProcessCollection", "ProcessCollection"]:
         """
-        Split into two new ProcessCollections based on execution time length.
+        Split into two ProcessCollections based on execution time length.
 
         Parameters
         ----------
@@ -1268,8 +1265,9 @@ class ProcessCollection:
 
         Returns
         -------
-        A tuple of two ProcessCollections, one with shorter than or equal execution
-        times and one with longer execution times.
+        tuple(ProcessCollection, ProcessCollection)
+            A tuple of two ProcessCollections, one with shorter than or equal execution
+            times and one with longer execution times.
         """
         short = []
         long = []
@@ -1302,8 +1300,9 @@ class ProcessCollection:
         total_ports: int = 2,
     ):
         """
-        Generate VHDL code for register based storages of processes based on
-        Forward-Backward Register Allocation [1].
+        Generate VHDL code for register based storage.
+
+        This is based on Forward-Backward Register Allocation [1].
 
         [1]: K. Parhi: VLSI Digital Signal Processing Systems: Design and
         Implementation, Ch. 6.3.2
@@ -1384,7 +1383,6 @@ class ProcessCollection:
         Returns
         -------
         A new :class:`~b_asic.resources.ProcessCollection`.
-
         """
         return ProcessCollection(
             {
@@ -1399,8 +1397,9 @@ class ProcessCollection:
 
     def read_ports_bound(self) -> int:
         """
-        Get the read port lower-bound (maximum number of concurrent reads) of this
-        :class:`~b_asic.resources.ProcessCollection`.
+        Get the read port lower-bound.
+
+        That is, the maximum number of concurrent reads.
 
         Returns
         -------
@@ -1420,8 +1419,9 @@ class ProcessCollection:
 
     def write_ports_bound(self) -> int:
         """
-        Get the total port lower-bound (maximum number of concurrent writes) of this
-        :class:`~b_asic.resources.ProcessCollection`.
+        Get the total port lower-bound.
+
+        That is, the maximum number of concurrent writes.
 
         Returns
         -------
@@ -1437,7 +1437,9 @@ class ProcessCollection:
 
     def total_ports_bound(self) -> int:
         """
-        Get the total port lower-bound (maximum number of concurrent reads and writes).
+        Get the total port lower-bound.
+
+        That is the maximum number of concurrent reads and writes.
 
         Returns
         -------
@@ -1458,15 +1460,17 @@ class ProcessCollection:
 
     def from_name(self, name: str):
         """
-        Get a :class:`~b_asic.process.Process` from this collection from its name.
-
-        Raises :class:`KeyError` if no processes with ``name`` is found in this
-        collection.
+        Get a :class:`~b_asic.process.Process` from its name.
 
         Parameters
         ----------
         name : str
             The name of the process to retrieve.
+
+        Raises
+        ------
+        :class:`KeyError`
+            If no processes with ``name`` is found in this collection.
         """
         name_to_proc = {p.name: p for p in self.collection}
         if name in name_to_proc:
diff --git a/b_asic/save_load_structure.py b/b_asic/save_load_structure.py
index 2a65db0a77d47d4900a15783efeaaec2c4f83d3b..1dccc40b560696bffa217b5a0ea96ceec88b868f 100644
--- a/b_asic/save_load_structure.py
+++ b/b_asic/save_load_structure.py
@@ -31,7 +31,6 @@ def sfg_to_python(
         String to append at the end of the result.
     schedule : bool, default: False
         True if printing a schedule.
-
     """
     if not isinstance(sfg, SFG):
         raise TypeError("An SFG must be provided")
diff --git a/b_asic/schedule.py b/b_asic/schedule.py
index dc9976cbc29045e6299f14bc20b21a07793a07dd..b41c3619952e6ebeda848c17349eb3e6bade8125 100644
--- a/b_asic/schedule.py
+++ b/b_asic/schedule.py
@@ -41,12 +41,12 @@ from b_asic.types import TypeName
 _EXECUTION_TIME_COLOR: Union[
     Tuple[float, float, float], Tuple[float, float, float, float]
 ] = tuple(float(c / 255) for c in EXECUTION_TIME_COLOR)
-_LATENCY_COLOR: Union[
-    Tuple[float, float, float], Tuple[float, float, float, float]
-] = tuple(float(c / 255) for c in LATENCY_COLOR)
-_SIGNAL_COLOR: Union[
-    Tuple[float, float, float], Tuple[float, float, float, float]
-] = tuple(float(c / 255) for c in SIGNAL_COLOR)
+_LATENCY_COLOR: Union[Tuple[float, float, float], Tuple[float, float, float, float]] = (
+    tuple(float(c / 255) for c in LATENCY_COLOR)
+)
+_SIGNAL_COLOR: Union[Tuple[float, float, float], Tuple[float, float, float, float]] = (
+    tuple(float(c / 255) for c in SIGNAL_COLOR)
+)
 
 
 def _laps_default():
@@ -143,6 +143,11 @@ class Schedule:
     def start_time_of_operation(self, graph_id: GraphID) -> int:
         """
         Return the start time of the operation with the specified by *graph_id*.
+
+        Parameters
+        ----------
+        graph_id : GraphID
+            The graph id of the operation to get the start time for.
         """
         if graph_id not in self._start_times:
             raise ValueError(f"No operation with graph_id {graph_id} in schedule")
@@ -171,8 +176,9 @@ class Schedule:
 
         Returns
         -------
-        The number of time steps the operation with *graph_id* can ba moved
-        forward in time.
+        int
+            The number of time steps the operation with *graph_id* can ba moved
+            forward in time.
 
         See Also
         --------
@@ -232,10 +238,12 @@ class Schedule:
 
         Returns
         -------
-        The number of time steps the operation with *graph_id* can ba moved
+        int
+            The number of time steps the operation with *graph_id* can ba moved
             backward in time.
-        .. note:: The backward slack is positive, but a call to :func:`move_operation`
-            should be negative to move the operation backward.
+        .. note:: The backward slack is positive, but a call to
+            :func:`move_operation` should be negative to move the operation
+            backward.
 
         See Also
         --------
@@ -284,8 +292,9 @@ class Schedule:
 
     def slacks(self, graph_id: GraphID) -> Tuple[int, int]:
         """
-        Return the backward and forward slacks of operation *graph_id*. That is, how
-        much the operation can be moved backward and forward in time.
+        Return the backward and forward slacks of operation *graph_id*.
+
+        That is, how much the operation can be moved backward and forward in time.
 
         Parameters
         ----------
@@ -294,7 +303,8 @@ class Schedule:
 
         Returns
         -------
-        A tuple as ``(backward_slack, forward_slack)``.
+        tuple(int, int)
+            The backward and forward slacks, respectively.
         .. note:: The backward slack is positive, but a call to :func:`move_operation`
             should be negative to move the operation backward.
 
@@ -302,7 +312,6 @@ class Schedule:
         --------
         backward_slack
         forward_slack
-
         """
         if graph_id not in self._start_times:
             raise ValueError(f"No operation with graph_id {graph_id} in schedule")
@@ -320,7 +329,6 @@ class Schedule:
             * 0: alphabetical on Graph ID
             * 1: backward slack
             * 2: forward slack
-
         """
         res = [
             (
@@ -373,7 +381,6 @@ class Schedule:
         ----------
         operation_id : GraphID
             The GraphID of the operation to swap.
-
         """
         self._original_sfg.swap_io_of_operation(operation_id)
         self._sfg.swap_io_of_operation(operation_id)
@@ -443,8 +450,9 @@ class Schedule:
 
     def _get_all_times(self) -> List[int]:
         """
-        Return a list of all times for the schedule. Used to check how the
-        resolution can be modified.
+        Return a list of all times for the schedule.
+
+        Used to check how the resolution can be modified.
         """
         # Local values
         ret = [self._schedule_time, *self._start_times.values()]
@@ -530,7 +538,6 @@ class Schedule:
         insert : bool, optional
             If True, all operations on that y-position will be moved one position.
             The default is False.
-
         """
         if insert:
             for gid in self._y_locations:
@@ -565,7 +572,6 @@ class Schedule:
         -------
         int
             The y-position of the operation.
-
         """
         return self._y_locations[graph_id]
 
@@ -579,7 +585,6 @@ class Schedule:
             The GraphID of the operation to move.
         y_location : int
             The new y-position of the operation.
-
         """
         self._y_locations[graph_id] = y_location
 
@@ -880,7 +885,6 @@ class Schedule:
         Returns
         -------
         ProcessCollection
-
         """
         return ProcessCollection(
             set(self._get_memory_variables_list()), self.schedule_time
@@ -894,7 +898,6 @@ class Schedule:
         Returns
         -------
         ProcessCollection
-
         """
         return ProcessCollection(
             {
@@ -919,7 +922,7 @@ class Schedule:
         y_location = self._y_locations[graph_id]
         if y_location is None:
             # Assign the lowest row number not yet in use
-            used = set(loc for loc in self._y_locations.values() if loc is not None)
+            used = {loc for loc in self._y_locations.values() if loc is not None}
             possible = set(range(len(self._start_times))) - used
             y_location = min(possible)
             self._y_locations[graph_id] = y_location
diff --git a/b_asic/scheduler_gui/axes_item.py b/b_asic/scheduler_gui/axes_item.py
index 12342aaa249826fe2fdb6977eca282754df9644f..43d56c9dfb74a4c9399a8584a59f88c3834f3efd 100644
--- a/b_asic/scheduler_gui/axes_item.py
+++ b/b_asic/scheduler_gui/axes_item.py
@@ -1,5 +1,4 @@
 #!/usr/bin/env python3
-# -*- coding: utf-8 -*-
 """
 B-ASIC Scheduler-gui Axes Item Module.
 
@@ -111,7 +110,7 @@ class AxesItem(QGraphicsItemGroup):
         self._make_base()
 
     def clear(self) -> None:
-        """Sets all children's parent to 'None' and delete the axes."""
+        """Set all children's parent to None and delete the axes."""
         # TODO: update, needed?
         # self._timeline.setParentItem(None)
         self._event_items = []
@@ -119,22 +118,24 @@ class AxesItem(QGraphicsItemGroup):
     @property
     def width(self) -> int:
         """
-        Get or set the current x-axis width. Setting the width to a new
-        value will update the axes automatically.
+        Get or set the current x-axis width.
+
+        Setting the width to a new value will update the axes automatically.
         """
         return self._width
 
     @property
     def height(self) -> float:
         """
-        Get or set the current y-axis height. Setting the height to a new
-        value will update the axes automatically.
+        Get or set the current y-axis height.
+
+        Setting the height to a new value will update the axes automatically.
         """
         return self._height
 
     @property
     def event_items(self) -> List[QGraphicsItem]:
-        """Return a list of objects, that receives events."""
+        """Return a list of objects that receives events."""
         return [self._x_ledger[-1]]
 
     def _register_event_item(self, item: QGraphicsItem) -> None:
diff --git a/b_asic/scheduler_gui/main_window.py b/b_asic/scheduler_gui/main_window.py
index db83d4256001d9f1f69e2ed0bd540e680fd6d543..c82466c92b5e0b34a7811bf8ff00fd9eb463dcfa 100644
--- a/b_asic/scheduler_gui/main_window.py
+++ b/b_asic/scheduler_gui/main_window.py
@@ -1,5 +1,4 @@
 #!/usr/bin/env python3
-# -*- coding: utf-8 -*-
 """
 B-ASIC Scheduler-GUI Module.
 
@@ -75,18 +74,18 @@ if __debug__:
     from qtpy import QtCore
 
     QT_API = os.environ.get("QT_API", "")
-    log.debug("Qt version (runtime):      {}".format(QtCore.qVersion()))
-    log.debug("Qt version (compile time): {}".format(QtCore.__version__))
-    log.debug("QT_API:                    {}".format(QT_API))
+    log.debug(f"Qt version (runtime):      {QtCore.qVersion()}")
+    log.debug(f"Qt version (compile time): {QtCore.__version__}")
+    log.debug(f"QT_API:                    {QT_API}")
     if QT_API.lower().startswith("pyside"):
         import PySide2
 
-        log.debug("PySide version:           {}".format(PySide2.__version__))
+        log.debug(f"PySide version:           {PySide2.__version__}")
     if QT_API.lower().startswith("pyqt"):
         from qtpy.QtCore import PYQT_VERSION_STR
 
-        log.debug("PyQt version:             {}".format(PYQT_VERSION_STR))
-    log.debug("QtPy version:             {}".format(qtpy.__version__))
+        log.debug(f"PyQt version:             {PYQT_VERSION_STR}")
+    log.debug(f"QtPy version:             {qtpy.__version__}")
 
 
 # The following QCoreApplication values is used for QSettings among others
@@ -318,11 +317,11 @@ class ScheduleMainWindow(QMainWindow, Ui_MainWindow):
         Load a python script as a module and search for a Schedule object. If
         found, opens it.
         """
-        log.debug("abs_path_filename = {}.".format(abs_path_filename))
+        log.debug(f"abs_path_filename = {abs_path_filename}.")
 
         module_name = inspect.getmodulename(abs_path_filename)
         if not module_name:  # return if empty module name
-            log.error("Could not load module from file '{}'.".format(abs_path_filename))
+            log.error(f"Could not load module from file '{abs_path_filename}'.")
             return
 
         try:
@@ -519,6 +518,8 @@ class ScheduleMainWindow(QMainWindow, Ui_MainWindow):
     @Slot(bool)
     def hide_exit_dialog(self, checked: bool) -> None:
         """
+        Update state of exit dialog setting.
+
         SLOT(bool) for SIGNAL(menu_exit_dialog.triggered)
         Takes in a boolean and stores 'checked' in 'hide_exit_dialog' item in
         settings.
@@ -546,6 +547,8 @@ class ScheduleMainWindow(QMainWindow, Ui_MainWindow):
     @Slot(str)
     def info_table_update_component(self, graph_id: GraphID) -> None:
         """
+        Fill the 'Operation' part of the info table.
+
         SLOT(str) for SIGNAL(_graph._signals.component_selected)
         Takes in an operator-id, first clears the 'Operator' part of the info
         table and then fill in the table with new values from the operator
@@ -557,6 +560,8 @@ class ScheduleMainWindow(QMainWindow, Ui_MainWindow):
     @Slot()
     def info_table_update_schedule(self) -> None:
         """
+        Update the 'Schedule' part of the info table.
+
         SLOT() for SIGNAL(_graph._signals.schedule_time_changed)
         Updates the 'Schedule' part of the info table.
         """
@@ -566,6 +571,8 @@ class ScheduleMainWindow(QMainWindow, Ui_MainWindow):
     @Slot(QRectF)
     def shrink_scene_to_min_size(self, rect: QRectF) -> None:
         """
+        Make scene minimum size.
+
         SLOT(QRectF) for SIGNAL(_scene.sceneRectChanged)
         Takes in a QRectF (unused) and shrink the scene bounding rectangle to
         its minimum size, when the bounding rectangle signals a change in
@@ -609,7 +616,7 @@ class ScheduleMainWindow(QMainWindow, Ui_MainWindow):
             if not hide_dialog:
                 settings.setValue("scheduler/hide_exit_dialog", checkbox.isChecked())
             self._write_settings()
-            log.info("Exit: {}".format(os.path.basename(__file__)))
+            log.info(f"Exit: {os.path.basename(__file__)}")
             event.accept()
         else:
             event.ignore()
@@ -685,7 +692,7 @@ class ScheduleMainWindow(QMainWindow, Ui_MainWindow):
         settings.setValue("scheduler/splitter/pos", self.splitter.sizes()[1])
 
         if settings.isWritable():
-            log.debug("Settings written to '{}'.".format(settings.fileName()))
+            log.debug(f"Settings written to '{settings.fileName()}'.")
         else:
             log.warning("Settings cant be saved to file, read-only.")
 
@@ -709,12 +716,16 @@ class ScheduleMainWindow(QMainWindow, Ui_MainWindow):
             settings.value("scheduler/hide_exit_dialog", False, bool)
         )
 
-        log.debug("Settings read from '{}'.".format(settings.fileName()))
+        log.debug(f"Settings read from '{settings.fileName()}'.")
 
     def info_table_fill_schedule(self, schedule: Schedule) -> None:
         """
-        Take a Schedule and fill in the 'Schedule' part of the info table
-        with values from *schedule*.
+        Fill the 'Schedule' part of the info table.
+
+        Parameters
+        ----------
+        schedule : Schedule
+            The Schedule to get information from.
         """
         self.info_table.insertRow(1)
         self.info_table.insertRow(1)
@@ -725,8 +736,12 @@ class ScheduleMainWindow(QMainWindow, Ui_MainWindow):
 
     def _info_table_fill_component(self, graph_id: GraphID) -> None:
         """
-        Take an operator-id and fill in the 'Operator' part of the info
-        table with values from the operator associated with *graph_id*.
+        Fill the 'Operator' part of the info table.
+
+        Parameters
+        ----------
+        graph_id : GraphID
+            The GraphID of the operator to get information from.
         """
         if self.schedule is None:
             return
@@ -769,12 +784,12 @@ class ScheduleMainWindow(QMainWindow, Ui_MainWindow):
         si += 1
 
     def info_table_clear(self) -> None:
-        """Clears the info table."""
+        """Clear the info table."""
         self.info_table_clear_component()
         self.info_table_clear_schedule()
 
     def info_table_clear_schedule(self) -> None:
-        """Clears the schedule part of the info table."""
+        """Clear the schedule part of the info table."""
         row = self.info_table.findItems("Operator", Qt.MatchFlag.MatchExactly)
         if row:
             row = row[0].row()
@@ -789,7 +804,7 @@ class ScheduleMainWindow(QMainWindow, Ui_MainWindow):
         QApplication.quit()
 
     def info_table_clear_component(self) -> None:
-        """Clears the component part of the info table."""
+        """Clear the component part of the info table."""
         row = self.info_table.findItems("Operator", Qt.MatchFlag.MatchExactly)
         if row:
             row = row[0].row()
@@ -826,7 +841,6 @@ class ScheduleMainWindow(QMainWindow, Ui_MainWindow):
         self._graph._execution_time_plot(type_name)
 
     def _show_execution_times_for_variables(self):
-        print("Show")
         self._execution_time_for_variables = MPLWindow("Execution times for variables")
         self._schedule.get_memory_variables().plot(
             self._execution_time_for_variables.axes, allow_excessive_lifetimes=True
diff --git a/b_asic/scheduler_gui/operation_item.py b/b_asic/scheduler_gui/operation_item.py
index e6d823e03397b57adcfb79a94a2814460606f97c..6f75542d7deb261e29a7f839694f3110689b32f6 100644
--- a/b_asic/scheduler_gui/operation_item.py
+++ b/b_asic/scheduler_gui/operation_item.py
@@ -1,5 +1,4 @@
 #!/usr/bin/env python3
-# -*- coding: utf-8 -*-
 """
 B-ASIC Scheduler-GUI Operation Item Module.
 
@@ -73,8 +72,9 @@ class OperationItem(QGraphicsItemGroup):
         height: float = OPERATION_HEIGHT,
     ):
         """
-        Construct a OperationItem. *parent* is passed to QGraphicsItemGroup's
-        constructor.
+        Construct a OperationItem.
+
+        *parent* is passed to QGraphicsItemGroup's constructor.
         """
         super().__init__(parent=parent)
         self._operation = operation
@@ -118,19 +118,19 @@ class OperationItem(QGraphicsItemGroup):
     #     return True
 
     def clear(self) -> None:
-        """Sets all children's parent to None and delete the axis."""
+        """Set all children's parent to None and delete the axis."""
         for item in self.childItems():
             item.setParentItem(None)
             del item
 
     @property
     def graph_id(self) -> GraphID:
-        """The graph-id of the operation that the item corresponds to."""
+        """GraphID of the operation that the item corresponds to."""
         return self._operation.graph_id
 
     @property
     def name(self) -> str:
-        """The name of the operation that the item corresponds to."""
+        """Name of the operation that the item corresponds to."""
         return self._operation.name
 
     @property
@@ -141,8 +141,9 @@ class OperationItem(QGraphicsItemGroup):
     @property
     def height(self) -> float:
         """
-        Get or set the current component height. Setting the height to a new
-        value will update the component automatically.
+        Get or set the current component height.
+
+        Setting the height to a new value will update the component automatically.
         """
         return self._height
 
@@ -214,7 +215,7 @@ class OperationItem(QGraphicsItemGroup):
         self._latency_item.setBrush(brush)
 
     def _make_component(self) -> None:
-        """Makes a new component out of the stored attributes."""
+        """Make a new component out of the stored attributes."""
         latency_outline_pen = QPen(Qt.GlobalColor.black)  # used by component outline
         latency_outline_pen.setWidthF(2 / self._scale)
         # latency_outline_pen.setCapStyle(Qt.RoundCap)
diff --git a/b_asic/scheduler_gui/scheduler_event.py b/b_asic/scheduler_gui/scheduler_event.py
index 7610d510a65358367c4d261849ff333cafd6dfef..293bb4126ebf9e7d9b6846e8e2cb2b5e1652bfbc 100644
--- a/b_asic/scheduler_gui/scheduler_event.py
+++ b/b_asic/scheduler_gui/scheduler_event.py
@@ -1,5 +1,4 @@
 #!/usr/bin/env python3
-# -*- coding: utf-8 -*-
 """
 B-ASIC Scheduler-GUI Graphics Scheduler Event Module.
 
@@ -78,9 +77,10 @@ class SchedulerEvent:  # PyQt5
 
     def installSceneEventFilters(self, filterItems) -> None:
         """
-        Installs an event filter for *filterItems* on 'self', causing all events
-        for *filterItems* to first pass through 'self's ``sceneEventFilter()``
-        method. *filterItems* can be one object or a list of objects.
+        Install an event filter for *filterItems* on 'self'.
+
+        This causes all events for *filterItems* to first pass through
+        :meth:`sceneEventFilter`. *filterItems* can be one object or a list of objects.
         """
         item: OperationItem
         for item in filterItems:
@@ -96,8 +96,9 @@ class SchedulerEvent:  # PyQt5
 
     def removeSceneEventFilters(self, filterItems) -> None:
         """
-        Removes an event filter on *filterItems* from *self*. *filterItems* can
-        be one object or a list of objects.
+        Remove an event filter on *filterItems* from *self*.
+
+        *filterItems* can be one object or a list of objects.
         """
         item: OperationItem
         for item in filterItems:
@@ -105,7 +106,8 @@ class SchedulerEvent:  # PyQt5
 
     def sceneEventFilter(self, item: QGraphicsItem, event: QEvent) -> bool:
         """
-        Returns True if the event was filtered (i.e. stopped), otherwise False.
+        Return True if the event was filtered (i.e. stopped), otherwise False.
+
         If False is returned, the event is forwarded to the appropriate child in
         the event chain.
         """
@@ -143,8 +145,9 @@ class SchedulerEvent:  # PyQt5
 
     def operation_mouseMoveEvent(self, event: QGraphicsSceneMouseEvent) -> None:
         """
-        Set the position of the graphical element in the graphic scene,
-        translate coordinates of the cursor within the graphic element in the
+        Set the position of the graphical element in the graphic scene.
+
+        This translates coordinates of the cursor within the graphic element in the
         coordinate system of the parent object.
         """
 
@@ -176,10 +179,12 @@ class SchedulerEvent:  # PyQt5
 
     def operation_mousePressEvent(self, event: QGraphicsSceneMouseEvent) -> None:
         """
-        Changes the cursor to ClosedHandCursor when grabbing an object and
-        stores the current position in item's parent coordinates. *event* will
-        by default be accepted, and this item is then the mouse grabber. This
-        allows the item to receive future move, release and double-click events.
+        Change the cursor to ClosedHandCursor or open context menu.
+
+        This is used when grabbing an object and stores the current position in item's
+        parent coordinates. *event* will by default be accepted, and this item is then
+        the mouse grabber. This allows the item to receive future move, release and
+        double-click events.
         """
         item: OperationItem = self.scene().mouseGrabberItem()
         if event.button() == Qt.MouseButton.LeftButton:
@@ -239,8 +244,9 @@ class SchedulerEvent:  # PyQt5
     ###################################
     def timeline_mouseMoveEvent(self, event: QGraphicsSceneMouseEvent) -> None:
         """
-        Set the position of the graphical element in the graphic scene,
-        translate coordinates of the cursor within the graphic element in the
+        Set the position of the graphical element in the graphic scene.
+
+        This translates coordinates of the cursor within the graphic element in the
         coordinate system of the parent object. The object can only move
         horizontally in x-axis scale steps.
         """
@@ -262,9 +268,10 @@ class SchedulerEvent:  # PyQt5
 
     def timeline_mousePressEvent(self, event: QGraphicsSceneMouseEvent) -> None:
         """
-        Store the current position in item's parent coordinates. *event* will
-        by default be accepted, and this item is then the mouse grabber. This
-        allows the item to receive future move, release and double-click events.
+        Store the current position in item's parent coordinates.
+
+        *event* will by default be accepted, and this item is then the mouse grabber.
+        This allows the item to receive future move, release and double-click events.
         """
         item: TimelineItem = self.scene().mouseGrabberItem()
         self._delta_time = 0
@@ -274,7 +281,7 @@ class SchedulerEvent:  # PyQt5
         event.accept()
 
     def timeline_mouseReleaseEvent(self, event: QGraphicsSceneMouseEvent) -> None:
-        """Updates the schedule time."""
+        """Update the schedule time."""
         item: TimelineItem = self.scene().mouseGrabberItem()
         item.hide_label()
         if self._delta_time != 0:
diff --git a/b_asic/scheduler_gui/scheduler_item.py b/b_asic/scheduler_gui/scheduler_item.py
index 66986c0a4fcd7bbbc41ee0649d860eb2d74341e4..35bddbdd48022faced1334f0da759915c9caef43 100644
--- a/b_asic/scheduler_gui/scheduler_item.py
+++ b/b_asic/scheduler_gui/scheduler_item.py
@@ -1,5 +1,4 @@
 #!/usr/bin/env python3
-# -*- coding: utf-8 -*-
 """
 B-ASIC Scheduler-GUI Scheduler Item Module.
 
@@ -50,12 +49,11 @@ class SchedulerItem(SchedulerEvent, QGraphicsItemGroup):  # PySide2 / PyQt5
         Whether to draw processes with execution time longer than schedule time in
         a different color.
 
-    port_numbers : bool, default: False
+    show_port_numbers : bool, default: False
         Whether to show port numbers on the operations.
 
-
     parent : QGraphicsItem, optional
-        The parent. Passed to the constructor of QGraphicsItemGroup
+        The parent. Passed to the constructor of QGraphicsItemGroup.
     """
 
     _axes: Optional[AxesItem]
@@ -72,8 +70,9 @@ class SchedulerItem(SchedulerEvent, QGraphicsItemGroup):  # PySide2 / PyQt5
         parent: Optional[QGraphicsItem] = None,
     ):
         """
-        Construct a SchedulerItem. *parent* is passed to QGraphicsItemGroup's
-        constructor.
+        Construct a SchedulerItem.
+
+        *parent* is passed to QGraphicsItemGroup's constructor.
         """
         # QGraphicsItemGroup.__init__(self, self)
         # SchedulerEvent.__init__(self)
@@ -107,8 +106,7 @@ class SchedulerItem(SchedulerEvent, QGraphicsItemGroup):  # PySide2 / PyQt5
 
     def is_component_valid_pos(self, item: OperationItem, pos: float) -> bool:
         """
-        Take in a component position and return True if the component's new
-        position is valid, False otherwise.
+        Take in a component position and return True if the new position is valid.
 
         Parameters
         ----------
@@ -184,13 +182,14 @@ class SchedulerItem(SchedulerEvent, QGraphicsItemGroup):  # PySide2 / PyQt5
 
     def set_item_active(self, item: OperationItem) -> None:
         """
-        Set *item* as active, i.e., draw it and connecting signals in special colors.
+        Set *item* as active.
+
+        This means draw it and connecting signals in special colors.
 
         Parameters
         ----------
         item : :class:`b_asic.scheduler_gui.operation_item.OperationItem`
             The item to set as active.
-
         """
         item.set_active()
         for signal in self._signal_dict[item]:
@@ -198,14 +197,14 @@ class SchedulerItem(SchedulerEvent, QGraphicsItemGroup):  # PySide2 / PyQt5
 
     def set_item_inactive(self, item: OperationItem) -> None:
         """
-        Set *item* as inactive, i.e., draw it and connecting signals in standard
-        colors.
+        Set *item* as inactive.
+
+        This means draw it and connecting signals in standard colors.
 
         Parameters
         ----------
         item : :class:`b_asic.scheduler_gui.operation_item.OperationItem`
             The item to set as active.
-
         """
         item.set_inactive()
         for signal in self._signal_dict[item]:
@@ -219,7 +218,6 @@ class SchedulerItem(SchedulerEvent, QGraphicsItemGroup):  # PySide2 / PyQt5
         ----------
         item : :class:`b_asic.scheduler_gui.operation_item.OperationItem`
             The item to set as active.
-
         """
         pos = item.x()
         op_start_time = self.schedule.start_time_of_operation(item.graph_id)
@@ -237,7 +235,6 @@ class SchedulerItem(SchedulerEvent, QGraphicsItemGroup):  # PySide2 / PyQt5
         ----------
         delta_time : int
             The time difference to check for.
-
         """
         # TODO: implement
         # item = self.scene().mouseGrabberItem()
diff --git a/b_asic/signal.py b/b_asic/signal.py
index 86b2325e7061e2c00e8332ec2142425383042695..df04fadcb46ab56bd233e972f4aa8b61b5a38eb1 100644
--- a/b_asic/signal.py
+++ b/b_asic/signal.py
@@ -141,7 +141,6 @@ class Signal(AbstractGraphComponent):
             changing the destination of the argument Signal will not affect this Signal.
             If Operation, it must have a single input, otherwise a TypeError
             is raised.
-
         """
         # import here to avoid cyclic imports
         from b_asic.operation import Operation
diff --git a/b_asic/signal_flow_graph.py b/b_asic/signal_flow_graph.py
index 74d3f1a2c54200d6702ae0de1eba9113470554bc..d848d4ffc1955616c0f2afc397db99ca64ddb913 100644
--- a/b_asic/signal_flow_graph.py
+++ b/b_asic/signal_flow_graph.py
@@ -111,7 +111,6 @@ class SFG(AbstractOperation):
     name : Name, optional
 
     input_sources :
-
     """
 
     _components_by_id: Dict[GraphID, GraphComponent]
@@ -535,6 +534,7 @@ class SFG(AbstractOperation):
     def find_by_type_name(self, type_name: TypeName) -> Sequence[GraphComponent]:
         """
         Find all components in this graph with the specified type name.
+
         Returns an empty sequence if no components were found.
 
         Parameters
@@ -552,6 +552,7 @@ class SFG(AbstractOperation):
     def find_by_id(self, graph_id: GraphID) -> Optional[GraphComponent]:
         """
         Find the graph component with the specified ID.
+
         Returns None if the component was not found.
 
         Parameters
@@ -564,6 +565,7 @@ class SFG(AbstractOperation):
     def find_by_name(self, name: Name) -> Sequence[GraphComponent]:
         """
         Find all graph components with the specified name.
+
         Returns an empty sequence if no components were found.
 
         Parameters
@@ -577,8 +579,9 @@ class SFG(AbstractOperation):
         self, name: Name, output_index: int = 0
     ) -> Sequence[ResultKey]:
         """
-        Find all graph components with the specified name and
-        return a sequence of the keys to use when fetching their results
+        Find all graph components with the specified name.
+
+        Return a sequence of the keys to use when fetching their results
         from a simulation.
 
         Parameters
@@ -756,7 +759,6 @@ class SFG(AbstractOperation):
         ----------
         operation_id : GraphID
             The GraphID of the operation to swap.
-
         """
         operation = cast(Operation, self.find_by_id(operation_id))
         if operation is not None:
@@ -775,7 +777,6 @@ class SFG(AbstractOperation):
         ----------
         operation_id : GraphID
             The GraphID of the operation to remove.
-
         """
         sfg_copy = self()
         operation = cast(Operation, sfg_copy.find_by_id(operation_id))
@@ -845,7 +846,6 @@ class SFG(AbstractOperation):
         The SFG in precedence form in Graphviz format.
 
         This can be rendered in enriched shells.
-
         """
         p_list = self.get_precedence_list()
         pg = Digraph()
@@ -1052,7 +1052,6 @@ class SFG(AbstractOperation):
             ``Addition.type_name()``.
         latency : int
             The latency of the operation.
-
         """
         for op in self.find_by_type_name(type_name):
             cast(Operation, op).set_latency(latency)
@@ -1401,7 +1400,7 @@ class SFG(AbstractOperation):
         splines: str = "spline",
     ) -> Digraph:
         """
-        Returns a Digraph of the SFG.
+        Return a Digraph of the SFG.
 
         Can be directly displayed in IPython.
 
@@ -1409,7 +1408,7 @@ class SFG(AbstractOperation):
         ----------
         show_id : bool, default: False
             If True, the graph_id:s of signals are shown.
-        engine : string, optional
+        engine : str, optional
             Graphviz layout engine to be used, see https://graphviz.org/documentation/.
             Most common are "dot" and "neato". Default is None leading to dot.
         branch_node : bool, default: True
@@ -1424,7 +1423,6 @@ class SFG(AbstractOperation):
         -------
         Digraph
             Digraph of the SFG.
-
         """
         dg = Digraph()
         dg.attr(rankdir="LR", splines=splines)
@@ -1515,14 +1513,14 @@ class SFG(AbstractOperation):
 
         Parameters
         ----------
-        fmt : string, optional
+        fmt : str, optional
             File format of the generated graph. Output formats can be found at
             https://www.graphviz.org/doc/info/output.html
             Most common are "pdf", "eps", "png", and "svg". Default is None which
             leads to PDF.
         show_id : bool, default: False
             If True, the graph_id:s of signals are shown.
-        engine : string, optional
+        engine : str, optional
             Graphviz layout engine to be used, see https://graphviz.org/documentation/.
             Most common are "dot" and "neato". Default is None leading to dot.
         branch_node : bool, default: True
@@ -1532,7 +1530,6 @@ class SFG(AbstractOperation):
             more.
         splines : {"spline", "line", "ortho", "polyline", "curved"}, default: "spline"
             Spline style, see https://graphviz.org/docs/attrs/splines/ for more info.
-
         """
 
         dg = self.sfg_digraph(
@@ -1577,7 +1574,7 @@ class SFG(AbstractOperation):
 
         Parameters
         ----------
-        factor : string, optional
+        factor : int
             Number of times to unfold
         """
 
diff --git a/b_asic/signal_generator.py b/b_asic/signal_generator.py
index e9bc99b4cc5faeb4d7260bdafb727cc4d124faf8..7ce87cc1edd784b854e2c4c8f3cc368218847a61 100644
--- a/b_asic/signal_generator.py
+++ b/b_asic/signal_generator.py
@@ -13,10 +13,12 @@ if you want more information.
 
 from math import pi, sin
 from numbers import Number
-from typing import Optional, Sequence, Union
+from typing import List, Optional, Sequence, Union
 
 import numpy as np
 
+from b_asic.types import Num
+
 
 class SignalGenerator:
     """
@@ -169,13 +171,13 @@ class FromFile(SignalGenerator):
 
     Parameters
     ----------
-    path : string
+    path : str
         Path to input file.
     """
 
     def __init__(self, path) -> None:
         self._path = path
-        data = np.loadtxt(path, dtype=complex).tolist()
+        data: List[Num] = np.loadtxt(path, dtype=complex).tolist()
         self._data = data
         self._len = len(data)
 
@@ -226,10 +228,10 @@ class Gaussian(SignalGenerator):
     ----------
     seed : int, optional
         The seed of the random number generator.
-    scale : float, default: 1.0
-        The standard deviation of the noise.
     loc : float, default: 0.0
         The average value of the noise.
+    scale : float, default: 1.0
+        The standard deviation of the noise.
     """
 
     def __init__(
@@ -261,7 +263,6 @@ class Uniform(SignalGenerator):
 
     See :py:meth:`numpy.random.Generator.normal` for further details.
 
-
     Parameters
     ----------
     seed : int, optional
diff --git a/b_asic/simulation.py b/b_asic/simulation.py
index 0f00e098d5993cfb98c52f42f1332e1d8529f60e..2a6e7b6e81c2569aec7aa1a63ea891b05e060720 100644
--- a/b_asic/simulation.py
+++ b/b_asic/simulation.py
@@ -74,8 +74,7 @@ class Simulation:
 
     def set_input(self, index: int, input_provider: InputProvider) -> None:
         """
-        Set the input used to get values for the specific input at the given index of\
- the internal SFG.
+        Set the input used to for a specific input index.
 
         Parameters
         ----------
@@ -135,8 +134,10 @@ class Simulation:
         quantize: bool = True,
     ) -> Sequence[Num]:
         """
-        Run the simulation until its iteration is greater than or equal to the given\
- iteration and return the output values of the last iteration.
+        Run the simulation a given number of iterations.
+
+        Will run until the number of iterations is greater than or equal to the given
+        iteration and return the output values of the last iteration.
         """
         result: Sequence[Num] = []
         while self._iteration < iteration:
@@ -167,8 +168,9 @@ class Simulation:
         quantize: bool = True,
     ) -> Sequence[Num]:
         """
-        Run a given number of iterations of the simulation and return the output\
- values of the last iteration.
+        Run a given number of iterations of the simulation.
+
+        Return the output values of the last iteration.
         """
         return self.run_until(
             self._iteration + iterations, save_results, bits_override, quantize
@@ -181,8 +183,9 @@ class Simulation:
         quantize: bool = True,
     ) -> Sequence[Num]:
         """
-        Run the simulation until the end of its input arrays and return the output\
- values of the last iteration.
+        Run the simulation until the end of its input arrays.
+
+        Return the output values of the last iteration.
         """
         if self._input_length is None:
             raise IndexError("Tried to run unlimited simulation")
@@ -202,8 +205,8 @@ class Simulation:
         that was run with *save_results* enabled.
         The mapping is indexed using the ``key()`` method of Operation with the
         appropriate output index.
-        Example result after 3 iterations::
 
+        Example result after 3 iterations::
             {"c1": [3, 6, 7], "c2": [4, 5, 5], "bfly1.0": [7, 0, 0], "bfly1.1":\
  [-1, 0, 2], "0": [7, -2, -1]}
         """
diff --git a/b_asic/special_operations.py b/b_asic/special_operations.py
index e523f3429861552075d62065a6817887aae34731..0e05a379d26e177a6f9817e06ca6bbb24174f979 100644
--- a/b_asic/special_operations.py
+++ b/b_asic/special_operations.py
@@ -23,6 +23,11 @@ class Input(AbstractOperation):
 
     Represents an input port to an SFG.
     Its value will be updated on each iteration when simulating the SFG.
+
+    Parameters
+    ==========
+    name : Name, optional
+        Operation name.
     """
 
     is_linear = True
@@ -99,6 +104,14 @@ class Output(AbstractOperation):
     Represents an output port to an SFG.
     The SFG will forward its input to the corresponding output signal
     destinations.
+
+    Parameters
+    ==========
+
+    src0 : SignalSourceProvider, optional
+        The signal connected to the Output operation.
+    name : Name, optional
+        Operation name.
     """
 
     is_linear = True
diff --git a/b_asic/utils.py b/b_asic/utils.py
index 19cf56422c359b682174f7a5660a5cf4a3eb8f0a..c128a32b949a3c54d5e2eb9e396b7329cf64ebd9 100644
--- a/b_asic/utils.py
+++ b/b_asic/utils.py
@@ -115,6 +115,5 @@ def decompose(a: Sequence[Num], factor: int) -> List[List[Num]]:
     [[0, 2, 4], [1, 3, 5]]
     >>> decompose(a, 3)
     [[0, 3], [1, 4], [2, 5]]
-
     """
     return [downsample(a, factor, phase) for phase in range(factor)]
diff --git a/docs_sphinx/Makefile b/docs_sphinx/Makefile
index 1bede10d4c691064a14a196b5a7d13ab23b919ca..9ca4e409e5429d4f02a7d3800240f2c3bdef75ed 100644
--- a/docs_sphinx/Makefile
+++ b/docs_sphinx/Makefile
@@ -10,7 +10,7 @@ BUILDDIR      = _build
 
 # Put it first so that "make" without argument is like "make help".
 help:
-	@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
+	@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(O)
 
 .PHONY: help Makefile
 
diff --git a/docs_sphinx/conf.py b/docs_sphinx/conf.py
index 74075c277ced34395c6dfe7dc8f39c29d750eadc..b56dcfbe831afefed4bb00f81462f3971a2c9209 100644
--- a/docs_sphinx/conf.py
+++ b/docs_sphinx/conf.py
@@ -46,6 +46,16 @@ intersphinx_mapping = {
 }
 
 numpydoc_show_class_members = False
+numpydoc_validation_checks = {
+    "all",
+    "ES01",
+    "SA01",
+    "EX01",
+    "RT01",
+    "GL08",
+    "SA04",
+    "RT03",
+}
 
 inheritance_node_attrs = dict(fontsize=16)
 
diff --git a/pyproject.toml b/pyproject.toml
index 141c0faa7b0493aff87af62447848bdf8e0f0603..95d5929deefb49143317df6c9a303c3c94972c0c 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -2,33 +2,31 @@
 name = "b-asic"
 description = "Better ASIC Toolbox"
 readme = "README.md"
-maintainers = [
-    { name = "Oscar Gustafsson", email = "oscar.gustafsson@liu.se" },
-]
+maintainers = [{ name = "Oscar Gustafsson", email = "oscar.gustafsson@liu.se" }]
 license = { file = "LICENSE" }
 requires-python = ">=3.8"
 dependencies = [
-    "numpy",
-    "qtpy",
-    "graphviz>=0.19",
-    "matplotlib",
-    "setuptools_scm[toml]>=6.2",
-    "networkx",
-    "qtawesome"
+  "numpy",
+  "qtpy",
+  "graphviz>=0.19",
+  "matplotlib",
+  "setuptools_scm[toml]>=6.2",
+  "networkx",
+  "qtawesome"
 ]
 classifiers = [
-    "Intended Audience :: Education",
-    "Intended Audience :: Science/Research",
-    "Programming Language :: Python :: 3",
-    "Programming Language :: Python :: 3.8",
-    "Programming Language :: Python :: 3.9",
-    "Programming Language :: Python :: 3.10",
-    "Programming Language :: Python :: 3.11",
-    "Programming Language :: C++",
-    "License :: OSI Approved :: MIT License",
-    "Operating System :: OS Independent",
-    "Topic :: Scientific/Engineering :: Electronic Design Automation (EDA)",
-    "Development Status :: 3 - Alpha",
+  "Intended Audience :: Education",
+  "Intended Audience :: Science/Research",
+  "Programming Language :: Python :: 3",
+  "Programming Language :: Python :: 3.8",
+  "Programming Language :: Python :: 3.9",
+  "Programming Language :: Python :: 3.10",
+  "Programming Language :: Python :: 3.11",
+  "Programming Language :: C++",
+  "License :: OSI Approved :: MIT License",
+  "Operating System :: OS Independent",
+  "Topic :: Scientific/Engineering :: Electronic Design Automation (EDA)",
+  "Development Status :: 3 - Alpha",
 ]
 dynamic = ["version", "authors"]
 
@@ -39,7 +37,12 @@ zip-safe = false
 include = ["b_asic*"]
 
 [build-system]
-requires = ["setuptools>=45", "setuptools_scm[toml]>=6.2", "wheel", "oldest-supported-numpy"]
+requires = [
+  "setuptools>=45",
+  "setuptools_scm[toml]>=6.2",
+  "wheel",
+  "oldest-supported-numpy"
+]
 build-backend = "setuptools.build_meta"
 
 [tool.setuptools_scm]
@@ -56,18 +59,13 @@ documentation = "https://da.gitlab-pages.liu.se/B-ASIC/"
 skip-string-normalization = true
 preview = true
 line-length = 88
-exclude = [
-    "test/test_gui", "b_asic/scheduler_gui/ui_main_window.py"
-]
+exclude = ["test/test_gui", "b_asic/scheduler_gui/ui_main_window.py"]
 
 [tool.isort]
 profile = "black"
 line_length = 88
 src_paths = ["b_asic", "test"]
-skip = [
-    "test/test_gui", "b_asic/scheduler_gui/ui_main_window.py"
-]
-
+skip = ["test/test_gui", "b_asic/scheduler_gui/ui_main_window.py"]
 
 [tool.mypy]
 packages = ["b_asic", "test"]