Skip to content
Snippets Groups Projects
operation.py 2.28 KiB
Newer Older
  • Learn to ignore specific revisions
  • """
    B-ASIC Operation Module.
    TODO: More info.
    """
    
    from abc import ABC, abstractmethod
    from numbers import Number
    
    from typing import NewType, List, Dict, Optional, Any, TYPE_CHECKING
    
    if TYPE_CHECKING:
    	from b_asic.port import InputPort, OutputPort
    	from b_asic.simulation import SimulationState
    
    class Operation(ABC):
    	"""
    	Operation interface.
    	TODO: More info.
    	"""
    
    	@abstractmethod
    
    	def inputs(self) -> "List[InputPort]":
    
    		"""
    		Get a list of all input ports.
    		"""
    		pass
    
    	@abstractmethod
    
    	def outputs(self) -> "List[OutputPort]":
    
    		"""
    		Get a list of all output ports.
    		"""
    		pass
    
    	@abstractmethod
    	def input_count(self) -> int:
    		"""
    		Get the number of input ports.
    		"""
    		pass
    
    	@abstractmethod
    	def output_count(self) -> int:
    		"""
    		Get the number of output ports.
    		"""
    		pass
    
    	@abstractmethod
    
    	def input(self, i: int) -> "InputPort":
    
    		"""
    		Get the input port at index i.
    		"""
    		pass
    
    	@abstractmethod
    
    	def output(self, i: int) -> "OutputPort":
    
    		"""
    		Get the output port at index i.
    		"""
    		pass
    
    	@abstractmethod
    	def params(self) -> Dict[str, Optional[Any]]:
    		"""
    		Get a dictionary of all parameter values.
    		"""
    		pass
    
    	@abstractmethod
    	def param(self, name: str) -> Optional[Any]:
    		"""
    		Get the value of a parameter.
    		Returns None if the parameter is not defined.
    		"""
    		pass
    
    	@abstractmethod
    	def set_param(self, name: str, value: Any) -> None:
    		"""
    		Set the value of a parameter.
    		The parameter must be defined.
    		"""
    		pass
    
    	@abstractmethod
    
    	def evaluate_outputs(self, state: "SimulationState") -> List[Number]:
    
    		"""
    		Simulate the circuit until its iteration count matches that of the simulation state,
    		then return the resulting output vector.
    		"""
    		pass
    
    	@abstractmethod
    
    	def split(self) -> "List[Operation]":
    
    		"""
    		Split the operation into multiple operations.
    		If splitting is not possible, this may return a list containing only the operation itself.
    		"""
    		pass
    
    	@abstractmethod
    	def get_op_name(self) -> "GraphIDType":
    		"""Returns a string representing the operation name of the operation."""
    		pass
    
    	@abstractmethod
    	def neighbours(self) -> "List[Operation]":
    		"""
    		Return all operations that are connected by signals to this operation.
    		If no neighbours are found this returns an empty list
    		"""
    
    
    	# TODO: More stuff.