Skip to content

Commit 5bbda4a

Browse files
authored
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.
1 parent d3b08ad commit 5bbda4a

File tree

3 files changed

+42
-14
lines changed

3 files changed

+42
-14
lines changed

qiskit/circuit/instruction.py

+3-4
Original file line numberDiff line numberDiff line change
@@ -618,12 +618,11 @@ def repeat(self, n):
618618
@property
619619
def condition_bits(self) -> List[Clbit]:
620620
"""Get Clbits in condition."""
621+
from qiskit.circuit.controlflow import condition_resources # pylint: disable=cyclic-import
622+
621623
if self.condition is None:
622624
return []
623-
if isinstance(self.condition[0], Clbit):
624-
return [self.condition[0]]
625-
else: # ClassicalRegister
626-
return list(self.condition[0])
625+
return list(condition_resources(self.condition).clbits)
627626

628627
@property
629628
def name(self):
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
fixes:
3+
- |
4+
The property :attr:`.Instruction.condition_bits` will now correctly handle runtime classical
5+
expressions (:mod:`qiskit.circuit.classical`).

test/python/circuit/test_instructions.py

+34-10
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,20 @@
1818

1919
import numpy as np
2020

21-
from qiskit.circuit import Gate
22-
from qiskit.circuit import Parameter
23-
from qiskit.circuit import Instruction, InstructionSet
24-
from qiskit.circuit import QuantumCircuit
25-
from qiskit.circuit import QuantumRegister, ClassicalRegister, Qubit, Clbit
26-
from qiskit.circuit.library.standard_gates.h import HGate
27-
from qiskit.circuit.library.standard_gates.rz import RZGate
28-
from qiskit.circuit.library.standard_gates.x import CXGate
29-
from qiskit.circuit.library.standard_gates.s import SGate
30-
from qiskit.circuit.library.standard_gates.t import TGate
21+
from qiskit.circuit import (
22+
Gate,
23+
Parameter,
24+
Instruction,
25+
InstructionSet,
26+
QuantumCircuit,
27+
QuantumRegister,
28+
ClassicalRegister,
29+
Qubit,
30+
Clbit,
31+
IfElseOp,
32+
)
33+
from qiskit.circuit.library import HGate, RZGate, CXGate, SGate, TGate
34+
from qiskit.circuit.classical import expr
3135
from qiskit.test import QiskitTestCase
3236
from qiskit.circuit.exceptions import CircuitError
3337
from qiskit.circuit.random import random_circuit
@@ -426,6 +430,26 @@ def test_repr_of_instructions(self):
426430
),
427431
)
428432

433+
def test_instruction_condition_bits(self):
434+
"""Test that the ``condition_bits`` property behaves correctly until it is deprecated and
435+
removed."""
436+
bits = [Clbit(), Clbit()]
437+
cr1 = ClassicalRegister(2, "cr1")
438+
cr2 = ClassicalRegister(2, "cr2")
439+
body = QuantumCircuit(cr1, cr2, bits)
440+
441+
def key(bit):
442+
return body.find_bit(bit).index
443+
444+
op = IfElseOp((bits[0], False), body)
445+
self.assertEqual(op.condition_bits, [bits[0]])
446+
447+
op = IfElseOp((cr1, 3), body)
448+
self.assertEqual(op.condition_bits, list(cr1))
449+
450+
op = IfElseOp(expr.logic_and(bits[1], expr.equal(cr2, 3)), body)
451+
self.assertEqual(sorted(op.condition_bits, key=key), sorted([bits[1]] + list(cr2), key=key))
452+
429453
def test_instructionset_c_if_direct_resource(self):
430454
"""Test that using :meth:`.InstructionSet.c_if` with an exact classical resource always
431455
works, and produces the expected condition."""

0 commit comments

Comments
 (0)