Source code for ltoi300.cells

import gdsfactory as gf

from _utils.chip_floorplan import chip_frame
from _utils.optical_resonators import ring_resonator as _ring_resonator
from ltoi300._builders.edge_couplers import (
    build_cband_ltoi300_edge_coupler as _build_cband_ltoi300_edge_coupler,
)
from ltoi300._builders.edge_couplers import (
    build_oband_ltoi300_edge_coupler as _build_oband_ltoi300_edge_coupler,
)
from ltoi300._builders.mmis import (
    build_mmi1x2_cband as _build_mmi1x2_cband,
)
from ltoi300._builders.mmis import (
    build_mmi1x2_oband as _build_mmi1x2_oband,
)
from ltoi300._builders.mmis import (
    build_mmi2x2_cband as _build_mmi2x2_cband,
)
from ltoi300._builders.mmis import (
    build_mmi2x2_oband as _build_mmi2x2_oband,
)
from ltoi300._builders.mzms import (
    build_terminated_mzm_cband as _build_terminated_mzm_cband,
)
from ltoi300._builders.mzms import (
    build_terminated_mzm_oband as _build_terminated_mzm_oband,
)
from ltoi300._builders.mzms import (
    build_unterminated_mzm_cband as _build_unterminated_mzm_cband,
)
from ltoi300._builders.mzms import (
    build_unterminated_mzm_oband as _build_unterminated_mzm_oband,
)
from ltoi300._builders.straights import (
    build_straight_rwg700 as _build_straight_rwg700,
)
from ltoi300._builders.straights import (
    build_straight_rwg900 as _build_straight_rwg900,
)
from ltoi300._builders.straights import (
    build_straight_rwg2500 as _build_straight_rwg2500,
)
from ltoi300.tech import xs_rwg700, xs_rwg900

############################################
############# O-band cells #################
############################################

################
# Straights
################


