Source code for gdsfactory.components.pad

from __future__ import annotations

from functools import partial

import gdsfactory as gf
from gdsfactory.cell import cell
from gdsfactory.component import Component
from gdsfactory.components.compass import compass
from gdsfactory.typings import ComponentSpec, Float2, LayerSpec


[docs] @cell def pad( size: str | Float2 = (100.0, 100.0), layer: LayerSpec = "MTOP", bbox_layers: tuple[LayerSpec, ...] | None = None, bbox_offsets: tuple[float, ...] | None = None, port_inclusion: float = 0, port_orientation: float | None = None, ) -> Component: """Returns rectangular pad with ports. Args: size: x, y size. layer: pad layer. bbox_layers: list of layers. bbox_offsets: Optional offsets for each layer with respect to size. positive grows, negative shrinks the size. port_inclusion: from edge. port_orientation: in degrees. """ c = Component() layer = gf.get_layer(layer) size = gf.get_constant(size) rect = compass( size=size, layer=layer, port_inclusion=port_inclusion, port_type="electrical" ) c_ref = c.add_ref(rect) c.add_ports(c_ref.ports) c.info["size"] = size c.info["xsize"] = size[0] c.info["ysize"] = size[1] c.info["layer"] = layer c.absorb(c_ref) width = size[1] if port_orientation in [0, 180] else size[0] c.add_port( name="pad", port_type="vertical_dc", layer=layer, center=(0, 0), orientation=port_orientation, width=width, ) if bbox_layers and bbox_offsets: sizes = [] for cladding_offset in bbox_offsets: size = (size[0] + 2 * cladding_offset, size[1] + 2 * cladding_offset) sizes.append(size) for layer, size in zip(bbox_layers, sizes): ref = c.add_ref( compass( size=size, layer=layer, ) ) c.absorb(ref) return c
pad_rectangular = partial(pad, size="pad_size") pad_small = partial(pad, size=(80, 80))
[docs] @cell def pad_array( pad: ComponentSpec = "pad", spacing: tuple[float, float] = (150.0, 150.0), columns: int = 6, rows: int = 1, orientation: float | None = 270, ) -> Component: """Returns 2D array of pads. Args: pad: pad element. spacing: x, y pitch. columns: number of columns. rows: number of rows. orientation: port orientation in deg. None for low speed DC ports. """ c = Component() pad = gf.get_component(pad) xsize = pad.info["xsize"] ysize = pad.info["ysize"] c.info["xsize"] = xsize c.info["ysize"] = ysize c.add_array(pad, columns=columns, rows=rows, spacing=spacing) width = xsize if orientation in [90, 270] else ysize for col in range(columns): for row in range(rows): c.add_port( name=f"e{row+1}{col+1}", center=(col * spacing[0], row * spacing[1]), width=width, orientation=orientation, port_type="electrical", layer=pad.info["layer"], ) return c
pad_array90 = partial(pad_array, orientation=90) pad_array270 = partial(pad_array, orientation=270) pad_array0 = partial(pad_array, orientation=0, columns=1, rows=3) pad_array180 = partial(pad_array, orientation=180, columns=1, rows=3) if __name__ == "__main__": # c = pad_rectangular() c = pad(port_orientation=0) # c = pad(layer_to_inclusion={(3, 0): 10}) # print(c.ports) # c = pad(width=10, height=10) # print(c.ports.keys()) # c = pad_array90() # c = pad_array0() # c = pad_array270() # c.pprint_ports() # c = pad_array_2d(cols=2, rows=3, port_names=("e2",)) # c = pad_array(columns=2, rows=2, orientation=270) # c.auto_rename_ports() c.show(show_ports=True)