Newer
Older
"""
B-ASIC Signal Flow Graph Module.
TODO: More info.
"""

Jacob Wahlman
committed
from b_asic.operation import Operation
from b_asic.basic_operation import BasicOperation

Jacob Wahlman
committed
from b_asic.signal import Signal, SignalSource, SignalDestination
from b_asic.simulation import SimulationState, OperationState

Jacob Wahlman
committed
from b_asic.graph_id import GraphIDGenerator, GraphID

Jacob Wahlman
committed
from typing import List, Dict, Union, Optional
class SFG(BasicOperation):
"""
Signal flow graph.
TODO: More info.
"""

Jacob Wahlman
committed
_graph_objects_by_id: Dict[GraphID, Union[Operation, Signal]]
_graph_id_generator: GraphIDGenerator

Jacob Wahlman
committed
def __init__(self, input_destinations: List[SignalDestination], output_sources: List[SignalSource]):
"""Constructs an SFG."""
super().__init__()
# TODO: Allocate input/output ports with appropriate IDs.

Jacob Wahlman
committed
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

Jacob Wahlman
committed
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
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