Skip to content

Commit ddae0ed

Browse files
authored
Merge branch 'main' into tcochran-measure_and_reset
2 parents 226005a + 65cbc8d commit ddae0ed

File tree

2 files changed

+34
-1
lines changed

2 files changed

+34
-1
lines changed

src/bloqade/analysis/address/impls.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -366,16 +366,22 @@ def for_loop(
366366
if iter_type is None:
367367
return interp_.eval_fallback(frame, stmt)
368368

369+
body_values = {}
369370
for value in iterable:
370371
with interp_.new_frame(stmt, has_parent_access=True) as body_frame:
371372
loop_vars = interp_.frame_call_region(
372373
body_frame, stmt, stmt.body, value, *loop_vars
373374
)
374375

376+
for ssa, val in body_frame.entries.items():
377+
body_values[ssa] = body_values.setdefault(ssa, val).join(val)
378+
375379
if loop_vars is None:
376380
loop_vars = ()
377381

378382
elif isinstance(loop_vars, interp.ReturnValue):
383+
frame.set_values(body_frame.entries.keys(), body_frame.entries.values())
379384
return loop_vars
380385

386+
frame.set_values(body_values.keys(), body_values.values())
381387
return loop_vars

test/analysis/address/test_qubit_analysis.py

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import pytest
22
from util import collect_address_types
33
from kirin.analysis import const
4-
from kirin.dialects import ilist
4+
from kirin.dialects import scf, ilist
55

66
from bloqade import qubit, squin
77
from bloqade.analysis import address
@@ -265,3 +265,30 @@ def main():
265265

266266
assert ret == address.AddressReg(data=tuple(range(20)))
267267
assert analysis.qubit_count == 20
268+
269+
270+
def test_for_loop_body_values():
271+
@squin.kernel
272+
def main():
273+
q = squin.qalloc(4)
274+
for i in range(1, len(q)):
275+
squin.cx(q[0], q[i])
276+
277+
address_analysis = address.AddressAnalysis(main.dialects)
278+
frame, result = address_analysis.run(main)
279+
main.print(analysis=frame.entries)
280+
281+
(for_stmt,) = tuple(
282+
stmt for stmt in main.callable_region.walk() if isinstance(stmt, scf.For)
283+
)
284+
285+
for_analysis = [
286+
value
287+
for stmt in for_stmt.body.walk()
288+
for value in frame.get_values(stmt.results)
289+
]
290+
291+
assert address.AddressQubit(data=0) in for_analysis
292+
assert address.ConstResult(const.Value(0)) in for_analysis
293+
assert address.ConstResult(const.Value(None)) in for_analysis
294+
assert address.Unknown() in for_analysis

0 commit comments

Comments
 (0)