Here are the components available in the PDK

Cells#

add_fiber_array#

ubcpdk.components.add_fiber_array(component: str | collections.abc.Callable[[...], gdsfactory.component.Component] | gdsfactory.component.Component | dict[str, typing.Any] = <function straight>, component_name: ~typing.Optional[str] = None, gc_port_name: str = 'o1', get_input_labels_function: ~collections.abc.Callable = <function get_input_labels>, with_loopback: bool = False, optical_routing_type: int = 0, fanout_length: float = 0.0, grating_coupler: str | collections.abc.Callable[[...], gdsfactory.component.Component] | gdsfactory.component.Component | dict[str, typing.Any] = <function gc_te1550>, cross_section: collections.abc.Callable[[...], gdsfactory.cross_section.CrossSection] | gdsfactory.cross_section.CrossSection | dict[str, typing.Any] | str | gdsfactory.cross_section.Transition = 'xs_sc', layer_label: tuple[int, int] | str = (10, 0), straight: str | collections.abc.Callable[[...], gdsfactory.component.Component] | gdsfactory.component.Component | dict[str, typing.Any] = <function straight>, **kwargs) Component[source]#

Returns component with grating couplers and labels on each port.

Routes all component ports south. Can add align_ports loopback reference structure on the edges.

Parameters:
  • component – to connect.

  • component_name – for the label.

  • gc_port_name – grating coupler input port name ‘o1’.

  • get_input_labels_function – function to get input labels for grating couplers.

  • with_loopback – True, adds loopback structures.

  • optical_routing_type – None: autoselection, 0: no extension.

  • fanout_length – None # if None, automatic calculation of fanout length.

  • grating_coupler – grating coupler instance, function or list of functions.

  • cross_section – spec.

  • layer_label – for label.

  • straight – straight component.

import ubcpdk

c = ubcpdk.components.add_fiber_array(gc_port_name='o1', with_loopback=False, optical_routing_type=0, fanout_length=0.0, cross_section='xs_sc', layer_label=(10, 0))
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-1.png

add_fiber_array_pads_rf#

ubcpdk.components.add_fiber_array_pads_rf(component: str | collections.abc.Callable[[...], gdsfactory.component.Component] | gdsfactory.component.Component | dict[str, Any] = 'ring_single_heater', username: str = 'JoaquinMatres', orientation: float = 0, **kwargs) Component[source]#

Returns fiber array with label and electrical pads.

Parameters:
  • component – to add fiber array and pads.

  • username – for the label.

  • orientation – for adding pads.

  • kwargs – for add_fiber_array.

import ubcpdk

c = ubcpdk.components.add_fiber_array_pads_rf(component='ring_single_heater', username='JoaquinMatres', orientation=0)
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-2.png

add_pads#

ubcpdk.components.add_pads(component: str | collections.abc.Callable[[...], gdsfactory.component.Component] | gdsfactory.component.Component | dict[str, Any] = 'ring_single_heater', username: str = 'JoaquinMatres', **kwargs) Component[source]#

Returns fiber array with label and electrical pads.

Parameters:
  • component – to add fiber array and pads.

  • username – for the label.

  • kwargs – for add_fiber_array.

import ubcpdk

c = ubcpdk.components.add_pads(component='ring_single_heater', username='JoaquinMatres')
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-3.png

add_pads_dc#

ubcpdk.components.add_pads_dc(*, component: ComponentSpec = 'ring_single_heater', spacing: Float2 = (0.0, 100.0), pad_array: ComponentSpec = functools.partial(<function pad_array>, pad=functools.partial(<function pad>, size=(75, 75), layer=(12, 0), bbox_layers=((13, 0), ), bbox_offsets=(-1.8, )), spacing=(125, 125)), select_ports: Callable = functools.partial(<function select_ports>, port_type='electrical'), get_bundle_function: Callable = functools.partial(<function get_bundle>, bend=<function wire_corner>, cross_section='xs_metal_routing'), port_names: Strs | None = None, **kwargs) Component#

Returns new component with electrical ports connected to top pad array.

Parameters:
  • component – component spec to connect to.

  • spacing – component to pad spacing.

  • pad_array – component spec for pad_array.

  • select_ports – function to select_ports.

  • get_bundle_function – function to route bundle of ports.

  • port_names – optional port names. Overrides select_ports.

  • kwargs – route settings.

import gdsfactory as gf
c = gf.components.wire_straight(length=200.)
c = gf.routing.add_electrical_pads_top_dc(c, width=10)
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-4.png
import ubcpdk

c = ubcpdk.components.add_pads_dc(component='ring_single_heater', spacing=(0.0, 100.0))
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-5.png

add_pads_rf#

ubcpdk.components.add_pads_rf(*, component: ComponentSpec = 'ring_single_heater', direction: str = 'top', spacing: Float2 = (0.0, 100.0), pad_array: ComponentSpec = functools.partial(<function pad_array>, pad=functools.partial(<function pad>, size=(75, 75), layer=(12, 0), bbox_layers=((13, 0), ), bbox_offsets=(-1.8, )), spacing=(125, 125)), select_ports: Callable = functools.partial(<function select_ports>, port_type='electrical'), port_names: Strs | None = None, layer: LayerSpec = 'MTOP', **kwargs) Component#

Returns new component with electrical ports connected to top pad array.

Parameters:
  • component – to route.

  • direction – sets direction of the array (top or right).

  • spacing – component to pad spacing.

  • pad_array – function for pad_array.

  • select_ports – function to select electrical ports.

  • port_names – optional port names. Overrides select_ports.

  • layer – for the routes.

Keyword Arguments:
  • ports – Dict[str, Port] a port dict {port name: port}.

  • prefix – select ports with port name prefix.

  • suffix – select ports with port name suffix.

  • orientation – select ports with orientation in degrees.

  • width – select ports with port width.

  • layers_excluded – List of layers to exclude.

  • port_type – select ports with port type (optical, electrical, vertical_te).

  • clockwise – if True, sort ports clockwise, False: counter-clockwise.

import gdsfactory as gf

