fixes/updates
This commit is contained in:
parent
069dde3648
commit
85a2eb6acc
@ -235,8 +235,12 @@ class Library(Mapping[str, 'Pattern'], metaclass=ABCMeta):
|
|||||||
|
|
||||||
if target not in flattened:
|
if target not in flattened:
|
||||||
flatten_single(target)
|
flatten_single(target)
|
||||||
if flattened[target] is None:
|
|
||||||
|
target_pat = flattened[target]
|
||||||
|
if target_pat is None:
|
||||||
raise PatternError(f'Circular reference in {name} to {target}')
|
raise PatternError(f'Circular reference in {name} to {target}')
|
||||||
|
if target_pat.is_empty() # avoid some extra allocations
|
||||||
|
continue
|
||||||
|
|
||||||
p = ref.as_pattern(pattern=flattened[target])
|
p = ref.as_pattern(pattern=flattened[target])
|
||||||
if not flatten_ports:
|
if not flatten_ports:
|
||||||
@ -613,8 +617,8 @@ class MutableLibrary(Library, MutableMapping[str, 'Pattern'], metaclass=ABCMeta)
|
|||||||
raise LibraryError('Received a non-Tree library containing multiple cells')
|
raise LibraryError('Received a non-Tree library containing multiple cells')
|
||||||
|
|
||||||
name = next(iter(other))
|
name = next(iter(other))
|
||||||
self.add(other)
|
rename_map = self.add(other)
|
||||||
return name
|
return rename_map.get(name, name)
|
||||||
|
|
||||||
def dedup(
|
def dedup(
|
||||||
self: ML,
|
self: ML,
|
||||||
|
@ -521,6 +521,7 @@ class Pattern(PortList, AnnotatableImpl, Mirrorable):
|
|||||||
|
|
||||||
def is_empty(self) -> bool:
|
def is_empty(self) -> bool:
|
||||||
"""
|
"""
|
||||||
|
# TODO is_empty doesn't include ports... maybe there should be an equivalent?
|
||||||
Returns:
|
Returns:
|
||||||
True if the pattern is contains no shapes, labels, or refs.
|
True if the pattern is contains no shapes, labels, or refs.
|
||||||
"""
|
"""
|
||||||
@ -575,6 +576,7 @@ class Pattern(PortList, AnnotatableImpl, Mirrorable):
|
|||||||
"""
|
"""
|
||||||
flattened: Dict[Optional[str], Optional[P]] = {}
|
flattened: Dict[Optional[str], Optional[P]] = {}
|
||||||
|
|
||||||
|
# TODO both Library and Pattern have flatten()... pattern is in-place?
|
||||||
def flatten_single(name: Optional[str]) -> None:
|
def flatten_single(name: Optional[str]) -> None:
|
||||||
if name is None:
|
if name is None:
|
||||||
pat = self
|
pat = self
|
||||||
@ -589,8 +591,12 @@ class Pattern(PortList, AnnotatableImpl, Mirrorable):
|
|||||||
|
|
||||||
if target not in flattened:
|
if target not in flattened:
|
||||||
flatten_single(target)
|
flatten_single(target)
|
||||||
if flattened[target] is None:
|
|
||||||
|
target_pat = flattened[target]
|
||||||
|
if target_pat is None:
|
||||||
raise PatternError(f'Circular reference in {name} to {target}')
|
raise PatternError(f'Circular reference in {name} to {target}')
|
||||||
|
if target_pat.is_empty() # avoid some extra allocations
|
||||||
|
continue
|
||||||
|
|
||||||
p = ref.as_pattern(pattern=flattened[target])
|
p = ref.as_pattern(pattern=flattened[target])
|
||||||
if not flatten_ports:
|
if not flatten_ports:
|
||||||
|
@ -200,6 +200,9 @@ class Ref(
|
|||||||
return None
|
return None
|
||||||
if library is not None and self.target not in library:
|
if library is not None and self.target not in library:
|
||||||
raise PatternError(f'get_bounds() called on dangling reference to "{self.target}"')
|
raise PatternError(f'get_bounds() called on dangling reference to "{self.target}"')
|
||||||
|
if pattern is not None and pattern.is_empty():
|
||||||
|
# no need to run as_pattern()
|
||||||
|
return None
|
||||||
return self.as_pattern(pattern=pattern, library=library).get_bounds(library)
|
return self.as_pattern(pattern=pattern, library=library).get_bounds(library)
|
||||||
|
|
||||||
def __repr__(self) -> str:
|
def __repr__(self) -> str:
|
||||||
|
Loading…
Reference in New Issue
Block a user