-
Notifications
You must be signed in to change notification settings - Fork 2.6k
Open
Labels
bugSomething isn't workingSomething isn't working
Description
Environment
- Qiskit version: 1.3.0 (compiled from source)
- Python version: 3.11.6
- Operating system: Ubuntu 23.01 LTS
Benny and I found this bug
What is happening?
Unknown instruction appears in transpiled circuit sometimes. Run the code below a few times and it should fail with:
qiskit_aer.aererror.AerError: 'unknown instruction: rccx'
We tried to investigate this a bit, by printing out all the instructions and comparing from the version that works vs the one that doesn't. This is because we guessed that maybe some decomposition isn't being done.
The output below shows what we got. Blocks surrounded by "======" are the same, blocks left alone are different.
Working instructions:
=================================================================
Instruction(name='measure', num_qubits=1, num_clbits=1, params=[])
Instruction(name='barrier', num_qubits=5, num_clbits=0, params=[])
Instruction(name='jump', num_qubits=5, num_clbits=0, params=['if_0_true'])
Instruction(name='jump', num_qubits=5, num_clbits=0, params=['if_0_else'])
Instruction(name='mark', num_qubits=5, num_clbits=0, params=['if_0_true'])
Instruction(name='id', num_qubits=1, num_clbits=0, params=[])
Instruction(name='jump', num_qubits=5, num_clbits=0, params=['if_0_end'])
Instruction(name='mark', num_qubits=5, num_clbits=0, params=['if_0_else'])
Instruction(name='measure', num_qubits=1, num_clbits=1, params=[])
Instruction(name='barrier', num_qubits=5, num_clbits=0, params=[])
Instruction(name='jump', num_qubits=5, num_clbits=0, params=['switch_1_0'])
Instruction(name='jump', num_qubits=5, num_clbits=0, params=['switch_1_1'])
Instruction(name='jump', num_qubits=5, num_clbits=0, params=['switch_1_end'])
Instruction(name='mark', num_qubits=5, num_clbits=0, params=['switch_1_0'])
Instruction(name='h', num_qubits=1, num_clbits=0, params=[])
==================================================================
Instruction(name='h', num_qubits=1, num_clbits=0, params=[])
Instruction(name='p', num_qubits=1, num_clbits=0, params=[0.39269908169872414])
Instruction(name='p', num_qubits=1, num_clbits=0, params=[0.39269908169872414])
Instruction(name='p', num_qubits=1, num_clbits=0, params=[0.39269908169872414])
Instruction(name='p', num_qubits=1, num_clbits=0, params=[0.39269908169872414])
Instruction(name='cx', num_qubits=2, num_clbits=0, params=[])
Instruction(name='p', num_qubits=1, num_clbits=0, params=[-0.39269908169872414])
Instruction(name='cx', num_qubits=2, num_clbits=0, params=[])
Instruction(name='cx', num_qubits=2, num_clbits=0, params=[])
Instruction(name='p', num_qubits=1, num_clbits=0, params=[-0.39269908169872414])
Instruction(name='cx', num_qubits=2, num_clbits=0, params=[])
Instruction(name='p', num_qubits=1, num_clbits=0, params=[0.39269908169872414])
Instruction(name='cx', num_qubits=2, num_clbits=0, params=[])
Instruction(name='p', num_qubits=1, num_clbits=0, params=[-0.39269908169872414])
Instruction(name='cx', num_qubits=2, num_clbits=0, params=[])
Instruction(name='cx', num_qubits=2, num_clbits=0, params=[])
Instruction(name='p', num_qubits=1, num_clbits=0, params=[-0.39269908169872414])
Instruction(name='cx', num_qubits=2, num_clbits=0, params=[])
Instruction(name='p', num_qubits=1, num_clbits=0, params=[0.39269908169872414])
Instruction(name='cx', num_qubits=2, num_clbits=0, params=[])
Instruction(name='p', num_qubits=1, num_clbits=0, params=[-0.39269908169872414])
Instruction(name='cx', num_qubits=2, num_clbits=0, params=[])
Instruction(name='p', num_qubits=1, num_clbits=0, params=[0.39269908169872414])
Instruction(name='cx', num_qubits=2, num_clbits=0, params=[])
Instruction(name='p', num_qubits=1, num_clbits=0, params=[-0.39269908169872414])
Instruction(name='cx', num_qubits=2, num_clbits=0, params=[])
Instruction(name='p', num_qubits=1, num_clbits=0, params=[0.39269908169872414])
Instruction(name='cx', num_qubits=2, num_clbits=0, params=[])
Instruction(name='p', num_qubits=1, num_clbits=0, params=[-0.39269908169872414])
Instruction(name='cx', num_qubits=2, num_clbits=0, params=[])
Instruction(name='h', num_qubits=1, num_clbits=0, params=[])
============================================================
Instruction(name='h', num_qubits=1, num_clbits=0, params=[])
============================================================
===============================================================
Instruction(name='mcphase', num_qubits=4, num_clbits=0, params=[0.925])
Instruction(name='mcphase', num_qubits=4, num_clbits=0, params=[-0.428])
===============================================================
Instruction(name='h', num_qubits=1, num_clbits=0, params=[])
Instruction(name='p', num_qubits=1, num_clbits=0, params=[0.39269908169872414])
Instruction(name='p', num_qubits=1, num_clbits=0, params=[0.39269908169872414])
Instruction(name='p', num_qubits=1, num_clbits=0, params=[0.39269908169872414])
Instruction(name='p', num_qubits=1, num_clbits=0, params=[0.39269908169872414])
Instruction(name='cx', num_qubits=2, num_clbits=0, params=[])
Instruction(name='p', num_qubits=1, num_clbits=0, params=[-0.39269908169872414])
Instruction(name='cx', num_qubits=2, num_clbits=0, params=[])
Instruction(name='cx', num_qubits=2, num_clbits=0, params=[])
Instruction(name='p', num_qubits=1, num_clbits=0, params=[-0.39269908169872414])
Instruction(name='cx', num_qubits=2, num_clbits=0, params=[])
Instruction(name='p', num_qubits=1, num_clbits=0, params=[0.39269908169872414])
Instruction(name='cx', num_qubits=2, num_clbits=0, params=[])
Instruction(name='p', num_qubits=1, num_clbits=0, params=[-0.39269908169872414])
Instruction(name='cx', num_qubits=2, num_clbits=0, params=[])
Instruction(name='cx', num_qubits=2, num_clbits=0, params=[])
Instruction(name='p', num_qubits=1, num_clbits=0, params=[-0.39269908169872414])
Instruction(name='cx', num_qubits=2, num_clbits=0, params=[])
Instruction(name='p', num_qubits=1, num_clbits=0, params=[0.39269908169872414])
Instruction(name='cx', num_qubits=2, num_clbits=0, params=[])
Instruction(name='p', num_qubits=1, num_clbits=0, params=[-0.39269908169872414])
Instruction(name='cx', num_qubits=2, num_clbits=0, params=[])
Instruction(name='p', num_qubits=1, num_clbits=0, params=[0.39269908169872414])
Instruction(name='cx', num_qubits=2, num_clbits=0, params=[])
Instruction(name='p', num_qubits=1, num_clbits=0, params=[-0.39269908169872414])
Instruction(name='cx', num_qubits=2, num_clbits=0, params=[])
Instruction(name='p', num_qubits=1, num_clbits=0, params=[0.39269908169872414])
Instruction(name='cx', num_qubits=2, num_clbits=0, params=[])
Instruction(name='p', num_qubits=1, num_clbits=0, params=[-0.39269908169872414])
Instruction(name='cx', num_qubits=2, num_clbits=0, params=[])
Instruction(name='h', num_qubits=1, num_clbits=0, params=[])
==================================================================
Instruction(name='jump', num_qubits=5, num_clbits=0, params=['switch_1_end'])
Instruction(name='mark', num_qubits=5, num_clbits=0, params=['switch_1_1'])
Instruction(name='x', num_qubits=1, num_clbits=0, params=[])
Instruction(name='jump', num_qubits=5, num_clbits=0, params=['switch_1_end'])
Instruction(name='mark', num_qubits=5, num_clbits=0, params=['switch_1_end'])
Instruction(name='barrier', num_qubits=5, num_clbits=0, params=[])
Instruction(name='mark', num_qubits=5, num_clbits=0, params=['if_0_end'])
Instruction(name='barrier', num_qubits=5, num_clbits=0, params=[])
Instruction(name='barrier', num_qubits=5, num_clbits=0, params=[])
Instruction(name='measure', num_qubits=1, num_clbits=1, params=[])
Instruction(name='measure', num_qubits=1, num_clbits=1, params=[])
Instruction(name='measure', num_qubits=1, num_clbits=1, params=[])
Instruction(name='measure', num_qubits=1, num_clbits=1, params=[])
Instruction(name='measure', num_qubits=1, num_clbits=1, params=[])
===================================================================
Not working instructions:
=================================================================
Instruction(name='measure', num_qubits=1, num_clbits=1, params=[])
Instruction(name='barrier', num_qubits=5, num_clbits=0, params=[])
Instruction(name='jump', num_qubits=5, num_clbits=0, params=['if_0_true'])
Instruction(name='jump', num_qubits=5, num_clbits=0, params=['if_0_else'])
Instruction(name='mark', num_qubits=5, num_clbits=0, params=['if_0_true'])
Instruction(name='id', num_qubits=1, num_clbits=0, params=[])
Instruction(name='jump', num_qubits=5, num_clbits=0, params=['if_0_end'])
Instruction(name='mark', num_qubits=5, num_clbits=0, params=['if_0_else'])
Instruction(name='measure', num_qubits=1, num_clbits=1, params=[])
Instruction(name='barrier', num_qubits=5, num_clbits=0, params=[])
Instruction(name='jump', num_qubits=5, num_clbits=0, params=['switch_1_0'])
Instruction(name='jump', num_qubits=5, num_clbits=0, params=['switch_1_1'])
Instruction(name='jump', num_qubits=5, num_clbits=0, params=['switch_1_end'])
Instruction(name='mark', num_qubits=5, num_clbits=0, params=['switch_1_0'])
Instruction(name='h', num_qubits=1, num_clbits=0, params=[])
==================================================================
Instruction(name='rccx', num_qubits=3, num_clbits=0, params=[])
Instruction(name='ccx', num_qubits=3, num_clbits=0, params=[])
============================================================
Instruction(name='h', num_qubits=1, num_clbits=0, params=[])***
============================================================
(Seems to map to nothing?)
Instruction(name='rccx', num_qubits=3, num_clbits=0, params=[])
===============================================================
Instruction(name='mcphase', num_qubits=4, num_clbits=0, params=[0.925])
Instruction(name='mcphase', num_qubits=4, num_clbits=0, params=[-0.428])
===============================================================
Instruction(name='rccx', num_qubits=3, num_clbits=0, params=[])
Instruction(name='ccx', num_qubits=3, num_clbits=0, params=[])
(Seems to map to nothing?)
Instruction(name='rccx', num_qubits=3, num_clbits=0, params=[])
==================================================================
Instruction(name='jump', num_qubits=5, num_clbits=0, params=['switch_1_end'])
Instruction(name='mark', num_qubits=5, num_clbits=0, params=['switch_1_1'])
Instruction(name='x', num_qubits=1, num_clbits=0, params=[])
Instruction(name='jump', num_qubits=5, num_clbits=0, params=['switch_1_end'])
Instruction(name='mark', num_qubits=5, num_clbits=0, params=['switch_1_end'])
Instruction(name='barrier', num_qubits=5, num_clbits=0, params=[])
Instruction(name='mark', num_qubits=5, num_clbits=0, params=['if_0_end'])
Instruction(name='barrier', num_qubits=5, num_clbits=0, params=[])
Instruction(name='barrier', num_qubits=5, num_clbits=0, params=[])
Instruction(name='measure', num_qubits=1, num_clbits=1, params=[])
Instruction(name='measure', num_qubits=1, num_clbits=1, params=[])
Instruction(name='measure', num_qubits=1, num_clbits=1, params=[])
Instruction(name='measure', num_qubits=1, num_clbits=1, params=[])
Instruction(name='measure', num_qubits=1, num_clbits=1, params=[])
===================================================================
How can we reproduce the issue?
from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister
from qiskit.circuit import Parameter, ParameterVector
from helpers.qiskit_helpers import compare_statevectors, run_on_simulator, run_routing_simulation
from pathlib import Path
from math import pi
from qiskit import QuantumCircuit, transpile
from qiskit_aer import AerSimulator
subcirc4 = QuantumCircuit(0)
# Adding qregs
qreg_0 = QuantumRegister(1)
subcirc4.add_register(qreg_0)
qreg_1 = QuantumRegister(1)
subcirc4.add_register(qreg_1)
# Adding creg resources
subcirc4.z(qreg_1[0])
subcirc4.u(0,0,0.925000, qreg_1[0])
subcirc4.u(0,0,-0.428000, qreg_1[0])
subcirc4.x(qreg_1[0])
subcirc4 = subcirc4.to_gate().control(3)
main_circ = QuantumCircuit(1)
# Adding qregs
qreg_0 = QuantumRegister(1)
main_circ.add_register(qreg_0)
qreg_1 = QuantumRegister(1)
main_circ.add_register(qreg_1)
qreg_2 = QuantumRegister(1)
main_circ.add_register(qreg_2)
qreg_3 = QuantumRegister(1)
main_circ.add_register(qreg_3)
# Adding creg resources
creg_0 = ClassicalRegister(1)
main_circ.add_register(creg_0)
creg_1 = ClassicalRegister(2)
main_circ.add_register(creg_1)
creg_3 = ClassicalRegister(1)
main_circ.add_register(creg_3)
main_circ.measure(qreg_2[0], creg_0[0])
with main_circ.if_test((creg_0[0],0)) as else_2:
main_circ.id(qreg_0[0])
with else_2:
main_circ.measure(qreg_0[0], creg_0[0])
with main_circ.switch(creg_0[0]) as case_1:
with case_1(0):
main_circ.append(subcirc4,[qreg_3[0],qreg_1[0],qreg_0[0],qreg_2[0],0])
with case_1(1):
main_circ.x(qreg_1[0])
main_circ.measure_active()
s = AerSimulator()
qc1 = transpile(main_circ, s, optimization_level=0)
c1 = s.run(qc1, shots=1).result().get_counts()
What should happen?
Circuit should be runnable all the time
Any suggestions?
No response
Metadata
Metadata
Assignees
Labels
bugSomething isn't workingSomething isn't working