Skip to content

Commit f4f7ed4

Browse files
committed
Mid-circuit measurement POC
1 parent 0427d9b commit f4f7ed4

File tree

4 files changed

+80
-6
lines changed

4 files changed

+80
-6
lines changed

qiskit/qpy/binary_io/circuits.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -476,6 +476,7 @@ def _read_instruction(
476476
circuit._append(inst_obj, qargs, cargs)
477477
return None
478478
elif gate_name in custom_operations:
479+
print("GATE NAME IN CUSTOM: ", gate_name)
479480
inst_obj = _parse_custom_operation(
480481
custom_operations,
481482
gate_name,
@@ -505,6 +506,7 @@ def _read_instruction(
505506
else:
506507
raise AttributeError(f"Invalid instruction type: {gate_name}")
507508

509+
print(">>>QPY GATE CLASS", gate_class)
508510
if instruction.label_size <= 0:
509511
label = None
510512
if gate_name in ("IfElseOp", "WhileLoopOp"):

qiskit/visualization/circuit/circuit_visualization.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,7 @@ def _text_circuit_drawer(
429429
idle_wires=idle_wires,
430430
wire_order=wire_order,
431431
)
432+
print("TEXT DRAWING?")
432433
text_drawing = _text.TextDrawing(
433434
qubits,
434435
clbits,

qiskit/visualization/circuit/text.py

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -222,17 +222,20 @@ class MeasureFrom(BoxOnQuWire):
222222
bot: └╥┘ └╥┘
223223
"""
224224

225-
def __init__(self):
226-
super().__init__()
225+
def __init__(self, label=""):
226+
super().__init__(label)
227227
self.top_format = self.mid_format = self.bot_format = "%s"
228+
if self.label == "measure":
229+
mid_content = "M"
230+
else:
231+
mid_content = self.label
228232
self.top_connect = "┌─┐"
229-
self.mid_content = "┤M├"
233+
self.mid_content = "┤" + mid_content + "├"
230234
self.bot_connect = "└╥┘"
231235

232236
self.top_pad = self.bot_pad = " "
233237
self._mid_padding = "─"
234238

235-
236239
class MultiBox(DrawElement):
237240
"""Elements that are drawn over multiple wires."""
238241

@@ -1135,9 +1138,11 @@ def add_connected_gate(node, gates, layer, current_cons, gate_wire_map):
11351138
if isinstance(modifier, ControlModifier):
11361139
mod_control = modifier
11371140
break
1138-
1141+
1142+
print("OP", isinstance(op, Measure), op)
11391143
if isinstance(op, Measure):
1140-
gate = MeasureFrom()
1144+
print("MEASURE?")
1145+
gate = MeasureFrom(label=op.name)
11411146
layer.set_qubit(node.qargs[0], gate)
11421147
register, _, reg_index = get_bit_reg_index(self._circuit, node.cargs[0])
11431148
if self.cregbundle and register is not None:

test_midcircuit_2.py

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import io
2+
3+
from qiskit import QuantumCircuit
4+
from qiskit.circuit import Instruction, Measure
5+
from qiskit.circuit.singleton import SingletonInstruction, stdlib_singleton_key
6+
from qiskit.circuit.exceptions import CircuitError
7+
from qiskit._accelerate.circuit import StandardInstructionType
8+
from qiskit.qpy import dump, load
9+
from qiskit.transpiler.passes import ResetAfterMeasureSimplification
10+
11+
12+
class CustomMeasurement(Measure):
13+
"""A custom specialized measurement."""
14+
15+
def __init__(self, label=None):
16+
super().__init__(label=label)
17+
if label:
18+
self.name= label
19+
else:
20+
self.name="measure_2"
21+
22+
def create():
23+
circ = QuantumCircuit(2, 2)
24+
circ.append(CustomMeasurement(), [0], [0])
25+
circ.append(CustomMeasurement("measure_3"), [0], [1])
26+
circ.measure_all()
27+
print(circ.draw())
28+
print(circ.data)
29+
print("Is subclass", issubclass(CustomMeasurement, Measure))
30+
print("Is instance", isinstance(circ.data[0].operation, Measure))
31+
return circ
32+
33+
def qpy_roundtrip(circ):
34+
print("QPY ROUNDTRIP")
35+
with io.BytesIO() as f:
36+
dump(circ, f)
37+
f.seek(0)
38+
out_circ = load(f)[0]
39+
print(out_circ.draw())
40+
print(out_circ.data)
41+
return out_circ
42+
43+
def test_roundtrip(circ, out_circ):
44+
print("ARE THEY EQUAL?")
45+
for i, out_item in enumerate(out_circ.data):
46+
print(out_item.name, "==", circ.data[i].name, "?", out_item == circ.data[i])
47+
# if not out_item == circ.data[i]:
48+
print("Before: ",isinstance(circ.data[i].operation, Measure), type(circ.data[i].operation).__mro__)
49+
print(circ.data[i].operation.definition)
50+
print("After: ", isinstance(out_item.operation, Measure), type(out_item.operation).__mro__)
51+
print(out_item.operation.definition)
52+
53+
54+
def qasm3_roundtrip(circ):
55+
import qiskit.qasm3 as qasm3
56+
print("QASM3 ROUNDTRIP")
57+
qasm_str = qasm3.dumps(circ)
58+
circ_qasm = qasm3.loads(qasm_str)
59+
return circ_qasm
60+
61+
62+
qc = create()
63+
qpy_qc = qpy_roundtrip(qc)
64+
test_roundtrip(qc, qpy_qc)
65+
qasm3_qc = qasm3_roundtrip(qc)
66+
test_roundtrip(qc, qasm3_qc)

0 commit comments

Comments
 (0)