""" B-ASIC Signal Flow Graph Module. TODO: More info. """ from b_asic.operation import Operation from b_asic.basic_operation import BasicOperation from b_asic.signal import Signal, SignalSource, SignalDestination from b_asic.simulation import SimulationState, OperationState from b_asic.graph_id import GraphIDGenerator, GraphID from typing import List, Dict, Union, Optional class SFG(BasicOperation): """ Signal flow graph. TODO: More info. """ _graph_objects_by_id: Dict[GraphID, Union[Operation, Signal]] _graph_id_generator: GraphIDGenerator def __init__(self, input_destinations: List[SignalDestination], output_sources: List[SignalSource]): """Constructs an SFG.""" super().__init__() # TODO: Allocate input/output ports with appropriate IDs. self._graph_objects_by_id = dict # Map Operation ID to Operation objects self._graph_id_generator = GraphIDGenerator() # TODO: Traverse the graph between the inputs/outputs and add to self._operations. # TODO: Connect ports with signals with appropriate IDs. def evaluate(self, inputs: list) -> list: return [] # TODO: Implement def add_operation(self, operation: Operation) -> GraphID: """Adds the entered operation to the SFG's dictionary of graph objects and returns a generated GraphID for it. Keyword arguments: operation: Operation to add to the graph. """ return self._add_graph_obj(operation, operation.get_op_name()) def add_signal(self, signal: Signal) -> GraphID: """Adds the entered signal to the SFG's dictionary of graph objects and returns a generated GraphID for it. Keyword argumentst: signal: Signal to add to the graph. """ return self._add_graph_obj(signal, 'sig') def find_by_id(self, graph_id: GraphID) -> Optional[Operation]: """Finds a graph object based on the entered Graph ID and returns it. If no graph object with the entered ID was found then returns None. Keyword arguments: graph_id: Graph ID of the wanted object. """ if graph_id in self._graph_objects_by_id: return self._graph_objects_by_id[graph_id] else: return None def _add_graph_obj(self, obj: Union[Operation, Signal], operation_id_type: str): graph_id = self._graph_id_generator.get_next_id(operation_id_type) self._graph_objects_by_id[graph_id] = obj return graph_id