Source code for gdsfactory.read.import_gds

from __future__ import annotations

from pathlib import Path
from typing import Any

import kfactory as kf
from kfactory import KCLayout

from gdsfactory.component import Component
from gdsfactory.typings import PostProcesses


[docs] def import_gds( gdspath: str | Path, cellname: str | None = None, post_process: PostProcesses | None = None, rename_duplicated_cells: bool = False, ) -> Component: """Reads a GDS file and returns a Component. Args: gdspath: path to GDS file. cellname: name of the cell to return. Defaults to top cell. post_process: function to run after reading the GDS file. rename_duplicated_cells: if True, rename duplicated cells. """ temp_kcl = KCLayout(name=str(gdspath)) options = kf.utilities.load_layout_options() options.warn_level = 0 temp_kcl.read(gdspath, options=options) cellname = cellname or temp_kcl.layout.top_cell().name kcell = temp_kcl[cellname] if rename_duplicated_cells: read_options = kf.utilities.load_layout_options() read_options.cell_conflict_resolution = ( kf.kdb.LoadLayoutOptions.CellConflictResolution.RenameCell ) if hasattr(temp_kcl, "cross_sections"): for cross_section in temp_kcl.cross_sections.cross_sections.values(): kf.kcl.get_symmetrical_cross_section(cross_section) c = kcell_to_component(kcell) for pp in post_process or []: pp(c) temp_kcl.library.delete() del kf.layout.kcls[temp_kcl.name] return c
def kcell_to_component(kcell: kf.kcell.ProtoTKCell[Any]) -> Component: c = Component() c.kdb_cell.copy_tree(kcell.kdb_cell) c.add_ports(kcell.ports) c.settings = kcell.settings.model_copy() c.info = kcell.info.model_copy() c.name = kcell.name return c def import_gds_with_conflicts( gdspath: str | Path, cellname: str | None = None, ) -> Component: """Reads a GDS file and returns a Component. Args: gdspath: path to GDS file. cellname: name of the cell to return. Defaults to top cell. Modes: AddToCell: Add content to existing cell. Content of new cells is simply added to existing cells with the same name. OverwriteCell: The old cell is overwritten entirely (including child cells which are not used otherwise) RenameCell: The new cell will be renamed to become unique SkipNewCell: The new cell is skipped entirely (including child cells which are not used otherwise) """ return import_gds(gdspath, cellname=cellname, rename_duplicated_cells=True) if __name__ == "__main__": from gdsfactory.components import mzi c = mzi() c.pprint_ports() gdspath = c.write_gds() c = import_gds(gdspath) c.pprint_ports() c.show()