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()