Source code for qpdk.cells.airbridge

"""Airbridge components for superconducting quantum circuits.

This module provides airbridge components for crossing transmission lines
without electrical contact, essential for complex quantum circuit layouts.
Airbridges are elevated metal structures that span over underlying circuits.
"""

from __future__ import annotations

import gdsfactory as gf
from gdsfactory.component import Component
from gdsfactory.typings import LayerSpec

import qpdk.tech as tech
from qpdk.tech import LAYER


[docs] @gf.cell def airbridge( bridge_length: float = 30.0, bridge_width: float = 8.0, pad_width: float = 15.0, pad_length: float = 12.0, bridge_layer: LayerSpec = LAYER.AB_DRAW, pad_layer: LayerSpec = LAYER.AB_VIA, ) -> Component: """Generate a superconducting airbridge component. Creates an airbridge consisting of a suspended bridge span and landing pads on either side. The bridge allows transmission lines to cross over each other without electrical contact, which is essential for complex quantum circuit routing without crosstalk. The bridge_layer (AB_DRAW) represents the elevated metal bridge structure, while the pad_layer (AB_VIA) represents the contact/landing pads that connect to the underlying circuit. Note: To be used with :class:`~gdsfactory.cross_section.ComponentAlongPath` the unrotated version should be _oriented for placement on a horizontal line_. Args: bridge_length: Total length of the airbridge span in µm. bridge_width: Width of the suspended bridge in µm. pad_width: Width of the landing pads in µm. pad_length: Length of each landing pad in µm. bridge_layer: Layer for the suspended bridge metal (default: AB_DRAW). pad_layer: Layer for the landing pads/contacts (default: AB_VIA). Returns: Component containing the airbridge geometry with appropriate ports. """ c = gf.Component() # Create the suspended bridge c << gf.components.rectangle( size=(bridge_length, bridge_width), layer=bridge_layer, centered=True, ) # Create left landing pad left_pad = c << gf.components.rectangle( size=(pad_length, pad_width), layer=pad_layer, centered=True, ) left_pad.move((-bridge_length / 2 - pad_length / 2, 0)) # Create right landing pad right_pad = c << gf.components.rectangle( size=(pad_length, pad_width), layer=pad_layer, centered=True, ) right_pad.move((bridge_length / 2 + pad_length / 2, 0)) # Port configuration data port_configs = [ { "name": "o1", "center": (0, bridge_width / 2), "width": bridge_width, "orientation": 90, "layer": bridge_layer, }, { "name": "o2", "center": (0, -bridge_width / 2), "width": bridge_width, "orientation": 270, "layer": bridge_layer, }, { "name": "e1", "center": (-bridge_length / 2 - pad_length, 0), "width": pad_width, "orientation": 180, "layer": pad_layer, "port_type": "electrical", }, { "name": "e2", "center": (bridge_length / 2 + pad_length, 0), "width": pad_width, "orientation": 0, "layer": pad_layer, "port_type": "electrical", }, ] # Add all ports using the configuration data for config in port_configs: c.add_port(**config) c.rotate(90) return c
def cpw_with_airbridges( airbridge_spacing: float = 100.0, airbridge_padding: float = 10.0, bridge_component: Component | None = None, **cpw_kwargs, ) -> gf.CrossSection: """Create a coplanar waveguide cross-section with airbridges. This function creates a CPW cross-section that includes airbridges placed at regular intervals along the transmission line. This is useful for preventing slot mode propagation and reducing crosstalk in quantum circuits. Args: airbridge_spacing: Distance between airbridge centers in µm. airbridge_padding: Minimum distance from path start to first airbridge in µm. bridge_component: Custom airbridge component. If None, uses default airbridge. **cpw_kwargs: Additional arguments passed to the coplanar_waveguide function. Returns: CrossSection with airbridges for use in routing functions. """ if bridge_component is None: bridge_component = airbridge() # Create base CPW cross-section base_xs = tech.coplanar_waveguide(**cpw_kwargs) # Create ComponentAlongPath for airbridges component_along_path = gf.ComponentAlongPath( component=bridge_component, spacing=airbridge_spacing, padding=airbridge_padding, ) # Create a copy with airbridges using Pydantic model_copy return base_xs.model_copy(update={"components_along_path": (component_along_path,)}) if __name__ == "__main__": # Example usage and testing from qpdk import PDK PDK.activate() # Create and display a single airbridge bridge = airbridge() bridge.show()