c = gf.components.wire_straight(length=200.)
cc = gf.routing.add_electrical_pads_top(component=c, spacing=(-150, 30))
cc.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-6.png
import ubcpdk

c = ubcpdk.components.add_pads_rf(component='ring_single_heater', direction='top', spacing=(0.0, 100.0), layer='MTOP')
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-7.png

add_pins_bbox_siepic#

ubcpdk.components.add_pins_bbox_siepic(component: ~gdsfactory.component.Component, function: ~collections.abc.Callable = <function add_pin_path>, port_type: str = 'optical', layer_pin: tuple[int, int] = (1, 10), pin_length: float = 0.01, bbox_layer: tuple[int, int] = (68, 0), padding: float = 0, remove_layers: bool = False) Component[source]#

Add bounding box device recognition layer.

Parameters:
  • component – to add pins.

  • function – to add pins.

  • port_type – optical, electrical…

  • layer_pin – for pin.

  • pin_length – in um.

  • bbox_layer – bounding box layer.

  • padding – around device.

  • remove_layers – removes old layers.

import ubcpdk

c = ubcpdk.components.add_pins_bbox_siepic(port_type='optical', layer_pin=(1, 10), pin_length=0.01, bbox_layer=(68, 0), padding=0, remove_layers=False)
c.plot()

(Source code)

add_pins_bbox_siepic_remove_layers#

import ubcpdk

c = ubcpdk.components.add_pins_bbox_siepic_remove_layers(port_type='optical', layer_pin=(1, 10), pin_length=0.01, bbox_layer=(68, 0), padding=0, remove_layers=True)
c.plot()

(Source code)

add_pins_siepic_metal#

import ubcpdk

c = ubcpdk.components.add_pins_siepic_metal(port_type='placement', layer_pin=(1, 11), pin_length=0.01)
c.plot()

(Source code)

bend#

ubcpdk.components.bend(**kwargs) Component#
import ubcpdk

c = ubcpdk.components.bend()
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-11.png

bend_euler180_sc#

ubcpdk.components.bend_euler180_sc(**kwargs) Component#
import ubcpdk

c = ubcpdk.components.bend_euler180_sc()
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-12.png

bend_euler_sc#

ubcpdk.components.bend_euler_sc(**kwargs) Component[source]#
import ubcpdk

c = ubcpdk.components.bend_euler_sc()
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-13.png

bend_s#

ubcpdk.components.bend_s(size: Float2 = (11.0, 1.8), npoints: int = 99, *, cross_section: CrossSectionSpec = 'xs_sc', **kwargs) Component#

Return S bend with bezier curve.

stores min_bend_radius property in self.info[‘min_bend_radius’] min_bend_radius depends on height and length

Parameters:
  • size – in x and y direction.

  • npoints – number of points.

  • cross_section – spec.

  • add_pins – add pins to the component.

Keyword Arguments:
  • with_manhattan_facing_angles – bool.

  • start_angle – optional start angle in deg.

  • end_angle – optional end angle in deg.

import ubcpdk

c = ubcpdk.components.bend_s(size=(11.0, 1.8), npoints=99, cross_section='xs_sc')
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-14.png

coupler#

ubcpdk.components.coupler(**kwargs) Component[source]#
import ubcpdk

c = ubcpdk.components.coupler(gap=0.236, length=20.0, dy=4.0, dx=10.0)
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-15.png

coupler_ring#

ubcpdk.components.coupler_ring(**kwargs) Component[source]#
import ubcpdk

c = ubcpdk.components.coupler_ring(gap=0.2, radius=5.0, length_x=4.0, length_extension=3)
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-16.png

dbg#

ubcpdk.components.dbg(w0: float = 0.5, dw: float = 0.1, n: int = 100, l1: float = 0.07940573770491803, l2: float = 0.07940573770491803) Component[source]#

Includes two ports.

Parameters:
  • w0 – width.

  • dw – delta width.

  • n – number of elements.

  • l1 – length teeth1.

  • l2 – length teeth2.

import ubcpdk

c = ubcpdk.components.dbg(w0=0.5, dw=0.1, n=100, l1=0.07940573770491803, l2=0.07940573770491803)
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-17.png

dbr#

ubcpdk.components.dbr(w0: float = 0.5, dw: float = 0.1, n: int = 100, l1: float = 0.07940573770491803, l2: float = 0.07940573770491803, cross_section: collections.abc.Callable[[...], gdsfactory.cross_section.CrossSection] | gdsfactory.cross_section.CrossSection | dict[str, typing.Any] | str | gdsfactory.cross_section.Transition = functools.partial(<function cross_section>, radius_min=5), **kwargs) Component[source]#

Returns distributed bragg reflector.

Parameters:
  • w0 – width.

  • dw – delta width.

  • n – number of elements.

  • l1 – length teeth1.

  • l2 – length teeth2.

  • cross_section – spec.

  • kwargs – cross_section settings.

import ubcpdk

c = ubcpdk.components.dbr(w0=0.5, dw=0.1, n=100, l1=0.07940573770491803, l2=0.07940573770491803)
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-18.png

dbr_cavity#

ubcpdk.components.dbr_cavity(dbr=<function dbr>, coupler=<function coupler>, **kwargs) Component[source]#
import ubcpdk

c = ubcpdk.components.dbr_cavity()
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-19.png

dbr_cavity_te#

ubcpdk.components.dbr_cavity_te(component='dbr_cavity', **kwargs) Component[source]#
import ubcpdk

c = ubcpdk.components.dbr_cavity_te(component='dbr_cavity')
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-20.png

ebeam_BondPad#

ubcpdk.components.ebeam_BondPad() Component[source]#

Return ebeam_BondPad fixed cell.

import ubcpdk

c = ubcpdk.components.ebeam_BondPad()
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-21.png

ebeam_adiabatic_te1550#

ubcpdk.components.ebeam_adiabatic_te1550() Component[source]#

Return ebeam_adiabatic_te1550 fixed cell.

import ubcpdk

c = ubcpdk.components.ebeam_adiabatic_te1550()
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-22.png

