Skip to content
Snippets Groups Projects
port.py 2.61 KiB
Newer Older
  • Learn to ignore specific revisions
  • """@package docstring
    
    B-ASIC Port Module.
    TODO: More info.
    """
    
    from abc import ABC, abstractmethod
    
    from typing import NewType, Optional, List
    
    from b_asic.signal import Signal
    
    
    PortId = NewType("PortId", int)
    
    
    class Port(ABC):
    
    	"""Abstract port class.
    
    	TODO: More info.
    	"""
    
    	_identifier: PortId
    
    	def __init__(self, identifier: PortId):
    
    		"""Construct a Port."""
    
    		self._identifier = identifier
    
    	def identifier(self) -> PortId:
    
    		"""Get the unique identifier."""
    
    		return self._identifier
    
    	@abstractmethod
    	def signals(self) -> List[Signal]:
    
    		"""Get a list of all connected signals."""
    
    		pass
    
    	@abstractmethod
    	def signal_count(self) -> int:
    
    		"""Get the number of connected signals."""
    
    		pass
    
    	@abstractmethod
    	def signal(self, i: int = 0) -> Signal:
    
    		"""Get the connected signal at index i."""
    
    		pass
    
    	@abstractmethod
    	def connect(self, signal: Signal) -> None:
    
    		"""Connect a signal."""
    
    		pass
    
    	@abstractmethod
    	def disconnect(self, i: int = 0) -> None:
    
    		"""Disconnect a signal."""
    
    		pass
    
    	# TODO: More stuff.
    
    
    class InputPort(Port):
    
    	"""Input port.
    
    	TODO: More info.
    	"""
    	_source_signal: Optional[Signal]
    
    	def __init__(self, identifier: PortId):
    		super().__init__(identifier)
    		self._source_signal = None
    
    	def signals(self) -> List[Signal]:
    
    		return [] if self._source_signal is None else [self._source_signal]
    
    	def signal_count(self) -> int:
    
    		return 0 if self._source_signal is None else 1
    
    
    	def signal(self, i: int = 0) -> Signal:
    
    		assert 0 <= i < self.signal_count() # TODO: Error message.
    		assert self._source_signal is not None # TODO: Error message.
    
    		return self._source_signal
    
    	def connect(self, signal: Signal) -> None:
    		self._source_signal = signal
    
    	def disconnect(self, i: int = 0) -> None:
    
    		assert 0 <= i < self.signal_count() # TODO: Error message.
    
    		self._source_signal = None
    
    	# TODO: More stuff.
    
    
    class OutputPort(Port):
    
    	"""Output port.
    
    	TODO: More info.
    	"""
    
    	_destination_signals: List[Signal]
    
    	def __init__(self, identifier: PortId):
    		super().__init__(identifier)
    		self._destination_signals = []
    
    	def signals(self) -> List[Signal]:
    		return self._destination_signals.copy()
    
    	def signal_count(self) -> int:
    		return len(self._destination_signals)
    
    	def signal(self, i: int = 0) -> Signal:
    
    		assert 0 <= i < self.signal_count() # TODO: Error message.
    
    		return self._destination_signals[i]
    
    	def connect(self, signal: Signal) -> None:
    		assert signal not in self._destination_signals # TODO: Error message.
    		self._destination_signals.append(signal)
    
    	def disconnect(self, i: int = 0) -> None:
    
    		assert 0 <= i < self.signal_count() # TODO: Error message.
    
    		del self._destination_signals[i]