Skip to content

Commit 093d239

Browse files
committed
get pyqrack runtime to work
1 parent ac90a6a commit 093d239

File tree

5 files changed

+30
-12
lines changed

5 files changed

+30
-12
lines changed

src/bloqade/pyqrack/squin/op.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
RotRuntime,
1111
KronRuntime,
1212
MultRuntime,
13+
ResetRuntime,
1314
ScaleRuntime,
1415
AdjointRuntime,
1516
ControlRuntime,
@@ -94,6 +95,12 @@ def phaseop(
9495
global_ = isinstance(stmt, op.stmts.PhaseOp)
9596
return (PhaseOpRuntime(theta, global_=global_),)
9697

98+
@interp.impl(op.stmts.Reset)
99+
def reset(
100+
self, interp: PyQrackInterpreter, frame: interp.Frame, stmt: op.stmts.Reset
101+
) -> tuple[OperatorRuntimeABC]:
102+
return (ResetRuntime(),)
103+
97104
@interp.impl(op.stmts.X)
98105
@interp.impl(op.stmts.Y)
99106
@interp.impl(op.stmts.Z)

src/bloqade/pyqrack/squin/qubit.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ def measure_qubit(
6060
result = self._measure_qubit(qbit)
6161
return (result,)
6262

63+
64+
"""
6365
@interp.impl(qubit.MeasureAndReset)
6466
def measure_and_reset(
6567
self,
@@ -83,3 +85,4 @@ def reset(self, interp: PyQrackInterpreter, frame: interp.Frame, stmt: qubit.Res
8385
qubits: ilist.IList[PyQrackQubit, Any] = frame.get(stmt.qubits)
8486
for qbit in qubits:
8587
qbit.sim_reg.force_m(qbit.addr, 0)
88+
"""

src/bloqade/pyqrack/squin/runtime.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,21 @@ def broadcast_apply(self, qubits: ilist.IList[PyQrackQubit, Any], **kwargs) -> N
4141
self.apply(*targets, **kwargs)
4242

4343

44+
@dataclass(frozen=True)
45+
class ResetRuntime(OperatorRuntimeABC):
46+
"""Reset the qubit to |0> state"""
47+
48+
@property
49+
def n_sites(self) -> int:
50+
return 1
51+
52+
def apply(self, *qubits: PyQrackQubit, adjoint: bool = False) -> None:
53+
for qubit in qubits:
54+
if not qubit.is_active():
55+
continue
56+
qubit.sim_reg.force_m(qubit.addr, 0)
57+
58+
4459
@dataclass(frozen=True)
4560
class OperatorRuntime(OperatorRuntimeABC):
4661
method_name: str

src/bloqade/squin/op/__init__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,10 @@ def u(theta: float, phi: float, lam: float) -> types.Op: ...
105105
def pauli_string(*, string: str) -> types.Op: ...
106106

107107

108+
@_wraps(stmts.Reset)
109+
def reset() -> types.Op: ...
110+
111+
108112
# stdlibs
109113
@_ir.dialect_group(_structural_no_opt.add(dialect))
110114
def op(self):

test/pyqrack/test_squin.py

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -28,25 +28,14 @@ def new():
2828
def m():
2929
q = squin.qubit.new(3)
3030
m = squin.qubit.measure(q)
31-
squin.qubit.reset(q)
31+
squin.qubit.apply(squin.op.reset(), q)
3232
return m
3333

3434
target = PyQrack(3)
3535
result = target.run(m)
3636
assert isinstance(result, ilist.IList)
3737
assert result.data == [0, 0, 0]
3838

39-
@squin.kernel
40-
def measure_and_reset():
41-
q = squin.qubit.new(3)
42-
m = squin.qubit.measure_and_reset(q)
43-
return m
44-
45-
target = PyQrack(3)
46-
result = target.run(measure_and_reset)
47-
assert isinstance(result, ilist.IList)
48-
assert result.data == [0, 0, 0]
49-
5039

5140
def test_x():
5241
@squin.kernel

0 commit comments

Comments
 (0)