Compilation moves measurement position if there is no end-circuit barrier
If there is no end-circuit barrier, the end circuit measurement will be moved by compiler. For instance, the measurement on q1 will be moved to mid-circuit position of q2. In the end q2 has two measurements but q1 has none.
To replicate the problem:
- Use circuit with qasm string attached in the end of this post.
- Run:
from pytket.extensions.qiskit import IBMQBackend
from pytket.extensions.qiskit import qiskit_to_tk, tk_to_qiskit
backend_name = 'ibmq_guadalupe'
tket_backend = IBMQBackend(backend_name=backend_name, account_provider=platform.provider)
qc = QuantumCircuit.from_qasm_str(qasm)
display(qc.draw("mpl",fold=-1))
qc = qc.decompose()
tket_circuit = qiskit_to_tk(qc)
compiled_circuit = tket_backend.get_compiled_circuit(
tket_circuit, optimisation_level=2
)
tk_to_qiskit(compiled_circuit).draw("mpl",fold=-1)
qasm='OPENQASM 2.0;\ninclude "qelib1.inc";\ngate r(param0,param1) q0 { u3(-2.51612248028357,-pi/2,pi/2) q0; }\nqreg q[10];\ncreg meas[10];\nu2(0,pi) q[0];\nu2(0,pi) q[1];\nu2(0,pi) q[2];\nu2(0,pi) q[3];\nu2(0,pi) q[4];\nu2(0,pi) q[5];\nu2(0,pi) q[6];\nu2(0,pi) q[7];\nu2(0,pi) q[8];\nu2(0,pi) q[9];\nrzz(-0.209012750456365) q[8],q[9];\nrzz(-0.483064487914431) q[7],q[9];\nrzz(-0.397414342128395) q[7],q[8];\nrzz(-0.435149748039562) q[6],q[7];\nrzz(-0.47135768009941) q[4],q[6];\nrzz(-0.790914623318578) q[5],q[7];\nrzz(-0.480351269646307) q[4],q[5];\nrzz(-0.522693114427535) q[3],q[4];\nrzz(-0.430147012143333) q[1],q[3];\nrzz(-0.518574550086051) q[2],q[4];\nrzz(-0.243780581235768) q[1],q[2];\nrzz(-0.826398643904474) q[0],q[1];\nr(-2.51612248028357,0) q[0];\nr(-2.51612248028357,0) q[1];\nr(-2.51612248028357,0) q[2];\nr(-2.51612248028357,0) q[3];\nr(-2.51612248028357,0) q[4];\nr(-2.51612248028357,0) q[5];\nr(-2.51612248028357,0) q[6];\nr(-2.51612248028357,0) q[7];\nr(-2.51612248028357,0) q[8];\nr(-2.51612248028357,0) q[9];\nmeasure q[0] -> meas[0];\nmeasure q[1] -> meas[1];\nmeasure q[2] -> meas[2];\nmeasure q[3] -> meas[3];\nmeasure q[4] -> meas[4];\nmeasure q[5] -> meas[5];\nmeasure q[6] -> meas[6];\nmeasure q[7] -> meas[7];\nmeasure q[8] -> meas[8];\nmeasure q[9] -> meas[9];\n'
Thanks for the report. This is a result of the CXMappingPass which is a routing pass run as part of the default compilation sequence for IBM backends defined by pytket-qiskit. This pass involves introducing some logical swaps which are then replaced with sequences of CX gates. For devices that support mid-circuit measurement (such as ibmq_guadalupe) these are left in place; they should not affect the results since the measured qubit is effectively replaced by another.
There is an option that can be passed to CXMappingPass to prevent this (delay_measures=True), but the default compilation passes in pytket-qiskit set this according to whether or not mid-circuit measurements are supported.
This issue has been automatically marked as stale.