ebeam_adiabatic_tm1550#

ubcpdk.components.ebeam_adiabatic_tm1550() Component[source]#

Return ebeam_adiabatic_tm1550 fixed cell.

import ubcpdk

c = ubcpdk.components.ebeam_adiabatic_tm1550()
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-23.png

ebeam_bdc_te1550#

ubcpdk.components.ebeam_bdc_te1550() Component[source]#

Return ebeam_bdc_te1550 fixed cell.

import ubcpdk

c = ubcpdk.components.ebeam_bdc_te1550()
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-24.png

ebeam_bdc_tm1550#

ubcpdk.components.ebeam_bdc_tm1550() Component[source]#

Return ebeam_bdc_tm1550 fixed cell.

import ubcpdk

c = ubcpdk.components.ebeam_bdc_tm1550()
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-25.png

ebeam_crossing4#

ubcpdk.components.ebeam_crossing4() Component[source]#

Return ebeam_crossing4 fixed cell.

import ubcpdk

c = ubcpdk.components.ebeam_crossing4()
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-26.png

ebeam_crossing4_2ports#

ubcpdk.components.ebeam_crossing4_2ports() Component[source]#

Return ebeam_crossing4 fixed cell.

import ubcpdk

c = ubcpdk.components.ebeam_crossing4_2ports()
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-27.png

ebeam_dc_halfring_straight#

ubcpdk.components.ebeam_dc_halfring_straight(gap: float = 0.2, radius: float = 5.0, length_x: float = 4.0, siepic: bool = True, model: str = 'ebeam_dc_halfring_straight', **kwargs) Component[source]#

Return a ring coupler.

Parameters:
  • gap – spacing between parallel coupled straight waveguides.

  • radius – of the bends.

  • length_x – length of the parallel coupled straight waveguides.

  • cross_section – cross_section spec.

  • siepic – if True adds siepic.

  • kwargs – cross_section settings for bend and coupler.

  2             3
  |             |
   \           /
    \         /
  ---=========---
1    length_x    4
import ubcpdk

c = ubcpdk.components.ebeam_dc_halfring_straight(gap=0.2, radius=5.0, length_x=4.0, siepic=True, model='ebeam_dc_halfring_straight')
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-28.png

ebeam_dc_te1550#

ubcpdk.components.ebeam_dc_te1550(gap: float = 0.236, length: float = 20.0, coupler_symmetric: ComponentFactory = <function coupler_symmetric>, coupler_straight: ComponentFactory = <function coupler_straight>, dy: float = 4.0, dx: float = 10.0, cross_section: CrossSectionSpec = 'xs_sc') Component#

Symmetric coupler.

Parameters:
  • gap – between straights in um.

  • length – of coupling region in um.

  • coupler_symmetric – spec for bend coupler.

  • coupler_straight – spec for straight coupler.

  • dy – port to port vertical spacing in um.

  • dx – length of bend in x direction in um.

  • cross_section – spec (CrossSection, string or dict).

      dx                                 dx
   |------|                           |------|
o2 ________                           ______o3
           \                         /           |
            \        length         /            |
             ======================= gap         | dy
            /                       \            |
   ________/                         \_______    |
o1                                          o4

               coupler_straight  coupler_symmetric
import ubcpdk

c = ubcpdk.components.ebeam_dc_te1550(gap=0.236, length=20.0, dy=4.0, dx=10.0, cross_section='xs_sc')
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-29.png

ebeam_splitter_adiabatic_swg_te1550#

ubcpdk.components.ebeam_splitter_adiabatic_swg_te1550() Component[source]#

Return ebeam_splitter_adiabatic_swg_te1550 fixed cell.

import ubcpdk

c = ubcpdk.components.ebeam_splitter_adiabatic_swg_te1550()
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-30.png

ebeam_splitter_swg_assist_te1310#

ubcpdk.components.ebeam_splitter_swg_assist_te1310() Component[source]#

Return ebeam_splitter_swg_assist_te1310 fixed cell.

import ubcpdk

c = ubcpdk.components.ebeam_splitter_swg_assist_te1310()
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-31.png

ebeam_splitter_swg_assist_te1550#

ubcpdk.components.ebeam_splitter_swg_assist_te1550() Component[source]#

Return ebeam_splitter_swg_assist_te1550 fixed cell.

import ubcpdk

c = ubcpdk.components.ebeam_splitter_swg_assist_te1550()
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-32.png

ebeam_swg_edgecoupler#

ubcpdk.components.ebeam_swg_edgecoupler() Component[source]#

Return ebeam_swg_edgecoupler fixed cell.

import ubcpdk

c = ubcpdk.components.ebeam_swg_edgecoupler()
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-33.png

ebeam_terminator_te1310#

ubcpdk.components.ebeam_terminator_te1310() Component[source]#

Return ebeam_terminator_te1310 fixed cell.

import ubcpdk

c = ubcpdk.components.ebeam_terminator_te1310()
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-34.png

ebeam_terminator_te1550#

ubcpdk.components.ebeam_terminator_te1550() Component[source]#

Return ebeam_terminator_te1550 fixed cell.

import ubcpdk

c = ubcpdk.components.ebeam_terminator_te1550()
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-35.png

ebeam_terminator_tm1550#

ubcpdk.components.ebeam_terminator_tm1550() Component[source]#

Return ebeam_terminator_tm1550 fixed cell.

import ubcpdk

c = ubcpdk.components.ebeam_terminator_tm1550()
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-36.png

ebeam_y_1550#

ubcpdk.components.ebeam_y_1550() Component[source]#

Return ebeam_y_1550 fixed cell.

import ubcpdk

c = ubcpdk.components.ebeam_y_1550()
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-37.png

ebeam_y_adiabatic#

ubcpdk.components.ebeam_y_adiabatic() Component[source]#

Return ebeam_y_adiabatic fixed cell.

import ubcpdk

c = ubcpdk.components.ebeam_y_adiabatic()
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-38.png

ebeam_y_adiabatic_1310#

