bloqade-circuit 0.7.8__tar.gz → 0.7.10__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of bloqade-circuit might be problematic. Click here for more details.

Files changed (423) hide show
  1. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/PKG-INFO +1 -1
  2. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/pyproject.toml +1 -1
  3. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/cirq_utils/noise/model.py +19 -13
  4. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/pyqrack/reg.py +1 -1
  5. bloqade_circuit-0.7.10/src/bloqade/qasm2/passes/fold.py +41 -0
  6. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/rewrite/passes/__init__.py +1 -0
  7. bloqade_circuit-0.7.10/src/bloqade/rewrite/passes/aggressive_unroll.py +93 -0
  8. bloqade_circuit-0.7.10/src/bloqade/rewrite/passes/canonicalize_ilist.py +32 -0
  9. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/analysis/measure_id/test_measure_id.py +14 -7
  10. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/qasm2/emit/test_qasm2_emit.py +27 -0
  11. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/uv.lock +1 -1
  12. bloqade_circuit-0.7.8/src/bloqade/qasm2/passes/fold.py +0 -100
  13. bloqade_circuit-0.7.8/src/bloqade/rewrite/passes/canonicalize_ilist.py +0 -28
  14. bloqade_circuit-0.7.8/src/bloqade/rewrite/rules/flatten_ilist.py +0 -51
  15. bloqade_circuit-0.7.8/src/bloqade/rewrite/rules/inline_getitem_ilist.py +0 -31
  16. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/.github/dependabot.yml +0 -0
  17. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/.github/workflows/ci.yml +0 -0
  18. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/.github/workflows/isort.yml +0 -0
  19. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/.github/workflows/lint.yml +0 -0
  20. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/.github/workflows/release.yml +0 -0
  21. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/.gitignore +0 -0
  22. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/.pre-commit-config.yaml +0 -0
  23. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/LICENSE +0 -0
  24. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/README.md +0 -0
  25. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/_typos.toml +0 -0
  26. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/justfile +0 -0
  27. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/analysis/__init__.py +0 -0
  28. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/analysis/address/__init__.py +0 -0
  29. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/analysis/address/analysis.py +0 -0
  30. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/analysis/address/impls.py +0 -0
  31. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/analysis/address/lattice.py +0 -0
  32. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/analysis/fidelity/__init__.py +0 -0
  33. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/analysis/fidelity/analysis.py +0 -0
  34. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/analysis/measure_id/__init__.py +0 -0
  35. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/analysis/measure_id/analysis.py +0 -0
  36. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/analysis/measure_id/impls.py +0 -0
  37. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/analysis/measure_id/lattice.py +0 -0
  38. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/cirq_utils/__init__.py +0 -0
  39. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/cirq_utils/lineprog.py +0 -0
  40. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/cirq_utils/noise/__init__.py +0 -0
  41. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/cirq_utils/noise/_two_zone_utils.py +0 -0
  42. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/cirq_utils/noise/conflict_graph.py +0 -0
  43. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/cirq_utils/noise/transform.py +0 -0
  44. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/cirq_utils/parallelize.py +0 -0
  45. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/device.py +0 -0
  46. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/native/__init__.py +0 -0
  47. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/native/_prelude.py +0 -0
  48. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/native/dialects/__init__.py +0 -0
  49. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/native/dialects/gates/__init__.py +0 -0
  50. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/native/dialects/gates/_dialect.py +0 -0
  51. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/native/dialects/gates/_interface.py +0 -0
  52. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/native/dialects/gates/stmts.py +0 -0
  53. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/native/stdlib/__init__.py +0 -0
  54. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/native/stdlib/broadcast.py +0 -0
  55. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/native/stdlib/simple.py +0 -0
  56. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/pyqrack/__init__.py +0 -0
  57. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/pyqrack/base.py +0 -0
  58. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/pyqrack/device.py +0 -0
  59. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/pyqrack/native.py +0 -0
  60. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/pyqrack/noise/__init__.py +0 -0
  61. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/pyqrack/noise/native.py +0 -0
  62. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/pyqrack/qasm2/__init__.py +0 -0
  63. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/pyqrack/qasm2/core.py +0 -0
  64. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/pyqrack/qasm2/glob.py +0 -0
  65. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/pyqrack/qasm2/parallel.py +0 -0
  66. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/pyqrack/qasm2/uop.py +0 -0
  67. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/pyqrack/squin/__init__.py +0 -0
  68. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/pyqrack/squin/noise/__init__.py +0 -0
  69. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/pyqrack/squin/noise/native.py +0 -0
  70. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/pyqrack/squin/op.py +0 -0
  71. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/pyqrack/squin/qubit.py +0 -0
  72. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/pyqrack/squin/runtime.py +0 -0
  73. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/pyqrack/squin/wire.py +0 -0
  74. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/pyqrack/target.py +0 -0
  75. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/pyqrack/task.py +0 -0
  76. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/__init__.py +0 -0
  77. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/_qasm_loading.py +0 -0
  78. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/_wrappers.py +0 -0
  79. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/dialects/__init__.py +0 -0
  80. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/dialects/core/__init__.py +0 -0
  81. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/dialects/core/_dialect.py +0 -0
  82. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/dialects/core/_emit.py +0 -0
  83. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/dialects/core/_typeinfer.py +0 -0
  84. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/dialects/core/address.py +0 -0
  85. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/dialects/core/stmts.py +0 -0
  86. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/dialects/expr/__init__.py +0 -0
  87. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/dialects/expr/_dialect.py +0 -0
  88. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/dialects/expr/_emit.py +0 -0
  89. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/dialects/expr/_from_python.py +0 -0
  90. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/dialects/expr/_interp.py +0 -0
  91. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/dialects/expr/stmts.py +0 -0
  92. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/dialects/glob.py +0 -0
  93. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/dialects/indexing.py +0 -0
  94. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/dialects/inline.py +0 -0
  95. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/dialects/noise/__init__.py +0 -0
  96. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/dialects/noise/_dialect.py +0 -0
  97. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/dialects/noise/fidelity.py +0 -0
  98. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/dialects/noise/model.py +0 -0
  99. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/dialects/noise/stmts.py +0 -0
  100. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/dialects/parallel.py +0 -0
  101. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/dialects/uop/__init__.py +0 -0
  102. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/dialects/uop/_dialect.py +0 -0
  103. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/dialects/uop/_emit.py +0 -0
  104. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/dialects/uop/schedule.py +0 -0
  105. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/dialects/uop/stmts.py +0 -0
  106. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/emit/__init__.py +0 -0
  107. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/emit/base.py +0 -0
  108. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/emit/gate.py +0 -0
  109. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/emit/impls/__init__.py +0 -0
  110. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/emit/impls/noise.py +0 -0
  111. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/emit/main.py +0 -0
  112. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/emit/target.py +0 -0
  113. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/glob.py +0 -0
  114. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/groups.py +0 -0
  115. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/noise.py +0 -0
  116. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/parallel.py +0 -0
  117. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/parse/__init__.py +0 -0
  118. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/parse/ast.py +0 -0
  119. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/parse/build.py +0 -0
  120. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/parse/lowering.py +0 -0
  121. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/parse/parser.py +0 -0
  122. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/parse/print.py +0 -0
  123. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/parse/qasm2.lark +0 -0
  124. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/parse/visitor.py +0 -0
  125. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/parse/visitor.pyi +0 -0
  126. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/passes/__init__.py +0 -0
  127. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/passes/glob.py +0 -0
  128. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/passes/lift_qubits.py +0 -0
  129. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/passes/noise.py +0 -0
  130. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/passes/parallel.py +0 -0
  131. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/passes/py2qasm.py +0 -0
  132. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/passes/qasm2py.py +0 -0
  133. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/passes/unroll_if.py +0 -0
  134. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/rewrite/__init__.py +0 -0
  135. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/rewrite/desugar.py +0 -0
  136. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/rewrite/glob.py +0 -0
  137. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/rewrite/insert_qubits.py +0 -0
  138. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/rewrite/native_gates.py +0 -0
  139. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/rewrite/noise/__init__.py +0 -0
  140. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/rewrite/noise/heuristic_noise.py +0 -0
  141. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/rewrite/noise/remove_noise.py +0 -0
  142. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/rewrite/parallel_to_glob.py +0 -0
  143. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/rewrite/parallel_to_uop.py +0 -0
  144. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/rewrite/register.py +0 -0
  145. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/rewrite/uop_to_parallel.py +0 -0
  146. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qasm2/types.py +0 -0
  147. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qbraid/__init__.py +0 -0
  148. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qbraid/lowering.py +0 -0
  149. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qbraid/schema.py +0 -0
  150. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qbraid/simulation_result.py +0 -0
  151. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/qbraid/target.py +0 -0
  152. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/rewrite/__init__.py +0 -0
  153. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/rewrite/rules/__init__.py +0 -0
  154. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/rewrite/rules/split_ifs.py +0 -0
  155. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/squin/__init__.py +0 -0
  156. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/squin/_typeinfer.py +0 -0
  157. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/squin/analysis/__init__.py +0 -0
  158. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/squin/analysis/address_impl.py +0 -0
  159. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/squin/analysis/nsites/__init__.py +0 -0
  160. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/squin/analysis/nsites/analysis.py +0 -0
  161. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/squin/analysis/nsites/impls.py +0 -0
  162. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/squin/analysis/nsites/lattice.py +0 -0
  163. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/squin/analysis/schedule.py +0 -0
  164. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/squin/cirq/__init__.py +0 -0
  165. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/squin/cirq/emit/emit_circuit.py +0 -0
  166. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/squin/cirq/emit/noise.py +0 -0
  167. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/squin/cirq/emit/op.py +0 -0
  168. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/squin/cirq/emit/qubit.py +0 -0
  169. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/squin/cirq/emit/runtime.py +0 -0
  170. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/squin/cirq/lowering.py +0 -0
  171. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/squin/groups.py +0 -0
  172. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/squin/lowering.py +0 -0
  173. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/squin/noise/__init__.py +0 -0
  174. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/squin/noise/_dialect.py +0 -0
  175. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/squin/noise/_wrapper.py +0 -0
  176. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/squin/noise/rewrite.py +0 -0
  177. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/squin/noise/stmts.py +0 -0
  178. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/squin/op/__init__.py +0 -0
  179. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/squin/op/_dialect.py +0 -0
  180. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/squin/op/_wrapper.py +0 -0
  181. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/squin/op/number.py +0 -0
  182. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/squin/op/rewrite.py +0 -0
  183. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/squin/op/stdlib.py +0 -0
  184. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/squin/op/stmts.py +0 -0
  185. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/squin/op/traits.py +0 -0
  186. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/squin/op/types.py +0 -0
  187. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/squin/parallel.py +0 -0
  188. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/squin/qubit.py +0 -0
  189. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/squin/rewrite/U3_to_clifford.py +0 -0
  190. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/squin/rewrite/__init__.py +0 -0
  191. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/squin/rewrite/canonicalize.py +0 -0
  192. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/squin/rewrite/desugar.py +0 -0
  193. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/squin/rewrite/remove_dangling_qubits.py +0 -0
  194. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/squin/rewrite/wrap_analysis.py +0 -0
  195. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/squin/stdlib/__init__.py +0 -0
  196. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/squin/stdlib/channel.py +0 -0
  197. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/squin/stdlib/gate.py +0 -0
  198. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/squin/types.py +0 -0
  199. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/squin/wire.py +0 -0
  200. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/stim/__init__.py +0 -0
  201. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/stim/_wrappers.py +0 -0
  202. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/stim/dialects/__init__.py +0 -0
  203. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/stim/dialects/auxiliary/__init__.py +0 -0
  204. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/stim/dialects/auxiliary/_dialect.py +0 -0
  205. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/stim/dialects/auxiliary/emit.py +0 -0
  206. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/stim/dialects/auxiliary/interp.py +0 -0
  207. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/stim/dialects/auxiliary/lowering.py +0 -0
  208. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/stim/dialects/auxiliary/stmts/__init__.py +0 -0
  209. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/stim/dialects/auxiliary/stmts/annotate.py +0 -0
  210. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/stim/dialects/auxiliary/stmts/const.py +0 -0
  211. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/stim/dialects/auxiliary/types.py +0 -0
  212. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/stim/dialects/collapse/__init__.py +0 -0
  213. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/stim/dialects/collapse/_dialect.py +0 -0
  214. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/stim/dialects/collapse/emit_str.py +0 -0
  215. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/stim/dialects/collapse/stmts/__init__.py +0 -0
  216. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/stim/dialects/collapse/stmts/measure.py +0 -0
  217. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/stim/dialects/collapse/stmts/pp_measure.py +0 -0
  218. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/stim/dialects/collapse/stmts/reset.py +0 -0
  219. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/stim/dialects/gate/__init__.py +0 -0
  220. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/stim/dialects/gate/_dialect.py +0 -0
  221. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/stim/dialects/gate/emit.py +0 -0
  222. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/stim/dialects/gate/stmts/__init__.py +0 -0
  223. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/stim/dialects/gate/stmts/base.py +0 -0
  224. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/stim/dialects/gate/stmts/clifford_1q.py +0 -0
  225. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/stim/dialects/gate/stmts/clifford_2q.py +0 -0
  226. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/stim/dialects/gate/stmts/control_2q.py +0 -0
  227. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/stim/dialects/gate/stmts/pp.py +0 -0
  228. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/stim/dialects/noise/__init__.py +0 -0
  229. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/stim/dialects/noise/_dialect.py +0 -0
  230. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/stim/dialects/noise/emit.py +0 -0
  231. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/stim/dialects/noise/stmts.py +0 -0
  232. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/stim/emit/__init__.py +0 -0
  233. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/stim/emit/stim_str.py +0 -0
  234. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/stim/groups.py +0 -0
  235. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/stim/parse/__init__.py +0 -0
  236. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/stim/parse/lowering.py +0 -0
  237. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/stim/passes/__init__.py +0 -0
  238. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/stim/passes/simplify_ifs.py +0 -0
  239. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/stim/passes/squin_to_stim.py +0 -0
  240. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/stim/rewrite/__init__.py +0 -0
  241. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/stim/rewrite/ifs_to_stim.py +0 -0
  242. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/stim/rewrite/py_constant_to_stim.py +0 -0
  243. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/stim/rewrite/qubit_to_stim.py +0 -0
  244. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/stim/rewrite/squin_measure.py +0 -0
  245. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/stim/rewrite/squin_noise.py +0 -0
  246. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/stim/rewrite/util.py +0 -0
  247. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/stim/rewrite/wire_identity_elimination.py +0 -0
  248. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/stim/rewrite/wire_to_stim.py +0 -0
  249. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/stim/upstream/__init__.py +0 -0
  250. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/stim/upstream/from_squin.py +0 -0
  251. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/task.py +0 -0
  252. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/test_utils.py +0 -0
  253. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/types.py +0 -0
  254. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/visual/__init__.py +0 -0
  255. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/visual/animation/__init__.py +0 -0
  256. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/visual/animation/animate.py +0 -0
  257. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/visual/animation/base.py +0 -0
  258. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/visual/animation/gate_event.py +0 -0
  259. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/visual/animation/runtime/__init__.py +0 -0
  260. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/visual/animation/runtime/aod.py +0 -0
  261. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/visual/animation/runtime/atoms.py +0 -0
  262. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/visual/animation/runtime/ppoly.py +0 -0
  263. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/visual/animation/runtime/qpustate.py +0 -0
  264. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/src/bloqade/visual/animation/runtime/utils.py +0 -0
  265. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/__init__.py +0 -0
  266. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/analysis/address/test_qubit_analysis.py +0 -0
  267. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/analysis/address/test_wire_analysis.py +0 -0
  268. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/analysis/address/util.py +0 -0
  269. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/analysis/fidelity/test_fidelity.py +0 -0
  270. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/cirq_utils/noise/test_noise_models.py +0 -0
  271. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/cirq_utils/noise/test_noisy_ghz.py +0 -0
  272. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/cirq_utils/noise/test_one_zone_correlated_noise.py +0 -0
  273. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/cirq_utils/test_lpsolvers.py +0 -0
  274. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/cirq_utils/test_parallelize.py +0 -0
  275. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/cirq_utils/test_transpile.py +0 -0
  276. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/native/__init__.py +0 -0
  277. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/native/test_stdlib.py +0 -0
  278. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/pyqrack/__init__.py +0 -0
  279. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/pyqrack/runtime/__init__.py +0 -0
  280. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/pyqrack/runtime/noise/__init__.py +0 -0
  281. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/pyqrack/runtime/noise/qasm2/test_loss.py +0 -0
  282. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/pyqrack/runtime/noise/qasm2/test_pauli.py +0 -0
  283. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/pyqrack/runtime/test_dyn_memory.py +0 -0
  284. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/pyqrack/runtime/test_qrack.py +0 -0
  285. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/pyqrack/squin/test_kernel.py +0 -0
  286. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/pyqrack/squin/test_noise.py +0 -0
  287. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/pyqrack/test_target.py +0 -0
  288. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/qasm2/__init__.py +0 -0
  289. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/qasm2/analysis/test_dag.py +0 -0
  290. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/qasm2/emit/test_extended.py +0 -0
  291. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/qasm2/emit/test_extended_noise.py +0 -0
  292. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/qasm2/emit/test_qasm2.py +0 -0
  293. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/qasm2/parse/__init__.py +0 -0
  294. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/qasm2/parse/invalid_programs/invalid_if.qasm +0 -0
  295. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/qasm2/parse/programs/README.md +0 -0
  296. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/qasm2/parse/programs/global.qasm +0 -0
  297. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/qasm2/parse/programs/iqft1.qasm +0 -0
  298. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/qasm2/parse/programs/main.qasm +0 -0
  299. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/qasm2/parse/programs/noise.qasm +0 -0
  300. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/qasm2/parse/programs/para.qasm +0 -0
  301. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/qasm2/parse/programs/process_tomo.qasm +0 -0
  302. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/qasm2/parse/programs/qelib1.inc +0 -0
  303. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/qasm2/parse/programs/qft.qasm +0 -0
  304. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/qasm2/parse/programs/qft2.qasm +0 -0
  305. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/qasm2/parse/programs/rb.qasm +0 -0
  306. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/qasm2/parse/programs/rep_code.qasm +0 -0
  307. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/qasm2/parse/programs/ripple_carry_adder.qasm +0 -0
  308. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/qasm2/parse/programs/tele.qasm +0 -0
  309. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/qasm2/parse/programs/valid_if.qasm +0 -0
  310. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/qasm2/parse/test_ast.py +0 -0
  311. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/qasm2/parse/test_roundtrip.py +0 -0
  312. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/qasm2/passes/__init__.py +0 -0
  313. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/qasm2/passes/test_global_to_parallel.py +0 -0
  314. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/qasm2/passes/test_global_to_uop.py +0 -0
  315. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/qasm2/passes/test_heuristic_noise.py +0 -0
  316. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/qasm2/passes/test_parallel_to_global.py +0 -0
  317. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/qasm2/passes/test_parallel_to_uop.py +0 -0
  318. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/qasm2/passes/test_qasm2py.py +0 -0
  319. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/qasm2/passes/test_unroll_if.py +0 -0
  320. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/qasm2/passes/test_uop_to_parallel.py +0 -0
  321. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/qasm2/test_count.py +0 -0
  322. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/qasm2/test_inline.py +0 -0
  323. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/qasm2/test_lowering.py +0 -0
  324. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/qasm2/test_native.py +0 -0
  325. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/qasm2/test_two2one.py +0 -0
  326. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/qbraid/__init__.py +0 -0
  327. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/qbraid/test_clean_circuit.py +0 -0
  328. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/qbraid/test_lowering.py +0 -0
  329. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/qbraid/test_target.py +0 -0
  330. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/sample/__init__.py +0 -0
  331. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/sample/test_noise_model.py +0 -0
  332. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/squin/analysis/test_nsites_analysis.py +0 -0
  333. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/squin/cirq/test_cirq_to_squin.py +0 -0
  334. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/squin/cirq/test_squin_noise_to_cirq.py +0 -0
  335. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/squin/cirq/test_squin_to_cirq.py +0 -0
  336. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/squin/op/test_reset.py +0 -0
  337. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/squin/rewrite/test_U3_to_clifford.py +0 -0
  338. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/squin/rewrite/test_canonicalize.py +0 -0
  339. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/squin/rewrite/test_desugar.py +0 -0
  340. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/squin/rewrite/test_mult_rewrite.py +0 -0
  341. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/squin/test_constprop.py +0 -0
  342. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/squin/test_qubit.py +0 -0
  343. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/squin/test_stdlib_shorthands.py +0 -0
  344. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/squin/test_sugar.py +0 -0
  345. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/squin/test_typeinfer.py +0 -0
  346. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/squin/wire/__init__.py +0 -0
  347. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/squin/wire/test_check.py +0 -0
  348. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/__init__.py +0 -0
  349. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/dialects/__init__.py +0 -0
  350. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/dialects/stim/__init__.py +0 -0
  351. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/dialects/stim/emit/__init__.py +0 -0
  352. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/dialects/stim/emit/base.py +0 -0
  353. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/dialects/stim/emit/test_stim_1q.py +0 -0
  354. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/dialects/stim/emit/test_stim_ctrl.py +0 -0
  355. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/dialects/stim/emit/test_stim_detector.py +0 -0
  356. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/dialects/stim/emit/test_stim_meas.py +0 -0
  357. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/dialects/stim/emit/test_stim_noise.py +0 -0
  358. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/dialects/stim/emit/test_stim_obs_inc.py +0 -0
  359. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/dialects/stim/emit/test_stim_ppmeas.py +0 -0
  360. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/dialects/stim/emit/test_stim_qubit_coords.py +0 -0
  361. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/dialects/stim/emit/test_stim_spp.py +0 -0
  362. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/dialects/stim/test_stim_circuits.py +0 -0
  363. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/dialects/stim/test_stim_const.py +0 -0
  364. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/parse/__init__.py +0 -0
  365. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/parse/base.py +0 -0
  366. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/parse/test_parse.py +0 -0
  367. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/parse/test_parse_clifford.py +0 -0
  368. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/parse/test_parse_control.py +0 -0
  369. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/parse/test_parse_custom.py +0 -0
  370. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/parse/test_parse_noise.py +0 -0
  371. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/parse/test_parse_spp.py +0 -0
  372. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/passes/__init__.py +0 -0
  373. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/passes/stim_reference_programs/noise/apply_depolarize1.stim +0 -0
  374. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/passes/stim_reference_programs/noise/apply_loss.stim +0 -0
  375. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/passes/stim_reference_programs/noise/apply_pauli_channel_1.stim +0 -0
  376. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/passes/stim_reference_programs/noise/broadcast_depolarize1.stim +0 -0
  377. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/passes/stim_reference_programs/noise/broadcast_depolarize2.stim +0 -0
  378. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/passes/stim_reference_programs/noise/broadcast_iid_bit_flip_channel.stim +0 -0
  379. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/passes/stim_reference_programs/noise/broadcast_iid_phase_flip_channel.stim +0 -0
  380. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/passes/stim_reference_programs/noise/broadcast_iid_y_flip_channel.stim +0 -0
  381. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/passes/stim_reference_programs/noise/broadcast_pauli_channel_1.stim +0 -0
  382. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/passes/stim_reference_programs/noise/broadcast_pauli_channel_1_many_qubits.stim +0 -0
  383. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/passes/stim_reference_programs/noise/broadcast_pauli_channel_1_reuse.stim +0 -0
  384. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/passes/stim_reference_programs/noise/broadcast_pauli_channel_2.stim +0 -0
  385. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/passes/stim_reference_programs/noise/broadcast_pauli_channel_2_reuse_on_4_qubits.stim +0 -0
  386. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/passes/stim_reference_programs/noise/wire_apply_pauli_channel_1.stim +0 -0
  387. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/passes/stim_reference_programs/pure_squin_rewrite.txt +0 -0
  388. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/passes/stim_reference_programs/qubit/addition_assignment_measure.stim +0 -0
  389. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/passes/stim_reference_programs/qubit/alias_with_measure_list.stim +0 -0
  390. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/passes/stim_reference_programs/qubit/complex_storage_index_order.stim +0 -0
  391. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/passes/stim_reference_programs/qubit/for_loop_nontrivial_index.stim +0 -0
  392. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/passes/stim_reference_programs/qubit/measure_desugar.stim +0 -0
  393. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/passes/stim_reference_programs/qubit/nested_for_loop.stim +0 -0
  394. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/passes/stim_reference_programs/qubit/nested_list.stim +0 -0
  395. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/passes/stim_reference_programs/qubit/non_pure_loop_iterator.stim +0 -0
  396. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/passes/stim_reference_programs/qubit/pick_if_else.stim +0 -0
  397. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/passes/stim_reference_programs/qubit/qubit.stim +0 -0
  398. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/passes/stim_reference_programs/qubit/qubit_broadcast.stim +0 -0
  399. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/passes/stim_reference_programs/qubit/qubit_loss.stim +0 -0
  400. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/passes/stim_reference_programs/qubit/qubit_reset.stim +0 -0
  401. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/passes/stim_reference_programs/qubit/record_index_order.stim +0 -0
  402. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/passes/stim_reference_programs/qubit/simple_if_rewrite.stim +0 -0
  403. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/passes/stim_reference_programs/qubit/u3_to_clifford.stim +0 -0
  404. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/passes/stim_reference_programs/wire/wire.stim +0 -0
  405. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/passes/stim_reference_programs/wire/wire_apply.stim +0 -0
  406. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/passes/stim_reference_programs/wire/wire_apply_control.stim +0 -0
  407. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/passes/stim_reference_programs/wire/wire_broadcast.stim +0 -0
  408. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/passes/stim_reference_programs/wire/wire_broadcast_control.stim +0 -0
  409. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/passes/stim_reference_programs/wire/wire_measure.stim +0 -0
  410. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/passes/stim_reference_programs/wire/wire_multiple_apply.stim +0 -0
  411. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/passes/stim_reference_programs/wire/wire_qubit_loss.stim +0 -0
  412. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/passes/stim_reference_programs/wire/wire_reset.stim +0 -0
  413. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/passes/test_squin_meas_to_stim.py +0 -0
  414. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/passes/test_squin_noise_to_stim.py +0 -0
  415. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/passes/test_squin_qubit_to_stim.py +0 -0
  416. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/passes/test_squin_wire_to_stim.py +0 -0
  417. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/test_measure_id_analysis.py +0 -0
  418. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/wrapper/__init__.py +0 -0
  419. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/stim/wrapper/test_wrapper.py +0 -0
  420. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/test_serialization.py +0 -0
  421. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/test_zone_model.py +0 -0
  422. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/visual/__init__.py +0 -0
  423. {bloqade_circuit-0.7.8 → bloqade_circuit-0.7.10}/test/visual/test_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bloqade-circuit
