Source code for gdsfactory.components.align

from __future__ import annotations

import gdsfactory as gf
from gdsfactory.cell import cell
from gdsfactory.component import Component
from gdsfactory.components.rectangle import rectangle
from gdsfactory.typings import ComponentSpec, LayerSpec, LayerSpecs


[docs] @cell def align_wafer( width: float = 10.0, spacing: float = 10.0, cross_length: float = 80.0, layer: LayerSpec = "WG", layers: LayerSpecs | None = None, layer_cladding: tuple[int, int] | None = None, square_corner: str = "bottom_left", ) -> Component: """Returns cross inside a frame to align wafer. Args: width: in um. spacing: in um. cross_length: for the cross. layer: for the cross. layers: Optional. List of layers for cross. layer_cladding: optional. square_corner: bottom_left, bottom_right, top_right, top_left. """ c = Component() layers = layers or [layer] for layer in layers: layer = gf.get_layer(layer) cross = gf.components.cross(length=cross_length, width=width, layer=layer) c.add_ref(cross) b = cross_length / 2 + spacing + width / 2 w = width rh = rectangle(size=(2 * b + w, w), layer=layer, centered=True) rtop = c.add_ref(rh) rbot = c.add_ref(rh) rtop.movey(+b) rbot.movey(-b) rv = rectangle(size=(w, 2 * b), layer=layer, centered=True) rl = c.add_ref(rv) rr = c.add_ref(rv) rl.movex(-b) rr.movex(+b) wsq = (cross_length + 2 * spacing) / 4 square_mark = c << rectangle(size=(wsq, wsq), layer=layer, centered=True) a = width / 2 + wsq / 2 + spacing corner_to_position = { "bottom_left": (-a, -a), "bottom_right": (a, -a), "top_right": (a, a), "top_left": (-a, a), } square_mark.move(corner_to_position[square_corner]) if layer_cladding: rc_tile_excl = rectangle( size=(2 * (b + spacing), 2 * (b + spacing)), layer=layer_cladding, centered=True, ) c.add_ref(rc_tile_excl) return c
[docs] @cell def add_frame( component: ComponentSpec = rectangle, width: float = 10.0, spacing: float = 10.0, layer: LayerSpec = "WG", layers: LayerSpecs | None = None, ) -> Component: """Returns component with a frame around it. Args: component: Component to frame. width: of the frame. spacing: of component to frame. layer: frame layer. layers: Optional. List of layers for geometry. """ c = Component() component = gf.get_component(component) layers = layers or [layer] for layer in layers: layer = gf.get_layer(layer) cref = c.add_ref(component) cref.move(-c.size_info.center) y = ( max([component.size_info.height, component.size_info.width]) / 2 + spacing + width / 2 ) x = y w = width rh = rectangle(size=(2 * y + w, w), layer=layer, centered=True) rtop = c.add_ref(rh) rbot = c.add_ref(rh) rtop.movey(+y) rbot.movey(-y) rv = rectangle(size=(w, 2 * y), layer=layer, centered=True) rl = c.add_ref(rv) rr = c.add_ref(rv) rl.movex(-x) rr.movex(+x) c.absorb(cref) return c
if __name__ == "__main__": layers = {(1, 0), (2, 0)} # c = gf.components.straight() # c = add_frame(component=c) c = align_wafer(layers=layers) c = add_frame(c, layers=layers) c.show(show_ports=True)