Source code for quantify_scheduler.device_under_test.composite_square_edge

# Repository: https://gitlab.com/quantify-os/quantify-scheduler
# Licensed according to the LICENCE file on the main branch
"""The module provides classes related CZ operations."""
from typing import Dict, Any

from qcodes.instrument import InstrumentChannel
from qcodes.instrument.base import InstrumentBase
from qcodes.instrument.parameter import ManualParameter

from quantify_scheduler.backends.graph_compilation import OperationCompilationConfig
from quantify_scheduler.helpers.validators import Numbers
from quantify_scheduler.device_under_test.edge import Edge
from quantify_scheduler.operations.pulse_factories import composite_square_pulse
from quantify_scheduler.resources import BasebandClockResource


[docs] class CZ(InstrumentChannel): """Submodule containing parameters for performing a CZ operation.""" def __init__(self, parent: InstrumentBase, name: str, **kwargs: Any) -> None: super().__init__(parent=parent, name=name) self.square_amp = ManualParameter( "square_amp", docstring=r"""Amplitude of the square envelope.""", unit="V", initial_value=kwargs.get("square_amp", 0.5), vals=Numbers(min_value=0, max_value=1e12, allow_nan=True), instrument=self, ) self.square_duration = ManualParameter( "square_duration", docstring=r"""The square pulse duration in seconds.""", unit="s", initial_value=kwargs.get("square_duration", 2e-8), vals=Numbers(min_value=0, max_value=1e12, allow_nan=True), instrument=self, ) self.add_parameter( name=f"{parent._parent_element_name}_phase_correction", docstring=r"""The phase correction for the parent qubit after the""" r""" square pulse operation has been performed.""", unit="degrees", parameter_class=ManualParameter, initial_value=kwargs.get( f"{parent._parent_element_name}_phase_correction", 0 ), vals=Numbers(min_value=-1e12, max_value=1e12, allow_nan=True), ) self.add_parameter( name=f"{parent._child_element_name}_phase_correction", docstring=r"""The phase correction for the child qubit after the""" r""" Square pulse operation has been performed.""", unit="degrees", parameter_class=ManualParameter, initial_value=kwargs.get( f"{parent._child_element_name}_phase_correction", 0 ), vals=Numbers(min_value=-1e12, max_value=1e12, allow_nan=True), )
[docs] class CompositeSquareEdge(Edge): """ An example Edge implementation which connects two BasicTransmonElements. This edge implements a square flux pulse and two virtual z phase corrections for the CZ operation between the two BasicTransmonElements. """ def __init__( self, parent_element_name: str, child_element_name: str, **kwargs, ): cz_data = kwargs.pop("cz", {}) super().__init__( parent_element_name=parent_element_name, child_element_name=child_element_name, **kwargs, ) self.add_submodule("cz", CZ(parent=self, name="cz", **cz_data))
[docs] def generate_edge_config(self) -> Dict[str, Dict[str, OperationCompilationConfig]]: """ Generate valid device config. Fills in the edges information to produce a valid device config for the quantify-scheduler making use of the :func:`~.circuit_to_device._compile_circuit_to_device` function. """ # pylint: disable=line-too-long edge_op_config = { f"{self.name}": { "CZ": OperationCompilationConfig( factory_func=composite_square_pulse, factory_kwargs={ "square_port": self.parent_device_element.ports.flux(), "square_clock": BasebandClockResource.IDENTITY, "square_amp": self.cz.square_amp(), "square_duration": self.cz.square_duration(), "virt_z_parent_qubit_phase": self.cz.parameters[ f"{self._parent_element_name}_phase_correction" ](), "virt_z_parent_qubit_clock": f"{self.parent_device_element.name}.01", "virt_z_child_qubit_phase": self.cz.parameters[ f"{self._child_element_name}_phase_correction" ](), "virt_z_child_qubit_clock": f"{self.child_device_element.name}.01", }, ), } } return edge_op_config