From a22e76aad525b583bddcd67ef943692830070421 Mon Sep 17 00:00:00 2001
From: Robier Al Kaadi <robal695@student.liu.se>
Date: Mon, 1 Jul 2024 09:49:23 +0000
Subject: [PATCH] Add slots to architecture classes

---
 b_asic/architecture.py    |  21 +++
 b_asic/core_operations.py | 260 +++++++++++++++++++++++++++++++++++++-
 2 files changed, 280 insertions(+), 1 deletion(-)

diff --git a/b_asic/architecture.py b/b_asic/architecture.py
index 75e5d971..3ccb1a8d 100644
--- a/b_asic/architecture.py
+++ b/b_asic/architecture.py
@@ -53,6 +53,8 @@ class HardwareBlock:
     entity_name : str, optional
         The name of the resulting entity.
     """
+    __slots__ = "_entity_name"
+    _entity_name: Optional[str]
 
     def __init__(self, entity_name: Optional[str] = None):
         self._entity_name: Optional[str] = None
@@ -379,6 +381,9 @@ class ProcessingElement(Resource):
     """
 
     _color = f"#{''.join(f'{v:0>2X}' for v in PE_COLOR)}"
+    __slots__ = ("_process_collection", "_entity_name")
+    _process_collection: ProcessCollection
+    _entity_name : Optional[str]
 
     def __init__(
         self,
@@ -462,6 +467,22 @@ class Memory(Resource):
     """
 
     _color = f"#{''.join(f'{v:0>2X}' for v in MEMORY_COLOR)}"
+    _slots__ = (
+        "_process_collection",
+        "_memory_type",
+        "_entity_name",
+        "_read_ports",
+        "_write_ports",
+        "_total_ports",
+        "_assign",
+    )
+    _process_collection: ProcessCollection
+    _memory_type: Literal["RAM", "register"]
+    _entity_name: Optional[str]
+    _read_ports: Optional[int]
+    _write_ports: Optional[int]
+    _total_ports: Optional[int]
+    _assign: bool
 
     def __init__(
         self,
diff --git a/b_asic/core_operations.py b/b_asic/core_operations.py
index e731a480..df0868ee 100644
--- a/b_asic/core_operations.py
+++ b/b_asic/core_operations.py
@@ -32,6 +32,10 @@ class Constant(AbstractOperation):
         Operation name.
     """
 
+    __slots__ = ("_value", "_name")
+    _value: Num
+    _name: Name
+
     _execution_time = 0
     is_linear = True
     is_constant = True
@@ -73,6 +77,7 @@ class Constant(AbstractOperation):
     def __str__(self) -> str:
         return f"{self.value}"
 
+
 class Addition(AbstractOperation):
     """
     Binary addition operation.
@@ -105,6 +110,21 @@ class Addition(AbstractOperation):
     AddSub
     """
 
+    __slots__ = (
+        "_src0",
+        "_src1",
+        "_name",
+        "_latency",
+        "_latency_offsets",
+        "_execution_time",
+    )
+    _src0: Optional[SignalSourceProvider]
+    _src1: Optional[SignalSourceProvider]
+    _name: Name
+    _latency: Optional[int]
+    _latency_offsets: Optional[Dict[str, int]]
+    _execution_time: Optional[int]
+
     is_linear = True
     is_swappable = True
 
@@ -172,6 +192,21 @@ class Subtraction(AbstractOperation):
 
     is_linear = True
 
+    __slots__ = (
+        "_src0",
+        "_src1",
+        "_name",
+        "_latency",
+        "_latency_offsets",
+        "_execution_time",
+    )
+    _src0: Optional[SignalSourceProvider]
+    _src1: Optional[SignalSourceProvider]
+    _name: Name
+    _latency: Optional[int]
+    _latency_offsets: Optional[Dict[str, int]]
+    _execution_time: Optional[int]
+
     def __init__(
         self,
         src0: Optional[SignalSourceProvider] = None,
@@ -240,6 +275,24 @@ class AddSub(AbstractOperation):
     ========
     Addition, Subtraction
     """
+
+    __slots__ = (
+        "_is_add",
+        "_src0",
+        "_src1",
+        "_name",
+        "_latency",
+        "_latency_offsets",
+        "_execution_time",
+    )
+    _is_add: bool
+    _src0: Optional[SignalSourceProvider]
+    _src1: Optional[SignalSourceProvider]
+    _name: Name
+    _latency: Optional[int]
+    _latency_offsets: Optional[Dict[str, int]]
+    _execution_time: Optional[int]
+
     is_linear = True
 
     def __init__(
@@ -317,6 +370,22 @@ class Multiplication(AbstractOperation):
     ========
     ConstantMultiplication
     """
+
+    __slots__ = (
+        "_src0",
+        "_src1",
+        "_name",
+        "_latency",
+        "_latency_offsets",
+        "_execution_time",
+    )
+    _src0: Optional[SignalSourceProvider]
+    _src1: Optional[SignalSourceProvider]
+    _name: Name
+    _latency: Optional[int]
+    _latency_offsets: Optional[Dict[str, int]]
+    _execution_time: Optional[int]
+
     is_swappable = True
 
     def __init__(
@@ -385,6 +454,21 @@ class Division(AbstractOperation):
     Reciprocal
     """
 
+    __slots__ = (
+        "_src0",
+        "_src1",
+        "_name",
+        "_latency",
+        "_latency_offsets",
+        "_execution_time",
+    )
+    _src0: Optional[SignalSourceProvider]
+    _src1: Optional[SignalSourceProvider]
+    _name: Name
+    _latency: Optional[int]
+    _latency_offsets: Optional[Dict[str, int]]
+    _execution_time: Optional[int]
+
     def __init__(
         self,
         src0: Optional[SignalSourceProvider] = None,
@@ -450,6 +534,22 @@ class Min(AbstractOperation):
     ========
     Max
     """
+
+    __slots__ = (
+        "_src0",
+        "_src1",
+        "_name",
+        "_latency",
+        "_latency_offsets",
+        "_execution_time",
+    )
+    _src0: Optional[SignalSourceProvider]
+    _src1: Optional[SignalSourceProvider]
+    _name: Name
+    _latency: Optional[int]
+    _latency_offsets: Optional[Dict[str, int]]
+    _execution_time: Optional[int]
+
     is_swappable = True
 
     def __init__(
@@ -515,6 +615,22 @@ class Max(AbstractOperation):
     ========
     Min
     """
+
+    __slots__ = (
+        "_src0",
+        "_src1",
+        "_name",
+        "_latency",
+        "_latency_offsets",
+        "_execution_time",
+    )
+    _src0: Optional[SignalSourceProvider]
+    _src1: Optional[SignalSourceProvider]
+    _name: Name
+    _latency: Optional[int]
+    _latency_offsets: Optional[Dict[str, int]]
+    _execution_time: Optional[int]
+
     is_swappable = True
 
     def __init__(
@@ -571,6 +687,13 @@ class SquareRoot(AbstractOperation):
         Operation execution time (time units before operator can be reused).
     """
 
+    __slots__ = ("_src0", "_name", "_latency", "_latency_offsets", "_execution_time")
+    _src0: Optional[SignalSourceProvider]
+    _name: Name
+    _latency: Optional[int]
+    _latency_offsets: Optional[Dict[str, int]]
+    _execution_time: Optional[int]
+
     def __init__(
         self,
         src0: Optional[SignalSourceProvider] = None,
@@ -622,6 +745,13 @@ class ComplexConjugate(AbstractOperation):
         Operation execution time (time units before operator can be reused).
     """
 
+    __slots__ = ("_src0", "_name", "_latency", "_latency_offsets", "_execution_time")
+    _src0: Optional[SignalSourceProvider]
+    _name: Name
+    _latency: Optional[int]
+    _latency_offsets: Optional[Dict[str, int]]
+    _execution_time: Optional[int]
+
     def __init__(
         self,
         src0: Optional[SignalSourceProvider] = None,
@@ -673,6 +803,13 @@ class Absolute(AbstractOperation):
         Operation execution time (time units before operator can be reused).
     """
 
+    __slots__ = ("_src0", "_name", "_latency", "_latency_offsets", "_execution_time")
+    _src0: Optional[SignalSourceProvider]
+    _name: Name
+    _latency: Optional[int]
+    _latency_offsets: Optional[Dict[str, int]]
+    _execution_time: Optional[int]
+
     def __init__(
         self,
         src0: Optional[SignalSourceProvider] = None,
@@ -729,6 +866,22 @@ class ConstantMultiplication(AbstractOperation):
     --------
     Multiplication
     """
+
+    __slots__ = (
+        "_value",
+        "_src0",
+        "_name",
+        "_latency",
+        "_latency_offsets",
+        "_execution_time",
+    )
+    _value: Num
+    _src0: Optional[SignalSourceProvider]
+    _name: Name
+    _latency: Optional[int]
+    _latency_offsets: Optional[Dict[str, int]]
+    _execution_time: Optional[int]
+
     is_linear = True
 
     def __init__(
@@ -802,6 +955,22 @@ class Butterfly(AbstractOperation):
     execution_time : int, optional
         Operation execution time (time units before operator can be reused).
     """
+
+    __slots__ = (
+        "_src0",
+        "_src1",
+        "_name",
+        "_latency",
+        "_latency_offsets",
+        "_execution_time",
+    )
+    _src0: Optional[SignalSourceProvider]
+    _src1: Optional[SignalSourceProvider]
+    _name: Name
+    _latency: Optional[int]
+    _latency_offsets: Optional[Dict[str, int]]
+    _execution_time: Optional[int]
+
     is_linear = True
 
     def __init__(
@@ -865,6 +1034,24 @@ class MAD(AbstractOperation):
     Multiplication
     Addition
     """
+
+    __slots__ = (
+        "_src0",
+        "_src1",
+        "_src2",
+        "_name",
+        "_latency",
+        "_latency_offsets",
+        "_execution_time",
+    )
+    _src0: Optional[SignalSourceProvider]
+    _src1: Optional[SignalSourceProvider]
+    _src2: Optional[SignalSourceProvider]
+    _name: Name
+    _latency: Optional[int]
+    _latency_offsets: Optional[Dict[str, int]]
+    _execution_time: Optional[int]
+
     is_swappable = True
 
     def __init__(
@@ -922,6 +1109,22 @@ class SymmetricTwoportAdaptor(AbstractOperation):
         y_1 & = & x_0 + \text{value}\times\left(x_1 - x_0\right)
         \end{eqnarray}
     """
+
+    __slots__ = (
+        "_src0",
+        "_src1",
+        "_name",
+        "_latency",
+        "_latency_offsets",
+        "_execution_time",
+    )
+    _src0: Optional[SignalSourceProvider]
+    _src1: Optional[SignalSourceProvider]
+    _name: Name
+    _latency: Optional[int]
+    _latency_offsets: Optional[Dict[str, int]]
+    _execution_time: Optional[int]
+
     is_linear = True
     is_swappable = True
 
@@ -1007,6 +1210,13 @@ class Reciprocal(AbstractOperation):
     Division
     """
 
+    __slots__ = ("_src0", "_name", "_latency", "_latency_offsets", "_execution_time")
+    _src0: Optional[SignalSourceProvider]
+    _name: Name
+    _latency: Optional[int]
+    _latency_offsets: Optional[Dict[str, int]]
+    _execution_time: Optional[int]
+
     def __init__(
         self,
         src0: Optional[SignalSourceProvider] = None,
@@ -1066,6 +1276,21 @@ class RightShift(AbstractOperation):
     Shift
     """
 
+    __slots__ = (
+        "_value",
+        "_src0",
+        "_name",
+        "_latency",
+        "_latency_offsets",
+        "_execution_time",
+    )
+    _value: Num
+    _src0: Optional[SignalSourceProvider]
+    _name: Name
+    _latency: Optional[int]
+    _latency_offsets: Optional[Dict[str, int]]
+    _execution_time: Optional[int]
+
     is_linear = True
 
     def __init__(
@@ -1143,6 +1368,21 @@ class LeftShift(AbstractOperation):
     Shift
     """
 
+    __slots__ = (
+        "_value",
+        "_src0",
+        "_name",
+        "_latency",
+        "_latency_offsets",
+        "_execution_time",
+    )
+    _value: Num
+    _src0: Optional[SignalSourceProvider]
+    _name: Name
+    _latency: Optional[int]
+    _latency_offsets: Optional[Dict[str, int]]
+    _execution_time: Optional[int]
+
     is_linear = True
 
     def __init__(
@@ -1221,6 +1461,21 @@ class Shift(AbstractOperation):
     RightShift
     """
 
+    __slots__ = (
+        "_value",
+        "_src0",
+        "_name",
+        "_latency",
+        "_latency_offsets",
+        "_execution_time",
+    )
+    _value: Num
+    _src0: Optional[SignalSourceProvider]
+    _name: Name
+    _latency: Optional[int]
+    _latency_offsets: Optional[Dict[str, int]]
+    _execution_time: Optional[int]
+
     is_linear = True
 
     def __init__(
@@ -1263,6 +1518,7 @@ class Shift(AbstractOperation):
             raise TypeError("value must be an int")
         self.set_param("value", value)
 
+
 class Sink(AbstractOperation):
     r"""
     Sink operation.
@@ -1276,7 +1532,9 @@ class Sink(AbstractOperation):
         Operation name.
     """
 
-    _execution_time = 0
+    __slots__ = "_name"
+    _name: Name
+
     is_linear = True
 
     def __init__(self, name: Name = ""):
-- 
GitLab