Source code for gdsfactory.geometry.layer_priority

import numpy as np

import gdsfactory as gf
from gdsfactory.typings import ComponentSpec, LayerSpec


[docs] @gf.cell def layer_priority( component: ComponentSpec, layer_high_order: LayerSpec, layer_low_order: LayerSpec, remove_high_order: bool = False, **kwargs, ) -> gf.Component: """Returns new component after removing one layer from another. Args: component: spec. layer_high_order: layer used to etch. layer_low_order: layer etched into. remove_high_order: whether to also remove the high order layer polygons. \ Useful if the higher order layer is purely logical. kwargs: keyword arguments for boolean difference operation. """ c = gf.Component() component = gf.get_component(component) # Obtain component subsets layers_to_remove = ( [gf.get_layer(layer_low_order), gf.get_layer(layer_high_order)] if remove_high_order else [gf.get_layer(layer_low_order)] ) component_minus_layers = component.extract( [ gf.get_layer(layer) for layer in component.get_layers() if gf.get_layer(layer) not in layers_to_remove ] ) component_high_order = component.extract([layer_high_order]) component_low_order = component.extract([layer_low_order]) # Remove high priority from low priority component_high_order_removed_from_low_order = gf.geometry.boolean( A=component_low_order, B=component_high_order, operation="A-B", layer=layer_low_order, **kwargs, ) # Place all the other layers a = c << component_minus_layers b = c << component_high_order_removed_from_low_order c.absorb(a) c.absorb(b) c.add_ports(ports=component.ports) c.copy_child_info(component) return c
def test_layer_priority() -> None: funky_cross_section = gf.cross_section.cross_section( width=0.5, layer="WG", sections=[ gf.cross_section.Section(width=2, layer="N"), gf.cross_section.Section(width=2, layer="SLAB150"), ], ) c = gf.components.coupler(cross_section=funky_cross_section) c_WG_before = c.extract([gf.get_layer("WG")]) c_SLAB150_before = c.extract([gf.get_layer("SLAB150")]) c_N_before = c.extract([gf.get_layer("N")]) c_processed = layer_priority( component=c, layer_high_order="WG", layer_low_order="SLAB150", remove_high_order=False, ) c_WG_after = c_processed.extract([gf.get_layer("WG")]) c_SLAB150_after = c_processed.extract([gf.get_layer("SLAB150")]) c_N_after = c_processed.extract([gf.get_layer("N")]) assert np.isclose(c_WG_before.area(), c_WG_after.area(), atol=1e-3) assert np.isclose(c_N_before.area(), c_N_after.area(), atol=1e-3) assert c_SLAB150_before.area() > c_SLAB150_after.area() c_processed = layer_priority( component=c, layer_high_order="WG", layer_low_order="SLAB150", remove_high_order=True, ) c_WG_after = c_processed.extract([gf.get_layer("WG")]) assert c_WG_after.area() == 0 if __name__ == "__main__": funky_cross_section = gf.cross_section.cross_section( width=0.5, layer="WG", sections=[ gf.cross_section.Section(width=2, layer="N"), gf.cross_section.Section(width=2, layer="SLAB150"), ], ) c = gf.components.coupler(cross_section=funky_cross_section) c2 = layer_priority( component=c, layer_high_order="WG", layer_low_order="SLAB150", remove_high_order=False, ) c2.show(show_ports=True)