Update `Instruction.condition_bits` for runtime classical expressions (#11325)

I didn't even know this property existed and it wasn't tested directly,
but the IBM provider uses it during its custom scheduling passes, so
until removal, it should be kept updated.
This commit is contained in:
Jake Lishman 2023-11-27 18:14:19 +00:00 committed by GitHub
parent d3b08adf69
commit 5bbda4a263
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 42 additions and 14 deletions

View File

@ -618,12 +618,11 @@ class Instruction(Operation):
@property
def condition_bits(self) -> List[Clbit]:
"""Get Clbits in condition."""
from qiskit.circuit.controlflow import condition_resources # pylint: disable=cyclic-import
if self.condition is None:
return []
if isinstance(self.condition[0], Clbit):
return [self.condition[0]]
else: # ClassicalRegister
return list(self.condition[0])
return list(condition_resources(self.condition).clbits)
@property
def name(self):

View File

@ -0,0 +1,5 @@
---
fixes:
- |
The property :attr:`.Instruction.condition_bits` will now correctly handle runtime classical
expressions (:mod:`qiskit.circuit.classical`).

View File

@ -18,16 +18,20 @@ import unittest.mock
import numpy as np
from qiskit.circuit import Gate
from qiskit.circuit import Parameter
from qiskit.circuit import Instruction, InstructionSet
from qiskit.circuit import QuantumCircuit
from qiskit.circuit import QuantumRegister, ClassicalRegister, Qubit, Clbit
from qiskit.circuit.library.standard_gates.h import HGate
from qiskit.circuit.library.standard_gates.rz import RZGate
from qiskit.circuit.library.standard_gates.x import CXGate
from qiskit.circuit.library.standard_gates.s import SGate
from qiskit.circuit.library.standard_gates.t import TGate
from qiskit.circuit import (
Gate,
Parameter,
Instruction,
InstructionSet,
QuantumCircuit,
QuantumRegister,
ClassicalRegister,
Qubit,
Clbit,
IfElseOp,
)
from qiskit.circuit.library import HGate, RZGate, CXGate, SGate, TGate
from qiskit.circuit.classical import expr
from qiskit.test import QiskitTestCase
from qiskit.circuit.exceptions import CircuitError
from qiskit.circuit.random import random_circuit
@ -426,6 +430,26 @@ class TestInstructions(QiskitTestCase):
),
)
def test_instruction_condition_bits(self):
"""Test that the ``condition_bits`` property behaves correctly until it is deprecated and
removed."""
bits = [Clbit(), Clbit()]
cr1 = ClassicalRegister(2, "cr1")
cr2 = ClassicalRegister(2, "cr2")
body = QuantumCircuit(cr1, cr2, bits)
def key(bit):
return body.find_bit(bit).index
op = IfElseOp((bits[0], False), body)
self.assertEqual(op.condition_bits, [bits[0]])
op = IfElseOp((cr1, 3), body)
self.assertEqual(op.condition_bits, list(cr1))
op = IfElseOp(expr.logic_and(bits[1], expr.equal(cr2, 3)), body)
self.assertEqual(sorted(op.condition_bits, key=key), sorted([bits[1]] + list(cr2), key=key))
def test_instructionset_c_if_direct_resource(self):
"""Test that using :meth:`.InstructionSet.c_if` with an exact classical resource always
works, and produces the expected condition."""