ubcpdk.components.ebeam_y_adiabatic_1310() Component[source]#

Return ebeam_y_adiabatic_1310 fixed cell.

import ubcpdk

c = ubcpdk.components.ebeam_y_adiabatic_1310()
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-39.png

ebeam_y_adiabatic_tapers#

ubcpdk.components.ebeam_y_adiabatic_tapers() Component[source]#

Return ebeam_y_adiabatic fixed cell.

import ubcpdk

c = ubcpdk.components.ebeam_y_adiabatic_tapers()
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-40.png

gc_te1310#

ubcpdk.components.gc_te1310() Component[source]#

Return ebeam_gc_te1310 fixed cell.

import ubcpdk

c = ubcpdk.components.gc_te1310()
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-41.png

gc_te1310_8deg#

ubcpdk.components.gc_te1310_8deg() Component[source]#

Return ebeam_gc_te1310_8deg fixed cell.

import ubcpdk

c = ubcpdk.components.gc_te1310_8deg()
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-42.png

gc_te1310_broadband#

ubcpdk.components.gc_te1310_broadband() Component[source]#

Return ebeam_gc_te1310_broadband fixed cell.

import ubcpdk

c = ubcpdk.components.gc_te1310_broadband()
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-43.png

gc_te1550#

ubcpdk.components.gc_te1550() Component[source]#

Return ebeam_gc_te1550 fixed cell.

import ubcpdk

c = ubcpdk.components.gc_te1550()
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-44.png

gc_te1550_90nmSlab#

ubcpdk.components.gc_te1550_90nmSlab() Component[source]#

Return ebeam_gc_te1550_90nmSlab fixed cell.

import ubcpdk

c = ubcpdk.components.gc_te1550_90nmSlab()
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-45.png

gc_te1550_broadband#

ubcpdk.components.gc_te1550_broadband() Component[source]#

Return ebeam_gc_te1550_broadband fixed cell.

import ubcpdk

c = ubcpdk.components.gc_te1550_broadband()
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-46.png

gc_tm1550#

ubcpdk.components.gc_tm1550() Component[source]#

Return ebeam_gc_tm1550 fixed cell.

import ubcpdk

c = ubcpdk.components.gc_tm1550()
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-47.png

metal_via#

ubcpdk.components.metal_via() Component[source]#

Return metal_via fixed cell.

import ubcpdk

c = ubcpdk.components.metal_via()
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-48.png

mmi1x2#

ubcpdk.components.mmi1x2(**kwargs) Component[source]#
import ubcpdk

c = ubcpdk.components.mmi1x2(width_taper=1.0, length_taper=10.0, length_mmi=5.5, width_mmi=2.5, gap_mmi=0.25)
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-49.png

mzi#

ubcpdk.components.mzi(delta_length: float = 10.0, length_y: float = 2.0, length_x: float | None = 0.1, *, bend: ComponentSpec = <function bend_euler_sc>, straight: ComponentSpec = <function straight>, straight_y: ComponentSpec | None = None, straight_x_top: ComponentSpec | None = None, straight_x_bot: ComponentSpec | None = None, extend_ports_straight_x: float | None = None, splitter: ComponentSpec = <function ebeam_y_1550>, combiner: ComponentSpec | None = None, with_splitter: bool = True, port_e1_splitter: str = 'o2', port_e0_splitter: str = 'o3', port_e1_combiner: str = 'o2', port_e0_combiner: str = 'o3', nbends: int = 2, cross_section: CrossSectionSpec = 'xs_sc', cross_section_x_top: CrossSectionSpec | None = None, cross_section_x_bot: CrossSectionSpec | None = None, mirror_bot: bool = False, add_optical_ports_arms: bool = False, add_electrical_ports_bot: bool = True, min_length: float = 0.01) Component#

Mzi.

Parameters:
  • delta_length – bottom arm vertical extra length.

  • length_y – vertical length for both and top arms.

  • length_x – horizontal length. None uses to the straight_x_bot/top defaults.

  • bend – 90 degrees bend library.

  • straight – straight function.

  • straight_y – straight for length_y and delta_length.

  • straight_x_top – top straight for length_x.

  • straight_x_bot – bottom straight for length_x.

  • extend_ports_straight_x – optional extend ports for straight_x_bot/top.

  • splitter – splitter function.

  • combiner – combiner function.

  • with_splitter – if False removes splitter.

  • port_e1_splitter – east top splitter port.

  • port_e0_splitter – east bot splitter port.

  • port_e1_combiner – east top combiner port.

  • port_e0_combiner – east bot combiner port.

  • nbends – from straight top/bot to combiner (at least 2).

  • cross_section – for routing (sxtop/sxbot to combiner).

  • cross_section_x_top – optional top cross_section (defaults to cross_section).

  • cross_section_x_bot – optional bottom cross_section (defaults to cross_section).

  • mirror_bot – if true, mirrors the bottom arm.

  • add_optical_ports_arms – add all other optical ports in the arms with top_ and bot_ prefix.

  • add_electrical_ports_bot – add electrical ports to the bottom arm.

  • min_length – minimum length for the straight_x_bot/top.

               b2______b3
              |  sxtop  |
      straight_y        |
              |         |
              b1        b4
    splitter==|         |==combiner
              b5        b8
              |         |
      straight_y        |
              |         |
delta_length/2          |
              |         |
             b6__sxbot__b7
                  Lx
import ubcpdk

c = ubcpdk.components.mzi(delta_length=10.0, length_y=2.0, length_x=0.1, with_splitter=True, port_e1_splitter='o2', port_e0_splitter='o3', port_e1_combiner='o2', port_e0_combiner='o3', nbends=2, cross_section='xs_sc', mirror_bot=False, add_optical_ports_arms=False, add_electrical_ports_bot=True)
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-50.png

mzi_heater#

