diff --git a/b_asic/basic_operation.py b/b_asic/basic_operation.py index e87860c6a226484afd6d3ba6c28811cd7b545b66..6810a9a753e327773d6ed8fe11e136b4ffb686e1 100644 --- a/b_asic/basic_operation.py +++ b/b_asic/basic_operation.py @@ -8,9 +8,10 @@ from b_asic.signal import SignalSource, SignalDestination from b_asic.operation import OperationId, Operation from b_asic.simulation import SimulationState, OperationState from abc import ABC, abstractmethod -from typing import List, Dict, Optional, Any, final +from typing import List, Dict, Optional, Any from numbers import Number + class BasicOperation(Operation): """ Generic abstract operation class which most implementations will derive from. @@ -38,43 +39,33 @@ class BasicOperation(Operation): """ pass - @final def id(self) -> OperationId: return self._identifier - - @final + def inputs(self) -> List[InputPort]: return self._input_ports.copy() - @final def outputs(self) -> List[OutputPort]: return self._output_ports.copy() - @final def input_count(self) -> int: return len(self._input_ports) - @final def output_count(self) -> int: return len(self._output_ports) - @final def input(self, i: int) -> InputPort: return self._input_ports[i] - @final def output(self, i: int) -> OutputPort: return self._output_ports[i] - @final def params(self) -> Dict[str, Optional[Any]]: return self._parameters.copy() - - @final + def param(self, name: str) -> Optional[Any]: return self._parameters.get(name) - @final def set_param(self, name: str, value: Any) -> None: assert name in self._parameters # TODO: Error message. self._parameters[name] = value @@ -110,5 +101,5 @@ class BasicOperation(Operation): if all(isinstance(e, Operation) for e in results): return results return [self] - - # TODO: More stuff. \ No newline at end of file + + # TODO: More stuff. diff --git a/b_asic/core_operations.py b/b_asic/core_operations.py index 553d7cff4d7b06cfdc79704773e0d1a3e4edf390..c766d06c2f190b8a20763bf75f2661cb65df2fd0 100644 --- a/b_asic/core_operations.py +++ b/b_asic/core_operations.py @@ -7,7 +7,7 @@ from b_asic.port import InputPort, OutputPort from b_asic.operation import OperationId, Operation from b_asic.basic_operation import BasicOperation from numbers import Number -from typing import final + class Input(Operation): """ @@ -18,6 +18,7 @@ class Input(Operation): # TODO: Implement. pass + class Constant(BasicOperation): """ Constant value operation. @@ -32,10 +33,10 @@ class Constant(BasicOperation): self._output_ports = [OutputPort()] # TODO: Generate appropriate ID for ports. self._parameters["value"] = value - @final def evaluate(self, inputs: list) -> list: return [self.param("value")] + class Addition(BasicOperation): """ Binary addition operation. @@ -50,7 +51,6 @@ class Addition(BasicOperation): self._input_ports = [InputPort(), InputPort()] # TODO: Generate appropriate ID for ports. self._output_ports = [OutputPort()] # TODO: Generate appropriate ID for ports. - @final def evaluate(self, inputs: list) -> list: return [inputs[0] + inputs[1]] @@ -70,8 +70,7 @@ class ConstantMultiplication(BasicOperation): self._output_ports = [OutputPort()] # TODO: Generate appropriate ID for ports. self._parameters["coefficient"] = coefficient - @final def evaluate(self, inputs: list) -> list: return [inputs[0] * self.param("coefficient")] -# TODO: More operations. \ No newline at end of file +# TODO: More operations. diff --git a/b_asic/operation.py b/b_asic/operation.py index 310491bce3ea18e206d087c298d67d23655bc709..731822f1d0cbc06e5ad244c878c5dbaf8847b905 100644 --- a/b_asic/operation.py +++ b/b_asic/operation.py @@ -13,6 +13,7 @@ if TYPE_CHECKING: OperationId = NewType("OperationId", int) + class Operation(ABC): """ Operation interface. @@ -107,6 +108,6 @@ class Operation(ABC): If splitting is not possible, this may return a list containing only the operation itself. """ pass - + # TODO: More stuff. diff --git a/b_asic/port.py b/b_asic/port.py index 6b1e8d2025ee5696f1365b8b8b2195167620925f..2d5405ed7f204e32342b31f7fc3d41a02f247b42 100644 --- a/b_asic/port.py +++ b/b_asic/port.py @@ -5,10 +5,11 @@ TODO: More info. from b_asic.signal import Signal from abc import ABC, abstractmethod -from typing import NewType, Optional, List, Dict, final +from typing import NewType, Optional, List, Dict PortId = NewType("PortId", int) + class Port(ABC): """ Abstract port class. @@ -22,8 +23,7 @@ class Port(ABC): Construct a Port. """ self._identifier = identifier - - @final + def identifier(self) -> PortId: """ Get the unique identifier. @@ -36,7 +36,7 @@ class Port(ABC): Get a list of all connected signals. """ pass - + @abstractmethod def signal_count(self) -> int: """ @@ -67,6 +67,7 @@ class Port(ABC): # TODO: More stuff. + class InputPort(Port): """ Input port. @@ -81,31 +82,27 @@ class InputPort(Port): super().__init__(identifier) self._source_signal = None - @final def signals(self) -> List[Signal]: return [] if self._source_signal == None else [self._source_signal] - - @final + def signal_count(self) -> int: return 0 if self._source_signal == None else 1 - @final def signal(self, i: int = 0) -> Signal: assert i >= 0 and i < self.signal_count() # TODO: Error message. assert self._source_signal != None # TODO: Error message. return self._source_signal - @final def connect(self, signal: Signal) -> None: self._source_signal = signal - @final def disconnect(self, i: int = 0) -> None: assert i >= 0 and i < self.signal_count() # TODO: Error message. self._source_signal = None # TODO: More stuff. + class OutputPort(Port): """ Output port. @@ -121,27 +118,22 @@ class OutputPort(Port): super().__init__(identifier) self._destination_signals = [] - @final def signals(self) -> List[Signal]: return self._destination_signals.copy() - @final def signal_count(self) -> int: return len(self._destination_signals) - @final def signal(self, i: int = 0) -> Signal: assert i >= 0 and i < self.signal_count() # TODO: Error message. return self._destination_signals[i] - @final def connect(self, signal: Signal) -> None: assert signal not in self._destination_signals # TODO: Error message. self._destination_signals.append(signal) - - @final + def disconnect(self, i: int = 0) -> None: assert i >= 0 and i < self.signal_count() # TODO: Error message. del self._destination_signals[i] - - # TODO: More stuff. \ No newline at end of file + + # TODO: More stuff. diff --git a/b_asic/precedence_chart.py b/b_asic/precedence_chart.py index 76a22c9fe0b006192b3755268ceecdef0f1174eb..329c78d2d7fea1cc21971c187b43d50b703b205b 100644 --- a/b_asic/precedence_chart.py +++ b/b_asic/precedence_chart.py @@ -5,6 +5,7 @@ TODO: More info. from b_asic.signal_flow_graph import SFG + class PrecedenceChart: """ Precedence chart constructed from a signal flow graph. @@ -21,4 +22,4 @@ class PrecedenceChart: self.sfg = sfg # TODO: Implement. - # TODO: More stuff. \ No newline at end of file + # TODO: More stuff. diff --git a/b_asic/schema.py b/b_asic/schema.py index c7a72526fc9a00f7bf573f98f17b68f6bd8c3003..56eb47ff0ad6674ac7acb610b8bc4bec8dc73d26 100644 --- a/b_asic/schema.py +++ b/b_asic/schema.py @@ -5,6 +5,7 @@ TODO: More info. from b_asic.precedence_chart import PrecedenceChart + class Schema: """ Schema constructed from a precedence chart. @@ -21,4 +22,4 @@ class Schema: self.pc = pc # TODO: Implement. - # TODO: More stuff. \ No newline at end of file + # TODO: More stuff. diff --git a/b_asic/signal.py b/b_asic/signal.py index 36be9f58d6a9a9403fb034140c3b60958f436f85..4fac563faf48cb6a6a7ea585cf7aea44ce259758 100644 --- a/b_asic/signal.py +++ b/b_asic/signal.py @@ -8,6 +8,7 @@ from typing import NewType SignalId = NewType("SignalId", int) + class SignalSource: """ Handle to a signal source. @@ -25,6 +26,7 @@ class SignalSource: # TODO: More stuff. + class SignalDestination: """ Handle to a signal destination. @@ -42,6 +44,7 @@ class SignalDestination: # TODO: More stuff. + class Signal: """ A connection between two operations consisting of a source and destination handle. @@ -65,4 +68,4 @@ class Signal: """ return self._identifier - # TODO: More stuff. \ No newline at end of file + # TODO: More stuff. diff --git a/b_asic/signal_flow_graph.py b/b_asic/signal_flow_graph.py index 8fbbebff824dd3a82e8ba4c10f86286d6d4b828a..f9671636dd345fadfebd2a116a9add2466615db8 100644 --- a/b_asic/signal_flow_graph.py +++ b/b_asic/signal_flow_graph.py @@ -7,7 +7,8 @@ from b_asic.operation import OperationId, Operation from b_asic.basic_operation import BasicOperation from b_asic.signal import SignalSource, SignalDestination from b_asic.simulation import SimulationState, OperationState -from typing import List, final +from typing import List + class SFG(BasicOperation): """ @@ -27,12 +28,10 @@ class SFG(BasicOperation): # TODO: Traverse the graph between the inputs/outputs and add to self._operations. # TODO: Connect ports with signals with appropriate IDs. - @final def evaluate(self, inputs: list) -> list: return [] # TODO: Implement - @final def split(self) -> List[Operation]: return self._operations - # TODO: More stuff. \ No newline at end of file + # TODO: More stuff. diff --git a/b_asic/simulation.py b/b_asic/simulation.py index aa33cb337d913bead6a7446ce093efdb86b09cb5..e219445b38abf7fc755295a4ccf8b6284ce6651b 100644 --- a/b_asic/simulation.py +++ b/b_asic/simulation.py @@ -7,6 +7,7 @@ from b_asic.operation import OperationId from numbers import Number from typing import List, Dict + class OperationState: """ Simulation state of an operation. @@ -23,6 +24,7 @@ class OperationState: self.output_values = [] self.iteration = 0 + class SimulationState: """ Simulation state. @@ -39,4 +41,4 @@ class SimulationState: self.operation_states = {} self.iteration = 0 - # TODO: More stuff. \ No newline at end of file + # TODO: More stuff.