Skip to content

Commit 6c14f4d

Browse files
committed
Add type check to Measure stmt and test
1 parent 28bc50d commit 6c14f4d

File tree

2 files changed

+26
-0
lines changed

2 files changed

+26
-0
lines changed

src/bloqade/qasm2/dialects/core/stmts.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,17 @@ class Measure(ir.Statement):
5151
carg: ir.SSAValue = info.argument(BitType | CRegType)
5252
"""carg (Bit): The bit to store the result in."""
5353

54+
def check_type(self) -> None:
55+
qarg_is_qubit = self.qarg.type.is_subseteq(QubitType)
56+
carg_is_bit = self.carg.type.is_subseteq(BitType)
57+
if (qarg_is_qubit and not carg_is_bit) or (not qarg_is_qubit and carg_is_bit):
58+
raise ir.TypeCheckError(
59+
self,
60+
"Can't perform measurement with single (qu)bit and an entire register!",
61+
help="Instead of `measure(qreg[i], creg)` or `measure(qreg, creg[i])`"
62+
"use `measure(qreg[i], creg[j])` or `measure(qreg, creg)`, respectively.",
63+
)
64+
5465

5566
@statement(dialect=dialect)
5667
class CRegEq(ir.Statement):

test/pyqrack/test_target.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
import math
22

3+
import pytest
4+
from kirin import ir
5+
36
from bloqade import qasm2
47
from bloqade.pyqrack import PyQrack, reg
58

@@ -137,3 +140,15 @@ def measure_single_qubits():
137140
result_reg = target.run(measure_register)
138141

139142
assert result_single == result_reg == [reg.Measurement.One, reg.Measurement.One]
143+
144+
@qasm2.main
145+
def measurement_that_errors():
146+
q = qasm2.qreg(1)
147+
c = qasm2.creg(1)
148+
qasm2.measure(q[0], c)
149+
150+
with pytest.raises(ir.TypeCheckError):
151+
measurement_that_errors.code.verify_type()
152+
153+
with pytest.raises(RuntimeError):
154+
target.run(measurement_that_errors)

0 commit comments

Comments
 (0)