From da43e52d0b01a9221ae2009006704546f4472e06 Mon Sep 17 00:00:00 2001 From: Mikael Henriksson <mike.zx@hotmail.com> Date: Tue, 9 May 2023 18:18:53 +0200 Subject: [PATCH] architecture.py: add assignments of Resources --- b_asic/architecture.py | 33 ++++++++++++++++ b_asic/resources.py | 23 ++++++----- .../test_left_edge_cell_assignment.png | Bin 23058 -> 22846 bytes test/test_resources.py | 36 ++++++++++++------ 4 files changed, 68 insertions(+), 24 deletions(-) diff --git a/b_asic/architecture.py b/b_asic/architecture.py index 510a29b4..28f44d96 100644 --- a/b_asic/architecture.py +++ b/b_asic/architecture.py @@ -5,6 +5,7 @@ from collections import defaultdict from io import TextIOWrapper from typing import Dict, Iterable, Iterator, List, Optional, Set, Tuple, Union, cast +import matplotlib.pyplot as plt from graphviz import Digraph from b_asic.port import InputPort, OutputPort @@ -132,6 +133,7 @@ class Resource(HardwareBlock): self._collection = process_collection self._input_count = -1 self._output_count = -1 + self._assignment: Optional[List[ProcessCollection]] = None def __repr__(self): return self.entity_name @@ -172,6 +174,19 @@ class Resource(HardwareBlock): # doc-string inherited return self._collection.schedule_time + def show_content(self): + if not self.is_assigned: + self._collection.show() + else: + fig, ax = plt.subplots() + for i, pc in enumerate(self._assignment): # type: ignore + pc.plot(ax=ax, row=i) + fig.show() # type: ignore + + @property + def is_assigned(self) -> bool: + return self._assignment is not None + class ProcessingElement(Resource): """ @@ -210,6 +225,11 @@ class ProcessingElement(Resource): self._entity_name = entity_name self._input_count = ops[0].input_count self._output_count = ops[0].output_count + self._assignment = list( + self._collection.split_on_execution_time(heuristic="left_edge") + ) + if len(self._assignment) > 1: + raise ValueError("Cannot map ProcessCollection to single ProcessingElement") @property def processes(self) -> Set[OperatorProcess]: @@ -275,6 +295,19 @@ class Memory(Resource): # Add information about the iterator type return cast(Iterator[MemoryVariable], iter(self._collection)) + def _assign_ram(self, heuristic: str = "left_edge"): + """ + Perform RAM-type assignment of MemoryVariables in this Memory. + + Parameters + ---------- + heuristic : {'left_edge', 'graph_color'} + The underlying heuristic to use when performing RAM assignment. + """ + self._assignment = list( + self._collection.split_on_execution_time(heuristic=heuristic) + ) + class Architecture(HardwareBlock): """ diff --git a/b_asic/resources.py b/b_asic/resources.py index 8ad13879..a3155736 100644 --- a/b_asic/resources.py +++ b/b_asic/resources.py @@ -852,7 +852,7 @@ class ProcessCollection: ) return self._split_from_graph_coloring(coloring) elif heuristic == "left_edge": - raise NotImplementedError() + return self._left_edge_assignment() else: raise ValueError(f"Invalid heuristic '{heuristic}'") @@ -989,18 +989,17 @@ class ProcessCollection: def __iter__(self): return iter(self._collection) - def graph_color_cell_assignment( + def _graph_color_assignment( self, coloring_strategy: str = "saturation_largest_first", *, coloring: Optional[Dict[Process, int]] = None, ) -> Set["ProcessCollection"]: """ - Perform cell assignment of the processes in this collection using graph - coloring. + Perform assignment of the processes in this collection using graph coloring. - Two or more processes can share a single cell if, and only if, they have no - overlaping time alive. + Two or more processes can share a single resource if, and only if, they have no + overlaping execution time. Parameters ---------- @@ -1029,17 +1028,17 @@ class ProcessCollection: cell_assignment[cell].add_process(process) return set(cell_assignment.values()) - def left_edge_cell_assignment(self) -> Dict[int, "ProcessCollection"]: + def _left_edge_assignment(self) -> Set["ProcessCollection"]: """ - Perform cell assignment of the processes in this collection using the left-edge + Perform assignment of the processes in this collection using the left-edge algorithm. - Two or more processes can share a single cell if, and only if, they have no - overlaping time alive. + Two or more processes can share a single resource if, and only if, they have no + overlaping execution time. Returns ------- - Dict[int, ProcessCollection] + Set[ProcessCollection] """ next_empty_cell = 0 cell_assignment: Dict[int, ProcessCollection] = dict() @@ -1070,7 +1069,7 @@ class ProcessCollection: ) cell_assignment[next_empty_cell].add_process(next_process) next_empty_cell += 1 - return cell_assignment + return {pc for pc in cell_assignment.values()} def generate_memory_based_storage_vhdl( self, diff --git a/test/baseline/test_left_edge_cell_assignment.png b/test/baseline/test_left_edge_cell_assignment.png index 45420a64ac885227c686564337c2be329830e71e..337acdb18320c885a946e47c9f14efc5525c6b84 100644 GIT binary patch literal 22846 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 Jmvv4FO#uBeoQwbf literal 23058 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 S!z2a<1_n=8KbLh*2~7Y#uCO!! diff --git a/test/test_resources.py b/test/test_resources.py index 6751879f..c5952f4c 100644 --- a/test/test_resources.py +++ b/test/test_resources.py @@ -34,27 +34,30 @@ class TestProcessCollectionPlainMemoryVariable: @pytest.mark.mpl_image_compare(style='mpl20') def test_left_edge_cell_assignment(self, simple_collection: ProcessCollection): fig, ax = plt.subplots(1, 2) - assignment = simple_collection.left_edge_cell_assignment() - for cell in assignment: - assignment[cell].plot(ax=ax[1], row=cell) # type: ignore + assignment = simple_collection._left_edge_assignment() + for i, cell in enumerate(assignment): + cell.plot(ax=ax[1], row=i) # type: ignore simple_collection.plot(ax[0]) # type:ignore return fig def test_cell_assignment_matrix_transposer(self): collection = generate_matrix_transposer(4, min_lifetime=5) - assignment_left_edge = collection.left_edge_cell_assignment() - assignment_graph_color = collection.graph_color_cell_assignment( + assignment_left_edge = collection._left_edge_assignment() + assignment_graph_color = collection.split_on_execution_time( coloring_strategy='saturation_largest_first' ) - assert len(assignment_left_edge.keys()) == 18 + assert len(assignment_left_edge) == 18 assert len(assignment_graph_color) == 16 def test_generate_memory_based_vhdl(self): for rows in [2, 3, 4, 5, 7]: collection = generate_matrix_transposer(rows, min_lifetime=0) - assignment = collection.graph_color_cell_assignment() + assignment = collection.split_on_execution_time(heuristic="graph_color") collection.generate_memory_based_storage_vhdl( - filename=f'b_asic/codegen/testbench/streaming_matrix_transposition_memory_{rows}x{rows}.vhdl', + filename=( + 'b_asic/codegen/testbench/' + f'streaming_matrix_transposition_memory_{rows}x{rows}.vhdl' + ), entity_name=f'streaming_matrix_transposition_memory_{rows}x{rows}', assignment=assignment, word_length=16, @@ -65,22 +68,31 @@ class TestProcessCollectionPlainMemoryVariable: generate_matrix_transposer( rows, min_lifetime=0 ).generate_register_based_storage_vhdl( - filename=f'b_asic/codegen/testbench/streaming_matrix_transposition_register_{rows}x{rows}.vhdl', + filename=( + 'b_asic/codegen/testbench/streaming_matrix_transposition_' + f'register_{rows}x{rows}.vhdl' + ), entity_name=f'streaming_matrix_transposition_register_{rows}x{rows}', word_length=16, ) def test_rectangular_matrix_transposition(self): collection = generate_matrix_transposer(rows=4, cols=8, min_lifetime=2) - assignment = collection.graph_color_cell_assignment() + assignment = collection.split_on_execution_time(heuristic="graph_color") collection.generate_memory_based_storage_vhdl( - filename='b_asic/codegen/testbench/streaming_matrix_transposition_memory_4x8.vhdl', + filename=( + 'b_asic/codegen/testbench/streaming_matrix_transposition_memory_' + '4x8.vhdl' + ), entity_name='streaming_matrix_transposition_memory_4x8', assignment=assignment, word_length=16, ) collection.generate_register_based_storage_vhdl( - filename='b_asic/codegen/testbench/streaming_matrix_transposition_register_4x8.vhdl', + filename=( + 'b_asic/codegen/testbench/streaming_matrix_transposition_register_' + '4x8.vhdl' + ), entity_name='streaming_matrix_transposition_register_4x8', word_length=16, ) -- GitLab