diff --git a/masque/builder/__init__.py b/masque/builder/__init__.py index 1fabfbf..fc839cb 100644 --- a/masque/builder/__init__.py +++ b/masque/builder/__init__.py @@ -1,3 +1,4 @@ -from .builder import Builder, Abstract +from .builder import Builder +from .abstract import Abstract from .utils import ell from .tools import Tool diff --git a/masque/builder/abstract.py b/masque/builder/abstract.py new file mode 100644 index 0000000..8f4476d --- /dev/null +++ b/masque/builder/abstract.py @@ -0,0 +1,59 @@ +from typing import Dict, Union, Optional +from typing import MutableMapping, TYPE_CHECKING +import copy +import logging + +from ..pattern import Pattern +from ..library import MutableLibrary +from ..ports import PortList, Port +from .tools import Tool + +if TYPE_CHECKING: + from .builder import Builder + + +logger = logging.getLogger(__name__) + + +class Abstract(PortList): + __slots__ = ('name', 'ports') + + name: str + """ Name of the pattern this device references """ + + ports: Dict[str, Port] + """ Uniquely-named ports which can be used to snap instances together""" + + def __init__( + self, + name: str, + ports: Dict[str, Port], + ) -> None: + self.name = name + self.ports = copy.deepcopy(ports) + + def build( + self, + library: MutableLibrary, + tools: Union[None, Tool, MutableMapping[Optional[str], Tool]] = None, + ) -> 'Builder': + """ + Begin building a new device around an instance of the current device + (rather than modifying the current device). + + Returns: + The new `Builder` object. + """ + pat = Pattern(ports=self.ports) + pat.ref(self.name) + new = Builder(library=library, pattern=pat, tools=tools) # TODO should Ref have tools? + return new + + # TODO do we want to store a Ref instead of just a name? then we can translate/rotate/mirror... + + def __repr__(self) -> str: + s = f' None: - self.name = name - self.ports = copy.deepcopy(ports) - - def build( - self, - library: MutableLibrary, - tools: Union[None, Tool, MutableMapping[Optional[str], Tool]] = None, - ) -> 'Builder': - """ - Begin building a new device around an instance of the current device - (rather than modifying the current device). - - Returns: - The new `Builder` object. - """ - pat = Pattern(ports=self.ports) - pat.ref(self.name) - new = Builder(library=library, pattern=pat, tools=tools) # TODO should Ref have tools? - return new - - # TODO do we want to store a Ref instead of just a name? then we can translate/rotate/mirror... - - def __repr__(self) -> str: - s = f' 'Abstract': + def abstract(self, name: str) -> Abstract: + """ + Return an `Abstract` (name & ports) for the pattern in question. + + Args: + name: The pattern name + + Returns: + An `Abstract` object for the pattern + """ return Abstract(name=name, ports=self[name].ports) def __repr__(self) -> str: