bloqade-circuit 0.4.3__tar.gz → 0.4.4__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 (327) hide show
  1. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/.pre-commit-config.yaml +1 -1
  2. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/PKG-INFO +1 -1
  3. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/pyproject.toml +1 -1
  4. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/squin/analysis/nsites/impls.py +7 -0
  5. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/squin/op/__init__.py +3 -0
  6. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/squin/op/_wrapper.py +12 -0
  7. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/squin/op/stmts.py +19 -1
  8. bloqade_circuit-0.4.4/src/bloqade/squin/rewrite/U3_to_clifford.py +149 -0
  9. bloqade_circuit-0.4.4/src/bloqade/squin/rewrite/__init__.py +7 -0
  10. bloqade_circuit-0.4.4/src/bloqade/squin/rewrite/remove_dangling_qubits.py +19 -0
  11. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/squin/rewrite/wrap_analysis.py +34 -19
  12. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/stim/__init__.py +1 -1
  13. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/stim/dialects/auxiliary/stmts/const.py +1 -1
  14. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/stim/dialects/gate/stmts/__init__.py +6 -0
  15. bloqade_circuit-0.4.4/src/bloqade/stim/passes/__init__.py +1 -0
  16. bloqade_circuit-0.4.4/src/bloqade/stim/passes/squin_to_stim.py +86 -0
  17. {bloqade_circuit-0.4.3/src/bloqade/squin → bloqade_circuit-0.4.4/src/bloqade/stim}/rewrite/__init__.py +1 -5
  18. bloqade_circuit-0.4.4/src/bloqade/stim/rewrite/py_constant_to_stim.py +42 -0
  19. {bloqade_circuit-0.4.3/src/bloqade/squin → bloqade_circuit-0.4.4/src/bloqade/stim}/rewrite/qubit_to_stim.py +18 -3
  20. {bloqade_circuit-0.4.3/src/bloqade/squin → bloqade_circuit-0.4.4/src/bloqade/stim}/rewrite/squin_measure.py +2 -2
  21. bloqade_circuit-0.4.3/src/bloqade/squin/rewrite/stim_rewrite_util.py → bloqade_circuit-0.4.4/src/bloqade/stim/rewrite/util.py +36 -17
  22. {bloqade_circuit-0.4.3/src/bloqade/squin → bloqade_circuit-0.4.4/src/bloqade/stim}/rewrite/wire_to_stim.py +1 -1
  23. bloqade_circuit-0.4.4/test/squin/rewrite/test_U3_to_clifford.py +471 -0
  24. bloqade_circuit-0.4.4/test/stim/passes/stim_reference_programs/qubit/qubit.txt +5 -0
  25. bloqade_circuit-0.4.4/test/stim/passes/stim_reference_programs/qubit/qubit_broadcast.txt +3 -0
  26. bloqade_circuit-0.4.4/test/stim/passes/stim_reference_programs/qubit/qubit_reset.txt +3 -0
  27. bloqade_circuit-0.4.4/test/stim/passes/stim_reference_programs/wire/wire.txt +3 -0
  28. bloqade_circuit-0.4.4/test/stim/passes/stim_reference_programs/wire/wire_apply.txt +2 -0
  29. bloqade_circuit-0.4.4/test/stim/passes/stim_reference_programs/wire/wire_apply_control.txt +2 -0
  30. bloqade_circuit-0.4.4/test/stim/passes/stim_reference_programs/wire/wire_broadcast.txt +2 -0
  31. bloqade_circuit-0.4.4/test/stim/passes/stim_reference_programs/wire/wire_broadcast_control.txt +6 -0
  32. bloqade_circuit-0.4.4/test/stim/passes/stim_reference_programs/wire/wire_measure.txt +2 -0
  33. bloqade_circuit-0.4.4/test/stim/passes/stim_reference_programs/wire/wire_multiple_apply.txt +5 -0
  34. bloqade_circuit-0.4.4/test/stim/passes/stim_reference_programs/wire/wire_reset.txt +3 -0
  35. bloqade_circuit-0.4.4/test/stim/passes/test_squin_qubit_to_stim.py +96 -0
  36. bloqade_circuit-0.4.4/test/stim/passes/test_squin_wire_to_stim.py +335 -0
  37. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/uv.lock +1 -1
  38. bloqade_circuit-0.4.3/src/bloqade/squin/passes/__init__.py +0 -1
  39. bloqade_circuit-0.4.3/src/bloqade/squin/passes/stim.py +0 -68
  40. bloqade_circuit-0.4.3/test/squin/stim/test_stim.py +0 -440
  41. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/.github/dependabot.yml +0 -0
  42. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/.github/workflows/ci.yml +0 -0
  43. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/.github/workflows/isort.yml +0 -0
  44. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/.github/workflows/lint.yml +0 -0
  45. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/.github/workflows/release.yml +0 -0
  46. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/.gitignore +0 -0
  47. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/LICENSE +0 -0
  48. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/README.md +0 -0
  49. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/_typos.toml +0 -0
  50. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/justfile +0 -0
  51. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/analysis/__init__.py +0 -0
  52. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/analysis/address/__init__.py +0 -0
  53. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/analysis/address/analysis.py +0 -0
  54. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/analysis/address/impls.py +0 -0
  55. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/analysis/address/lattice.py +0 -0
  56. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/analysis/fidelity/__init__.py +0 -0
  57. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/analysis/fidelity/analysis.py +0 -0
  58. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/device.py +0 -0
  59. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/pyqrack/__init__.py +0 -0
  60. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/pyqrack/base.py +0 -0
  61. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/pyqrack/device.py +0 -0
  62. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/pyqrack/noise/__init__.py +0 -0
  63. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/pyqrack/noise/native.py +0 -0
  64. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/pyqrack/qasm2/__init__.py +0 -0
  65. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/pyqrack/qasm2/core.py +0 -0
  66. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/pyqrack/qasm2/glob.py +0 -0
  67. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/pyqrack/qasm2/parallel.py +0 -0
  68. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/pyqrack/qasm2/uop.py +0 -0
  69. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/pyqrack/reg.py +0 -0
  70. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/pyqrack/squin/__init__.py +0 -0
  71. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/pyqrack/squin/noise/__init__.py +0 -0
  72. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/pyqrack/squin/noise/native.py +0 -0
  73. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/pyqrack/squin/op.py +0 -0
  74. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/pyqrack/squin/qubit.py +0 -0
  75. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/pyqrack/squin/runtime.py +0 -0
  76. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/pyqrack/squin/wire.py +0 -0
  77. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/pyqrack/target.py +0 -0
  78. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/pyqrack/task.py +0 -0
  79. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/__init__.py +0 -0
  80. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/_qasm_loading.py +0 -0
  81. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/_wrappers.py +0 -0
  82. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/dialects/__init__.py +0 -0
  83. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/dialects/core/__init__.py +0 -0
  84. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/dialects/core/_dialect.py +0 -0
  85. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/dialects/core/_emit.py +0 -0
  86. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/dialects/core/_typeinfer.py +0 -0
  87. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/dialects/core/address.py +0 -0
  88. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/dialects/core/stmts.py +0 -0
  89. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/dialects/expr/__init__.py +0 -0
  90. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/dialects/expr/_dialect.py +0 -0
  91. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/dialects/expr/_emit.py +0 -0
  92. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/dialects/expr/_from_python.py +0 -0
  93. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/dialects/expr/_interp.py +0 -0
  94. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/dialects/expr/stmts.py +0 -0
  95. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/dialects/glob.py +0 -0
  96. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/dialects/indexing.py +0 -0
  97. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/dialects/inline.py +0 -0
  98. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/dialects/noise/__init__.py +0 -0
  99. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/dialects/noise/_dialect.py +0 -0
  100. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/dialects/noise/fidelity.py +0 -0
  101. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/dialects/noise/model.py +0 -0
  102. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/dialects/noise/stmts.py +0 -0
  103. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/dialects/parallel.py +0 -0
  104. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/dialects/uop/__init__.py +0 -0
  105. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/dialects/uop/_dialect.py +0 -0
  106. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/dialects/uop/_emit.py +0 -0
  107. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/dialects/uop/schedule.py +0 -0
  108. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/dialects/uop/stmts.py +0 -0
  109. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/emit/__init__.py +0 -0
  110. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/emit/base.py +0 -0
  111. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/emit/gate.py +0 -0
  112. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/emit/impls/__init__.py +0 -0
  113. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/emit/impls/noise.py +0 -0
  114. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/emit/main.py +0 -0
  115. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/emit/target.py +0 -0
  116. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/glob.py +0 -0
  117. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/groups.py +0 -0
  118. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/noise.py +0 -0
  119. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/parallel.py +0 -0
  120. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/parse/__init__.py +0 -0
  121. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/parse/ast.py +0 -0
  122. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/parse/build.py +0 -0
  123. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/parse/lowering.py +0 -0
  124. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/parse/parser.py +0 -0
  125. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/parse/print.py +0 -0
  126. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/parse/qasm2.lark +0 -0
  127. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/parse/visitor.py +0 -0
  128. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/parse/visitor.pyi +0 -0
  129. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/passes/__init__.py +0 -0
  130. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/passes/fold.py +0 -0
  131. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/passes/glob.py +0 -0
  132. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/passes/lift_qubits.py +0 -0
  133. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/passes/noise.py +0 -0
  134. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/passes/parallel.py +0 -0
  135. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/passes/py2qasm.py +0 -0
  136. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/passes/qasm2py.py +0 -0
  137. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/passes/unroll_if.py +0 -0
  138. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/rewrite/__init__.py +0 -0
  139. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/rewrite/desugar.py +0 -0
  140. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/rewrite/glob.py +0 -0
  141. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/rewrite/insert_qubits.py +0 -0
  142. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/rewrite/native_gates.py +0 -0
  143. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/rewrite/noise/__init__.py +0 -0
  144. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/rewrite/noise/heuristic_noise.py +0 -0
  145. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/rewrite/noise/remove_noise.py +0 -0
  146. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/rewrite/parallel_to_uop.py +0 -0
  147. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/rewrite/register.py +0 -0
  148. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/rewrite/split_ifs.py +0 -0
  149. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/rewrite/uop_to_parallel.py +0 -0
  150. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qasm2/types.py +0 -0
  151. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qbraid/__init__.py +0 -0
  152. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qbraid/lowering.py +0 -0
  153. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qbraid/schema.py +0 -0
  154. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qbraid/simulation_result.py +0 -0
  155. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/qbraid/target.py +0 -0
  156. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/squin/__init__.py +0 -0
  157. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/squin/analysis/__init__.py +0 -0
  158. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/squin/analysis/nsites/__init__.py +0 -0
  159. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/squin/analysis/nsites/analysis.py +0 -0
  160. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/squin/analysis/nsites/lattice.py +0 -0
  161. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/squin/analysis/schedule.py +0 -0
  162. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/squin/cirq/__init__.py +0 -0
  163. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/squin/cirq/emit/emit_circuit.py +0 -0
  164. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/squin/cirq/emit/op.py +0 -0
  165. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/squin/cirq/emit/qubit.py +0 -0
  166. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/squin/cirq/emit/runtime.py +0 -0
  167. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/squin/cirq/lowering.py +0 -0
  168. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/squin/groups.py +0 -0
  169. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/squin/lowering.py +0 -0
  170. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/squin/noise/__init__.py +0 -0
  171. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/squin/noise/_dialect.py +0 -0
  172. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/squin/noise/_wrapper.py +0 -0
  173. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/squin/noise/rewrite.py +0 -0
  174. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/squin/noise/stmts.py +0 -0
  175. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/squin/op/_dialect.py +0 -0
  176. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/squin/op/number.py +0 -0
  177. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/squin/op/rewrite.py +0 -0
  178. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/squin/op/stdlib.py +0 -0
  179. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/squin/op/traits.py +0 -0
  180. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/squin/op/types.py +0 -0
  181. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/squin/qubit.py +0 -0
  182. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/squin/rewrite/desugar.py +0 -0
  183. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/squin/wire.py +0 -0
  184. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/stim/_wrappers.py +0 -0
  185. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/stim/dialects/__init__.py +0 -0
  186. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/stim/dialects/auxiliary/__init__.py +0 -0
  187. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/stim/dialects/auxiliary/_dialect.py +0 -0
  188. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/stim/dialects/auxiliary/emit.py +0 -0
  189. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/stim/dialects/auxiliary/interp.py +0 -0
  190. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/stim/dialects/auxiliary/lowering.py +0 -0
  191. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/stim/dialects/auxiliary/stmts/__init__.py +0 -0
  192. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/stim/dialects/auxiliary/stmts/annotate.py +0 -0
  193. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/stim/dialects/auxiliary/types.py +0 -0
  194. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/stim/dialects/collapse/__init__.py +0 -0
  195. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/stim/dialects/collapse/_dialect.py +0 -0
  196. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/stim/dialects/collapse/emit_str.py +0 -0
  197. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/stim/dialects/collapse/stmts/__init__.py +0 -0
  198. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/stim/dialects/collapse/stmts/measure.py +0 -0
  199. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/stim/dialects/collapse/stmts/pp_measure.py +0 -0
  200. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/stim/dialects/collapse/stmts/reset.py +0 -0
  201. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/stim/dialects/gate/__init__.py +0 -0
  202. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/stim/dialects/gate/_dialect.py +0 -0
  203. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/stim/dialects/gate/emit.py +0 -0
  204. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/stim/dialects/gate/stmts/base.py +0 -0
  205. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/stim/dialects/gate/stmts/clifford_1q.py +0 -0
  206. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/stim/dialects/gate/stmts/clifford_2q.py +0 -0
  207. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/stim/dialects/gate/stmts/control_2q.py +0 -0
  208. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/stim/dialects/gate/stmts/pp.py +0 -0
  209. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/stim/dialects/noise/__init__.py +0 -0
  210. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/stim/dialects/noise/_dialect.py +0 -0
  211. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/stim/dialects/noise/emit.py +0 -0
  212. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/stim/dialects/noise/stmts.py +0 -0
  213. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/stim/emit/__init__.py +0 -0
  214. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/stim/emit/stim_str.py +0 -0
  215. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/stim/groups.py +0 -0
  216. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/stim/parse/__init__.py +0 -0
  217. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/stim/parse/lowering.py +0 -0
  218. {bloqade_circuit-0.4.3/src/bloqade/squin → bloqade_circuit-0.4.4/src/bloqade/stim}/rewrite/wire_identity_elimination.py +0 -0
  219. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/task.py +0 -0
  220. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/test_utils.py +0 -0
  221. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/types.py +0 -0
  222. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/visual/__init__.py +0 -0
  223. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/visual/animation/__init__.py +0 -0
  224. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/visual/animation/animate.py +0 -0
  225. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/visual/animation/base.py +0 -0
  226. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/visual/animation/gate_event.py +0 -0
  227. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/visual/animation/runtime/__init__.py +0 -0
  228. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/visual/animation/runtime/aod.py +0 -0
  229. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/visual/animation/runtime/atoms.py +0 -0
  230. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/visual/animation/runtime/ppoly.py +0 -0
  231. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/visual/animation/runtime/qpustate.py +0 -0
  232. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/src/bloqade/visual/animation/runtime/utils.py +0 -0
  233. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/__init__.py +0 -0
  234. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/analysis/address/test_analysis.py +0 -0
  235. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/analysis/address/test_lattice.py +0 -0
  236. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/analysis/fidelity/test_fidelity.py +0 -0
  237. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/pyqrack/__init__.py +0 -0
  238. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/pyqrack/runtime/__init__.py +0 -0
  239. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/pyqrack/runtime/noise/__init__.py +0 -0
  240. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/pyqrack/runtime/noise/qasm2/test_loss.py +0 -0
  241. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/pyqrack/runtime/noise/qasm2/test_pauli.py +0 -0
  242. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/pyqrack/runtime/test_dyn_memory.py +0 -0
  243. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/pyqrack/runtime/test_qrack.py +0 -0
  244. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/pyqrack/squin/test_kernel.py +0 -0
  245. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/pyqrack/squin/test_noise.py +0 -0
  246. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/pyqrack/test_target.py +0 -0
  247. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/qasm2/__init__.py +0 -0
  248. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/qasm2/analysis/test_dag.py +0 -0
  249. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/qasm2/emit/test_extended.py +0 -0
  250. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/qasm2/emit/test_extended_noise.py +0 -0
  251. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/qasm2/emit/test_qasm2.py +0 -0
  252. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/qasm2/emit/test_qasm2_emit.py +0 -0
  253. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/qasm2/parse/__init__.py +0 -0
  254. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/qasm2/parse/invalid_programs/invalid_if.qasm +0 -0
  255. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/qasm2/parse/programs/README.md +0 -0
  256. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/qasm2/parse/programs/global.qasm +0 -0
  257. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/qasm2/parse/programs/iqft1.qasm +0 -0
  258. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/qasm2/parse/programs/main.qasm +0 -0
  259. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/qasm2/parse/programs/noise.qasm +0 -0
  260. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/qasm2/parse/programs/para.qasm +0 -0
  261. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/qasm2/parse/programs/process_tomo.qasm +0 -0
  262. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/qasm2/parse/programs/qelib1.inc +0 -0
  263. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/qasm2/parse/programs/qft.qasm +0 -0
  264. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/qasm2/parse/programs/qft2.qasm +0 -0
  265. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/qasm2/parse/programs/rb.qasm +0 -0
  266. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/qasm2/parse/programs/rep_code.qasm +0 -0
  267. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/qasm2/parse/programs/ripple_carry_adder.qasm +0 -0
  268. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/qasm2/parse/programs/tele.qasm +0 -0
  269. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/qasm2/parse/programs/valid_if.qasm +0 -0
  270. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/qasm2/parse/test_ast.py +0 -0
  271. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/qasm2/parse/test_roundtrip.py +0 -0
  272. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/qasm2/passes/__init__.py +0 -0
  273. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/qasm2/passes/test_global_to_parallel.py +0 -0
  274. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/qasm2/passes/test_global_to_uop.py +0 -0
  275. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/qasm2/passes/test_heuristic_noise.py +0 -0
  276. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/qasm2/passes/test_parallel_to_uop.py +0 -0
  277. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/qasm2/passes/test_qasm2py.py +0 -0
  278. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/qasm2/passes/test_unroll_if.py +0 -0
  279. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/qasm2/passes/test_uop_to_parallel.py +0 -0
  280. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/qasm2/test_count.py +0 -0
  281. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/qasm2/test_inline.py +0 -0
  282. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/qasm2/test_lowering.py +0 -0
  283. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/qasm2/test_native.py +0 -0
  284. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/qasm2/test_two2one.py +0 -0
  285. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/qbraid/__init__.py +0 -0
  286. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/qbraid/test_clean_circuit.py +0 -0
  287. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/qbraid/test_lowering.py +0 -0
  288. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/qbraid/test_target.py +0 -0
  289. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/sample/__init__.py +0 -0
  290. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/sample/test_noise_model.py +0 -0
  291. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/squin/analysis/test_nsites_analysis.py +0 -0
  292. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/squin/cirq/test_cirq_to_squin.py +0 -0
  293. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/squin/cirq/test_squin_to_cirq.py +0 -0
  294. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/squin/op/test_reset.py +0 -0
  295. {bloqade_circuit-0.4.3/test/squin → bloqade_circuit-0.4.4/test/squin/rewrite}/test_mult_rewrite.py +0 -0
  296. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/squin/test_constprop.py +0 -0
  297. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/squin/test_sugar.py +0 -0
  298. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/stim/__init__.py +0 -0
  299. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/stim/dialects/__init__.py +0 -0
  300. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/stim/dialects/stim/__init__.py +0 -0
  301. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/stim/dialects/stim/emit/__init__.py +0 -0
  302. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/stim/dialects/stim/emit/base.py +0 -0
  303. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/stim/dialects/stim/emit/test_stim_1q.py +0 -0
  304. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/stim/dialects/stim/emit/test_stim_ctrl.py +0 -0
  305. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/stim/dialects/stim/emit/test_stim_detector.py +0 -0
  306. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/stim/dialects/stim/emit/test_stim_meas.py +0 -0
  307. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/stim/dialects/stim/emit/test_stim_noise.py +0 -0
  308. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/stim/dialects/stim/emit/test_stim_obs_inc.py +0 -0
  309. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/stim/dialects/stim/emit/test_stim_ppmeas.py +0 -0
  310. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/stim/dialects/stim/emit/test_stim_qubit_coords.py +0 -0
  311. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/stim/dialects/stim/emit/test_stim_spp.py +0 -0
  312. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/stim/dialects/stim/test_stim_circuits.py +0 -0
  313. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/stim/dialects/stim/test_stim_const.py +0 -0
  314. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/stim/parse/__init__.py +0 -0
  315. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/stim/parse/base.py +0 -0
  316. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/stim/parse/test_parse.py +0 -0
  317. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/stim/parse/test_parse_clifford.py +0 -0
  318. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/stim/parse/test_parse_control.py +0 -0
  319. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/stim/parse/test_parse_custom.py +0 -0
  320. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/stim/parse/test_parse_noise.py +0 -0
  321. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/stim/parse/test_parse_spp.py +0 -0
  322. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/stim/wrapper/__init__.py +0 -0
  323. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/stim/wrapper/test_wrapper.py +0 -0
  324. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/test_serialization.py +0 -0
  325. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/test_zone_model.py +0 -0
  326. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/visual/__init__.py +0 -0
  327. {bloqade_circuit-0.4.3 → bloqade_circuit-0.4.4}/test/visual/test_utils.py +0 -0
