qiskit 1.1.2__cp38-abi3-macosx_10_9_universal2.whl → 1.2.0__cp38-abi3-macosx_10_9_universal2.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- qiskit/VERSION.txt +1 -1
- qiskit/__init__.py +27 -24
- qiskit/_accelerate.abi3.so +0 -0
- qiskit/_numpy_compat.py +1 -1
- qiskit/assembler/assemble_circuits.py +107 -64
- qiskit/assembler/assemble_schedules.py +5 -12
- qiskit/assembler/disassemble.py +10 -1
- qiskit/circuit/__init__.py +6 -3
- qiskit/circuit/_classical_resource_map.py +5 -5
- qiskit/circuit/_utils.py +0 -13
- qiskit/circuit/add_control.py +1 -1
- qiskit/circuit/annotated_operation.py +23 -1
- qiskit/circuit/classical/expr/expr.py +4 -4
- qiskit/circuit/classical/expr/visitors.py +1 -1
- qiskit/circuit/classical/types/__init__.py +1 -1
- qiskit/circuit/classical/types/types.py +2 -2
- qiskit/circuit/classicalfunction/boolean_expression.py +1 -1
- qiskit/circuit/classicalfunction/classical_function_visitor.py +5 -5
- qiskit/circuit/classicalfunction/utils.py +1 -1
- qiskit/circuit/classicalregister.py +1 -1
- qiskit/circuit/commutation_checker.py +83 -35
- qiskit/circuit/controlflow/_builder_utils.py +1 -1
- qiskit/circuit/controlflow/builder.py +10 -6
- qiskit/circuit/controlflow/if_else.py +2 -2
- qiskit/circuit/controlflow/switch_case.py +1 -1
- qiskit/circuit/delay.py +1 -1
- qiskit/circuit/duration.py +2 -2
- qiskit/circuit/equivalence.py +5 -7
- qiskit/circuit/gate.py +11 -8
- qiskit/circuit/instruction.py +31 -13
- qiskit/circuit/instructionset.py +2 -5
- qiskit/circuit/library/__init__.py +2 -1
- qiskit/circuit/library/arithmetic/linear_amplitude_function.py +1 -1
- qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +1 -1
- qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +1 -1
- qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +1 -1
- qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +3 -3
- qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +1 -1
- qiskit/circuit/library/basis_change/__init__.py +1 -1
- qiskit/circuit/library/basis_change/qft.py +40 -6
- qiskit/circuit/library/blueprintcircuit.py +3 -5
- qiskit/circuit/library/data_preparation/__init__.py +9 -2
- qiskit/circuit/library/data_preparation/initializer.py +8 -0
- qiskit/circuit/library/data_preparation/state_preparation.py +98 -178
- qiskit/circuit/library/generalized_gates/isometry.py +8 -8
- qiskit/circuit/library/generalized_gates/linear_function.py +3 -2
- qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +4 -4
- qiskit/circuit/library/generalized_gates/permutation.py +8 -9
- qiskit/circuit/library/generalized_gates/uc.py +3 -3
- qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +2 -2
- qiskit/circuit/library/generalized_gates/unitary.py +13 -11
- qiskit/circuit/library/graph_state.py +1 -1
- qiskit/circuit/library/hamiltonian_gate.py +1 -2
- qiskit/circuit/library/hidden_linear_function.py +1 -1
- qiskit/circuit/library/n_local/evolved_operator_ansatz.py +3 -2
- qiskit/circuit/library/n_local/n_local.py +4 -5
- qiskit/circuit/library/n_local/pauli_two_design.py +1 -1
- qiskit/circuit/library/n_local/qaoa_ansatz.py +6 -8
- qiskit/circuit/library/n_local/two_local.py +1 -1
- qiskit/circuit/library/overlap.py +11 -5
- qiskit/circuit/library/pauli_evolution.py +7 -3
- qiskit/circuit/library/standard_gates/dcx.py +3 -0
- qiskit/circuit/library/standard_gates/ecr.py +3 -0
- qiskit/circuit/library/standard_gates/global_phase.py +3 -0
- qiskit/circuit/library/standard_gates/h.py +13 -5
- qiskit/circuit/library/standard_gates/i.py +3 -0
- qiskit/circuit/library/standard_gates/iswap.py +3 -0
- qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +19 -10
- qiskit/circuit/library/standard_gates/p.py +14 -9
- qiskit/circuit/library/standard_gates/r.py +3 -0
- qiskit/circuit/library/standard_gates/rx.py +21 -6
- qiskit/circuit/library/standard_gates/rxx.py +40 -1
- qiskit/circuit/library/standard_gates/ry.py +21 -6
- qiskit/circuit/library/standard_gates/ryy.py +40 -1
- qiskit/circuit/library/standard_gates/rz.py +22 -6
- qiskit/circuit/library/standard_gates/rzx.py +40 -1
- qiskit/circuit/library/standard_gates/rzz.py +41 -2
- qiskit/circuit/library/standard_gates/s.py +77 -0
- qiskit/circuit/library/standard_gates/swap.py +12 -5
- qiskit/circuit/library/standard_gates/sx.py +14 -5
- qiskit/circuit/library/standard_gates/t.py +5 -0
- qiskit/circuit/library/standard_gates/u.py +22 -7
- qiskit/circuit/library/standard_gates/u1.py +8 -3
- qiskit/circuit/library/standard_gates/u2.py +3 -0
- qiskit/circuit/library/standard_gates/u3.py +22 -7
- qiskit/circuit/library/standard_gates/x.py +156 -92
- qiskit/circuit/library/standard_gates/xx_minus_yy.py +40 -1
- qiskit/circuit/library/standard_gates/xx_plus_yy.py +52 -11
- qiskit/circuit/library/standard_gates/y.py +6 -1
- qiskit/circuit/library/standard_gates/z.py +8 -1
- qiskit/circuit/operation.py +1 -1
- qiskit/circuit/parameter.py +9 -10
- qiskit/circuit/parameterexpression.py +16 -13
- qiskit/circuit/parametertable.py +1 -190
- qiskit/circuit/parametervector.py +1 -1
- qiskit/circuit/quantumcircuit.py +395 -387
- qiskit/circuit/quantumcircuitdata.py +3 -5
- qiskit/circuit/quantumregister.py +1 -1
- qiskit/circuit/random/__init__.py +1 -1
- qiskit/circuit/random/utils.py +175 -26
- qiskit/circuit/register.py +5 -7
- qiskit/circuit/singleton.py +3 -3
- qiskit/circuit/tools/pi_check.py +4 -4
- qiskit/compiler/assembler.py +95 -24
- qiskit/compiler/scheduler.py +2 -2
- qiskit/compiler/transpiler.py +42 -128
- qiskit/converters/circuit_to_dag.py +4 -6
- qiskit/converters/circuit_to_gate.py +4 -8
- qiskit/converters/circuit_to_instruction.py +5 -17
- qiskit/converters/dag_to_circuit.py +2 -6
- qiskit/dagcircuit/collect_blocks.py +2 -2
- qiskit/dagcircuit/dagcircuit.py +190 -187
- qiskit/dagcircuit/dagdependency.py +4 -4
- qiskit/dagcircuit/dagdependency_v2.py +4 -4
- qiskit/dagcircuit/dagdepnode.py +1 -1
- qiskit/dagcircuit/dagnode.py +66 -157
- qiskit/passmanager/flow_controllers.py +1 -1
- qiskit/passmanager/passmanager.py +3 -3
- qiskit/primitives/__init__.py +1 -5
- qiskit/primitives/backend_estimator.py +25 -15
- qiskit/primitives/backend_estimator_v2.py +31 -7
- qiskit/primitives/backend_sampler.py +21 -12
- qiskit/primitives/backend_sampler_v2.py +12 -3
- qiskit/primitives/base/base_estimator.py +31 -4
- qiskit/primitives/base/base_primitive.py +2 -2
- qiskit/primitives/base/base_result.py +2 -2
- qiskit/primitives/base/base_sampler.py +26 -2
- qiskit/primitives/base/estimator_result.py +2 -2
- qiskit/primitives/base/sampler_result.py +2 -2
- qiskit/primitives/containers/__init__.py +0 -1
- qiskit/primitives/containers/bindings_array.py +2 -2
- qiskit/primitives/containers/bit_array.py +108 -10
- qiskit/primitives/containers/shape.py +3 -3
- qiskit/primitives/estimator.py +9 -2
- qiskit/primitives/primitive_job.py +1 -1
- qiskit/primitives/sampler.py +10 -3
- qiskit/primitives/statevector_estimator.py +5 -3
- qiskit/primitives/statevector_sampler.py +11 -5
- qiskit/primitives/utils.py +16 -0
- qiskit/providers/backend.py +15 -6
- qiskit/providers/backend_compat.py +7 -4
- qiskit/providers/basic_provider/basic_provider_tools.py +1 -1
- qiskit/providers/basic_provider/basic_simulator.py +33 -25
- qiskit/providers/fake_provider/fake_backend.py +10 -3
- qiskit/providers/fake_provider/fake_openpulse_2q.py +157 -149
- qiskit/providers/fake_provider/fake_openpulse_3q.py +228 -220
- qiskit/providers/fake_provider/fake_pulse_backend.py +2 -1
- qiskit/providers/fake_provider/fake_qasm_backend.py +7 -2
- qiskit/providers/fake_provider/generic_backend_v2.py +514 -68
- qiskit/providers/models/__init__.py +48 -11
- qiskit/providers/models/backendconfiguration.py +50 -4
- qiskit/providers/models/backendproperties.py +13 -2
- qiskit/providers/models/pulsedefaults.py +10 -11
- qiskit/providers/options.py +13 -13
- qiskit/providers/providerutils.py +3 -1
- qiskit/pulse/configuration.py +8 -12
- qiskit/pulse/instruction_schedule_map.py +3 -5
- qiskit/pulse/instructions/acquire.py +7 -8
- qiskit/pulse/instructions/instruction.py +2 -3
- qiskit/pulse/library/samplers/decorators.py +5 -9
- qiskit/pulse/library/symbolic_pulses.py +4 -7
- qiskit/pulse/library/waveform.py +2 -5
- qiskit/pulse/macros.py +11 -6
- qiskit/pulse/parser.py +8 -10
- qiskit/pulse/schedule.py +9 -17
- qiskit/pulse/transforms/alignments.py +1 -3
- qiskit/pulse/utils.py +1 -2
- qiskit/qasm/libs/stdgates.inc +35 -28
- qiskit/qasm2/__init__.py +7 -7
- qiskit/qasm2/export.py +5 -9
- qiskit/qasm2/parse.py +1 -1
- qiskit/qasm3/ast.py +9 -25
- qiskit/qasm3/exporter.py +582 -479
- qiskit/qasm3/printer.py +7 -16
- qiskit/qobj/common.py +10 -0
- qiskit/qobj/converters/lo_config.py +9 -0
- qiskit/qobj/converters/pulse_instruction.py +13 -6
- qiskit/qobj/pulse_qobj.py +69 -15
- qiskit/qobj/qasm_qobj.py +72 -20
- qiskit/qobj/utils.py +9 -0
- qiskit/qpy/__init__.py +1 -1
- qiskit/qpy/binary_io/circuits.py +8 -5
- qiskit/qpy/binary_io/schedules.py +1 -1
- qiskit/qpy/binary_io/value.py +3 -3
- qiskit/qpy/interface.py +3 -2
- qiskit/qpy/type_keys.py +2 -2
- qiskit/quantum_info/operators/channel/quantum_channel.py +3 -6
- qiskit/quantum_info/operators/channel/superop.py +2 -2
- qiskit/quantum_info/operators/channel/transformations.py +1 -1
- qiskit/quantum_info/operators/dihedral/dihedral.py +3 -4
- qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +1 -3
- qiskit/quantum_info/operators/dihedral/random.py +6 -3
- qiskit/quantum_info/operators/measures.py +2 -2
- qiskit/quantum_info/operators/op_shape.py +12 -20
- qiskit/quantum_info/operators/operator.py +14 -21
- qiskit/quantum_info/operators/predicates.py +1 -0
- qiskit/quantum_info/operators/symplectic/base_pauli.py +7 -11
- qiskit/quantum_info/operators/symplectic/clifford.py +1 -1
- qiskit/quantum_info/operators/symplectic/pauli.py +3 -3
- qiskit/quantum_info/operators/symplectic/pauli_list.py +9 -10
- qiskit/quantum_info/operators/symplectic/random.py +1 -1
- qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +15 -17
- qiskit/quantum_info/quaternion.py +1 -1
- qiskit/quantum_info/states/densitymatrix.py +5 -8
- qiskit/quantum_info/states/stabilizerstate.py +128 -37
- qiskit/quantum_info/states/statevector.py +4 -8
- qiskit/result/counts.py +2 -2
- qiskit/result/mitigation/correlated_readout_mitigator.py +2 -2
- qiskit/result/mitigation/local_readout_mitigator.py +2 -2
- qiskit/result/mitigation/utils.py +1 -3
- qiskit/result/models.py +17 -16
- qiskit/result/result.py +15 -20
- qiskit/scheduler/lowering.py +2 -2
- qiskit/synthesis/__init__.py +2 -1
- qiskit/synthesis/clifford/__init__.py +1 -1
- qiskit/synthesis/clifford/clifford_decompose_ag.py +2 -2
- qiskit/synthesis/clifford/clifford_decompose_bm.py +10 -240
- qiskit/synthesis/clifford/clifford_decompose_greedy.py +9 -303
- qiskit/synthesis/clifford/clifford_decompose_layers.py +25 -23
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +1 -1
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +1 -1
- qiskit/synthesis/discrete_basis/generate_basis_approximations.py +1 -1
- qiskit/synthesis/discrete_basis/solovay_kitaev.py +2 -2
- qiskit/synthesis/evolution/evolution_synthesis.py +4 -2
- qiskit/synthesis/evolution/lie_trotter.py +46 -19
- qiskit/synthesis/evolution/product_formula.py +111 -55
- qiskit/synthesis/evolution/qdrift.py +40 -10
- qiskit/synthesis/evolution/suzuki_trotter.py +43 -33
- qiskit/synthesis/linear/__init__.py +1 -0
- qiskit/synthesis/linear/cnot_synth.py +22 -96
- qiskit/synthesis/linear/linear_depth_lnn.py +8 -8
- qiskit/synthesis/linear/linear_matrix_utils.py +13 -161
- qiskit/synthesis/linear_phase/cnot_phase_synth.py +1 -1
- qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +3 -3
- qiskit/synthesis/linear_phase/cz_depth_lnn.py +1 -1
- qiskit/synthesis/one_qubit/one_qubit_decompose.py +29 -29
- qiskit/synthesis/permutation/permutation_full.py +5 -29
- qiskit/synthesis/permutation/permutation_lnn.py +2 -24
- qiskit/synthesis/permutation/permutation_utils.py +2 -59
- qiskit/synthesis/qft/__init__.py +1 -0
- qiskit/synthesis/qft/qft_decompose_full.py +79 -0
- qiskit/synthesis/qft/qft_decompose_lnn.py +17 -9
- qiskit/synthesis/stabilizer/stabilizer_circuit.py +6 -6
- qiskit/synthesis/stabilizer/stabilizer_decompose.py +2 -2
- qiskit/synthesis/two_qubit/local_invariance.py +8 -38
- qiskit/synthesis/two_qubit/two_qubit_decompose.py +48 -129
- qiskit/synthesis/unitary/aqc/cnot_structures.py +1 -1
- qiskit/synthesis/unitary/qsd.py +5 -3
- qiskit/transpiler/__init__.py +1 -0
- qiskit/transpiler/basepasses.py +1 -1
- qiskit/transpiler/coupling.py +3 -3
- qiskit/transpiler/instruction_durations.py +1 -2
- qiskit/transpiler/layout.py +3 -3
- qiskit/transpiler/passes/__init__.py +2 -0
- qiskit/transpiler/passes/basis/basis_translator.py +84 -64
- qiskit/transpiler/passes/basis/translate_parameterized.py +3 -5
- qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -1
- qiskit/transpiler/passes/basis/unroll_custom_definitions.py +10 -10
- qiskit/transpiler/passes/calibration/rx_builder.py +3 -3
- qiskit/transpiler/passes/calibration/rzx_builder.py +3 -3
- qiskit/transpiler/passes/layout/apply_layout.py +13 -3
- qiskit/transpiler/passes/layout/sabre_layout.py +10 -8
- qiskit/transpiler/passes/layout/sabre_pre_layout.py +4 -1
- qiskit/transpiler/passes/layout/set_layout.py +2 -2
- qiskit/transpiler/passes/layout/vf2_layout.py +1 -1
- qiskit/transpiler/passes/layout/vf2_utils.py +3 -3
- qiskit/transpiler/passes/optimization/__init__.py +1 -0
- qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +2 -2
- qiskit/transpiler/passes/optimization/commutation_analysis.py +7 -10
- qiskit/transpiler/passes/optimization/commutative_cancellation.py +35 -19
- qiskit/transpiler/passes/optimization/consolidate_blocks.py +17 -8
- qiskit/transpiler/passes/optimization/inverse_cancellation.py +6 -6
- qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +64 -41
- qiskit/transpiler/passes/optimization/optimize_1q_gates.py +1 -1
- qiskit/transpiler/passes/optimization/split_2q_unitaries.py +83 -0
- qiskit/transpiler/passes/optimization/template_matching/backward_match.py +1 -1
- qiskit/transpiler/passes/optimization/template_matching/forward_match.py +2 -2
- qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +1 -1
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +3 -2
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +1 -1
- qiskit/transpiler/passes/routing/layout_transformation.py +2 -1
- qiskit/transpiler/passes/routing/sabre_swap.py +35 -26
- qiskit/transpiler/passes/routing/star_prerouting.py +80 -105
- qiskit/transpiler/passes/routing/stochastic_swap.py +1 -3
- qiskit/transpiler/passes/scheduling/alap.py +1 -2
- qiskit/transpiler/passes/scheduling/alignments/__init__.py +2 -2
- qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -1
- qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +2 -2
- qiskit/transpiler/passes/scheduling/alignments/reschedule.py +1 -1
- qiskit/transpiler/passes/scheduling/asap.py +1 -2
- qiskit/transpiler/passes/scheduling/base_scheduler.py +5 -5
- qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +3 -3
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +1 -1
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +20 -14
- qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +7 -6
- qiskit/transpiler/passes/scheduling/time_unit_conversion.py +4 -3
- qiskit/transpiler/passes/synthesis/high_level_synthesis.py +211 -36
- qiskit/transpiler/passes/synthesis/plugin.py +2 -2
- qiskit/transpiler/passes/synthesis/unitary_synthesis.py +80 -40
- qiskit/transpiler/passes/utils/__init__.py +0 -1
- qiskit/transpiler/passes/utils/check_gate_direction.py +4 -4
- qiskit/transpiler/passes/utils/check_map.py +3 -6
- qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +3 -4
- qiskit/transpiler/passes/utils/error.py +2 -2
- qiskit/transpiler/passes/utils/fixed_point.py +3 -3
- qiskit/transpiler/passes/utils/gate_direction.py +1 -1
- qiskit/transpiler/passes/utils/gates_basis.py +1 -2
- qiskit/transpiler/passmanager.py +7 -6
- qiskit/transpiler/preset_passmanagers/__init__.py +4 -228
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +73 -18
- qiskit/transpiler/preset_passmanagers/common.py +3 -6
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +518 -0
- qiskit/transpiler/preset_passmanagers/level0.py +1 -1
- qiskit/transpiler/target.py +27 -8
- qiskit/user_config.py +29 -6
- qiskit/utils/classtools.py +3 -3
- qiskit/utils/deprecation.py +3 -2
- qiskit/utils/lazy_tester.py +2 -2
- qiskit/utils/optionals.py +8 -8
- qiskit/visualization/bloch.py +18 -23
- qiskit/visualization/circuit/_utils.py +34 -10
- qiskit/visualization/circuit/circuit_visualization.py +23 -16
- qiskit/visualization/circuit/latex.py +29 -27
- qiskit/visualization/circuit/matplotlib.py +4 -2
- qiskit/visualization/circuit/qcstyle.py +2 -2
- qiskit/visualization/circuit/text.py +9 -15
- qiskit/visualization/dag_visualization.py +2 -2
- qiskit/visualization/pulse_v2/core.py +1 -1
- qiskit/visualization/pulse_v2/events.py +1 -1
- qiskit/visualization/pulse_v2/generators/frame.py +3 -4
- qiskit/visualization/pulse_v2/generators/waveform.py +5 -9
- qiskit/visualization/pulse_v2/layouts.py +1 -5
- qiskit/visualization/pulse_v2/plotters/matplotlib.py +1 -2
- qiskit/visualization/state_visualization.py +5 -6
- qiskit/visualization/timeline/plotters/matplotlib.py +1 -2
- qiskit/visualization/transition_visualization.py +7 -2
- {qiskit-1.1.2.dist-info → qiskit-1.2.0.dist-info}/METADATA +12 -12
- {qiskit-1.1.2.dist-info → qiskit-1.2.0.dist-info}/RECORD +342 -340
- {qiskit-1.1.2.dist-info → qiskit-1.2.0.dist-info}/entry_points.txt +3 -0
- qiskit/transpiler/passes/utils/block_to_matrix.py +0 -47
- {qiskit-1.1.2.dist-info → qiskit-1.2.0.dist-info}/LICENSE.txt +0 -0
- {qiskit-1.1.2.dist-info → qiskit-1.2.0.dist-info}/WHEEL +0 -0
- {qiskit-1.1.2.dist-info → qiskit-1.2.0.dist-info}/top_level.txt +0 -0
@@ -16,6 +16,7 @@ from __future__ import annotations
|
|
16
16
|
import warnings
|
17
17
|
|
18
18
|
from collections.abc import Iterable
|
19
|
+
from typing import List, Dict, Any, Union
|
19
20
|
import numpy as np
|
20
21
|
|
21
22
|
from qiskit import pulse
|
@@ -35,12 +36,12 @@ from qiskit.transpiler import CouplingMap, Target, InstructionProperties, QubitP
|
|
35
36
|
from qiskit.providers import Options
|
36
37
|
from qiskit.providers.basic_provider import BasicSimulator
|
37
38
|
from qiskit.providers.backend import BackendV2
|
38
|
-
from qiskit.providers.models import (
|
39
|
-
PulseDefaults,
|
40
|
-
Command,
|
41
|
-
)
|
42
|
-
from qiskit.qobj import PulseQobjInstruction, PulseLibraryItem
|
43
39
|
from qiskit.utils import optionals as _optionals
|
40
|
+
from qiskit.providers.models.pulsedefaults import Command
|
41
|
+
from qiskit.qobj.converters.pulse_instruction import QobjToInstructionConverter
|
42
|
+
from qiskit.pulse.calibration_entries import PulseQobjDef
|
43
|
+
from qiskit.providers.models.pulsedefaults import MeasurementKernel, Discriminator
|
44
|
+
from qiskit.qobj.pulse_qobj import QobjMeasurementOption
|
44
45
|
|
45
46
|
# Noise default values/ranges for duration and error of supported
|
46
47
|
# instructions. There are two possible formats:
|
@@ -74,17 +75,432 @@ _QUBIT_PROPERTIES = {
|
|
74
75
|
"frequency": (5e9, 5.5e9),
|
75
76
|
}
|
76
77
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
78
|
+
|
79
|
+
class PulseDefaults:
|
80
|
+
"""Internal - Description of default settings for Pulse systems. These are instructions
|
81
|
+
or settings that
|
82
|
+
may be good starting points for the Pulse user. The user may modify these defaults for custom
|
83
|
+
scheduling.
|
84
|
+
"""
|
85
|
+
|
86
|
+
# Copy from the deprecated from qiskit.providers.models.pulsedefaults.PulseDefaults
|
87
|
+
|
88
|
+
_data = {}
|
89
|
+
|
90
|
+
def __init__(
|
91
|
+
self,
|
92
|
+
qubit_freq_est: List[float],
|
93
|
+
meas_freq_est: List[float],
|
94
|
+
buffer: int,
|
95
|
+
pulse_library: List[PulseLibraryItem],
|
96
|
+
cmd_def: List[Command],
|
97
|
+
meas_kernel: MeasurementKernel = None,
|
98
|
+
discriminator: Discriminator = None,
|
99
|
+
**kwargs: Dict[str, Any],
|
100
|
+
):
|
101
|
+
"""
|
102
|
+
Validate and reformat transport layer inputs to initialize.
|
103
|
+
Args:
|
104
|
+
qubit_freq_est: Estimated qubit frequencies in GHz.
|
105
|
+
meas_freq_est: Estimated measurement cavity frequencies in GHz.
|
106
|
+
buffer: Default buffer time (in units of dt) between pulses.
|
107
|
+
pulse_library: Pulse name and sample definitions.
|
108
|
+
cmd_def: Operation name and definition in terms of Commands.
|
109
|
+
meas_kernel: The measurement kernels
|
110
|
+
discriminator: The discriminators
|
111
|
+
**kwargs: Other attributes for the super class.
|
112
|
+
"""
|
113
|
+
self._data = {}
|
114
|
+
self.buffer = buffer
|
115
|
+
self.qubit_freq_est = [freq * 1e9 for freq in qubit_freq_est]
|
116
|
+
"""Qubit frequencies in Hertz."""
|
117
|
+
self.meas_freq_est = [freq * 1e9 for freq in meas_freq_est]
|
118
|
+
"""Measurement frequencies in Hertz."""
|
119
|
+
self.pulse_library = pulse_library
|
120
|
+
self.cmd_def = cmd_def
|
121
|
+
self.instruction_schedule_map = InstructionScheduleMap()
|
122
|
+
self.converter = QobjToInstructionConverter(pulse_library)
|
123
|
+
|
124
|
+
for inst in cmd_def:
|
125
|
+
entry = PulseQobjDef(converter=self.converter, name=inst.name)
|
126
|
+
entry.define(inst.sequence, user_provided=False)
|
127
|
+
self.instruction_schedule_map._add(
|
128
|
+
instruction_name=inst.name,
|
129
|
+
qubits=tuple(inst.qubits),
|
130
|
+
entry=entry,
|
131
|
+
)
|
132
|
+
|
133
|
+
if meas_kernel is not None:
|
134
|
+
self.meas_kernel = meas_kernel
|
135
|
+
if discriminator is not None:
|
136
|
+
self.discriminator = discriminator
|
137
|
+
|
138
|
+
self._data.update(kwargs)
|
139
|
+
|
140
|
+
def __getattr__(self, name):
|
141
|
+
try:
|
142
|
+
return self._data[name]
|
143
|
+
except KeyError as ex:
|
144
|
+
raise AttributeError(f"Attribute {name} is not defined") from ex
|
145
|
+
|
146
|
+
def to_dict(self):
|
147
|
+
"""Return a dictionary format representation of the PulseDefaults.
|
148
|
+
Returns:
|
149
|
+
dict: The dictionary form of the PulseDefaults.
|
150
|
+
"""
|
151
|
+
out_dict = {
|
152
|
+
"qubit_freq_est": self.qubit_freq_est,
|
153
|
+
"meas_freq_est": self.qubit_freq_est,
|
154
|
+
"buffer": self.buffer,
|
155
|
+
"pulse_library": [x.to_dict() for x in self.pulse_library],
|
156
|
+
"cmd_def": [x.to_dict() for x in self.cmd_def],
|
157
|
+
}
|
158
|
+
if hasattr(self, "meas_kernel"):
|
159
|
+
out_dict["meas_kernel"] = self.meas_kernel.to_dict()
|
160
|
+
if hasattr(self, "discriminator"):
|
161
|
+
out_dict["discriminator"] = self.discriminator.to_dict()
|
162
|
+
for key, value in self.__dict__.items():
|
163
|
+
if key not in [
|
164
|
+
"qubit_freq_est",
|
165
|
+
"meas_freq_est",
|
166
|
+
"buffer",
|
167
|
+
"pulse_library",
|
168
|
+
"cmd_def",
|
169
|
+
"meas_kernel",
|
170
|
+
"discriminator",
|
171
|
+
"converter",
|
172
|
+
"instruction_schedule_map",
|
173
|
+
]:
|
174
|
+
out_dict[key] = value
|
175
|
+
out_dict.update(self._data)
|
176
|
+
|
177
|
+
out_dict["qubit_freq_est"] = [freq * 1e-9 for freq in self.qubit_freq_est]
|
178
|
+
out_dict["meas_freq_est"] = [freq * 1e-9 for freq in self.meas_freq_est]
|
179
|
+
return out_dict
|
180
|
+
|
181
|
+
@classmethod
|
182
|
+
def from_dict(cls, data):
|
183
|
+
"""Create a new PulseDefaults object from a dictionary.
|
184
|
+
|
185
|
+
Args:
|
186
|
+
data (dict): A dictionary representing the PulseDefaults
|
187
|
+
to create. It will be in the same format as output by
|
188
|
+
:meth:`to_dict`.
|
189
|
+
Returns:
|
190
|
+
PulseDefaults: The PulseDefaults from the input dictionary.
|
191
|
+
"""
|
192
|
+
schema = {
|
193
|
+
"pulse_library": PulseLibraryItem, # The class PulseLibraryItem is deprecated
|
194
|
+
"cmd_def": Command,
|
195
|
+
"meas_kernel": MeasurementKernel,
|
196
|
+
"discriminator": Discriminator,
|
197
|
+
}
|
198
|
+
|
199
|
+
# Pulse defaults data is nested dictionary.
|
200
|
+
# To avoid deepcopy and avoid mutating the source object, create new dict here.
|
201
|
+
in_data = {}
|
202
|
+
for key, value in data.items():
|
203
|
+
if key in schema:
|
204
|
+
with warnings.catch_warnings():
|
205
|
+
# The class PulseLibraryItem is deprecated
|
206
|
+
warnings.filterwarnings("ignore", category=DeprecationWarning, module="qiskit")
|
207
|
+
if isinstance(value, list):
|
208
|
+
in_data[key] = list(map(schema[key].from_dict, value))
|
209
|
+
else:
|
210
|
+
in_data[key] = schema[key].from_dict(value)
|
211
|
+
else:
|
212
|
+
in_data[key] = value
|
213
|
+
|
214
|
+
return cls(**in_data)
|
215
|
+
|
216
|
+
def __str__(self):
|
217
|
+
qubit_freqs = [freq / 1e9 for freq in self.qubit_freq_est]
|
218
|
+
meas_freqs = [freq / 1e9 for freq in self.meas_freq_est]
|
219
|
+
qfreq = f"Qubit Frequencies [GHz]\n{qubit_freqs}"
|
220
|
+
mfreq = f"Measurement Frequencies [GHz]\n{meas_freqs} "
|
221
|
+
return f"<{self.__class__.__name__}({str(self.instruction_schedule_map)}{qfreq}\n{mfreq})>"
|
222
|
+
|
223
|
+
|
224
|
+
def _to_complex(value: Union[List[float], complex]) -> complex:
|
225
|
+
"""Convert the input value to type ``complex``.
|
226
|
+
Args:
|
227
|
+
value: Value to be converted.
|
228
|
+
Returns:
|
229
|
+
Input value in ``complex``.
|
230
|
+
Raises:
|
231
|
+
TypeError: If the input value is not in the expected format.
|
232
|
+
"""
|
233
|
+
if isinstance(value, list) and len(value) == 2:
|
234
|
+
return complex(value[0], value[1])
|
235
|
+
elif isinstance(value, complex):
|
236
|
+
return value
|
237
|
+
|
238
|
+
raise TypeError(f"{value} is not in a valid complex number format.")
|
239
|
+
|
240
|
+
|
241
|
+
class PulseLibraryItem:
|
242
|
+
"""INTERNAL - An item in a pulse library."""
|
243
|
+
|
244
|
+
# Copy from the deprecated from qiskit.qobj.PulseLibraryItem
|
245
|
+
def __init__(self, name, samples):
|
246
|
+
"""Instantiate a pulse library item.
|
247
|
+
|
248
|
+
Args:
|
249
|
+
name (str): A name for the pulse.
|
250
|
+
samples (list[complex]): A list of complex values defining pulse
|
251
|
+
shape.
|
252
|
+
"""
|
253
|
+
self.name = name
|
254
|
+
if isinstance(samples[0], list):
|
255
|
+
self.samples = np.array([complex(sample[0], sample[1]) for sample in samples])
|
256
|
+
else:
|
257
|
+
self.samples = samples
|
258
|
+
|
259
|
+
def to_dict(self):
|
260
|
+
"""Return a dictionary format representation of the pulse library item.
|
261
|
+
|
262
|
+
Returns:
|
263
|
+
dict: The dictionary form of the PulseLibraryItem.
|
264
|
+
"""
|
265
|
+
return {"name": self.name, "samples": self.samples}
|
266
|
+
|
267
|
+
@classmethod
|
268
|
+
def from_dict(cls, data):
|
269
|
+
"""Create a new PulseLibraryItem object from a dictionary.
|
270
|
+
|
271
|
+
Args:
|
272
|
+
data (dict): A dictionary for the experiment config
|
273
|
+
|
274
|
+
Returns:
|
275
|
+
PulseLibraryItem: The object from the input dictionary.
|
276
|
+
"""
|
277
|
+
return cls(**data)
|
278
|
+
|
279
|
+
def __repr__(self):
|
280
|
+
return f"PulseLibraryItem({self.name}, {repr(self.samples)})"
|
281
|
+
|
282
|
+
def __str__(self):
|
283
|
+
return f"Pulse Library Item:\n\tname: {self.name}\n\tsamples: {self.samples}"
|
284
|
+
|
285
|
+
def __eq__(self, other):
|
286
|
+
if isinstance(other, PulseLibraryItem):
|
287
|
+
if self.to_dict() == other.to_dict():
|
288
|
+
return True
|
289
|
+
return False
|
290
|
+
|
291
|
+
|
292
|
+
class PulseQobjInstruction:
|
293
|
+
"""Internal - A class representing a single instruction in a PulseQobj Experiment."""
|
294
|
+
|
295
|
+
# Copy from the deprecated from qiskit.qobj.PulseQobjInstruction
|
296
|
+
|
297
|
+
_COMMON_ATTRS = [
|
298
|
+
"ch",
|
299
|
+
"conditional",
|
300
|
+
"val",
|
301
|
+
"phase",
|
302
|
+
"frequency",
|
303
|
+
"duration",
|
304
|
+
"qubits",
|
305
|
+
"memory_slot",
|
306
|
+
"register_slot",
|
307
|
+
"label",
|
308
|
+
"type",
|
309
|
+
"pulse_shape",
|
310
|
+
"parameters",
|
311
|
+
]
|
312
|
+
|
313
|
+
def __init__(
|
314
|
+
self,
|
315
|
+
name,
|
316
|
+
t0,
|
317
|
+
ch=None,
|
318
|
+
conditional=None,
|
319
|
+
val=None,
|
320
|
+
phase=None,
|
321
|
+
duration=None,
|
322
|
+
qubits=None,
|
323
|
+
memory_slot=None,
|
324
|
+
register_slot=None,
|
325
|
+
kernels=None,
|
326
|
+
discriminators=None,
|
327
|
+
label=None,
|
328
|
+
type=None, # pylint: disable=invalid-name,redefined-builtin
|
329
|
+
pulse_shape=None,
|
330
|
+
parameters=None,
|
331
|
+
frequency=None,
|
332
|
+
):
|
333
|
+
"""Instantiate a new PulseQobjInstruction object.
|
334
|
+
|
335
|
+
Args:
|
336
|
+
name (str): The name of the instruction
|
337
|
+
t0 (int): Pulse start time in integer **dt** units.
|
338
|
+
ch (str): The channel to apply the pulse instruction.
|
339
|
+
conditional (int): The register to use for a conditional for this
|
340
|
+
instruction
|
341
|
+
val (complex): Complex value to apply, bounded by an absolute value
|
342
|
+
of 1.
|
343
|
+
phase (float): if a ``fc`` instruction, the frame change phase in
|
344
|
+
radians.
|
345
|
+
frequency (float): if a ``sf`` instruction, the frequency in Hz.
|
346
|
+
duration (int): The duration of the pulse in **dt** units.
|
347
|
+
qubits (list): A list of ``int`` representing the qubits the
|
348
|
+
instruction operates on
|
349
|
+
memory_slot (list): If a ``measure`` instruction this is a list
|
350
|
+
of ``int`` containing the list of memory slots to store the
|
351
|
+
measurement results in (must be the same length as qubits).
|
352
|
+
If a ``bfunc`` instruction this is a single ``int`` of the
|
353
|
+
memory slot to store the boolean function result in.
|
354
|
+
register_slot (list): If a ``measure`` instruction this is a list
|
355
|
+
of ``int`` containing the list of register slots in which to
|
356
|
+
store the measurement results (must be the same length as
|
357
|
+
qubits). If a ``bfunc`` instruction this is a single ``int``
|
358
|
+
of the register slot in which to store the result.
|
359
|
+
kernels (list): List of :class:`QobjMeasurementOption` objects
|
360
|
+
defining the measurement kernels and set of parameters if the
|
361
|
+
measurement level is 1 or 2. Only used for ``acquire``
|
362
|
+
instructions.
|
363
|
+
discriminators (list): A list of :class:`QobjMeasurementOption`
|
364
|
+
used to set the discriminators to be used if the measurement
|
365
|
+
level is 2. Only used for ``acquire`` instructions.
|
366
|
+
label (str): Label of instruction
|
367
|
+
type (str): Type of instruction
|
368
|
+
pulse_shape (str): The shape of the parametric pulse
|
369
|
+
parameters (dict): The parameters for a parametric pulse
|
370
|
+
"""
|
371
|
+
self.name = name
|
372
|
+
self.t0 = t0
|
373
|
+
if ch is not None:
|
374
|
+
self.ch = ch
|
375
|
+
if conditional is not None:
|
376
|
+
self.conditional = conditional
|
377
|
+
if val is not None:
|
378
|
+
self.val = val
|
379
|
+
if phase is not None:
|
380
|
+
self.phase = phase
|
381
|
+
if frequency is not None:
|
382
|
+
self.frequency = frequency
|
383
|
+
if duration is not None:
|
384
|
+
self.duration = duration
|
385
|
+
if qubits is not None:
|
386
|
+
self.qubits = qubits
|
387
|
+
if memory_slot is not None:
|
388
|
+
self.memory_slot = memory_slot
|
389
|
+
if register_slot is not None:
|
390
|
+
self.register_slot = register_slot
|
391
|
+
if kernels is not None:
|
392
|
+
self.kernels = kernels
|
393
|
+
if discriminators is not None:
|
394
|
+
self.discriminators = discriminators
|
395
|
+
if label is not None:
|
396
|
+
self.label = label
|
397
|
+
if type is not None:
|
398
|
+
self.type = type
|
399
|
+
if pulse_shape is not None:
|
400
|
+
self.pulse_shape = pulse_shape
|
401
|
+
if parameters is not None:
|
402
|
+
self.parameters = parameters
|
403
|
+
|
404
|
+
def to_dict(self):
|
405
|
+
"""Return a dictionary format representation of the Instruction.
|
406
|
+
|
407
|
+
Returns:
|
408
|
+
dict: The dictionary form of the PulseQobjInstruction.
|
409
|
+
"""
|
410
|
+
out_dict = {"name": self.name, "t0": self.t0}
|
411
|
+
for attr in self._COMMON_ATTRS:
|
412
|
+
if hasattr(self, attr):
|
413
|
+
out_dict[attr] = getattr(self, attr)
|
414
|
+
if hasattr(self, "kernels"):
|
415
|
+
out_dict["kernels"] = [x.to_dict() for x in self.kernels]
|
416
|
+
if hasattr(self, "discriminators"):
|
417
|
+
out_dict["discriminators"] = [x.to_dict() for x in self.discriminators]
|
418
|
+
return out_dict
|
419
|
+
|
420
|
+
def __repr__(self):
|
421
|
+
out = f'PulseQobjInstruction(name="{self.name}", t0={self.t0}'
|
422
|
+
for attr in self._COMMON_ATTRS:
|
423
|
+
attr_val = getattr(self, attr, None)
|
424
|
+
if attr_val is not None:
|
425
|
+
if isinstance(attr_val, str):
|
426
|
+
out += f', {attr}="{attr_val}"'
|
427
|
+
else:
|
428
|
+
out += f", {attr}={attr_val}"
|
429
|
+
out += ")"
|
430
|
+
return out
|
431
|
+
|
432
|
+
def __str__(self):
|
433
|
+
out = f"Instruction: {self.name}\n"
|
434
|
+
out += f"\t\tt0: {self.t0}\n"
|
435
|
+
for attr in self._COMMON_ATTRS:
|
436
|
+
if hasattr(self, attr):
|
437
|
+
out += f"\t\t{attr}: {getattr(self, attr)}\n"
|
438
|
+
return out
|
439
|
+
|
440
|
+
@classmethod
|
441
|
+
def from_dict(cls, data):
|
442
|
+
"""Create a new PulseQobjExperimentConfig object from a dictionary.
|
443
|
+
|
444
|
+
Args:
|
445
|
+
data (dict): A dictionary for the experiment config
|
446
|
+
|
447
|
+
Returns:
|
448
|
+
PulseQobjInstruction: The object from the input dictionary.
|
449
|
+
"""
|
450
|
+
schema = {
|
451
|
+
"discriminators": QobjMeasurementOption,
|
452
|
+
"kernels": QobjMeasurementOption,
|
453
|
+
}
|
454
|
+
skip = ["t0", "name"]
|
455
|
+
|
456
|
+
# Pulse instruction data is nested dictionary.
|
457
|
+
# To avoid deepcopy and avoid mutating the source object, create new dict here.
|
458
|
+
in_data = {}
|
459
|
+
for key, value in data.items():
|
460
|
+
if key in skip:
|
461
|
+
continue
|
462
|
+
if key == "parameters":
|
463
|
+
# This is flat dictionary of parametric pulse parameters
|
464
|
+
formatted_value = value.copy()
|
465
|
+
if "amp" in formatted_value:
|
466
|
+
formatted_value["amp"] = _to_complex(formatted_value["amp"])
|
467
|
+
in_data[key] = formatted_value
|
468
|
+
continue
|
469
|
+
if key in schema:
|
470
|
+
if isinstance(value, list):
|
471
|
+
in_data[key] = list(map(schema[key].from_dict, value))
|
472
|
+
else:
|
473
|
+
in_data[key] = schema[key].from_dict(value)
|
474
|
+
else:
|
475
|
+
in_data[key] = value
|
476
|
+
|
477
|
+
return cls(data["name"], data["t0"], **in_data)
|
478
|
+
|
479
|
+
def __eq__(self, other):
|
480
|
+
if isinstance(other, PulseQobjInstruction):
|
481
|
+
if self.to_dict() == other.to_dict():
|
482
|
+
return True
|
483
|
+
return False
|
484
|
+
|
485
|
+
|
486
|
+
def _pulse_library():
|
487
|
+
# The number of samples determines the pulse durations of the corresponding
|
488
|
+
# instructions. This default defines pulses with durations in multiples of
|
489
|
+
# 16 dt for consistency with the pulse granularity of real IBM devices, but
|
490
|
+
# keeps the number smaller than what would be realistic for
|
491
|
+
# manageability. If needed, more realistic durations could be added in the
|
492
|
+
# future (order of 160dt for 1q gates, 1760dt for 2q gates and measure).
|
493
|
+
return [
|
494
|
+
PulseLibraryItem(
|
495
|
+
name="pulse_1", samples=np.linspace(0, 1.0, 16, dtype=np.complex128)
|
496
|
+
), # 16dt
|
497
|
+
PulseLibraryItem(
|
498
|
+
name="pulse_2", samples=np.linspace(0, 1.0, 32, dtype=np.complex128)
|
499
|
+
), # 32dt
|
500
|
+
PulseLibraryItem(
|
501
|
+
name="pulse_3", samples=np.linspace(0, 1.0, 64, dtype=np.complex128)
|
502
|
+
), # 64dt
|
503
|
+
]
|
88
504
|
|
89
505
|
|
90
506
|
class GenericBackendV2(BackendV2):
|
@@ -112,6 +528,8 @@ class GenericBackendV2(BackendV2):
|
|
112
528
|
calibrate_instructions: bool | InstructionScheduleMap | None = None,
|
113
529
|
dtm: float | None = None,
|
114
530
|
seed: int | None = None,
|
531
|
+
pulse_channels: bool = True,
|
532
|
+
noise_info: bool = True,
|
115
533
|
):
|
116
534
|
"""
|
117
535
|
Args:
|
@@ -159,6 +577,10 @@ class GenericBackendV2(BackendV2):
|
|
159
577
|
None by default.
|
160
578
|
|
161
579
|
seed: Optional seed for generation of default values.
|
580
|
+
|
581
|
+
pulse_channels: If true, sets default pulse channel information on the backend.
|
582
|
+
|
583
|
+
noise_info: If true, associates gates and qubits with default noise information.
|
162
584
|
"""
|
163
585
|
|
164
586
|
super().__init__(
|
@@ -175,6 +597,10 @@ class GenericBackendV2(BackendV2):
|
|
175
597
|
self._control_flow = control_flow
|
176
598
|
self._calibrate_instructions = calibrate_instructions
|
177
599
|
self._supported_gates = get_standard_gate_name_mapping()
|
600
|
+
self._noise_info = noise_info
|
601
|
+
|
602
|
+
if calibrate_instructions and not noise_info:
|
603
|
+
raise QiskitError("Must set parameter noise_info when calibrating instructions.")
|
178
604
|
|
179
605
|
if coupling_map is None:
|
180
606
|
self._coupling_map = CouplingMap().from_full(num_qubits)
|
@@ -198,7 +624,10 @@ class GenericBackendV2(BackendV2):
|
|
198
624
|
self._basis_gates.append(name)
|
199
625
|
|
200
626
|
self._build_generic_target()
|
201
|
-
|
627
|
+
if pulse_channels:
|
628
|
+
self._build_default_channels()
|
629
|
+
else:
|
630
|
+
self.channels_map = {}
|
202
631
|
|
203
632
|
@property
|
204
633
|
def target(self):
|
@@ -249,31 +678,40 @@ class GenericBackendV2(BackendV2):
|
|
249
678
|
acting on qargs.
|
250
679
|
"""
|
251
680
|
|
252
|
-
pulse_library =
|
681
|
+
pulse_library = _pulse_library()
|
253
682
|
# Note that the calibration pulses are different for
|
254
683
|
# 1q gates vs 2q gates vs measurement instructions.
|
255
684
|
if inst == "measure":
|
256
|
-
|
257
|
-
PulseQobjInstruction
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
685
|
+
with warnings.catch_warnings():
|
686
|
+
# The class PulseQobjInstruction is deprecated
|
687
|
+
warnings.filterwarnings("ignore", category=DeprecationWarning, module="qiskit")
|
688
|
+
sequence = [
|
689
|
+
PulseQobjInstruction(
|
690
|
+
name="acquire",
|
691
|
+
duration=1792,
|
692
|
+
t0=0,
|
693
|
+
qubits=qargs,
|
694
|
+
memory_slot=qargs,
|
695
|
+
)
|
696
|
+
] + [
|
697
|
+
PulseQobjInstruction(name=pulse_library[1].name, ch=f"m{i}", t0=0)
|
698
|
+
for i in qargs
|
699
|
+
]
|
265
700
|
return sequence
|
266
|
-
|
701
|
+
with warnings.catch_warnings():
|
702
|
+
# The class PulseQobjInstruction is deprecated
|
703
|
+
warnings.filterwarnings("ignore", category=DeprecationWarning, module="qiskit")
|
704
|
+
if num_qubits == 1:
|
705
|
+
return [
|
706
|
+
PulseQobjInstruction(name="fc", ch=f"u{qargs[0]}", t0=0, phase="-P0"),
|
707
|
+
PulseQobjInstruction(name=pulse_library[0].name, ch=f"d{qargs[0]}", t0=0),
|
708
|
+
]
|
267
709
|
return [
|
268
|
-
PulseQobjInstruction(name=
|
269
|
-
PulseQobjInstruction(name=pulse_library[
|
710
|
+
PulseQobjInstruction(name=pulse_library[1].name, ch=f"d{qargs[0]}", t0=0),
|
711
|
+
PulseQobjInstruction(name=pulse_library[2].name, ch=f"u{qargs[0]}", t0=0),
|
712
|
+
PulseQobjInstruction(name=pulse_library[1].name, ch=f"d{qargs[1]}", t0=0),
|
713
|
+
PulseQobjInstruction(name="fc", ch=f"d{qargs[1]}", t0=0, phase=2.1),
|
270
714
|
]
|
271
|
-
return [
|
272
|
-
PulseQobjInstruction(name=pulse_library[1].name, ch=f"d{qargs[0]}", t0=0),
|
273
|
-
PulseQobjInstruction(name=pulse_library[2].name, ch=f"u{qargs[0]}", t0=0),
|
274
|
-
PulseQobjInstruction(name=pulse_library[1].name, ch=f"d{qargs[1]}", t0=0),
|
275
|
-
PulseQobjInstruction(name="fc", ch=f"d{qargs[1]}", t0=0, phase=2.1),
|
276
|
-
]
|
277
715
|
|
278
716
|
def _generate_calibration_defaults(self) -> PulseDefaults:
|
279
717
|
"""Generate pulse calibration defaults as specified with `self._calibrate_instructions`.
|
@@ -330,7 +768,7 @@ class GenericBackendV2(BackendV2):
|
|
330
768
|
qubit_freq_est=qubit_freq_est,
|
331
769
|
meas_freq_est=meas_freq_est,
|
332
770
|
buffer=0,
|
333
|
-
pulse_library=
|
771
|
+
pulse_library=_pulse_library(),
|
334
772
|
cmd_def=cmd_def,
|
335
773
|
)
|
336
774
|
|
@@ -340,22 +778,31 @@ class GenericBackendV2(BackendV2):
|
|
340
778
|
"""
|
341
779
|
# the qubit properties are sampled from default ranges
|
342
780
|
properties = _QUBIT_PROPERTIES
|
343
|
-
self.
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
781
|
+
if not self._noise_info:
|
782
|
+
self._target = Target(
|
783
|
+
description=f"Generic Target with {self._num_qubits} qubits",
|
784
|
+
num_qubits=self._num_qubits,
|
785
|
+
dt=properties["dt"],
|
786
|
+
qubit_properties=None,
|
787
|
+
concurrent_measurements=[list(range(self._num_qubits))],
|
788
|
+
)
|
789
|
+
else:
|
790
|
+
self._target = Target(
|
791
|
+
description=f"Generic Target with {self._num_qubits} qubits",
|
792
|
+
num_qubits=self._num_qubits,
|
793
|
+
dt=properties["dt"],
|
794
|
+
qubit_properties=[
|
795
|
+
QubitProperties(
|
796
|
+
t1=self._rng.uniform(properties["t1"][0], properties["t1"][1]),
|
797
|
+
t2=self._rng.uniform(properties["t2"][0], properties["t2"][1]),
|
798
|
+
frequency=self._rng.uniform(
|
799
|
+
properties["frequency"][0], properties["frequency"][1]
|
800
|
+
),
|
801
|
+
)
|
802
|
+
for _ in range(self._num_qubits)
|
803
|
+
],
|
804
|
+
concurrent_measurements=[list(range(self._num_qubits))],
|
805
|
+
)
|
359
806
|
|
360
807
|
# Generate instruction schedule map with calibrations to add to target.
|
361
808
|
calibration_inst_map = None
|
@@ -380,8 +827,13 @@ class GenericBackendV2(BackendV2):
|
|
380
827
|
f"Provided basis gate {name} needs more qubits than {self.num_qubits}, "
|
381
828
|
f"which is the size of the backend."
|
382
829
|
)
|
383
|
-
|
384
|
-
|
830
|
+
if self._noise_info:
|
831
|
+
noise_params = self._get_noise_defaults(name, gate.num_qubits)
|
832
|
+
self._add_noisy_instruction_to_target(gate, noise_params, calibration_inst_map)
|
833
|
+
else:
|
834
|
+
qarg_set = self._coupling_map if gate.num_qubits > 1 else range(self.num_qubits)
|
835
|
+
props = {(qarg,) if isinstance(qarg, int) else qarg: None for qarg in qarg_set}
|
836
|
+
self._target.add_instruction(gate, properties=props, name=name)
|
385
837
|
|
386
838
|
if self._control_flow:
|
387
839
|
self._target.add_instruction(IfElseOp, name="if_else")
|
@@ -501,8 +953,8 @@ class GenericBackendV2(BackendV2):
|
|
501
953
|
pulse_job = False
|
502
954
|
if pulse_job is None: # submitted job is invalid
|
503
955
|
raise QiskitError(
|
504
|
-
"Invalid input object
|
505
|
-
"QuantumCircuit, Schedule, or a list of either"
|
956
|
+
f"Invalid input object {circuits}, must be either a "
|
957
|
+
"QuantumCircuit, Schedule, or a list of either"
|
506
958
|
)
|
507
959
|
if pulse_job: # pulse job
|
508
960
|
raise QiskitError("Pulse simulation is currently not supported for V2 backends.")
|
@@ -531,18 +983,12 @@ class GenericBackendV2(BackendV2):
|
|
531
983
|
|
532
984
|
@classmethod
|
533
985
|
def _default_options(cls) -> Options:
|
534
|
-
|
535
|
-
|
536
|
-
"ignore",
|
537
|
-
category=DeprecationWarning,
|
538
|
-
message=".+abstract Provider and ProviderV1.+",
|
539
|
-
)
|
540
|
-
if _optionals.HAS_AER:
|
541
|
-
from qiskit_aer import AerSimulator
|
986
|
+
if _optionals.HAS_AER:
|
987
|
+
from qiskit_aer import AerSimulator
|
542
988
|
|
543
|
-
|
544
|
-
|
545
|
-
|
989
|
+
return AerSimulator._default_options()
|
990
|
+
else:
|
991
|
+
return BasicSimulator._default_options()
|
546
992
|
|
547
993
|
def drive_channel(self, qubit: int):
|
548
994
|
drive_channels_map = getattr(self, "channels_map", {}).get("drive", {})
|