Skip to content

Commit 7821d0a

Browse files
committed
Properly reset qubits in squin runtime
1 parent b707a4b commit 7821d0a

File tree

2 files changed

+23
-8
lines changed

2 files changed

+23
-8
lines changed

src/bloqade/pyqrack/squin/qubit.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -71,15 +71,23 @@ def measure_and_reset(
7171
result = []
7272
for qbit in qubits:
7373
if qbit.is_active():
74-
result.append(qbit.sim_reg.m(qbit.addr))
74+
qbit_result = bool(qbit.sim_reg.m(qbit.addr))
7575
else:
76-
result.append(None)
77-
qbit.sim_reg.force_m(qbit.addr, 0)
76+
qbit_result = None
77+
78+
if qbit_result:
79+
qbit.sim_reg.x(qbit.addr)
80+
81+
result.append(qbit_result)
7882

7983
return (ilist.IList(result),)
8084

8185
@interp.impl(qubit.Reset)
8286
def reset(self, interp: PyQrackInterpreter, frame: interp.Frame, stmt: qubit.Reset):
8387
qubits: ilist.IList[PyQrackQubit, Any] = frame.get(stmt.qubits)
8488
for qbit in qubits:
85-
qbit.sim_reg.force_m(qbit.addr, 0)
89+
if not qbit.is_active():
90+
continue
91+
92+
if bool(qbit.sim_reg.m(qbit.addr)):
93+
qbit.sim_reg.x(qbit.addr)

src/bloqade/pyqrack/squin/wire.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ def measure(
4343
):
4444
w: PyQrackWire = frame.get(stmt.wire)
4545
qbit = w.qubit
46-
res: int = qbit.sim_reg.m(qbit.addr)
46+
res: bool = bool(qbit.sim_reg.m(qbit.addr))
4747
return (res,)
4848

4949
@interp.impl(wire.MeasureAndReset)
@@ -55,15 +55,22 @@ def measure_and_reset(
5555
):
5656
w: PyQrackWire = frame.get(stmt.wire)
5757
qbit = w.qubit
58-
res: int = qbit.sim_reg.m(qbit.addr)
59-
qbit.sim_reg.force_m(qbit.addr, False)
58+
res: bool = bool(qbit.sim_reg.m(qbit.addr))
59+
60+
if res:
61+
qbit.sim_reg.x(qbit.addr)
62+
63+
# TODO: do we need to rewrap this here? The qbit changed in-place
6064
new_w = PyQrackWire(qbit)
6165
return (new_w, res)
6266

6367
@interp.impl(wire.Reset)
6468
def reset(self, interp: PyQrackInterpreter, frame: interp.Frame, stmt: wire.Reset):
6569
w: PyQrackWire = frame.get(stmt.wire)
6670
qbit = w.qubit
67-
qbit.sim_reg.force_m(qbit.addr, False)
71+
72+
if bool(qbit.sim_reg.m(qbit.addr)):
73+
qbit.sim_reg.x(qbit.addr)
74+
6875
new_w = PyQrackWire(qbit)
6976
return (new_w,)

0 commit comments

Comments
 (0)