add NamedPattern

libcentric
Jan Petykiewicz 1 year ago
parent 171d61ccab
commit 3105a669b4

@ -7,7 +7,7 @@ import numpy
from numpy import pi
from numpy.typing import ArrayLike
from ..pattern import Pattern
from ..pattern import Pattern, NamedPattern
from ..ref import Ref
from ..library import MutableLibrary
from ..error import PortError, BuildError
@ -253,7 +253,7 @@ class Builder(PortList):
def plug(
self: BB,
other: Union[Abstract, str],
other: Union[Abstract, str, NamedPattern],
map_in: Dict[str, str],
map_out: Optional[Dict[str, Optional[str]]] = None,
*,
@ -352,7 +352,7 @@ class Builder(PortList):
def place(
self: BB,
other: Union[Abstract, str],
other: Union[Abstract, str, NamedPattern],
*,
offset: ArrayLike = (0, 0),
rotation: float = 0,

@ -25,7 +25,7 @@ from .label import Label
from .abstract import Abstract
if TYPE_CHECKING:
from .pattern import Pattern
from .pattern import Pattern, NamedPattern
logger = logging.getLogger(__name__)
@ -447,7 +447,7 @@ class MutableLibrary(Library, MutableMapping[str, 'Pattern'], metaclass=ABCMeta)
del self[old_name]
return self
def create(self, base_name: str) -> Tuple[str, 'Pattern']:
def create(self, base_name: str) -> NamedPattern:
"""
Convenience method to create an empty pattern, choose a name
for it, add it with that name, and return both the pattern and name.
@ -460,8 +460,9 @@ class MutableLibrary(Library, MutableMapping[str, 'Pattern'], metaclass=ABCMeta)
"""
from .pattern import Pattern
name = self.get_name(base_name)
pat = Pattern()
self[name] = value
npat = NamedPattern(name)
self[name] = npat
return npat
def name_and_set(
self,
@ -748,6 +749,8 @@ class WrapLibrary(MutableLibrary):
if callable(value):
value = value()
elif hasattr(value, 'as_pattern'):
value = cast('NamedPattern', value).as_pattern() # don't want to carry along NamedPattern instances
else:
value = value
self.mapping[key] = value

@ -665,3 +665,50 @@ class Pattern(PortList, AnnotatableImpl, Mirrorable):
pyplot.ylabel('y')
pyplot.show()
class NamedPattern(Pattern):
"""
TODO: Document NamedPattern
"""
__slots__ = ('_name',)
_name: str
""" The pattern's name """
@property
def name(self) -> str:
return self._name
def __init__(self, name: str) -> None:
"""
Creates an empty NamedPattern
Args:
name: The pattern's name. Immutable.
"""
Pattern.__init__(self)
self._name = name
def __repr__(self) -> str:
s = f'<NamedPattern "{self.name}":'
s += f' sh{len(self.shapes)} sp{len(self.refs)} la{len(self.labels)} ['
for name, port in self.ports.items():
s += f'\n\t{name}: {port}'
s += ']>'
return s
def __copy__(self) -> Pattern:
return Pattern.__copy__(self)
def __deepcopy__(self, memo: Optional[Dict] = None) -> Pattern:
return Pattern.__deepcopy__(self, memo)
def as_pattern(self) -> Pattern:
return Pattern(
shapes=self.shapes,
labels=self.labels,
refs=self.refs,
annotations=self.annotations,
ports=self.ports,
)

Loading…
Cancel
Save