diff --git a/qiskit/circuit/library/blueprintcircuit.py b/qiskit/circuit/library/blueprintcircuit.py index 415ae8ecd117..082249e54b04 100644 --- a/qiskit/circuit/library/blueprintcircuit.py +++ b/qiskit/circuit/library/blueprintcircuit.py @@ -119,10 +119,10 @@ def qasm(self, formatted=False, filename=None, encoding=None): self._build() return super().qasm(formatted, filename, encoding) - def append(self, instruction, qargs=None, cargs=None): + def _append(self, instruction, _qargs=None, _cargs=None): if not self._is_built: self._build() - return super().append(instruction, qargs, cargs) + return super()._append(instruction, _qargs, _cargs) def compose(self, other, qubits=None, clbits=None, front=False, inplace=False, wrap=False): if not self._is_built: diff --git a/releasenotes/notes/fix-blueprint-circuit-_append-b4d6c9c41db860f5.yaml b/releasenotes/notes/fix-blueprint-circuit-_append-b4d6c9c41db860f5.yaml new file mode 100644 index 000000000000..0596bc50d964 --- /dev/null +++ b/releasenotes/notes/fix-blueprint-circuit-_append-b4d6c9c41db860f5.yaml @@ -0,0 +1,6 @@ +--- +fixes: + - | + :class:`.BlueprintCircuit` subclasses will now behave correctly when the semi-public method + :meth:`.QuantumCircuit._append` is used with the blueprint in an unbuilt state, *i.e.* the + circuit will be built before attempting the append. diff --git a/test/python/circuit/library/test_blueprintcircuit.py b/test/python/circuit/library/test_blueprintcircuit.py index 974e4c1ead32..0ccd5c40ebbc 100644 --- a/test/python/circuit/library/test_blueprintcircuit.py +++ b/test/python/circuit/library/test_blueprintcircuit.py @@ -16,8 +16,15 @@ from ddt import ddt, data from qiskit.test.base import QiskitTestCase -from qiskit.circuit import QuantumRegister, Parameter, QuantumCircuit, Gate, Instruction -from qiskit.circuit.library import BlueprintCircuit +from qiskit.circuit import ( + QuantumRegister, + Parameter, + QuantumCircuit, + Gate, + Instruction, + CircuitInstruction, +) +from qiskit.circuit.library import BlueprintCircuit, XGate class MockBlueprint(BlueprintCircuit): @@ -139,6 +146,34 @@ def test_to_gate_and_instruction(self, method): gate = circuit.to_instruction() self.assertIsInstance(gate, Instruction) + def test_build_before_appends(self): + """Test that both forms of direct append (public and semi-public) function correctly.""" + + class DummyBlueprint(BlueprintCircuit): + """Dummy circuit.""" + + def _check_configuration(self, raise_on_failure=True): + return True + + def _build(self): + super()._build() + self.z(0) + + expected = QuantumCircuit(2) + expected.z(0) + expected.x(0) + + qr = QuantumRegister(2, "q") + mock = DummyBlueprint() + mock.add_register(qr) + mock.append(XGate(), [qr[0]], []) + self.assertEqual(expected, mock) + + mock = DummyBlueprint() + mock.add_register(qr) + mock._append(CircuitInstruction(XGate(), (qr[0],), ())) + self.assertEqual(expected, mock) + if __name__ == "__main__": unittest.main()