Skip to content

Commit 58f7bfe

Browse files
committed
reshuffled some things, structure up for debate
1 parent 7fed307 commit 58f7bfe

File tree

7 files changed

+68
-12
lines changed

7 files changed

+68
-12
lines changed

src/bloqade/gemini/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
from .groups import logical as logical
1+
from . import logical as logical
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
from . import stmts as stmts
2+
from .groups import kernel as kernel
3+
from ._dialect import dialect as dialect
4+
from ._interface import terminal_measure as terminal_measure
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
from kirin import ir
2+
3+
dialect = ir.Dialect("gemini.logical")
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
from typing import TypeVar
2+
3+
from kirin import lowering
4+
from kirin.dialects import ilist
5+
6+
from bloqade.types import Qubit, MeasurementResult
7+
8+
from .stmts import TerminalLogicalMeasurement
9+
10+
Len = TypeVar("Len", bound=int)
11+
CodeN = TypeVar("CodeN", bound=int)
12+
13+
14+
@lowering.wraps(TerminalLogicalMeasurement)
15+
def terminal_measure(
16+
qubits: ilist.IList[Qubit, Len],
17+
) -> ilist.IList[ilist.IList[MeasurementResult, CodeN], Len]:
18+
"""Perform measurements on a list of logical qubits.
19+
20+
Measurements are returned as a nested list where each member list
21+
contains the individual measurement results for the constituent physical qubits per logical qubit.
22+
23+
Args:
24+
qubits (IList[Qubit, Len]): The list of logical qubits to measure.
25+
26+
Returns:
27+
IList[IList[MeasurementResult, CodeN], Len]: A nested list containing the measurement results,
28+
where each inner list corresponds to the measurements of the physical qubits that make up each logical qubit.
29+
"""
30+
...
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,11 @@
1111
from bloqade.validation import KernelValidation
1212
from bloqade.rewrite.passes import AggressiveUnroll
1313

14-
from .analysis import GeminiLogicalValidationAnalysis
14+
from ..analysis import GeminiLogicalValidationAnalysis
1515

1616

1717
@ir.dialect_group(structural_no_opt.union([gate, py.constant, qubit, func, ilist]))
18-
def logical(self):
18+
def kernel(self):
1919
"""Compile a function to a Gemini logical kernel."""
2020

2121
def run_pass(
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
from kirin import ir, types, lowering
2+
from kirin.decl import info, statement
3+
from kirin.dialects import ilist
4+
5+
from bloqade.types import QubitType, MeasurementResultType
6+
7+
from ._dialect import dialect
8+
9+
Len = types.TypeVar("Len", bound=types.Int)
10+
CodeN = types.TypeVar("CodeN", bound=types.Int)
11+
12+
13+
@statement(dialect=dialect)
14+
class TerminalLogicalMeasurement(ir.Statement):
15+
traits = frozenset({lowering.FromPythonCall()})
16+
qubits: ir.SSAValue = info.argument(ilist.IListType[QubitType, Len])
17+
result: ir.ResultValue = info.result(
18+
ilist.IListType[ilist.IListType[MeasurementResultType, CodeN], Len]
19+
)

test/gemini/test_logical_validation.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010

1111
def test_if_stmt_invalid():
12-
@gemini.logical(verify=False)
12+
@gemini.logical.kernel(verify=False)
1313
def main():
1414
q = squin.qalloc(3)
1515

@@ -42,7 +42,7 @@ def main():
4242

4343
def test_for_loop():
4444

45-
@gemini.logical
45+
@gemini.logical.kernel
4646
def valid_loop():
4747
q = squin.qalloc(3)
4848

@@ -53,7 +53,7 @@ def valid_loop():
5353

5454
with pytest.raises(ir.ValidationError):
5555

56-
@gemini.logical
56+
@gemini.logical.kernel
5757
def invalid_loop(n: int):
5858
q = squin.qalloc(3)
5959

@@ -64,11 +64,11 @@ def invalid_loop(n: int):
6464

6565

6666
def test_func():
67-
@gemini.logical
67+
@gemini.logical.kernel
6868
def sub_kernel(q: Qubit):
6969
squin.x(q)
7070

71-
@gemini.logical
71+
@gemini.logical.kernel
7272
def main():
7373
q = squin.qalloc(3)
7474
sub_kernel(q[0])
@@ -77,14 +77,14 @@ def main():
7777

7878
with pytest.raises(ValidationErrorGroup):
7979

80-
@gemini.logical(inline=False)
80+
@gemini.logical.kernel(inline=False)
8181
def invalid():
8282
q = squin.qalloc(3)
8383
sub_kernel(q[0])
8484

8585

8686
def test_clifford_gates():
87-
@gemini.logical
87+
@gemini.logical.kernel
8888
def main():
8989
q = squin.qalloc(2)
9090
squin.u3(0.123, 0.253, 1.2, q[0])
@@ -94,7 +94,7 @@ def main():
9494

9595
with pytest.raises(ir.ValidationError):
9696

97-
@gemini.logical(no_raise=False)
97+
@gemini.logical.kernel(no_raise=False)
9898
def invalid():
9999
q = squin.qalloc(2)
100100

@@ -113,7 +113,7 @@ def test_multiple_errors():
113113
did_error = False
114114
try:
115115

116-
@gemini.logical
116+
@gemini.logical.kernel
117117
def main(n: int):
118118
q = squin.qalloc(3)
119119
m = squin.qubit.measure(q[0])

0 commit comments

Comments
 (0)