Improve documentation on disambiguate_pattern_names
This commit is contained in:
parent
778e54c895
commit
e401f37993
@ -11,7 +11,7 @@ Note that GDSII references follow the same convention as `masque`,
|
|||||||
Scaling, rotation, and mirroring apply to individual instances, not grid
|
Scaling, rotation, and mirroring apply to individual instances, not grid
|
||||||
vectors or offsets.
|
vectors or offsets.
|
||||||
"""
|
"""
|
||||||
from typing import List, Any, Dict, Tuple, Callable, Union, Sequence, Iterable, Optional
|
from typing import List, Any, Dict, Tuple, Callable, Union, Sequence, Iterable, Optional, Sequence
|
||||||
import re
|
import re
|
||||||
import io
|
import io
|
||||||
import copy
|
import copy
|
||||||
@ -482,13 +482,24 @@ def _labels_to_texts(labels: List[Label]) -> List[gdsii.elements.Text]:
|
|||||||
return texts
|
return texts
|
||||||
|
|
||||||
|
|
||||||
def disambiguate_pattern_names(patterns,
|
def disambiguate_pattern_names(patterns: Sequence[Pattern],
|
||||||
max_name_length: int = 32,
|
max_name_length: int = 32,
|
||||||
suffix_length: int = 6,
|
suffix_length: int = 6,
|
||||||
dup_warn_filter: Callable[[str,], bool] = None, # If returns False, don't warn about this name
|
dup_warn_filter: Optional[Callable[[str,], bool]] = None,
|
||||||
):
|
):
|
||||||
|
"""
|
||||||
|
Args:
|
||||||
|
patterns: List of patterns to disambiguate
|
||||||
|
max_name_length: Names longer than this will be truncated
|
||||||
|
suffix_length: Names which get truncated are truncated by this many extra characters. This is to
|
||||||
|
leave room for a suffix if one is necessary.
|
||||||
|
dup_warn_filter: (optional) Function for suppressing warnings about cell names changing. Receives
|
||||||
|
the cell name and returns `False` if the warning should be suppressed and `True` if it should
|
||||||
|
be displayed. Default displays all warnings.
|
||||||
|
"""
|
||||||
used_names = []
|
used_names = []
|
||||||
for pat in patterns:
|
for pat in patterns:
|
||||||
|
# Shorten names which already exceed max-length
|
||||||
if len(pat.name) > max_name_length:
|
if len(pat.name) > max_name_length:
|
||||||
shortened_name = pat.name[:max_name_length - suffix_length]
|
shortened_name = pat.name[:max_name_length - suffix_length]
|
||||||
logger.warning('Pattern name "{}" is too long ({}/{} chars),\n'.format(pat.name, len(pat.name), max_name_length) +
|
logger.warning('Pattern name "{}" is too long ({}/{} chars),\n'.format(pat.name, len(pat.name), max_name_length) +
|
||||||
@ -496,8 +507,10 @@ def disambiguate_pattern_names(patterns,
|
|||||||
else:
|
else:
|
||||||
shortened_name = pat.name
|
shortened_name = pat.name
|
||||||
|
|
||||||
|
# Remove invalid characters
|
||||||
sanitized_name = re.compile('[^A-Za-z0-9_\?\$]').sub('_', shortened_name)
|
sanitized_name = re.compile('[^A-Za-z0-9_\?\$]').sub('_', shortened_name)
|
||||||
|
|
||||||
|
# Add a suffix that makes the name unique
|
||||||
i = 0
|
i = 0
|
||||||
suffixed_name = sanitized_name
|
suffixed_name = sanitized_name
|
||||||
while suffixed_name in used_names or suffixed_name == '':
|
while suffixed_name in used_names or suffixed_name == '':
|
||||||
@ -513,6 +526,7 @@ def disambiguate_pattern_names(patterns,
|
|||||||
logger.warning('Pattern name "{}" ({}) appears multiple times;\n renaming to "{}"'.format(
|
logger.warning('Pattern name "{}" ({}) appears multiple times;\n renaming to "{}"'.format(
|
||||||
pat.name, sanitized_name, suffixed_name))
|
pat.name, sanitized_name, suffixed_name))
|
||||||
|
|
||||||
|
# Encode into a byte-string and perform some final checks
|
||||||
encoded_name = suffixed_name.encode('ASCII')
|
encoded_name = suffixed_name.encode('ASCII')
|
||||||
if len(encoded_name) == 0:
|
if len(encoded_name) == 0:
|
||||||
# Should never happen since zero-length names are replaced
|
# Should never happen since zero-length names are replaced
|
||||||
|
Loading…
Reference in New Issue
Block a user