3
- Version: 0.7.8
3
+ Version: 0.7.10
4
4
  Summary: The software development toolkit for neutral atom arrays.
5
5
  Author-email: Roger-luo <rluo@quera.com>, kaihsin <khwu@quera.com>, weinbe58 <pweinberg@quera.com>, johnzl-777 <jlong@quera.com>
6
6
  License-File: LICENSE
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "bloqade-circuit"
3
- version = "0.7.8"
3
+ version = "0.7.10"
4
4
  description = "The software development toolkit for neutral atom arrays."
5
5
  readme = "README.md"
6
6
  authors = [
@@ -56,21 +56,29 @@ class GeminiNoiseModelABC(cirq.NoiseModel, MoveNoiseModelABC):
56
56
  """The correlated CZ error rates as a dictionary"""
57
57
 
58
58
  def __post_init__(self):
59
- if (
59
+ is_ambiguous = (
60
+ self.cz_paired_correlated_rates is not None
61
+ and self.cz_paired_error_probabilities is not None
62
+ )
63
+ if is_ambiguous:
64
+ raise ValueError(
65
+ "Received both `cz_paired_correlated_rates` and `cz_paired_error_probabilities` as input. This is ambiguous, please only set one."
66
+ )
67
+
68
+ use_default = (
60
69
  self.cz_paired_correlated_rates is None
61
70
  and self.cz_paired_error_probabilities is None
62
- ):
71
+ )
72
+ if use_default:
63
73
  # NOTE: no input, set to default value; weird setattr for frozen dataclass
64
74
  object.__setattr__(
65
75
  self,
66
76
  "cz_paired_error_probabilities",
67
77
  _default_cz_paired_correlated_rates(),
68
78
  )
69
- elif (
70
- self.cz_paired_correlated_rates is not None
71
- and self.cz_paired_correlated_rates is None
72
- ):
79
+ return
73
80
 
81
+ if self.cz_paired_correlated_rates is not None:
74
82
  if self.cz_paired_correlated_rates.shape != (4, 4):
75
83
  raise ValueError(
76
84
  "Expected a 4x4 array of probabilities for cz_paired_correlated_rates"
@@ -82,13 +90,11 @@ class GeminiNoiseModelABC(cirq.NoiseModel, MoveNoiseModelABC):
82
90
  "cz_paired_error_probabilities",
83
91
  correlated_noise_array_to_dict(self.cz_paired_correlated_rates),
84
92
  )
85
- elif (
86
- self.cz_paired_correlated_rates is not None
87
- and self.cz_paired_correlated_rates is not None
88
- ):
89
- raise ValueError(
90
- "Received both `cz_paired_correlated_rates` and `cz_paired_correlated_rates` as input. This is ambiguous, please only set one."
91
- )
93
+ return
94
+
95
+ assert (
96
+ self.cz_paired_error_probabilities is not None
97
+ ), "This error should not happen! Please report this issue."
92
98
 
93
99
  @staticmethod
94
100
  def validate_moments(moments: Iterable[cirq.Moment]):
@@ -2,8 +2,8 @@ import enum
2
2
  from typing import TYPE_CHECKING
3
3
  from dataclasses import dataclass
4
4
 
5
- from bloqade.types import MeasurementResult
6
5
  from bloqade.qasm2.types import Qubit
6
+ from bloqade.squin.types import MeasurementResult
7
7
 
8
8
  if TYPE_CHECKING:
9
9
  from pyqrack import QrackSimulator
@@ -0,0 +1,41 @@
1
+ from dataclasses import field, dataclass
2
+
3
+ from kirin import ir
4
+ from kirin.passes import Pass
5
+ from kirin.ir.method import Method
6
+ from kirin.rewrite.abc import RewriteResult
7
+
8
+ from bloqade.qasm2.dialects import expr
9
+ from bloqade.rewrite.passes import AggressiveUnroll
10
+
11
+ from .unroll_if import UnrollIfs
12
+
13
+
14
+ @dataclass
15
+ class QASM2Fold(Pass):
16
+ """Fold pass for qasm2.extended"""
17
+
18
+ inline_gate_subroutine: bool = True
19
+ unroll_ifs: bool = True
20
+ aggressive_unroll: AggressiveUnroll = field(init=False)
21
+
22
+ def __post_init__(self):
23
+ def inline_simple(node: ir.Statement):
24
+ if isinstance(node, expr.GateFunction):
25
+ return self.inline_gate_subroutine
26
+
27
+ return True
28
+
29
+ self.aggressive_unroll = AggressiveUnroll(
30
+ self.dialects, inline_simple, no_raise=self.no_raise
31
+ )
32
+
33
+ def unsafe_run(self, mt: Method) -> RewriteResult:
34
+ result = RewriteResult()
35
+
36
+ if self.unroll_ifs:
37
+ result = UnrollIfs(mt.dialects).unsafe_run(mt).join(result)
38
+
39
+ result = self.aggressive_unroll.unsafe_run(mt).join(result)
40
+
41
+ return result
@@ -1 +1,2 @@
1
+ from .aggressive_unroll import AggressiveUnroll as AggressiveUnroll
1
2
  from .canonicalize_ilist import CanonicalizeIList as CanonicalizeIList
@@ -0,0 +1,93 @@
1
+ from typing import Callable
2
+ from dataclasses import field, dataclass
3
+
4
+ from kirin import ir
5
+ from kirin.passes import Pass, HintConst, TypeInfer
6
+ from kirin.rewrite import (
7
+ Walk,
8
+ Chain,
9
+ Inline,
10
+ Fixpoint,
11
+ Call2Invoke,
12
+ ConstantFold,
13
+ CFGCompactify,
14
+ InlineGetItem,
15
+ InlineGetField,
16
+ DeadCodeElimination,
17
+ )
18
+ from kirin.dialects import scf, ilist
19
+ from kirin.ir.method import Method
20
+ from kirin.rewrite.abc import RewriteResult
21
+ from kirin.rewrite.cse import CommonSubexpressionElimination
22
+ from kirin.passes.aggressive import UnrollScf
23
+
24
+
25
+ @dataclass
26
+ class Fold(Pass):
27
+ hint_const: HintConst = field(init=False)
28
+
29
+ def __post_init__(self):
30
+ self.hint_const = HintConst(self.dialects, no_raise=self.no_raise)
31
+
32
+ def unsafe_run(self, mt: Method) -> RewriteResult:
33
+ result = RewriteResult()
34
+ result = self.hint_const.unsafe_run(mt).join(result)
35
+ rule = Chain(
36
+ ConstantFold(),
37
+ Call2Invoke(),
38
+ InlineGetField(),
39
+ InlineGetItem(),
40
+ ilist.rewrite.InlineGetItem(),
41
+ ilist.rewrite.HintLen(),
42
+ )
43
+ result = Fixpoint(Walk(rule)).rewrite(mt.code).join(result)
44
+
45
+ return result
46
+
47
+
48
+ @dataclass
49
+ class AggressiveUnroll(Pass):
50
+ """A pass to unroll structured control flow"""
51
+
52
+ additional_inline_heuristic: Callable[[ir.Statement], bool] = lambda node: True
53
+
54
+ fold: Fold = field(init=False)
55
+ typeinfer: TypeInfer = field(init=False)
56
+ scf_unroll: UnrollScf = field(init=False)
57
+
58
+ def __post_init__(self):
59
+ self.fold = Fold(self.dialects, no_raise=self.no_raise)
60
+ self.typeinfer = TypeInfer(self.dialects, no_raise=self.no_raise)
61
+ self.scf_unroll = UnrollScf(self.dialects, no_raise=self.no_raise)
62
+
63
+ def unsafe_run(self, mt: Method) -> RewriteResult:
64
+ result = RewriteResult()
65
+ result = self.scf_unroll.unsafe_run(mt).join(result)
66
+ result = (
67
+ Walk(Chain(ilist.rewrite.ConstList2IList(), ilist.rewrite.Unroll()))
68
+ .rewrite(mt.code)
69
+ .join(result)
70
+ )
71
+ result = self.typeinfer.unsafe_run(mt).join(result)
72
+ result = self.fold.unsafe_run(mt).join(result)
73
+ result = Walk(Inline(self.inline_heuristic)).rewrite(mt.code).join(result)
74
+ result = Walk(Fixpoint(CFGCompactify())).rewrite(mt.code).join(result)
75
+
76
+ rule = Chain(
77
+ CommonSubexpressionElimination(),
78
+ DeadCodeElimination(),
79
+ )
80
+ result = Fixpoint(Walk(rule)).rewrite(mt.code).join(result)
81
+
82
+ return result
83
+
84
+ def inline_heuristic(self, node: ir.Statement) -> bool:
85
+ """The heuristic to decide whether to inline a function call or not.
86
+ inside loops and if-else, only inline simple functions, i.e.
87
+ functions with a single block
88
+ """
89
+ return not isinstance(
90
+ node.parent_stmt, (scf.For, scf.IfElse)
91
+ ) and self.additional_inline_heuristic(
92
+ node
93
+ ) # always inline calls outside of loops and if-else
@@ -0,0 +1,32 @@
1
+ from dataclasses import field, dataclass
2
+
3
+ from kirin import ir, passes
4
+ from kirin.rewrite import (
5
+ Walk,
6
+ Chain,
7
+ Fixpoint,
8
+ )
9
+ from kirin.dialects.ilist import rewrite
10
+
11
+
12
+ @dataclass
13
+ class CanonicalizeIList(passes.Pass):
14
+
15
+ fold_pass: passes.Fold = field(init=False)
16
+
17
+ def __post_init__(self):
18
+ self.fold_pass = passes.Fold(self.dialects, no_raise=self.no_raise)
19
+
20
+ def unsafe_run(self, mt: ir.Method):
21
+ result = Fixpoint(
22
+ Walk(
23
+ Chain(
24
+ rewrite.InlineGetItem(),
25
+ rewrite.FlattenAdd(),
26
+ rewrite.HintLen(),
27
+ )
28
+ )
29
+ ).rewrite(mt.code)
30
+
31
+ result = self.fold_pass(mt).join(result)
32
+ return result
@@ -4,7 +4,6 @@ from kirin.dialects import scf
4
4
  from bloqade.squin import op, qubit, kernel
5
5
  from bloqade.analysis.measure_id import MeasurementIDAnalysis
6
6
  from bloqade.analysis.measure_id.lattice import (
7
- NotMeasureId,
8
7
  MeasureIdBool,
9
8
  MeasureIdTuple,
10
9
  InvalidMeasureId,
@@ -111,10 +110,15 @@ def test_scf_cond_true():
111
110
  HintConst(dialects=test.dialects).unsafe_run(test)
112
111
  frame, _ = MeasurementIDAnalysis(test.dialects).run_analysis(test)
113
112
 
114
- assert [frame.entries[result] for result in results_at(test, 0, 7)] == [
115
- NotMeasureId(),
116
- MeasureIdTuple((MeasureIdBool(idx=1),)),
113
+ # MeasureIdTuple(data=MeasureIdBool(idx=1),) should occur twice:
114
+ # First from the measurement in the true branch, then
115
+ # the result of the scf.IfElse itself
116
+ analysis_results = [
117
+ val
118
+ for val in frame.entries.values()
119
+ if val == MeasureIdTuple(data=(MeasureIdBool(idx=1),))
117
120
  ]
121
+ assert len(analysis_results) == 2
118
122
 
119
123
 
120
124
  def test_scf_cond_false():
@@ -136,10 +140,13 @@ def test_scf_cond_false():
136
140
  HintConst(dialects=test.dialects).unsafe_run(test)
137
141
  frame, _ = MeasurementIDAnalysis(test.dialects).run_analysis(test)
138
142
 
139
- assert [frame.entries[result] for result in results_at(test, 0, 7)] == [
140
- NotMeasureId(),
141
- MeasureIdBool(idx=1),
143
+ # MeasureIdBool(idx=1) should occur twice:
144
+ # First from the measurement in the false branch, then
145
+ # the result of the scf.IfElse itself
146
+ analysis_results = [
147
+ val for val in frame.entries.values() if val == MeasureIdBool(idx=1)
142
148
  ]
149
+ assert len(analysis_results) == 2
143
150
 
144
151
 
145
152
  def test_slice():
@@ -288,3 +288,30 @@ def test_if():
288
288
 
289
289
  target = qasm2.emit.QASM2()
290
290
  target.emit(nested_kernel)
291
+
292
+
293
+ def test_loop_unroll():
294
+ n_qubits = 4
295
+
296
+ @qasm2.extended
297
+ def ghz_linear():
298
+ q = qasm2.qreg(n_qubits)
299
+ qasm2.h(q[0])
300
+ for i in range(1, n_qubits):
301
+ qasm2.cx(q[i - 1], q[i])
302
+
303
+ target = qasm2.emit.QASM2(
304
+ allow_parallel=True,
305
+ )
306
+ qasm2_str = target.emit_str(ghz_linear)
307
+
308
+ assert qasm2_str == (
309
+ """KIRIN {func,lowering.call,lowering.func,py.ilist,qasm2.core,qasm2.expr,qasm2.indexing,qasm2.noise,qasm2.parallel,qasm2.uop,scf};
310
+ include "qelib1.inc";
311
+ qreg q[4];
312
+ h q[0];
313
+ CX q[0], q[1];
314
+ CX q[1], q[2];
315
+ CX q[2], q[3];
316
+ """
317
+ )
@@ -103,7 +103,7 @@ wheels = [
103
103
 
104
104
  [[package]]
105
105
  name = "bloqade-circuit"
106
- version = "0.7.8"
106
+ version = "0.7.10"
107
107
  source = { editable = "." }
108
108
  dependencies = [
109
109
  { name = "kirin-toolchain" },
@@ -1,100 +0,0 @@
1
- from dataclasses import field, dataclass
2
-
3
- from kirin import ir
4
- from kirin.passes import Pass, TypeInfer
5
- from kirin.rewrite import (
6
- Walk,
7
- Chain,
8
- Inline,
9
- Fixpoint,
10
- WrapConst,
11
- Call2Invoke,
12
- ConstantFold,
13
- CFGCompactify,
14
- InlineGetItem,
15
- InlineGetField,
16
- DeadCodeElimination,
17
- CommonSubexpressionElimination,
18
- )
19
- from kirin.analysis import const
20
- from kirin.dialects import scf, ilist
21
- from kirin.ir.method import Method
22
- from kirin.rewrite.abc import RewriteResult
23
-
24
- from bloqade.qasm2.dialects import expr
25
-
26
- from .unroll_if import UnrollIfs
27
-
28
-
29
- @dataclass
30
- class QASM2Fold(Pass):
31
- """Fold pass for qasm2.extended"""
32
-
33
- constprop: const.Propagate = field(init=False)
34
- inline_gate_subroutine: bool = True
35
- unroll_ifs: bool = True
36
-
37
- def __post_init__(self):
38
- self.constprop = const.Propagate(self.dialects)
39
- self.typeinfer = TypeInfer(self.dialects)
40
-
41
- def unsafe_run(self, mt: Method) -> RewriteResult:
42
- result = RewriteResult()
43
- frame, _ = self.constprop.run_analysis(mt)
44
- result = Walk(WrapConst(frame)).rewrite(mt.code).join(result)
45
- rule = Chain(
46
- ConstantFold(),
47
- Call2Invoke(),
48
- InlineGetField(),
49
- InlineGetItem(),
50
- DeadCodeElimination(),
51
- CommonSubexpressionElimination(),
52
- )
53
- result = Fixpoint(Walk(rule)).rewrite(mt.code).join(result)
54
-
55
- result = (
56
- Walk(
57
- Chain(
58
- scf.unroll.PickIfElse(),
59
- scf.unroll.ForLoop(),
60
- scf.trim.UnusedYield(),
61
- )
62
- )
63
- .rewrite(mt.code)
64
- .join(result)
65
- )
66
-
67
- if self.unroll_ifs:
68
- UnrollIfs(mt.dialects).unsafe_run(mt).join(result)
69
-
70
- # run typeinfer again after unroll etc. because we now insert
71
- # a lot of new nodes, which might have more precise types
72
- self.typeinfer.unsafe_run(mt)
73
- result = (
74
- Walk(Chain(ilist.rewrite.ConstList2IList(), ilist.rewrite.Unroll()))
75
- .rewrite(mt.code)
76
- .join(result)
77
- )
78
-
79
- def inline_simple(node: ir.Statement):
80
- if isinstance(node, expr.GateFunction):
81
- return self.inline_gate_subroutine
82
-
83
- if not isinstance(node.parent_stmt, (scf.For, scf.IfElse)):
84
- return True # always inline calls outside of loops and if-else
85
-
86
- # inside loops and if-else, only inline simple functions, i.e. functions with a single block
87
- if (trait := node.get_trait(ir.CallableStmtInterface)) is None:
88
- return False # not a callable, don't inline to be safe
89
- region = trait.get_callable_region(node)
90
- return len(region.blocks) == 1
91
-
92
- result = (
93
- Walk(
94
- Inline(inline_simple),
95
- )
96
- .rewrite(mt.code)
97
- .join(result)
98
- )
99
- result = Walk(Fixpoint(CFGCompactify())).rewrite(mt.code).join(result)
100
- return result
@@ -1,28 +0,0 @@
1
- from dataclasses import dataclass
2
-
3
- from kirin import ir
4
- from kirin.passes import Pass
5
- from kirin.rewrite import (
6
- Walk,
7
- Chain,
8
- Fixpoint,
9
- )
10
- from kirin.analysis import const
11
-
12
- from ..rules.flatten_ilist import FlattenAddOpIList
13
- from ..rules.inline_getitem_ilist import InlineGetItemFromIList
14
-
15
-
16
- @dataclass
17
- class CanonicalizeIList(Pass):
18
-
19
- def unsafe_run(self, mt: ir.Method):
20
-
21
- cp_result_frame, _ = const.Propagate(dialects=mt.dialects).run_analysis(mt)
22
-
23
- return Fixpoint(
24
- Chain(
25
- Walk(InlineGetItemFromIList(constprop_result=cp_result_frame.entries)),
26
- Walk(FlattenAddOpIList()),
27
- )
28
- ).rewrite(mt.code)
@@ -1,51 +0,0 @@
1
- from dataclasses import dataclass
2
-
3
- from kirin import ir
4
- from kirin.dialects import py, ilist
5
- from kirin.rewrite.abc import RewriteRule, RewriteResult
6
-
7
-
8
- @dataclass
9
- class FlattenAddOpIList(RewriteRule):
10
-
11
- def rewrite_Statement(self, node: ir.Statement) -> RewriteResult:
12
- if not isinstance(node, py.binop.Add):
13
- return RewriteResult()
14
-
15
- # check if we are adding two ilist.New objects
16
- new_data = ()
17
-
18
- # lhs:
19
- if not isinstance(node.lhs.owner, ilist.New):
20
- if not (
21
- isinstance(node.lhs.owner, py.Constant)
22
- and isinstance(
23
- const_ilist := node.lhs.owner.value.unwrap(), ilist.IList
24
- )
25
- and len(const_ilist.data) == 0
26
- ):
27
- return RewriteResult()
28
-
29
- else:
30
- new_data += node.lhs.owner.values
31
-
32
- # rhs:
33
- if not isinstance(node.rhs.owner, ilist.New):
34
- if not (
35
- isinstance(node.rhs.owner, py.Constant)
36
- and isinstance(
37
- const_ilist := node.rhs.owner.value.unwrap(), ilist.IList
38
- )
39
- and len(const_ilist.data) == 0
40
- ):
41
- return RewriteResult()
42
-
43
- else:
44
- new_data += node.rhs.owner.values
45
-
46
- new_stmt = ilist.New(values=new_data)
47
- node.replace_by(new_stmt)
48
-
49
- return RewriteResult(
50
- has_done_something=True,
51
- )
@@ -1,31 +0,0 @@
1
- from dataclasses import dataclass
2
-
3
- from kirin import ir
4
- from kirin.analysis import const
5
- from kirin.dialects import py, ilist
6
- from kirin.rewrite.abc import RewriteRule, RewriteResult
7
-
8
-
9
- @dataclass
10
- class InlineGetItemFromIList(RewriteRule):
11
- constprop_result: dict[ir.SSAValue, const.Result]
12
-
13
- def rewrite_Statement(self, node: ir.Statement) -> RewriteResult:
14
- if not isinstance(node, py.indexing.GetItem):
15
- return RewriteResult()
16
-
17
- if not isinstance(node.obj.owner, ilist.New):
18
- return RewriteResult()
19
-
20
- if not isinstance(
21
- index_value := self.constprop_result.get(node.index), const.Value
22
- ):
23
- return RewriteResult()
24
-
25
- elem_ssa = node.obj.owner.values[index_value.data]
26
-
27
- node.result.replace_by(elem_ssa)
28
-
29
- return RewriteResult(
30
- has_done_something=True,
31
- )