ubcpdk.components.mzi_heater(delta_length: float = 10.0, length_y: float = 2.0, *, length_x: float | None = 200, bend: ComponentSpec = <function bend_euler_sc>, straight: ComponentSpec = <function straight>, straight_y: ComponentSpec | None = None, straight_x_top: ComponentSpec | None = 'straight_heater_metal', straight_x_bot: ComponentSpec | None = None, extend_ports_straight_x: float | None = None, splitter: ComponentSpec = <function ebeam_y_1550>, combiner: ComponentSpec | None = None, with_splitter: bool = True, port_e1_splitter: str = 'o2', port_e0_splitter: str = 'o3', port_e1_combiner: str = 'o2', port_e0_combiner: str = 'o3', nbends: int = 2, cross_section: CrossSectionSpec = 'xs_sc', cross_section_x_top: CrossSectionSpec | None = None, cross_section_x_bot: CrossSectionSpec | None = None, mirror_bot: bool = False, add_optical_ports_arms: bool = False, add_electrical_ports_bot: bool = True, min_length: float = 0.01) Component#

Mzi.

Parameters:
  • delta_length – bottom arm vertical extra length.

  • length_y – vertical length for both and top arms.

  • length_x – horizontal length. None uses to the straight_x_bot/top defaults.

  • bend – 90 degrees bend library.

  • straight – straight function.

  • straight_y – straight for length_y and delta_length.

  • straight_x_top – top straight for length_x.

  • straight_x_bot – bottom straight for length_x.

  • extend_ports_straight_x – optional extend ports for straight_x_bot/top.

  • splitter – splitter function.

  • combiner – combiner function.

  • with_splitter – if False removes splitter.

  • port_e1_splitter – east top splitter port.

  • port_e0_splitter – east bot splitter port.

  • port_e1_combiner – east top combiner port.

  • port_e0_combiner – east bot combiner port.

  • nbends – from straight top/bot to combiner (at least 2).

  • cross_section – for routing (sxtop/sxbot to combiner).

  • cross_section_x_top – optional top cross_section (defaults to cross_section).

  • cross_section_x_bot – optional bottom cross_section (defaults to cross_section).

  • mirror_bot – if true, mirrors the bottom arm.

  • add_optical_ports_arms – add all other optical ports in the arms with top_ and bot_ prefix.

  • add_electrical_ports_bot – add electrical ports to the bottom arm.

  • min_length – minimum length for the straight_x_bot/top.

               b2______b3
              |  sxtop  |
      straight_y        |
              |         |
              b1        b4
    splitter==|         |==combiner
              b5        b8
              |         |
      straight_y        |
              |         |
delta_length/2          |
              |         |
             b6__sxbot__b7
                  Lx
import ubcpdk

c = ubcpdk.components.mzi_heater(delta_length=10.0, length_y=2.0, length_x=200, straight_x_top='straight_heater_metal', with_splitter=True, port_e1_splitter='o2', port_e0_splitter='o3', port_e1_combiner='o2', port_e0_combiner='o3', nbends=2, cross_section='xs_sc', mirror_bot=False, add_optical_ports_arms=False, add_electrical_ports_bot=True)
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-51.png

pad#

ubcpdk.components.pad(*, size: str | Float2 = (75, 75), layer: LayerSpec = (12, 0), bbox_layers: tuple[LayerSpec, ...] | None = ((13, 0),), bbox_offsets: tuple[float, ...] | None = (- 1.8,), port_inclusion: float = 0, port_orientation: float | None = None) Component#

Returns rectangular pad with ports.

Parameters:
  • 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.

import ubcpdk

c = ubcpdk.components.pad(size=(75, 75), layer=(12, 0), bbox_layers=((13, 0),), bbox_offsets=(-1.8,), port_inclusion=0)
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-52.png

pad_array#

ubcpdk.components.pad_array(*, pad: ComponentSpec = functools.partial(<function pad>, size=(75, 75), layer=(12, 0), bbox_layers=((13, 0), ), bbox_offsets=(-1.8, )), spacing: tuple[float, float] = (125, 125), columns: int = 6, rows: int = 1, orientation: float | None = 270) Component#

Returns 2D array of pads.

Parameters:
  • 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.

import ubcpdk

c = ubcpdk.components.pad_array(spacing=(125, 125), columns=6, rows=1, orientation=270)
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-53.png

photonic_wirebond_surfacetaper_1310#

ubcpdk.components.photonic_wirebond_surfacetaper_1310() Component[source]#

Return photonic_wirebond_surfacetaper_1310 fixed cell.

import ubcpdk

c = ubcpdk.components.photonic_wirebond_surfacetaper_1310()
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-54.png

photonic_wirebond_surfacetaper_1550#

ubcpdk.components.photonic_wirebond_surfacetaper_1550() Component[source]#

Return photonic_wirebond_surfacetaper_1550 fixed cell.

import ubcpdk

c = ubcpdk.components.photonic_wirebond_surfacetaper_1550()
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-55.png

ring_double#

ubcpdk.components.ring_double(gap: float = 0.2, gap_top: float | None = None, radius: float = 10.0, length_x: float = 0.01, length_y: float = 0.01, *, coupler_ring: ComponentSpec = <function coupler_ring>, bend: ComponentSpec = <function bend_euler>, straight: ComponentSpec = <function straight>, cross_section: CrossSectionSpec = CrossSection(sections=(Section(width=0.5, offset=0.0, insets=None, layer='WG', port_names=('o1', 'o2'), port_types=('optical', 'optical'), name='_default', hidden=False, simplify=None, width_function=None, offset_function=None), ), components_along_path=(), radius=10.0, radius_min=5.0, bbox_layers=None, bbox_offsets=None)) Component#

Returns a double bus ring.

two couplers (ct: top, cb: bottom) connected with two vertical straights (sl: left, sr: right)

Parameters:
  • gap – gap between for coupler.

  • gap_top – optional gap between top waveguides. Defaults to gap.

  • radius – for the bend and coupler.

  • length_x – ring coupler length.

  • length_y – vertical straight length.

  • coupler – ring coupler spec.

  • bend – bend spec.

  • straight – straight spec.

  • cross_section – cross_section spec.

     o2──────▲─────────o3
             │gap_top
     xx──────▼─────────xxx
    xxx                   xxx
  xxx                       xxx
 xx                           xxx
 x                             xxx
