From 4d0c50b5d23e3fc153ff4b42a42182a2e5cf6601 Mon Sep 17 00:00:00 2001 From: Oscar Gustafsson <oscar.gustafsson@gmail.com> Date: Sun, 7 May 2023 17:05:41 +0200 Subject: [PATCH] Minor modifications --- b_asic/architecture.py | 71 ++++++++++++++++++++++----------------- test/test_architecture.py | 4 +-- 2 files changed, 43 insertions(+), 32 deletions(-) diff --git a/b_asic/architecture.py b/b_asic/architecture.py index cfe9d9de..cdf90d6d 100644 --- a/b_asic/architecture.py +++ b/b_asic/architecture.py @@ -15,9 +15,14 @@ class ProcessingElement: Parameters ---------- process_collection : :class:`~b_asic.resources.ProcessCollection` + Process collection containing operations to map to processing element. + entity_name : str, optional + Name of processing element entity. """ - def __init__(self, process_collection: ProcessCollection, name=""): + def __init__( + self, process_collection: ProcessCollection, entity_name: Optional[str] = None + ): if not len(process_collection): raise ValueError( "Do not create ProcessingElement with empty ProcessCollection" @@ -40,22 +45,19 @@ class ProcessingElement: self._collection = process_collection self._operation_type = op_type self._type_name = op_type.type_name() - self._name = name + self._entity_name = entity_name @property def processes(self) -> Set[OperatorProcess]: return {cast(OperatorProcess, p) for p in self._collection} - def __str__(self): - return self._name or self._type_name - def __repr__(self): - return self._name or self._type_name + return self._entity_name or self._type_name - def set_name(self, name: str): - self._name = name + def set_entity_name(self, entity_name: str): + self._entity_name = entity_name - def write_code(self, path: str, entity_name: str) -> None: + def write_code(self, path: str) -> None: """ Write VHDL code for processing element. @@ -63,8 +65,9 @@ class ProcessingElement: ---------- path : str Directory to write code in. - entity_name : str """ + if not self._entity_name: + raise ValueError("Entity name must be set") raise NotImplementedError @@ -78,10 +81,15 @@ class Memory: The ProcessCollection to create a Memory for. memory_type : {'RAM', 'register'} The type of memory. + entity_name : str, optional + Name of memory entity. """ def __init__( - self, process_collection: ProcessCollection, memory_type: str = "RAM", name="" + self, + process_collection: ProcessCollection, + memory_type: str = "RAM", + entity_name: Optional[str] = None, ): if not len(process_collection): raise ValueError("Do not create Memory with empty ProcessCollection") @@ -93,23 +101,24 @@ class Memory: "Can only have MemoryVariable or PlainMemoryVariable in" " ProcessCollection when creating Memory" ) + if memory_type not in ("RAM", "register"): + raise ValueError( + f"memory_type must be 'RAM' or 'register', not {memory_type!r}" + ) self._collection = process_collection self._memory_type = memory_type - self._name = name + self._entity_name = entity_name def __iter__(self): return iter(self._collection) - def set_name(self, name: str): - self._name = name - - def __str__(self): - return self._name or self._memory_type + def set_entity_name(self, entity_name: str): + self._entity_name = entity_name def __repr__(self): - return self._name or self._memory_type + return self._entity_name or self._memory_type - def write_code(self, path: str, entity_name: str) -> None: + def write_code(self, path: str) -> None: """ Write VHDL code for memory. @@ -117,13 +126,9 @@ class Memory: ---------- path : str Directory to write code in. - entity_name : str - - Returns - ------- - - """ + if not self._entity_name: + raise ValueError("Entity name must be set") raise NotImplementedError @@ -137,9 +142,8 @@ class Architecture: The processing elements in the architecture. memories : set of :class:`~b_asic.architecture.Memory` The memories in the architecture. - name : str, default: "arch" - Name for the top-level architecture. Used for the entity and as prefix for all - building blocks. + entity_name : str, default: "arch" + Name for the top-level entity. direct_interconnects : ProcessCollection, optional Process collection of zero-time memory variables used for direct interconnects. """ @@ -148,12 +152,12 @@ class Architecture: self, processing_elements: Set[ProcessingElement], memories: Set[Memory], - name: str = "arch", + entity_name: str = "arch", direct_interconnects: Optional[ProcessCollection] = None, ): self._processing_elements = processing_elements self._memories = memories - self._name = name + self._entity_name = entity_name self._direct_interconnects = direct_interconnects self._variable_inport_to_resource = {} self._variable_outport_to_resource = {} @@ -259,6 +263,9 @@ class Architecture: d_out[i][self._variable_outport_to_resource[output]] += 1 return [dict(d) for d in d_in], [dict(d) for d in d_out] + def set_entity_name(self, entity_name: str): + self._entity_name = entity_name + @property def memories(self) -> Set[Memory]: return self._memories @@ -266,3 +273,7 @@ class Architecture: @property def processing_elements(self) -> Set[ProcessingElement]: return self._processing_elements + + @property + def direct_interconnects(self) -> Optional[ProcessCollection]: + return self._direct_interconnects diff --git a/test/test_architecture.py b/test/test_architecture.py index 425ebfd3..3d5e59df 100644 --- a/test/test_architecture.py +++ b/test/test_architecture.py @@ -86,7 +86,7 @@ def test_architecture(schedule_direct_form_iir_lp_filter: Schedule): for operation in chain(adders, const_mults, inputs, outputs) ] for i, pe in enumerate(processing_elements): - pe.set_name(f"{pe._type_name.upper()}-{i}") + pe.set_entity_name(f"{pe._type_name.upper()}-{i}") # Extract zero-length memory variables direct_conn, mvs = mvs.split_on_length() @@ -97,7 +97,7 @@ def test_architecture(schedule_direct_form_iir_lp_filter: Schedule): ] assert len(memories) == 1 for i, memory in enumerate(memories): - memory.set_name(f"mem-{i}") + memory.set_entity_name(f"mem-{i}") # Create architecture from architecture = Architecture( -- GitLab