@@ -14,7 +14,7 @@ repos:
14
14
  - id: isort
15
15
  name: isort (python)
16
16
  - repo: https://github.com/psf/black
17
- rev: 24.10.0
17
+ rev: 25.1.0
18
18
  hooks:
19
19
  - id: black
20
20
  - repo: https://github.com/charliermarsh/ruff-pre-commit
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bloqade-circuit
3
- Version: 0.4.3
3
+ Version: 0.4.4
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.4.3"
3
+ version = "0.4.4"
4
4
  description = "The software development toolkit for neutral atom arrays."
5
5
  readme = "README.md"
6
6
  authors = [
@@ -1,4 +1,6 @@
1
1
  from kirin import interp
2
+ from kirin.dialects import scf
3
+ from kirin.dialects.scf.typeinfer import TypeInfer as ScfTypeInfer
2
4
 
3
5
  from bloqade.squin import op, wire
4
6
 
@@ -78,3 +80,8 @@ class SquinOp(interp.MethodTable):
78
80
  def scale(self, interp: NSitesAnalysis, frame: interp.Frame, stmt: op.stmts.Scale):
79
81
  op_sites = frame.get(stmt.op)
80
82
  return (op_sites,)
83
+
84
+
85
+ @scf.dialect.register(key="op.nsites")
86
+ class ScfSquinOp(ScfTypeInfer):
87
+ pass
@@ -30,6 +30,9 @@ from ._wrapper import (
30
30
  shift as shift,
31
31
  spin_n as spin_n,
32
32
  spin_p as spin_p,
33
+ sqrt_x as sqrt_x,
34
+ sqrt_y as sqrt_y,
35
+ sqrt_z as sqrt_z,
33
36
  adjoint as adjoint,
34
37
  control as control,
35
38
  identity as identity,
@@ -69,6 +69,18 @@ def y() -> types.Op: ...
69
69
  def z() -> types.Op: ...
70
70
 
71
71
 
72
+ @wraps(stmts.SqrtX)
73
+ def sqrt_x() -> types.Op: ...
74
+
75
+
76
+ @wraps(stmts.SqrtY)
77
+ def sqrt_y() -> types.Op: ...
78
+
79
+
80
+ @wraps(stmts.S)
81
+ def sqrt_z() -> types.Op: ...
82
+
83
+
72
84
  @wraps(stmts.H)
73
85
  def h() -> types.Op: ...
74
86
 
@@ -142,7 +142,12 @@ class Reset(PrimitiveOp):
142
142
 
143
143
 
144
144
  @statement
145
- class PauliOp(ConstantUnitary):
145
+ class CliffordOp(ConstantUnitary):
146
+ pass
147
+
148
+
149
+ @statement
150
+ class PauliOp(CliffordOp):
146
151
  pass
147
152
 
148
153
 
@@ -173,6 +178,19 @@ class Z(PauliOp):
173
178
  pass
174
179
 
175
180
 
181
+ @statement(dialect=dialect)
182
+ class SqrtX(ConstantUnitary):
183
+ pass
184
+
185
+
186
+ @statement(dialect=dialect)
187
+ class SqrtY(ConstantUnitary):
188
+ pass
189
+
190
+
191
+ # NOTE no SqrtZ since its equal to S
192
+
193
+
176
194
  @statement(dialect=dialect)
177
195
  class H(ConstantUnitary):
178
196
  pass
@@ -0,0 +1,149 @@
1
+ # create rewrite rule name SquinMeasureToStim using kirin
2
+ import math
3
+ from typing import List, Tuple, Callable
4
+
5
+ import numpy as np
6
+ from kirin import ir
7
+ from kirin.dialects import py
8
+ from kirin.rewrite.abc import RewriteRule, RewriteResult
9
+
10
+ from bloqade.squin import op, qubit
11
+
12
+
13
+ def sdag() -> list[ir.Statement]:
14
+ return [_op := op.stmts.S(), op.stmts.Adjoint(op=_op.result, is_unitary=True)]
15
+
16
+
17
+ # (theta, phi, lam)
18
+ U3_HALF_PI_ANGLE_TO_GATES: dict[
19
+ tuple[int, int, int], Callable[[], Tuple[List[ir.Statement], ...]]
20
+ ] = {
21
+ (0, 0, 0): lambda: ([op.stmts.Identity(sites=1)],),
22
+ (0, 0, 1): lambda: ([op.stmts.S()],),
23
+ (0, 0, 2): lambda: ([op.stmts.Z()],),
24
+ (0, 0, 3): lambda: (sdag(),),
25
+ (1, 0, 0): lambda: ([op.stmts.SqrtY()],),
26
+ (1, 0, 1): lambda: ([op.stmts.S()], [op.stmts.SqrtY()]),
27
+ (1, 0, 2): lambda: ([op.stmts.H()],),
28
+ (1, 0, 3): lambda: (sdag(), [op.stmts.SqrtY()]),
29
+ (1, 1, 0): lambda: ([op.stmts.SqrtY()], [op.stmts.S()]),
30
+ (1, 1, 1): lambda: ([op.stmts.S()], [op.stmts.SqrtY()], [op.stmts.S()]),
31
+ (1, 1, 2): lambda: ([op.stmts.Z()], [op.stmts.SqrtY()], [op.stmts.S()]),
32
+ (1, 1, 3): lambda: (sdag(), [op.stmts.SqrtY()], [op.stmts.S()]),
33
+ (1, 2, 0): lambda: ([op.stmts.SqrtY()], [op.stmts.Z()]),
34
+ (1, 2, 1): lambda: ([op.stmts.S()], [op.stmts.SqrtY()], [op.stmts.Z()]),
35
+ (1, 2, 2): lambda: ([op.stmts.Z()], [op.stmts.SqrtY()], [op.stmts.Z()]),
36
+ (1, 2, 3): lambda: (sdag(), [op.stmts.SqrtY()], [op.stmts.Z()]),
37
+ (1, 3, 0): lambda: ([op.stmts.SqrtY()], sdag()),
38
+ (1, 3, 1): lambda: ([op.stmts.S()], [op.stmts.SqrtY()], sdag()),
39
+ (1, 3, 2): lambda: ([op.stmts.Z()], [op.stmts.SqrtY()], sdag()),
40
+ (1, 3, 3): lambda: (sdag(), [op.stmts.SqrtY()], sdag()),
41
+ (2, 0, 0): lambda: ([op.stmts.Y()],),
42
+ (2, 0, 1): lambda: ([op.stmts.S()], [op.stmts.Y()]),
43
+ (2, 0, 2): lambda: ([op.stmts.Z()], [op.stmts.Y()]),
44
+ (2, 0, 3): lambda: (sdag(), [op.stmts.Y()]),
45
+ }
46
+
47
+
48
+ def equivalent_u3_para(
49
+ theta_half_pi: int, phi_half_pi: int, lam_half_pi: int
50
+ ) -> tuple[int, int, int]:
51
+ """
52
+ 1. Assume all three angles are in the range [0, 4].
53
+ 2. U3(theta, phi, lam) = -U3(2pi-theta, phi+pi, lam+pi).
54
+ """
55
+ return ((4 - theta_half_pi) % 4, (phi_half_pi + 2) % 4, (lam_half_pi + 2) % 4)
56
+
57
+
58
+ class SquinU3ToClifford(RewriteRule):
59
+ """
60
+ Rewrite squin U3 statements to clifford when possible.
61
+ """
62
+
63
+ def rewrite_Statement(self, node: ir.Statement) -> RewriteResult:
64
+ if isinstance(node, (qubit.Apply, qubit.Broadcast)):
65
+ return self.rewrite_ApplyOrBroadcast_onU3(node)
66
+ else:
67
+ return RewriteResult()
68
+
69
+ def get_constant(self, node: ir.SSAValue) -> float | None:
70
+ if isinstance(node.owner, py.Constant):
71
+ # node.value is a PyAttr, need to get the wrapped value out
72
+ return node.owner.value.unwrap()
73
+ else:
74
+ return None
75
+
76
+ def resolve_angle(self, angle: float) -> int | None:
77
+ """
78
+ Normalize the angle to be in the range [0, 2π).
79
+ """
80
+ # convert to 0.0~1.0, in unit of pi/2
81
+ angle_half_pi = angle / math.pi * 2.0
82
+
83
+ mod = angle_half_pi % 1.0
84
+ if not (np.isclose(mod, 0.0) or np.isclose(mod, 1.0)):
85
+ return None
86
+
87
+ else:
88
+ return round((angle / math.tau) % 1 * 4) % 4
89
+
90
+ def rewrite_ApplyOrBroadcast_onU3(
91
+ self, node: qubit.Apply | qubit.Broadcast
92
+ ) -> RewriteResult:
93
+ """
94
+ Rewrite Apply and Broadcast nodes to their clifford equivalent statements.
95
+ """
96
+ if not isinstance(node.operator.owner, op.stmts.U3):
97
+ return RewriteResult()
98
+
99
+ gates = self.decompose_U3_gates(node.operator.owner)
100
+
101
+ if len(gates) == 0:
102
+ return RewriteResult()
103
+
104
+ for stmt_list in gates:
105
+ for gate_stmt in stmt_list[:-1]:
106
+ gate_stmt.insert_before(node)
107
+
108
+ oper = stmt_list[-1]
109
+ oper.insert_before(node)
110
+ new_node = node.__class__(operator=oper.result, qubits=node.qubits)
111
+ new_node.insert_before(node)
112
+
113
+ node.delete()
114
+
115
+ # rewrite U3 to clifford gates
116
+ return RewriteResult(has_done_something=True)
117
+
118
+ def decompose_U3_gates(self, node: op.stmts.U3) -> Tuple[List[ir.Statement], ...]:
119
+ """
120
+ Rewrite U3 statements to clifford gates if possible.
121
+ """
122
+ theta = self.get_constant(node.theta)
123
+ phi = self.get_constant(node.phi)
124
+ lam = self.get_constant(node.lam)
125
+
126
+ if theta is None or phi is None or lam is None:
127
+ return ()
128
+
129
+ theta_half_pi: int | None = self.resolve_angle(theta)
130
+ phi_half_pi: int | None = self.resolve_angle(phi)
131
+ lam_half_pi: int | None = self.resolve_angle(lam)
132
+
133
+ if theta_half_pi is None or phi_half_pi is None or lam_half_pi is None:
134
+ return ()
135
+
136
+ angles_key = (theta_half_pi, phi_half_pi, lam_half_pi)
137
+ if angles_key not in U3_HALF_PI_ANGLE_TO_GATES:
138
+ angles_key = equivalent_u3_para(*angles_key)
139
+ if angles_key not in U3_HALF_PI_ANGLE_TO_GATES:
140
+ return ()
141
+
142
+ gates_stmts = U3_HALF_PI_ANGLE_TO_GATES.get(angles_key)
143
+
144
+ # no consistent gates, then:
145
+ assert (
146
+ gates_stmts is not None
147
+ ), "internal error, U3 gates not found for angles: {}".format(angles_key)
148
+
149
+ return gates_stmts()
@@ -0,0 +1,7 @@
1
+ from .wrap_analysis import (
2
+ SitesAttribute as SitesAttribute,
3
+ AddressAttribute as AddressAttribute,
4
+ WrapOpSiteAnalysis as WrapOpSiteAnalysis,
5
+ WrapAddressAnalysis as WrapAddressAnalysis,
6
+ )
7
+ from .remove_dangling_qubits import RemoveDeadRegister as RemoveDeadRegister
@@ -0,0 +1,19 @@
1
+ from kirin import ir
2
+ from kirin.rewrite.abc import RewriteRule, RewriteResult
3
+
4
+ from bloqade.squin import qubit
5
+
6
+
7
+ class RemoveDeadRegister(RewriteRule):
8
+
9
+ def rewrite_Statement(self, node: ir.Statement) -> RewriteResult:
10
+
11
+ if not isinstance(node, qubit.New):
12
+ return RewriteResult()
13
+
14
+ if bool(node.result.uses):
15
+ return RewriteResult()
16
+ else:
17
+ node.delete()
18
+
19
+ return RewriteResult(has_done_something=True)
@@ -1,3 +1,4 @@
1
+ from abc import abstractmethod
1
2
  from dataclasses import dataclass
2
3
 
3
4
  from kirin import ir
@@ -40,33 +41,47 @@ class SitesAttribute(ir.Attribute):
40
41
 
41
42
 
42
43
  @dataclass
43
- class WrapSquinAnalysis(RewriteRule):
44
+ class WrapAnalysis(RewriteRule):
44
45
 
46
+ @abstractmethod
47
+ def wrap(self, value: ir.SSAValue) -> bool:
48
+ pass
49
+
50
+ def rewrite_Block(self, node: ir.Block) -> RewriteResult:
51
+ has_done_something = any(self.wrap(arg) for arg in node.args)
52
+ return RewriteResult(has_done_something=has_done_something)
53
+
54
+ def rewrite_Statement(self, node: ir.Statement) -> RewriteResult:
55
+ has_done_something = any(self.wrap(result) for result in node.results)
56
+ return RewriteResult(has_done_something=has_done_something)
57
+
58
+
59
+ @dataclass
60
+ class WrapAddressAnalysis(WrapAnalysis):
45
61
  address_analysis: dict[ir.SSAValue, Address]
46
- op_site_analysis: dict[ir.SSAValue, Sites]
47
62
 
48
63
  def wrap(self, value: ir.SSAValue) -> bool:
49
64
  address_analysis_result = self.address_analysis[value]
50
- op_site_analysis_result = self.op_site_analysis[value]
51
65
 
52
- if value.hints.get("address") and value.hints.get("sites"):
66
+ if value.hints.get("address") is not None:
53
67
  return False
54
- else:
55
- value.hints["address"] = AddressAttribute(address_analysis_result)
56
- value.hints["sites"] = SitesAttribute(op_site_analysis_result)
68
+
69
+ value.hints["address"] = AddressAttribute(address_analysis_result)
57
70
 
58
71
  return True
59
72
 
60
- def rewrite_Block(self, node: ir.Block) -> RewriteResult:
61
- has_done_something = False
62
- for arg in node.args:
63
- if self.wrap(arg):
64
- has_done_something = True
65
- return RewriteResult(has_done_something=has_done_something)
66
73
 
67
- def rewrite_Statement(self, node: ir.Statement) -> RewriteResult:
68
- has_done_something = False
69
- for result in node.results:
70
- if self.wrap(result):
71
- has_done_something = True
72
- return RewriteResult(has_done_something=has_done_something)
74
+ @dataclass
75
+ class WrapOpSiteAnalysis(WrapAnalysis):
76
+
77
+ op_site_analysis: dict[ir.SSAValue, Sites]
78
+
79
+ def wrap(self, value: ir.SSAValue) -> bool:
80
+ op_site_analysis_result = self.op_site_analysis[value]
81
+
82
+ if value.hints.get("sites") is not None:
83
+ return False
84
+
85
+ value.hints["sites"] = SitesAttribute(op_site_analysis_result)
86
+
87
+ return True
@@ -1,4 +1,4 @@
1
- from . import emit as emit, parse as parse, dialects as dialects
1
+ from . import emit as emit, parse as parse, passes as passes, dialects as dialects
2
2
  from .groups import main as main
3
3
  from ._wrappers import (
4
4
  h as h,
@@ -47,7 +47,7 @@ class ConstFloat(ir.Statement):
47
47
 
48
48
  @statement(dialect=dialect)
49
49
  class ConstBool(ir.Statement):
50
- """IR Statement representing a constant float value."""
50
+ """IR Statement representing a constant boolean value."""
51
51
 
52
52
  name = "constant.bool"
53
53
  traits = frozenset({ir.Pure(), ir.ConstantLike(), lowering.FromPythonCall()})
@@ -1,4 +1,10 @@
1
1
  from .pp import SPP as SPP
2
+ from .base import (
3
+ Gate as Gate,
4
+ TwoQubitGate as TwoQubitGate,
5
+ SingleQubitGate as SingleQubitGate,
6
+ ControlledTwoQubitGate as ControlledTwoQubitGate,
7
+ )
2
8
  from .control_2q import CX as CX, CY as CY, CZ as CZ
3
9
  from .clifford_1q import (
4
10
  H as H,
@@ -0,0 +1 @@
1
+ from .squin_to_stim import SquinToStim as SquinToStim
@@ -0,0 +1,86 @@
1
+ from dataclasses import dataclass
2
+
3
+ from kirin.passes import Fold
4
+ from kirin.rewrite import (
5
+ Walk,
6
+ Chain,
7
+ Fixpoint,
8
+ DeadCodeElimination,
9
+ CommonSubexpressionElimination,
10
+ )
11
+ from kirin.ir.method import Method
12
+ from kirin.passes.abc import Pass
13
+ from kirin.rewrite.abc import RewriteResult
14
+
15
+ from bloqade.stim.groups import main as stim_main_group
16
+ from bloqade.stim.rewrite import (
17
+ SquinWireToStim,
18
+ PyConstantToStim,
19
+ SquinQubitToStim,
20
+ SquinMeasureToStim,
21
+ SquinWireIdentityElimination,
22
+ )
23
+ from bloqade.squin.rewrite import RemoveDeadRegister
24
+
25
+
26
+ @dataclass
27
+ class SquinToStim(Pass):
28
+
29
+ def unsafe_run(self, mt: Method) -> RewriteResult:
30
+ fold_pass = Fold(mt.dialects)
31
+ # propagate constants
32
+ rewrite_result = fold_pass(mt)
33
+
34
+ # Assume that address analysis and
35
+ # wrapping has been done before this pass!
36
+
37
+ # Wrap Rewrite + SquinToStim can happen w/ standard walk
38
+ rewrite_result = (
39
+ Walk(
40
+ Chain(
41
+ SquinQubitToStim(),
42
+ SquinWireToStim(),
43
+ SquinMeasureToStim(), # reduce duplicated logic, can split out even more rules later
44
+ SquinWireIdentityElimination(),
45
+ )
46
+ )
47
+ .rewrite(mt.code)
48
+ .join(rewrite_result)
49
+ )
50
+
51
+ # Convert all PyConsts to Stim Constants
52
+ rewrite_result = (
53
+ Walk(Chain(PyConstantToStim())).rewrite(mt.code).join(rewrite_result)
54
+ )
55
+
56
+ # remove any squin.qubit.new that's left around
57
+ ## Not considered pure so DCE won't touch it but
58
+ ## it isn't being used anymore considering everything is a
59
+ ## stim dialect statement
60
+ rewrite_result = (
61
+ Fixpoint(
62
+ Walk(
63
+ Chain(
64
+ DeadCodeElimination(),
65
+ CommonSubexpressionElimination(),
66
+ RemoveDeadRegister(),
67
+ )
68
+ )
69
+ )
70
+ .rewrite(mt.code)
71
+ .join(rewrite_result)
72
+ )
73
+
74
+ # do program verification here,
75
+ # ideally use built-in .verify() to catch any
76
+ # incompatible statements as the full rewrite process should not
77
+ # leave statements from any other dialects (other than the stim main group)
78
+ mt_verification_clone = mt.similar(stim_main_group)
79
+
80
+ # suggested by Kai, will work for now
81
+ for stmt in mt_verification_clone.code.walk():
82
+ assert (
83
+ stmt.dialect in stim_main_group
84
+ ), "Statements detected that are not part of the stim dialect, please verify the original code is valid for rewrite!"
85
+
86
+ return rewrite_result
@@ -1,11 +1,7 @@
1
1
  from .wire_to_stim import SquinWireToStim as SquinWireToStim
2
2
  from .qubit_to_stim import SquinQubitToStim as SquinQubitToStim
3
3
  from .squin_measure import SquinMeasureToStim as SquinMeasureToStim
4
- from .wrap_analysis import (
5
- SitesAttribute as SitesAttribute,
6
- AddressAttribute as AddressAttribute,
7
- WrapSquinAnalysis as WrapSquinAnalysis,
8
- )
4
+ from .py_constant_to_stim import PyConstantToStim as PyConstantToStim
9
5
  from .wire_identity_elimination import (
10
6
  SquinWireIdentityElimination as SquinWireIdentityElimination,
11
7
  )
@@ -0,0 +1,42 @@
1
+ from kirin import ir
2
+ from kirin.dialects import py
3
+ from kirin.rewrite.abc import RewriteRule, RewriteResult
4
+
5
+ from bloqade.stim.dialects import auxiliary
6
+
7
+ # py.constant.int -> stim.const.ConstInt
8
+ # py.constant.float -> stimt.const.ConstFloat
9
+ # py.constant -> stim.const.ConstBool
10
+ #
11
+
12
+
13
+ class PyConstantToStim(RewriteRule):
14
+
15
+ def rewrite_Statement(self, node: ir.Statement) -> RewriteResult:
16
+
17
+ match node:
18
+ case py.constant.Constant():
19
+ return self.rewrite_PyConstant(node)
20
+ case _:
21
+ return RewriteResult()
22
+
23
+ def rewrite_PyConstant(self, node: py.constant.Constant) -> RewriteResult:
24
+
25
+ # node.value is a PyAttr, need to get the
26
+ # wrapped value out
27
+ wrapped_value = node.value.unwrap()
28
+
29
+ if isinstance(wrapped_value, int):
30
+ stim_const = auxiliary.ConstInt(value=wrapped_value)
31
+ elif isinstance(wrapped_value, float):
32
+ stim_const = auxiliary.ConstFloat(value=wrapped_value)
33
+ elif isinstance(wrapped_value, bool):
34
+ stim_const = auxiliary.ConstBool(value=wrapped_value)
35
+ elif isinstance(wrapped_value, str):
36
+ stim_const = auxiliary.ConstStr(value=wrapped_value)
37
+ else:
38
+ return RewriteResult()
39
+
40
+ node.replace_by(stim_const)
41
+
42
+ return RewriteResult(has_done_something=True)
@@ -2,8 +2,9 @@ from kirin import ir
2
2
  from kirin.rewrite.abc import RewriteRule, RewriteResult
3
3
 
4
4
  from bloqade.squin import op, qubit
5
- from bloqade.squin.rewrite.wrap_analysis import AddressAttribute
6
- from bloqade.squin.rewrite.stim_rewrite_util import (
5
+ from bloqade.squin.rewrite import AddressAttribute
6
+ from bloqade.stim.dialects import gate
7
+ from bloqade.stim.rewrite.util import (
7
8
  SQUIN_STIM_GATE_MAPPING,
8
9
  rewrite_Control,
9
10
  insert_qubit_idx_from_address,
@@ -34,6 +35,15 @@ class SquinQubitToStim(RewriteRule):
34
35
  if isinstance(applied_op, op.stmts.Control):
35
36
  return rewrite_Control(stmt)
36
37
 
38
+ # check if its adjoint, assume its canonicalized so no nested adjoints.
39
+ is_conj = False
40
+ if isinstance(applied_op, op.stmts.Adjoint):
41
+ if not applied_op.is_unitary:
42
+ return RewriteResult()
43
+
44
+ is_conj = True
45
+ applied_op = applied_op.op.owner
46
+
37
47
  # need to handle Control through separate means
38
48
  # but we can handle X, Y, Z, H, and S here just fine
39
49
  stim_1q_op = SQUIN_STIM_GATE_MAPPING.get(type(applied_op))
@@ -41,9 +51,11 @@ class SquinQubitToStim(RewriteRule):
41
51
  return RewriteResult()
42
52
 
43
53
  address_attr = stmt.qubits.hints.get("address")
54
+
44
55
  if address_attr is None:
45
56
  return RewriteResult()
46
57
 
58
+ # sometimes you can get a whole AddressReg...
47
59
  assert isinstance(address_attr, AddressAttribute)
48
60
  qubit_idx_ssas = insert_qubit_idx_from_address(
49
61
  address=address_attr, stmt_to_insert_before=stmt
@@ -52,7 +64,10 @@ class SquinQubitToStim(RewriteRule):
52
64
  if qubit_idx_ssas is None:
53
65
  return RewriteResult()
54
66
 
55
- stim_1q_stmt = stim_1q_op(targets=tuple(qubit_idx_ssas))
67
+ if isinstance(stim_1q_op, gate.stmts.Gate):
68
+ stim_1q_stmt = stim_1q_op(targets=tuple(qubit_idx_ssas), dagger=is_conj)
69
+ else:
70
+ stim_1q_stmt = stim_1q_op(targets=tuple(qubit_idx_ssas))
56
71
  stmt.replace_by(stim_1q_stmt)
57
72
 
58
73
  return RewriteResult(has_done_something=True)
@@ -4,9 +4,9 @@ from kirin.dialects import py
4
4
  from kirin.rewrite.abc import RewriteRule, RewriteResult
5
5
 
6
6
  from bloqade.squin import wire, qubit
7
+ from bloqade.squin.rewrite import AddressAttribute
7
8
  from bloqade.stim.dialects import collapse
8
- from bloqade.squin.rewrite.wrap_analysis import AddressAttribute
9
- from bloqade.squin.rewrite.stim_rewrite_util import (
9
+ from bloqade.stim.rewrite.util import (
10
10
  is_measure_result_used,
11
11
  insert_qubit_idx_from_address,
12
12
  )