xx                              xx▲
xx                              xx│length_y
xx                              xx▼
xx                             xx
 xx          length_x          x
  xx     ◄───────────────►    x
   xx                       xxx
     xx                   xxx
      xxx──────▲─────────xxx
               │gap
       o1──────▼─────────o4
import ubcpdk

c = ubcpdk.components.ring_double(gap=0.2, radius=10.0, length_x=0.01, length_y=0.01)
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-56.png

ring_double_heater#

ubcpdk.components.ring_double_heater(gap: float = 0.2, gap_top: float | None = None, radius: float = 10.0, length_x: float = 1.0, *, length_y: float = 0.2, coupler_ring: ComponentFactory = <function coupler_ring>, coupler_ring_top: ComponentFactory | None = None, straight: ComponentFactory = <function straight>, straight_heater: ComponentFactory = <function straight>, bend: ComponentFactory = <function bend_euler>, cross_section_heater: CrossSectionSpec = 'xs_heater_metal', cross_section_waveguide_heater: CrossSectionSpec = 'xs_sc_heater_metal', cross_section: CrossSectionSpec = CrossSection(sections=(Section(width=0.5, offset=0.0, insets=None, layer='WG', port_names=('o1', 'o2'), port_types=('optical', 'optical'), name='_default', hidden=False, simplify=None, width_function=None, offset_function=None), ), components_along_path=(), radius=10.0, radius_min=5.0, bbox_layers=None, bbox_offsets=None), via_stack: ComponentSpec = functools.partial(<function via_stack>, size=(10, 10), layers=((11, 0), (12, 0)), vias=(None, None)), port_orientation: float | Float2 | None = None, via_stack_offset: Float2 = (1, 0)) Component#

Returns a double bus ring with heater on top.

two couplers (ct: top, cb: bottom) connected with two vertical straights (sl: left, sr: right)

Parameters:
  • gap – gap between bottom coupler waveguides.

  • gap_top – optional gap between top waveguides. Defaults to gap.

  • radius – for the bend and coupler.

  • length_x – ring coupler length.

  • length_y – vertical straight length.

  • coupler_ring – ring coupler spec.

  • coupler_ring_top – ring coupler spec for coupler away from vias (defaults to coupler_ring)

  • straight – straight spec.

  • bend – bend spec.

  • cross_section_heater – for heater.

  • cross_section_waveguide_heater – for waveguide with heater.

  • cross_section – for regular waveguide.

  • via_stack – for heater to routing metal.

  • port_orientation – for electrical ports to promote from via_stack. Tuple allows the left and right contacts to be defined differently.

  • via_stack_offset – x,y offset for via_stack.

     o2──────▲─────────o3
             │gap_top
     xx──────▼─────────xxx
    xxx                   xxx
  xxx                       xxx
 xx                           xxx
 x                             xxx
xx                              xx▲
xx                              xx│length_y
xx                              xx▼
xx                             xx
 xx          length_x          x
  xx     ◄───────────────►    x
   xx                       xxx
     xx                   xxx
      xxx──────▲─────────xxx
               │gap
       o1──────▼─────────o4
import ubcpdk

c = ubcpdk.components.ring_double_heater(gap=0.2, radius=10.0, length_x=1.0, length_y=0.2, cross_section_heater='xs_heater_metal', cross_section_waveguide_heater='xs_sc_heater_metal', via_stack_offset=(1, 0))
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-57.png

ring_single#

ubcpdk.components.ring_single(gap: float = 0.2, radius: float = 10.0, length_x: float = 4.0, length_y: float = 0.6, *, coupler_ring: ComponentFactory = <function coupler_ring>, bend: ComponentFactory = <function bend_euler_sc>, bend_coupler: ComponentFactory | None = <function bend_euler>, straight: ComponentFactory = <function straight>, cross_section: CrossSectionSpec = CrossSection(sections=(Section(width=0.5, offset=0.0, insets=None, layer='WG', port_names=('o1', 'o2'), port_types=('optical', 'optical'), name='_default', hidden=False, simplify=None, width_function=None, offset_function=None), ), components_along_path=(), radius=10.0, radius_min=5.0, bbox_layers=None, bbox_offsets=None), pass_cross_section_to_bend: bool = False) Component#

Returns a single ring.

ring coupler (cb: bottom) connects to two vertical straights (sl: left, sr: right), two bends (bl, br) and horizontal straight (wg: top)

Parameters:
  • gap – gap between for coupler.

  • radius – for the bend and coupler.

  • length_x – ring coupler length.

  • length_y – vertical straight length.

  • coupler_ring – ring coupler spec.

  • bend – 90 degrees bend spec.

  • bend_coupler – optional bend for coupler.

  • straight – straight spec.

  • cross_section – cross_section spec.

  • pass_cross_section_to_bend – pass cross_section to bend.

          xxxxxxxxxxxxx
      xxxxx           xxxx
    xxx                   xxx
  xxx                       xxx
 xx                           xxx
 x                             xxx
xx                              xx▲
xx                              xx│length_y
xx                              xx▼
xx                             xx
 xx          length_x          x
  xx     ◄───────────────►    x
   xx                       xxx
     xx                   xxx
      xxx──────▲─────────xxx
               │gap
       o1──────▼─────────o2
import ubcpdk

c = ubcpdk.components.ring_single(gap=0.2, radius=10.0, length_x=4.0, length_y=0.6, pass_cross_section_to_bend=False)
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-58.png

ring_single_heater#

