From 3f26530cf69abc527f9a24f9258c06fe250a413b Mon Sep 17 00:00:00 2001 From: Oscar Gustafsson <oscar.gustafsson@gmail.com> Date: Tue, 9 May 2023 08:28:58 +0200 Subject: [PATCH] Fix formatting --- b_asic/resources.py | 101 ++++++++++++++++++++++++++------------------ 1 file changed, 60 insertions(+), 41 deletions(-) diff --git a/b_asic/resources.py b/b_asic/resources.py index f38030b7..1d2bb49f 100644 --- a/b_asic/resources.py +++ b/b_asic/resources.py @@ -163,20 +163,24 @@ class _ForwardBackwardEntry: outputs_from: Optional[int] = None, ): """ - Single entry in a _ForwardBackwardTable. Aggregate type of input, output and list of registers. + Single entry in a _ForwardBackwardTable. + + Aggregate type of input, output and list of registers. Parameters ---------- - inputs : List[Process], optional + inputs : list of Process, optional input - outputs : List[Process], optional + outputs : list of Process, optional output - regs : List[Optional[Process]], optional + regs : list of Process, optional regs back_edge_to : dict, optional - Dictionary containing back edges of this entry to registers in the next entry. + Dictionary containing back edges of this entry to registers in the next + entry. back_edge_from : dict, optional - Dictionary containing the back edge of the previous entry to registers in this entry. + Dictionary containing the back edge of the previous entry to registers in + this entry. outputs_from : int, optional """ self.inputs: List[Process] = [] if inputs is None else inputs @@ -192,8 +196,10 @@ class _ForwardBackwardEntry: class _ForwardBackwardTable: def __init__(self, collection: 'ProcessCollection'): """ - Forward-Backward allocation table for ProcessCollections. This structure implements the forward-backward - register allocation algorithm, which is used to generate hardware from MemoryVariables in a ProcessCollection. + Forward-Backward allocation table for ProcessCollections. + + This structure implements the forward-backward register allocation algorithm, + which is used to generate hardware from MemoryVariables in a ProcessCollection. Parameters ---------- @@ -218,10 +224,12 @@ class _ForwardBackwardTable: self.table.append(entry) # Insert all processes (one per time-slot) to the table input - # TODO: "Input each variable at the time step corresponding to the beginning of its lifetime. If multiple - # variables are input in a given cycle, theses are allocated to multple registers such that the variable - # with the longest lifetime is allocated to the inital register and the other variables are allocated to - # consecutive registers in decreasing order of lifetime." -- K. Parhi + # TODO: "Input each variable at the time step corresponding to the beginning of + # its lifetime. If multiple variables are input in a given cycle, these + # are allocated to multple registers such that the variable with the + # longest lifetime is allocated to the inital register and the other + # variables are allocated to consecutive registers in decreasing order + # of lifetime." -- K. Parhi for mv in collection: self.table[mv.start_time].inputs.append(mv) if mv.execution_time: @@ -245,13 +253,15 @@ class _ForwardBackwardTable: def _do_forward_allocation(self): """ - Forward all Processes as far as possible in the register chain. Processes are forwarded until they reach their - end time (at which they are added to the output list), or until they reach the end of the register chain. + Forward all Processes as far as possible in the register chain. + + Processes are forwarded until they reach their end time (at which they are + added to the output list), or until they reach the end of the register chain. """ rows = len(self.table) cols = len(self.table[0].regs) - # Note that two passes of the forward allocation need to be done, since variables may loop around the schedule - # cycle boundary. + # Note that two passes of the forward allocation need to be done, since + # variables may loop around the schedule cycle boundary. for _ in range(2): for time, entry in enumerate(self.table): for reg_idx, reg in enumerate(entry.regs): @@ -282,9 +292,9 @@ class _ForwardBackwardTable: cols = len(self.table[0].regs) outputs = {out for e in self.table for out in e.outputs} # - # Pass #1: Find any (one) non-dead variable from the last register and try to backward allocate it to a - # previous register where it is not blocking an open path. This heuristic helps minimize forward allocation - # moves later. + # Pass #1: Find any (one) non-dead variable from the last register and try to + # backward allocate it to a previous register where it is not blocking an open + # path. This heuristic helps minimize forward allocation moves later. # for time, entry in enumerate(self.table): reg = entry.regs[-1] @@ -299,7 +309,8 @@ class _ForwardBackwardTable: next_entry.back_edge_from[nreg_idx] = cols - 1 return # - # Pass #2: Backward allocate the first non-dead variable from the last registers to an empty register. + # Pass #2: Backward allocate the first non-dead variable from the last + # registers to an empty register. # for time, entry in enumerate(self.table): reg = entry.regs[-1] @@ -480,12 +491,12 @@ class ProcessCollection: show_markers : bool, default True Show markers at read and write times. row : int, optional - Render all processes in this collection on a specified row in the matplotlib axes object. - Defaults to None, which renders all processes on separate rows. This option is useful when - drawing cell assignments. + Render all processes in this collection on a specified row in the Matplotlib + axes object. Defaults to None, which renders all processes on separate rows. + This option is useful when drawing cell assignments. allow_excessive_lifetimes : bool, default False - If set to true, the plot method allows ploting collections of variables with a greater lifetime - than the schedule time. + If set to true, the plot method allows ploting collections of variables with + a greater lifetime than the schedule time. Returns ------- @@ -606,8 +617,9 @@ class ProcessCollection: ) -> None: """ Show the process collection using the current Matplotlib backend. - Equivalent to creating a Matplotlib figure, passing it and arguments to :func:`plot` - and invoking :py:meth:`matplotlib.figure.Figure.show`. + + Equivalent to creating a Matplotlib figure, passing it and arguments to + :meth:`plot` and invoking :py:meth:`matplotlib.figure.Figure.show`. Parameters ---------- @@ -624,8 +636,8 @@ class ProcessCollection: show_markers : bool, default True Show markers at read and write times. allow_excessive_lifetimes : bool, default False - If set to true, the plot method allows ploting collections of variables with a greater lifetime - than the schedule time. + If set to True, the plot method allows ploting collections of variables with + a greater lifetime than the schedule time. title : str, optional Title of plot. """ @@ -690,7 +702,6 @@ class ProcessCollection: exclusion_graph = nx.Graph() exclusion_graph.add_nodes_from(self._collection) for node1 in exclusion_graph: - # node1_stop_time = (node1.start_time + node1.execution_time) % self.schedule_time node1_stop_times = tuple( read_time % self.schedule_time for read_time in node1.read_times ) @@ -701,7 +712,6 @@ class ProcessCollection: if node1 == node2: continue else: - # node2_stop_time = (node2.start_time + node2.execution_time) % self.schedule_time node2_stop_times = tuple( read_time % self.schedule_time for read_time in node2.read_times ) @@ -795,7 +805,8 @@ class ProcessCollection: The heuristic used when splitting based on execution times. coloring_strategy : str, default: 'saturation_largest_first' - Node ordering strategy passed to :func:`networkx.algorithms.coloring.greedy_color`. + Node ordering strategy passed to + :func:`networkx.algorithms.coloring.greedy_color`. This parameter is only considered if *heuristic* is set to 'graph_color'. One of @@ -887,7 +898,8 @@ class ProcessCollection: The total number of ports used when splitting process collection based on memory variable access. coloring_strategy : str, default: 'saturation_largest_first' - Node ordering strategy passed to :func:`networkx.algorithms.coloring.greedy_color` + Node ordering strategy passed to + :func:`networkx.algorithms.coloring.greedy_color` One of * 'largest_first' * 'random_sequential' @@ -911,7 +923,8 @@ class ProcessCollection: coloring: Dict[Process, int], ) -> Set["ProcessCollection"]: """ - Split :class:`Process` objects into a set of :class:`ProcessesCollection` objects based on a provided graph coloring. + Split :class:`Process` objects into a set of :class:`ProcessesCollection` + objects based on a provided graph coloring. Resulting :class:`ProcessCollection` will have the same schedule time and cyclic property as self. @@ -960,17 +973,21 @@ class ProcessCollection: coloring: Optional[Dict[Process, int]] = None, ) -> Set["ProcessCollection"]: """ - Perform cell assignment of the processes in this collection using graph coloring. + Perform cell 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 cell if, and only if, they have no + overlaping time alive. Parameters ---------- coloring_strategy : str, default: "saturation_largest_first" - Graph coloring strategy passed to :func:`networkx.algorithms.coloring.greedy_color`. + Graph coloring strategy passed to + :func:`networkx.algorithms.coloring.greedy_color`. coloring : dictionary, optional - An optional graph coloring, dictionary with Process and its associated color (int). - If a graph coloring is not provided throught this parameter, one will be created when calling this method. + An optional graph coloring, dictionary with Process and its associated color + (int). If a graph coloring is not provided throught this parameter, one will + be created when calling this method. Returns ------- @@ -991,9 +1008,11 @@ class ProcessCollection: def left_edge_cell_assignment(self) -> Dict[int, "ProcessCollection"]: """ - Perform cell assignment of the processes in this collection using the left-edge algorithm. + Perform cell 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 cell if, and only if, they have no + overlaping time alive. Returns ------- -- GitLab