[library] auto-rename single-use names in add_source

This commit is contained in:
Jan Petykiewicz 2026-07-16 08:36:19 -07:00
commit ac34108253
5 changed files with 48 additions and 4 deletions

View file

@ -437,6 +437,19 @@ def test_build_library_add_source_can_rename_every_source_cell() -> None:
assert report.provenance["mapped_child"].requested_name == "child"
def test_build_library_add_source_renames_conflicting_single_use_name_by_default() -> None:
source = Library({'_myCellName$F': Pattern(), 'source_top': Pattern()})
source['source_top'].ref('_myCellName$F')
builder = LibraryBuilder()
builder['_myCellName$F'] = Pattern()
rename_map = builder.add_source(source)
built, _report = builder.build()
assert rename_map == {'_myCellName$F': '_myCellName'}
assert set(built['source_top'].refs) == {'_myCellName'}
def test_library_builder_adds_an_ordinary_view_eagerly() -> None:
child = Pattern()
top = Pattern()

View file

@ -382,7 +382,7 @@ def test_gdsii_lazy_overlay_add_source_rename_when_validation() -> None:
src = _make_lazy_port_library()
with pytest.raises(TypeError, match='rename_theirs'):
OverlayLibrary().add_source(src, rename_when='always')
OverlayLibrary().add_source(src, rename_theirs=None, rename_when='always')
with pytest.raises(ValueError, match='rename mode'):
OverlayLibrary().add_source(src, rename_when='sometimes') # type: ignore[arg-type]

View file

@ -621,6 +621,26 @@ def test_overlay_add_source_callback_sees_earlier_name_reservations() -> None:
assert set(rename_map.values()) <= set(overlay)
def test_overlay_add_source_renames_conflicting_single_use_name_by_default() -> None:
overlay = OverlayLibrary()
overlay['_myCellName$F'] = Pattern()
source = Library({'_myCellName$F': Pattern(), 'source_top': Pattern()})
source['source_top'].ref('_myCellName$F')
rename_map = overlay.add_source(source)
assert rename_map == {'_myCellName$F': '_myCellName'}
assert set(overlay['source_top'].refs) == {'_myCellName'}
def test_overlay_add_source_can_explicitly_disable_default_renaming() -> None:
overlay = OverlayLibrary()
overlay['_helper$A'] = Pattern()
with pytest.raises(LibraryError, match='Conflicting name'):
overlay.add_source(Library({'_helper$A': Pattern()}), rename_theirs=None)
def test_port_load_view_detaches_already_materialized_overlay_pattern() -> None:
overlay = OverlayLibrary()
overlay.add_source(Library({"top": Pattern()}))