[docs] @gf.cell def straight_rwg700_oband(length: float = 10.0, **kwargs) -> gf.Component: """Returns a standard straight 700 nm-wide single-mode waveguide for O-band propagation. Args: length: straight length (um). """ return _build_straight_rwg700( length=length, **kwargs, )
[docs] @gf.cell def straight_rwg2500(length: float = 10.0, **kwargs) -> gf.Component: """Returns a straight 2500 nm-wide multi-mode waveguide. Args: length: straight length (um). """ return _build_straight_rwg2500( length=length, **kwargs, )
########################## # Edge couplers ##########################
[docs] @gf.cell def edge_coupler_oband( input_ext: float = 10.0, total_taper_length: float = 160.0, upper_taper_length: float = 80.0, ) -> gf.Component: """Returns an O-band edge coupler for LTOI300. Args: input_ext: extension length at the taper tip. total_taper_length: total length of the taper. upper_taper_length: length of the ridge section taper. """ return _build_oband_ltoi300_edge_coupler( input_ext=input_ext, total_taper_length=total_taper_length, upper_taper_length=upper_taper_length, )
[docs] @gf.cell def edge_coupler_cband( input_ext: float = 10.0, total_taper_length: float = 160.0, upper_taper_length: float = 80.0, ) -> gf.Component: """Returns a C-band edge coupler for LTOI300. Args: input_ext: extension length at the taper tip. total_taper_length: total length of the taper. upper_taper_length: length of the ridge section taper. """ return _build_cband_ltoi300_edge_coupler( input_ext=input_ext, total_taper_length=total_taper_length, upper_taper_length=upper_taper_length, )
########################## # 1x2 and 2x2 O-band MMIs ##########################
[docs] @gf.cell def mmi1x2_oband(**kwargs) -> gf.Component: r"""Returns a standard 1x2 MMI optimized for low insertion loss on a 300/120 stack in the O-band (at 1310 nm). Use with default parameters for standard designs: `mmi = mmi1x2_oband()`. Parameters can be overridden at the user's risk. Args: width_mmi: Width of the MMI region in micrometers length_mmi: Length of the MMI region in micrometers width_taper: Width of the taper at the MMI interface in micrometers length_taper: Length of the input/output tapers in micrometers port_separation: Center-to-center separation between output ports in micrometers cross_section: Cross-section specification for the waveguides **kwargs: Additional keyword arguments passed to gdsfactory mmi1x2 Note: Default values for all parameters are defined in ltoi300._builders.mmis.build_mmi1x2_oband """ return _build_mmi1x2_oband(**kwargs)
[docs] @gf.cell def mmi2x2_oband(**kwargs) -> gf.Component: r"""Returns a standard 2x2 MMI optimized for 50% splitting on a 300/120 stack in the O-band (at 1310 nm). Use with default parameters for standard designs: `mmi = mmi2x2_oband()`. Parameters can be overridden at the user's risk. Args: width_mmi: Width of the MMI region in micrometers length_mmi: Length of the MMI region in micrometers width_taper: Width of the taper at the MMI interface in micrometers length_taper: Length of the input/output tapers in micrometers port_separation: Center-to-center separation between output ports in micrometers cross_section: Cross-section specification for the waveguides **kwargs: Additional keyword arguments passed to gdsfactory mmi2x2 Note: Default values for all parameters are defined in ltoi300._builders.mmis.build_mmi2x2_oband """ return _build_mmi2x2_oband(**kwargs)
################ # Modulators ################
[docs] @gf.cell def terminated_mzm_1x2mmi_oband( modulation_length: float = 5000.0, rf_gap: float = 5.5, rf_central_conductor_width: float = 20.0, gsg_pitch: float = 100.0, length_imbalance: float = 100.0, bias_tuning_section_length: float = 700.0, ): """Returns a terminated MZM with 1x2 MMI splitter with effective index matching for O-band operation. Args: modulation_length: length of the EO modulation section. rf_gap: gap between the RF ground planes and the RF central conductor. rf_central_conductor_width: width of the RF central conductor. gsg_pitch: pitch of the GSGs contact pads. length_imbalance: length difference between the MZ branches for spectral bias tuning. If 0, MZ is balanced. bias_tuning_section_length: length of the heater bias tuning section. If 0, the heater is disabled. """ mmi_cell = mmi1x2_oband() # noqa: use public cell cpw_pad_params = { "pitch": gsg_pitch, } cpw_params = { "rf_gap": rf_gap, "rf_central_conductor_width": rf_central_conductor_width, } optical_waveguide_params = { "length_imbalance": length_imbalance, "heater_section_length": bias_tuning_section_length, } heater_params = { "length": bias_tuning_section_length, } return _build_terminated_mzm_oband( mmi_cell=mmi_cell, modulation_length=modulation_length, cpw_params=cpw_params, cpw_pad_params=cpw_pad_params, optical_waveguide_params=optical_waveguide_params, heater_params=heater_params, )
[docs] @gf.cell def unterminated_mzm_1x2mmi_oband( modulation_length: float = 5000.0, rf_gap: float = 5.5, rf_central_conductor_width: float = 20.0, gsg_pitch: float = 100.0, length_imbalance: float = 100.0, bias_tuning_section_length: float = 700.0, ): """Returns a unterminated MZM with 1x2 MMI splitter with effective index matching for O-band operation. Args: modulation_length: length of the EO modulation section. rf_gap: gap between the RF ground planes and the RF central conductor. rf_central_conductor_width: width of the RF central conductor. gsg_pitch: pitch of the GSGs contact pads. length_imbalance: length difference between the MZ branches for spectral bias tuning. If 0, MZ is balanced. bias_tuning_section_length: length of the heater bias tuning section. If 0, the heater is disabled. """ cpw_params = { "rf_gap": rf_gap, "rf_central_conductor_width": rf_central_conductor_width, } cpw_pad_params = { "pitch": gsg_pitch, } optical_waveguide_params = { "length_imbalance": length_imbalance, } heater_params = { "length": bias_tuning_section_length, } return _build_unterminated_mzm_oband( mmi_cell=mmi1x2_oband(), modulation_length=modulation_length, cpw_params=cpw_params, cpw_pad_params=cpw_pad_params, optical_waveguide_params=optical_waveguide_params, heater_params=heater_params, )
[docs] @gf.cell def terminated_mzm_2x2mmi_oband( modulation_length: float = 5000.0, rf_gap: float = 5.5, rf_central_conductor_width: float = 20.0, gsg_pitch: float = 100.0, length_imbalance: float = 100.0, bias_tuning_section_length: float = 700.0, ) -> gf.Component: """Returns a terminated MZM with 2x2 MMI splitter with effective index matching for O-band operation. Args: modulation_length: length of the EO modulation section. rf_gap: gap between the RF ground planes and the RF central conductor. rf_central_conductor_width: width of the RF central conductor. gsg_pitch: pitch of the GSGs contact pads. length_imbalance: length difference between the MZ branches for spectral bias tuning. If 0, MZ is balanced. bias_tuning_section_length: length of the heater bias tuning section. If 0, the heater is disabled. """ cpw_params = { "rf_gap": rf_gap, "rf_central_conductor_width": rf_central_conductor_width, } cpw_pad_params = { "pitch": gsg_pitch, } optical_waveguide_params = { "length_imbalance": length_imbalance, } heater_params = { "length": bias_tuning_section_length, } return _build_terminated_mzm_oband( mmi_cell=mmi2x2_oband(), modulation_length=modulation_length, cpw_params=cpw_params, cpw_pad_params=cpw_pad_params, optical_waveguide_params=optical_waveguide_params, heater_params=heater_params, )
[docs] @gf.cell def unterminated_mzm_2x2mmi_oband( modulation_length: float = 5000.0, rf_gap: float = 5.5, rf_central_conductor_width: float = 20.0, gsg_pitch: float = 100.0, length_imbalance: float = 100.0, bias_tuning_section_length: float = 700.0, ) -> gf.Component: """Returns an unterminated MZM with 2x2 MMI splitter with effective index matching for O-band operation. Args: modulation_length: length of the EO modulation section. rf_gap: gap between the RF ground planes and the RF central conductor. rf_central_conductor_width: width of the RF central conductor. gsg_pitch: pitch of the GSGs contact pads. length_imbalance: length difference between the MZ branches for spectral bias tuning. If 0, MZ is balanced. bias_tuning_section_length: length of the heater bias tuning section. If 0, the heater is disabled. """ cpw_params = { "rf_gap": rf_gap, "rf_central_conductor_width": rf_central_conductor_width, } cpw_pad_params = { "pitch": gsg_pitch, } optical_waveguide_params = { "length_imbalance": length_imbalance, } heater_params = { "length": bias_tuning_section_length, } return _build_unterminated_mzm_oband( mmi_cell=mmi2x2_oband(), modulation_length=modulation_length, cpw_params=cpw_params, cpw_pad_params=cpw_pad_params, optical_waveguide_params=optical_waveguide_params, heater_params=heater_params, )
##################### # Optical Resonators #####################
[docs] @gf.cell def ring_resonator_single_mode_point_coupler_oband( ring_radius: float = 200.0, ring_width: float = 0.7, gap: float = 1.05, bus_length: float | None = None, ) -> gf.Component: """Returns a ring resonator with an evanescent point coupler for O-band operation. The gap is set to 1.05 um to ensure critical coupling. Note: the critical coupling condition is loss-specific and a different gap may be required for other loss conditions.""" return _ring_resonator( gap=gap, ring_radius=ring_radius, bus_length=bus_length, bus_xs=xs_rwg700(), ring_xs=xs_rwg700(width=ring_width), )
[docs] @gf.cell def ring_resonator_multimode_point_coupler_oband( ring_radius: float = 200.0, ring_width: float = 1.5, gap: float = 0.75, bus_length: float | None = None, ) -> gf.Component: """Returns a multimode ring resonator with an evanescent point coupler for O-band operation. The gap is set to 0.75 um to ensure critical coupling. Note: the critical coupling condition is loss-specific and a different gap may be required for other loss conditions.""" return _ring_resonator( gap=gap, ring_radius=ring_radius, bus_length=bus_length, bus_xs=xs_rwg700(), ring_xs=xs_rwg700(width=ring_width), )
############################################ ############# C-band cells ################# ############################################ ################ # Straights ################
[docs] @gf.cell def straight_rwg900_cband(length: float = 10.0, **kwargs) -> gf.Component: """Standard straight single-mode waveguide for C-band propagation.""" return _build_straight_rwg900( length=length, **kwargs, )
########## # Bends ########## ######################### # 1x2 and 2x2 C-band MMIs #########################
[docs] @gf.cell def mmi1x2_cband(**kwargs) -> gf.Component: r"""Returns a standard 1x2 MMI optimized for low insertion loss on a 300/120 stack in the C-band (at 1550 nm). Use with default parameters for standard designs: `mmi = mmi1x2_cband()`. Parameters can be overridden at the user's risk. Args: width_mmi: Width of the MMI region in micrometers length_mmi: Length of the MMI region in micrometers width_taper: Width of the taper at the MMI interface in micrometers length_taper: Length of the input/output tapers in micrometers port_separation: Center-to-center separation between output ports in micrometers cross_section: Cross-section specification for the waveguides **kwargs: Additional keyword arguments passed to gdsfactory mmi1x2 Note: Default values for all parameters are defined in ltoi300._builders.mmis.build_mmi1x2_cband """ return _build_mmi1x2_cband(**kwargs)
[docs] @gf.cell def mmi2x2_cband(**kwargs) -> gf.Component: r"""Returns a standard 2x2 MMI optimized for 50% splitting on a 300/120 stack in the C-band (at 1550 nm). Use with default parameters for standard designs: `mmi = mmi2x2_cband()`. Parameters can be overridden at the user's risk. Args: width_mmi: Width of the MMI region in micrometers length_mmi: Length of the MMI region in micrometers width_taper: Width of the taper at the MMI interface in micrometers length_taper: Length of the input/output tapers in micrometers port_separation: Center-to-center separation between output ports in micrometers cross_section: Cross-section specification for the waveguides **kwargs: Additional keyword arguments passed to gdsfactory mmi2x2 Note: Default values for all parameters are defined in ltoi300._builders.mmis.build_mmi2x2_cband """ return _build_mmi2x2_cband(**kwargs)
############### # Modulators ###############
[docs] @gf.cell def terminated_mzm_1x2mmi_cband( modulation_length: float = 5000.0, rf_gap: float = 5.5, rf_central_conductor_width: float = 16.0, gsg_pitch: float = 100.0, length_imbalance: float = 100.0, bias_tuning_section_length: float = 700.0, ): """Returns a terminated MZM with 1x2 MMI splitter with effective index matching for C-band operation. Args: modulation_length: length of the EO modulation section. rf_gap: gap between the RF ground planes and the RF central conductor. rf_central_conductor_width: width of the RF central conductor. gsg_pitch: pitch of the GSGs contact pads. length_imbalance: length difference between the MZ branches for spectral bias tuning. If 0, MZ is balanced. bias_tuning_section_length: length of the heater bias tuning section. If 0, the heater is disabled. """ cpw_pad_params = { "pitch": gsg_pitch, } cpw_params = { "rf_gap": rf_gap, "rf_central_conductor_width": rf_central_conductor_width, } optical_waveguide_params = { "length_imbalance": length_imbalance, } heater_params = { "length": bias_tuning_section_length, } return _build_terminated_mzm_cband( mmi_cell=mmi1x2_cband(), modulation_length=modulation_length, cpw_params=cpw_params, cpw_pad_params=cpw_pad_params, optical_waveguide_params=optical_waveguide_params, heater_params=heater_params, )
[docs] @gf.cell def unterminated_mzm_1x2mmi_cband( modulation_length: float = 5000.0, rf_gap: float = 5.5, rf_central_conductor_width: float = 16.0, gsg_pitch: float = 100.0, length_imbalance: float = 100.0, bias_tuning_section_length: float = 700.0, ): """Returns a unterminated MZM with 1x2 MMI splitter with effective index matching for C-band operation. Args: modulation_length: length of the EO modulation section. rf_gap: gap between the RF ground planes and the RF central conductor. rf_central_conductor_width: width of the RF central conductor. gsg_pitch: pitch of the GSGs contact pads. length_imbalance: length difference between the MZ branches for spectral bias tuning. If 0, MZ is balanced. bias_tuning_section_length: length of the heater bias tuning section. If 0, the heater is disabled. """ cpw_pad_params = { "pitch": gsg_pitch, } cpw_params = { "rf_gap": rf_gap, "rf_central_conductor_width": rf_central_conductor_width, } optical_waveguide_params = { "length_imbalance": length_imbalance, } heater_params = { "length": bias_tuning_section_length, } return _build_unterminated_mzm_cband( mmi_cell=mmi1x2_cband(), modulation_length=modulation_length, cpw_params=cpw_params, cpw_pad_params=cpw_pad_params, optical_waveguide_params=optical_waveguide_params, heater_params=heater_params, )
[docs] @gf.cell def terminated_mzm_2x2mmi_cband( modulation_length: float = 5000.0, rf_gap: float = 5.5, rf_central_conductor_width: float = 16.0, gsg_pitch: float = 100.0, length_imbalance: float = 100.0, bias_tuning_section_length: float = 700.0, ) -> gf.Component: """Returns a terminated MZM with 2x2 MMI splitter with effective index matching for C-band operation. Args: modulation_length: length of the EO modulation section. rf_gap: gap between the RF ground planes and the RF central conductor. rf_central_conductor_width: width of the RF central conductor. gsg_pitch: pitch of the GSGs contact pads. length_imbalance: length difference between the MZ branches for spectral bias tuning. If 0, MZ is balanced. bias_tuning_section_length: length of the heater bias tuning section. If 0, the heater is disabled. """ cpw_pad_params = { "pitch": gsg_pitch, } cpw_params = { "rf_gap": rf_gap, "rf_central_conductor_width": rf_central_conductor_width, } optical_waveguide_params = { "length_imbalance": length_imbalance, } heater_params = { "length": bias_tuning_section_length, } return _build_terminated_mzm_cband( mmi_cell=mmi2x2_cband(), modulation_length=modulation_length, cpw_params=cpw_params, cpw_pad_params=cpw_pad_params, optical_waveguide_params=optical_waveguide_params, heater_params=heater_params, )
[docs] @gf.cell def unterminated_mzm_2x2mmi_cband( modulation_length: float = 5000.0, rf_gap: float = 5.5, rf_central_conductor_width: float = 16.0, gsg_pitch: float = 100.0, length_imbalance: float = 100.0, bias_tuning_section_length: float = 700.0, ) -> gf.Component: """Returns an unterminated MZM with 2x2 MMI splitter with effective index matching for C-band operation. Args: modulation_length: length of the EO modulation section. rf_gap: gap between the RF ground planes and the RF central conductor. rf_central_conductor_width: width of the RF central conductor. gsg_pitch: pitch of the GSGs contact pads. length_imbalance: length difference between the MZ branches for spectral bias tuning. If 0, MZ is balanced. bias_tuning_section_length: length of the heater bias tuning section. If 0, the heater is disabled. """ cpw_pad_params = { "pitch": gsg_pitch, } cpw_params = { "rf_gap": rf_gap, "rf_central_conductor_width": rf_central_conductor_width, } optical_waveguide_params = { "length_imbalance": length_imbalance, } heater_params = { "length": bias_tuning_section_length, } return _build_unterminated_mzm_cband( mmi_cell=mmi2x2_cband(), modulation_length=modulation_length, cpw_params=cpw_params, cpw_pad_params=cpw_pad_params, optical_waveguide_params=optical_waveguide_params, heater_params=heater_params, )
##################### # Optical Resonators #####################
[docs] @gf.cell def ring_resonator_single_mode_point_coupler_cband( ring_radius: float = 200.0, ring_width: float = 0.9, gap: float = 1.5, bus_length: float | None = None, ) -> gf.Component: """Returns a single mode ring resonator with an evanescent point coupler for C-band operation. The gap is set to 1.5 um to ensure critical coupling. Note: the critical coupling condition is loss-specific and a different gap may be required for other loss conditions.""" return _ring_resonator( gap=gap, ring_radius=ring_radius, bus_length=bus_length, bus_xs=xs_rwg900(), ring_xs=xs_rwg900(width=ring_width), )
[docs] @gf.cell def ring_resonator_multimode_point_coupler_cband( ring_radius: float = 200.0, ring_width: float = 1.5, gap: float = 1.2, bus_length: float | None = None, ) -> gf.Component: """Returns a multimode ring resonator with an evanescent point coupler for C-band operation. The gap is set to 1.2 um to ensure critical coupling. Note: the critical coupling condition is loss-specific and a different gap may be required for other loss conditions.""" return _ring_resonator( gap=gap, ring_radius=ring_radius, bus_length=bus_length, bus_xs=xs_rwg900(), ring_xs=xs_rwg900(width=ring_width), )
if __name__ == "__main__": chip_frame().show()