[Pattern / Library] add resolve_repeated_refs
This commit is contained in:
parent
e5a6aab940
commit
963103b859
2 changed files with 41 additions and 0 deletions
|
|
@ -1063,6 +1063,25 @@ class ILibrary(ILibraryView, MutableMapping[str, 'Pattern'], metaclass=ABCMeta):
|
||||||
|
|
||||||
return self
|
return self
|
||||||
|
|
||||||
|
def resolve_repeated_refs(self, name: str | None = None) -> Self:
|
||||||
|
"""
|
||||||
|
Expand all repeated references into multiple individual references.
|
||||||
|
Alters the library in-place.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
name: If specified, only resolve repeated refs in this pattern.
|
||||||
|
Otherwise, resolve in all patterns.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
self
|
||||||
|
"""
|
||||||
|
if name is not None:
|
||||||
|
self[name].resolve_repeated_refs()
|
||||||
|
else:
|
||||||
|
for pat in self.values():
|
||||||
|
pat.resolve_repeated_refs()
|
||||||
|
return self
|
||||||
|
|
||||||
def subtree(
|
def subtree(
|
||||||
self,
|
self,
|
||||||
tops: str | Sequence[str],
|
tops: str | Sequence[str],
|
||||||
|
|
|
||||||
|
|
@ -976,6 +976,28 @@ class Pattern(PortList, AnnotatableImpl, Mirrorable):
|
||||||
del self.labels[layer]
|
del self.labels[layer]
|
||||||
return self
|
return self
|
||||||
|
|
||||||
|
def resolve_repeated_refs(self) -> Self:
|
||||||
|
"""
|
||||||
|
Expand all repeated references into multiple individual references.
|
||||||
|
Alters the current pattern in-place.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
self
|
||||||
|
"""
|
||||||
|
new_refs: defaultdict[str | None, list[Ref]] = defaultdict(list)
|
||||||
|
for target, rseq in self.refs.items():
|
||||||
|
for ref in rseq:
|
||||||
|
if ref.repetition is None:
|
||||||
|
new_refs[target].append(ref)
|
||||||
|
else:
|
||||||
|
for dd in ref.repetition.displacements:
|
||||||
|
new_ref = ref.deepcopy()
|
||||||
|
new_ref.offset = ref.offset + dd
|
||||||
|
new_ref.repetition = None
|
||||||
|
new_refs[target].append(new_ref)
|
||||||
|
self.refs = new_refs
|
||||||
|
return self
|
||||||
|
|
||||||
def prune_refs(self) -> Self:
|
def prune_refs(self) -> Self:
|
||||||
"""
|
"""
|
||||||
Remove empty ref lists in `self.refs`.
|
Remove empty ref lists in `self.refs`.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue