circuit_to_device#

Compilation backend for quantum-circuit to quantum-device layer.

Module Contents#

Functions#

compile_circuit_to_device_with_config_validation(...)

Add pulse information to all gates in the schedule.

_compile_circuit_to_device(…)

set_pulse_and_acquisition_clock(...)

Ensures that each pulse/acquisition-level clock resource is added to the schedule,

_extract_clock_freqs(→ None)

_set_pulse_and_acquisition_clock(…)

Ensures that each pulse/acquisition-level clock resource is added to the schedule.

_valid_clock_in_schedule(→ bool)

Asserts that valid clock is present. Returns whether clock is already in schedule.

_clocks_compatible(→ bool)

Compare device config and schedule resources for compatibility of their clocks.

_assert_operation_valid_device_level(→ None)

Verifies that the operation has been compiled to device level.

_compile_multiplexed(...)

Compiles gate with multiple qubits.

_compile_single_qubit(...)

Compiles gate with multiple qubits.

_compile_two_qubits(...)

Compiles gate with multiple qubits.

_compile_circuit_to_device_pulse_compensation(...)

Compiles circuit-level pulse compensation operation to device-level.

_get_device_repr_from_cfg(...)

_get_device_repr_from_cfg_multiplexed(...)

compile_circuit_to_device_with_config_validation(schedule: quantify_scheduler.schedules.schedule.Schedule, config: quantify_scheduler.backends.graph_compilation.CompilationConfig) quantify_scheduler.schedules.schedule.Schedule[source]#

Add pulse information to all gates in the schedule.

Before calling this function, the schedule can contain abstract operations (gates or measurements). This function adds pulse and acquisition information with respect to config as they are expected to arrive to device (latency or distortion corrections are not taken into account).

From a point of view of Compilation, this function converts a schedule defined on a quantum-circuit layer to a schedule defined on a quantum-device layer.

Parameters:
Returns:

The modified schedule with pulse information added to all gates, or the unmodified schedule if circuit to device compilation is not necessary.

_compile_circuit_to_device(operation: quantify_scheduler.schedules.schedule.Schedule, device_cfg: quantify_scheduler.backends.graph_compilation.DeviceCompilationConfig, device_overrides: dict) quantify_scheduler.schedules.schedule.Schedule[source]#
_compile_circuit_to_device(operation: quantify_scheduler.operations.operation.Operation | quantify_scheduler.schedules.schedule.Schedule, device_cfg: quantify_scheduler.backends.graph_compilation.DeviceCompilationConfig, device_overrides: dict) quantify_scheduler.operations.operation.Operation | quantify_scheduler.schedules.schedule.Schedule
set_pulse_and_acquisition_clock(schedule: quantify_scheduler.schedules.schedule.Schedule, config: quantify_scheduler.backends.graph_compilation.CompilationConfig) quantify_scheduler.schedules.schedule.Schedule[source]#

Ensures that each pulse/acquisition-level clock resource is added to the schedule, and validates the given configuration.

If a pulse/acquisition-level clock resource has not been added to the schedule and is present in device_cfg, it is added to the schedule.

A warning is given when a clock resource has conflicting frequency definitions, and an error is raised if the clock resource is unknown.

Parameters:
Returns:

The modified schedule with all clock resources added, or the unmodified schedule if circuit to device compilation is not necessary.

Warns:

RuntimeWarning – When clock has conflicting frequency definitions.

Raises:
  • RuntimeError – When operation is not at pulse/acquisition-level.

  • ValueError – When clock frequency is unknown.

  • ValueError – When clock frequency is NaN.

_extract_clock_freqs(operation: quantify_scheduler.operations.operation.Operation | quantify_scheduler.schedules.schedule.Schedule, all_clock_freqs: dict[str, float]) None[source]#
_set_pulse_and_acquisition_clock(schedule: quantify_scheduler.schedules.schedule.Schedule, operation: quantify_scheduler.schedules.schedule.Schedule, all_clock_freqs: dict[str, float], verified_clocks: list) quantify_scheduler.schedules.schedule.Schedule[source]#
_set_pulse_and_acquisition_clock(schedule: quantify_scheduler.schedules.schedule.Schedule, operation: quantify_scheduler.operations.operation.Operation | quantify_scheduler.schedules.schedule.Schedule, all_clock_freqs: dict[str, float], verified_clocks: list) quantify_scheduler.operations.operation.Operation | quantify_scheduler.schedules.schedule.Schedule

Ensures that each pulse/acquisition-level clock resource is added to the schedule.

Parameters:
  • schedule – The resources from operation are added to schedule if operation is not a Schedule.

  • operation – The operation to collect resources from.

  • all_clock_freqs – All clock frequencies.

  • verified_clocks – Already verified clocks.

Returns:

The modified operation with all clock resources added.

_valid_clock_in_schedule(clock: str, all_clock_freqs: dict[str, float], schedule: quantify_scheduler.schedules.schedule.Schedule, operation: quantify_scheduler.operations.operation.Operation) bool[source]#

Asserts that valid clock is present. Returns whether clock is already in schedule.

Parameters:
  • clock – Name of the clock

  • all_clock_freqs – All clock frequencies

  • schedule – Schedule that potentially has the clock in its resources

  • operation – Quantify operation, to which the clock belongs. Only used for error message.

Raises:

ValueError – Returns ValueError if (i) the device config is the only defined clock and contains nan values or (ii) no clock is defined.

_clocks_compatible(clock: str, device_cfg: quantify_scheduler.backends.graph_compilation.DeviceCompilationConfig, schedule_clock_resources: dict[str, float]) bool[source]#

Compare device config and schedule resources for compatibility of their clocks.

Clocks can be defined in the device_cfg and in the schedule. They are consistent if

  • they have the same value

  • if the clock in the device config is nan (not the other way around)

These conditions are also generalized to numpy arrays. Arrays of different length are only equal if all frequencies in the device config are nan.

If the clocks are inconsistent, a warning message is emitted.

Parameters:
  • clock – Name of the clock found in the device config and schedule

  • device_cfg – Device config containing the clock

  • schedule_clock_resources – All clock resources in the schedule

Returns:

True if the clock frequencies are consistent.

_assert_operation_valid_device_level(operation: quantify_scheduler.operations.operation.Operation) None[source]#

Verifies that the operation has been compiled to device level.

Parameters:

operation – Quantify operation

_compile_multiplexed(operation: quantify_scheduler.operations.operation.Operation, qubits: Sequence[str], operation_type: str, device_cfg: quantify_scheduler.backends.graph_compilation.DeviceCompilationConfig, device_overrides: dict) quantify_scheduler.operations.operation.Operation | quantify_scheduler.schedules.schedule.Schedule[source]#

Compiles gate with multiple qubits.

Note: it updates the operation, if it can directly add pulse representation.

_compile_single_qubit(operation: quantify_scheduler.operations.operation.Operation, qubit: str, operation_type: str, device_cfg: quantify_scheduler.backends.graph_compilation.DeviceCompilationConfig, device_overrides: dict) quantify_scheduler.operations.operation.Operation | quantify_scheduler.schedules.schedule.Schedule[source]#

Compiles gate with multiple qubits.

Note: it updates the operation, if it can directly add pulse representation.

_compile_two_qubits(operation: quantify_scheduler.operations.operation.Operation, qubits: Sequence[str], operation_type: str, device_cfg: quantify_scheduler.backends.graph_compilation.DeviceCompilationConfig, device_overrides: dict) quantify_scheduler.operations.operation.Operation | quantify_scheduler.schedules.schedule.Schedule[source]#

Compiles gate with multiple qubits.

Note: it updates the operation, if it can directly add pulse representation.

_compile_circuit_to_device_pulse_compensation(operation: quantify_scheduler.operations.pulse_compensation_library.PulseCompensation, device_cfg: quantify_scheduler.backends.graph_compilation.DeviceCompilationConfig) quantify_scheduler.operations.pulse_compensation_library.PulseCompensation[source]#

Compiles circuit-level pulse compensation operation to device-level.

_get_device_repr_from_cfg(operation: quantify_scheduler.operations.operation.Operation, operation_cfg: quantify_scheduler.backends.graph_compilation.OperationCompilationConfig, device_overrides: dict) quantify_scheduler.operations.operation.Operation | quantify_scheduler.schedules.schedule.Schedule[source]#
_get_device_repr_from_cfg_multiplexed(operation: quantify_scheduler.operations.operation.Operation, operation_cfg: quantify_scheduler.backends.graph_compilation.OperationCompilationConfig, mux_idx: int, device_overrides: dict) quantify_scheduler.operations.operation.Operation | quantify_scheduler.schedules.schedule.Schedule[source]#
exception ConfigKeyError(kind: str, missing: str, allowed: list[str])[source]#

Bases: KeyError

Custom exception for when a key is missing in a configuration file.

value[source]#
exception MultipleKeysError(operation: str, matches: list[str])[source]#

Bases: KeyError

Custom exception for when symmetric keys are found in a configuration file.

value[source]#