Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions src/bloqade/analysis/address/impls.py
Original file line number Diff line number Diff line change
Expand Up @@ -366,16 +366,22 @@ def for_loop(
if iter_type is None:
return interp_.eval_fallback(frame, stmt)

body_values = {}
for value in iterable:
with interp_.new_frame(stmt, has_parent_access=True) as body_frame:
loop_vars = interp_.frame_call_region(
body_frame, stmt, stmt.body, value, *loop_vars
)

for ssa, val in body_frame.entries.items():
body_values[ssa] = body_values.setdefault(ssa, val).join(val)

if loop_vars is None:
loop_vars = ()

elif isinstance(loop_vars, interp.ReturnValue):
frame.set_values(body_frame.entries.keys(), body_frame.entries.values())
return loop_vars

frame.set_values(body_values.keys(), body_values.values())
return loop_vars
29 changes: 28 additions & 1 deletion test/analysis/address/test_qubit_analysis.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import pytest
from util import collect_address_types
from kirin.analysis import const
from kirin.dialects import ilist
from kirin.dialects import scf, ilist

from bloqade import qubit, squin
from bloqade.analysis import address
Expand Down Expand Up @@ -265,3 +265,30 @@ def main():

assert ret == address.AddressReg(data=tuple(range(20)))
assert analysis.qubit_count == 20


def test_for_loop_body_values():
@squin.kernel
def main():
q = squin.qalloc(4)
for i in range(1, len(q)):
squin.cx(q[0], q[i])

address_analysis = address.AddressAnalysis(main.dialects)
frame, result = address_analysis.run(main)
main.print(analysis=frame.entries)

(for_stmt,) = tuple(
stmt for stmt in main.callable_region.walk() if isinstance(stmt, scf.For)
)

for_analysis = [
value
for stmt in for_stmt.body.walk()
for value in frame.get_values(stmt.results)
]

assert address.AddressQubit(data=0) in for_analysis
assert address.ConstResult(const.Value(0)) in for_analysis
assert address.ConstResult(const.Value(None)) in for_analysis
assert address.Unknown() in for_analysis
Loading