ubcpdk.components.ring_single_heater(gap: float = 0.2, radius: float = 10.0, length_x: float = 4.0, length_y: float = 0.6, *, coupler_ring: ComponentSpec = <function coupler_ring>, bend: ComponentSpec = <function bend_euler>, bend_coupler: ComponentFactory | None = <function bend_euler>, straight: ComponentFactory = <function straight>, cross_section_waveguide_heater: CrossSectionSpec = 'xs_sc_heater_metal', cross_section: CrossSectionSpec = CrossSection(sections=(Section(width=0.5, offset=0.0, insets=None, layer='WG', port_names=('o1', 'o2'), port_types=('optical', 'optical'), name='_default', hidden=False, simplify=None, width_function=None, offset_function=None), ), components_along_path=(), radius=10.0, radius_min=5.0, bbox_layers=None, bbox_offsets=None), via_stack: ComponentSpec = functools.partial(<function via_stack>, size=(10, 10), layers=((11, 0), (12, 0)), vias=(None, None)), port_orientation: float | Float2 | None = None, via_stack_offset: Float2 = (0, 0)) Component#

Returns a single ring with heater on top.

ring coupler (cb: bottom) connects to two vertical straights (sl: left, sr: right), two bends (bl, br) and horizontal straight (wg: top)

Parameters:
  • gap – gap between for coupler.

  • radius – for the bend and coupler.

  • length_x – ring coupler length.

  • length_y – vertical straight length.

  • coupler_ring – ring coupler function.

  • bend – 90 degrees bend function.

  • straight – straight function.

  • cross_section_waveguide_heater – for heater.

  • cross_section – for regular waveguide.

  • via_stack – for heater to routing metal.

  • port_orientation – for electrical ports to promote from via_stack. Tuple allows the left and right contacts to be defined differently.

  • via_stack_offset – x,y offset for via_stack.

          xxxxxxxxxxxxx
      xxxxx           xxxx
    xxx                   xxx
  xxx                       xxx
 xx                           xxx
 x                             xxx
xx                              xx▲
xx                              xx│length_y
xx                              xx▼
xx                             xx
 xx          length_x          x
  xx     ◄───────────────►    x
   xx                       xxx
     xx                   xxx
      xxx──────▲─────────xxx
               │gap
       o1──────▼─────────o2
import ubcpdk

c = ubcpdk.components.ring_single_heater(gap=0.2, radius=10.0, length_x=4.0, length_y=0.6, cross_section_waveguide_heater='xs_sc_heater_metal', via_stack_offset=(0, 0))
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-59.png

ring_with_crossing#

ubcpdk.components.ring_with_crossing(*, component: ComponentSpec = <function ebeam_crossing4_2ports>, gap: float = 0.2, length_x: float = 4, length_y: float = 0, radius: float = 5.0, coupler: ComponentSpec = <function coupler_ring>, bend: ComponentSpec = <function bend_euler_sc>, straight: ComponentSpec = <function straight>, with_component: bool = True, port_name: str = 'o4', **kwargs) Component#

Single bus ring made of two couplers (ct: top, cb: bottom) connected.

with two vertical straights (wyl: left, wyr: right) (Component Under Test) in the middle to extract loss from quality factor.

Parameters:
  • component – device under test.

  • gap – in um.

  • length – in um.

  • length_y – in um.

  • radius – in um.

  • coupler – coupler function.

  • bend – bend function.

  • with_component – True adds component. False adds waveguide.

  • port_name – for component input.

  • kwargs – cross_section settings.

  • with_component – if False changes component for just a straight.

 bl-wt-br
 |      | length_y
 wl     component
 |      |
--==cb==-- gap

 length_x
import ubcpdk

c = ubcpdk.components.ring_with_crossing(gap=0.2, length_x=4, length_y=0, radius=5.0, with_component=True, port_name='o4')
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-60.png

spiral#

ubcpdk.components.spiral(N: int = 6, x_inner_length_cutback: float = 300.0, x_inner_offset: float = 0.0, y_straight_inner_top: float = 0.0, xspacing: float = 3.0, yspacing: float = 3.0, bend: ComponentSpec = <function bend_euler>, length: float | None = None, cross_section: CrossSectionSpec = 'xs_sc', with_inner_ports: bool = False, y_straight_outer_offset: float = 0.0, inner_loop_spacing_offset: float = 0.0, mirror_straight: bool = False, **kwargs) Component#

Returns spiral with input and output ports outside the spiral.

Parameters:
  • N – number of loops.

  • x_inner_length_cutback – x inner length.

  • x_inner_offset – x inner offset.

  • y_straight_inner_top – y straight inner top.

  • xspacing – center to center x-spacing.

  • yspacing – center to center y-spacing.

  • bend – function.

  • length – length in um, it is the approximates total length.

  • cross_section – spec.

  • with_inner_ports – if True, removes the internal S-bend and exposes new ports

  • y_straight_outer_offset – amount to add/remove to the last points at the outer output of the spiral

  • inner_loop_spacing_offset – extra difference between the inner ports

  • mirror_straight – if True, mirrors the straight cross section in round_corners (can help when xs is asymmetric)

  • kwargs – cross_section settings.

import ubcpdk

c = ubcpdk.components.spiral(N=6, x_inner_length_cutback=300.0, x_inner_offset=0.0, y_straight_inner_top=0.0, xspacing=3.0, yspacing=3.0, cross_section='xs_sc', with_inner_ports=False, y_straight_outer_offset=0.0, inner_loop_spacing_offset=0.0, mirror_straight=False)
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-61.png

straight#

ubcpdk.components.straight(length: float = 1.0, npoints: int = 2, cross_section='xs_sc') Component[source]#
import ubcpdk

c = ubcpdk.components.straight(length=10.0, npoints=2, cross_section='xs_sc', post_process=(functools.partial(<function add_padding at 0x7f87372dd440>, layers=((68, 0),), default=0, top=0.5, bottom=0.5),))
c.plot()

(Source code)

straight_heater_metal#

ubcpdk.components.straight_heater_metal(length: float = 320.0, length_undercut_spacing: float = 6.0, length_undercut: float = 30.0, length_straight: float = 0.1, length_straight_input: float = 15.0, cross_section: CrossSectionSpec = 'xs_sc', cross_section_heater: CrossSectionSpec = 'xs_heater_metal', cross_section_waveguide_heater: CrossSectionSpec = 'xs_sc_heater_metal', cross_section_heater_undercut: CrossSectionSpec = 'xs_sc_heater_metal_undercut', *, with_undercut: bool = False, via_stack: ComponentSpec | None = 'via_stack_heater_mtop', port_orientation1: int | None = None, port_orientation2: int | None = None, heater_taper_length: float | None = 5.0, ohms_per_square: float | None = None, straight: ComponentSpec = <function straight>) Component#

Returns a thermal phase shifter.

dimensions from https://doi.org/10.1364/OE.27.010456

Parameters:
  • length – of the waveguide.

  • length_undercut_spacing – from undercut regions.

  • length_undercut – length of each undercut section.

  • length_straight – from where the trenches start to the via_stack.

  • length_straight_input – from input port to where trenches start.

  • cross_section – for waveguide ports.

  • cross_section_heater – for heated sections. heater metal only.

  • cross_section_waveguide_heater – for heated sections.

  • cross_section_heater_undercut – for heated sections with undercut.

  • with_undercut – isolation trenches for higher efficiency.

  • via_stack – via stack.

  • port_orientation1 – left via stack port orientation.

  • port_orientation2 – right via stack port orientation.

  • heater_taper_length – minimizes current concentrations from heater to via_stack.

  • ohms_per_square – to calculate resistance.

  • straight – straight component.

import ubcpdk

c = ubcpdk.components.straight_heater_metal(length=320.0, length_undercut_spacing=6.0, length_undercut=30.0, length_straight=0.1, length_straight_input=15.0, cross_section='xs_sc', cross_section_heater='xs_heater_metal', cross_section_waveguide_heater='xs_sc_heater_metal', cross_section_heater_undercut='xs_sc_heater_metal_undercut', with_undercut=False, via_stack='via_stack_heater_mtop', heater_taper_length=5.0)
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-63.png

straight_one_pin#

ubcpdk.components.straight_one_pin(length=1, cross_section=functools.partial(<function cross_section>, radius_min=5, bbox_layers=None, bbox_offsets=None)) Component[source]#
import ubcpdk

c = ubcpdk.components.straight_one_pin(length=1)
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-64.png

taper#

ubcpdk.components.taper(length: float = 10.0, width1: float = 0.5, width2: float | None = None, port: Port | None = None, with_two_ports: bool = True, cross_section: CrossSectionSpec = 'xs_sc', port_order_name: tuple | None = ('o1', 'o2'), port_order_types: tuple | None = ('optical', 'optical'), **kwargs) Component#

Linear taper, which tapers only the main cross section section.

Deprecated, use gf.components.taper_cross_section instead

Parameters:
  • length – taper length.

  • width1 – width of the west/left port.

  • width2 – width of the east/right port. Defaults to width1.

  • port – can taper from a port instead of defining width1.

  • with_two_ports – includes a second port. False for terminator and edge coupler fiber interface.

  • cross_section – specification (CrossSection, string, CrossSectionFactory dict).

  • port_order_name (tuple) – Ordered tuple of port names. First port is default taper port, second name only if with_two_ports flags used.

  • port_order_types (tuple) – Ordered tuple of port types. First port is default taper port, second name only if with_two_ports flags used.

  • kwargs – cross_section settings.

import ubcpdk

c = ubcpdk.components.taper(length=10.0, width1=0.5, with_two_ports=True, cross_section='xs_sc', port_order_name=('o1', 'o2'), port_order_types=('optical', 'optical'))
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-65.png

terminator_short#

ubcpdk.components.terminator_short(**kwargs) Component[source]#
import ubcpdk

c = ubcpdk.components.terminator_short()
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-66.png

thermal_phase_shifter0#

ubcpdk.components.thermal_phase_shifter0() Component[source]#

Return thermal_phase_shifters fixed cell.

import ubcpdk

c = ubcpdk.components.thermal_phase_shifter0()
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-67.png

thermal_phase_shifter1#

ubcpdk.components.thermal_phase_shifter1() Component[source]#

Return thermal_phase_shifters fixed cell.

import ubcpdk

c = ubcpdk.components.thermal_phase_shifter1()
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-68.png

thermal_phase_shifter2#

ubcpdk.components.thermal_phase_shifter2() Component[source]#

Return thermal_phase_shifters fixed cell.

import ubcpdk

c = ubcpdk.components.thermal_phase_shifter2()
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-69.png

thermal_phase_shifter3#

ubcpdk.components.thermal_phase_shifter3() Component[source]#

Return thermal_phase_shifters fixed cell.

import ubcpdk

c = ubcpdk.components.thermal_phase_shifter3()
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-70.png

via_stack_heater_mtop#

ubcpdk.components.via_stack_heater_mtop(*, size=(10, 10), layers: tuple[LayerSpec | None, ...] = ((11, 0), (12, 0)), layer_offsets: Floats | None = None, vias: tuple[ComponentSpec | None, ...] | None = (None, None), layer_port: LayerSpec | None = None, correct_size: bool = True, slot_horizontal: bool = False, slot_vertical: bool = False) Component#

Rectangular via array stack.

You can use it to connect different metal layers or metals to silicon. You can use the naming convention via_stack_layerSource_layerDestination contains 4 ports (e1, e2, e3, e4)

also know as Via array http://www.vlsi-expert.com/2017/12/vias.html

spacing = via.info[‘spacing’] enclosure = via.info[‘enclosure’]

Parameters:
  • size – of the layers.

  • layers – layers on which to draw rectangles.

  • layer_offsets – Optional offsets for each layer with respect to size. positive grows, negative shrinks the size.

  • vias – vias to use to fill the rectangles.

  • layer_port – if None assumes port is on the last layer.

  • correct_size – if True, if the specified dimensions are too small it increases them to the minimum possible to fit a via.

  • slot_horizontal – if True, then vias are horizontal.

  • slot_vertical – if True, then vias are vertical.

import ubcpdk

c = ubcpdk.components.via_stack_heater_mtop(size=(10, 10), layers=((11, 0), (12, 0)), vias=(None, None), correct_size=True, slot_horizontal=False, slot_vertical=False)
c.plot()

(Source code, png, hires.png, pdf)

_images/components_plot-71.png