bloqade-circuit 0.2.3__tar.gz → 0.4.0__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 (314) hide show
  1. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/PKG-INFO +5 -3
  2. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/pyproject.toml +8 -3
  3. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/analysis/address/impls.py +3 -2
  4. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/pyqrack/device.py +1 -3
  5. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/pyqrack/noise/native.py +8 -8
  6. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/pyqrack/qasm2/core.py +4 -1
  7. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/pyqrack/squin/op.py +7 -0
  8. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/pyqrack/squin/qubit.py +5 -27
  9. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/pyqrack/squin/runtime.py +18 -0
  10. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/pyqrack/squin/wire.py +4 -22
  11. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/pyqrack/task.py +13 -5
  12. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qasm2/__init__.py +1 -0
  13. bloqade_circuit-0.4.0/src/bloqade/qasm2/_qasm_loading.py +151 -0
  14. bloqade_circuit-0.4.0/src/bloqade/qasm2/dialects/core/__init__.py +11 -0
  15. bloqade_circuit-0.4.0/src/bloqade/qasm2/dialects/expr/__init__.py +20 -0
  16. {bloqade_circuit-0.2.3/src/bloqade/noise/native → bloqade_circuit-0.4.0/src/bloqade/qasm2/dialects/noise}/__init__.py +1 -7
  17. bloqade_circuit-0.4.0/src/bloqade/qasm2/dialects/noise/_dialect.py +3 -0
  18. {bloqade_circuit-0.2.3/src/bloqade → bloqade_circuit-0.4.0/src/bloqade/qasm2/dialects}/noise/fidelity.py +4 -4
  19. bloqade_circuit-0.4.0/src/bloqade/qasm2/dialects/noise/model.py +278 -0
  20. {bloqade_circuit-0.2.3/src/bloqade/noise/native → bloqade_circuit-0.4.0/src/bloqade/qasm2/dialects/noise}/stmts.py +1 -1
  21. bloqade_circuit-0.4.0/src/bloqade/qasm2/dialects/uop/__init__.py +40 -0
  22. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qasm2/dialects/uop/schedule.py +1 -1
  23. bloqade_circuit-0.4.0/src/bloqade/qasm2/emit/impls/__init__.py +1 -0
  24. bloqade_circuit-0.4.0/src/bloqade/qasm2/emit/impls/noise.py +89 -0
  25. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qasm2/emit/main.py +23 -4
  26. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qasm2/emit/target.py +19 -4
  27. bloqade_circuit-0.4.0/src/bloqade/qasm2/noise.py +67 -0
  28. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qasm2/parse/__init__.py +7 -4
  29. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qasm2/parse/lowering.py +20 -130
  30. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qasm2/parse/qasm2.lark +1 -1
  31. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qasm2/passes/__init__.py +1 -0
  32. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qasm2/passes/fold.py +6 -0
  33. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qasm2/passes/glob.py +12 -8
  34. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qasm2/passes/noise.py +27 -16
  35. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qasm2/passes/parallel.py +9 -0
  36. bloqade_circuit-0.4.0/src/bloqade/qasm2/passes/unroll_if.py +25 -0
  37. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qasm2/rewrite/__init__.py +3 -0
  38. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qasm2/rewrite/desugar.py +3 -2
  39. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qasm2/rewrite/native_gates.py +67 -4
  40. {bloqade_circuit-0.2.3/src/bloqade/qasm2/rewrite → bloqade_circuit-0.4.0/src/bloqade/qasm2/rewrite/noise}/heuristic_noise.py +32 -62
  41. bloqade_circuit-0.2.3/src/bloqade/noise/native/rewrite.py → bloqade_circuit-0.4.0/src/bloqade/qasm2/rewrite/noise/remove_noise.py +2 -2
  42. bloqade_circuit-0.4.0/src/bloqade/qasm2/rewrite/split_ifs.py +66 -0
  43. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qbraid/lowering.py +8 -8
  44. bloqade_circuit-0.4.0/src/bloqade/squin/__init__.py +8 -0
  45. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/squin/analysis/nsites/__init__.py +1 -0
  46. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/squin/analysis/nsites/impls.py +16 -1
  47. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/squin/groups.py +4 -4
  48. bloqade_circuit-0.4.0/src/bloqade/squin/lowering.py +27 -0
  49. bloqade_circuit-0.4.0/src/bloqade/squin/noise/__init__.py +8 -0
  50. bloqade_circuit-0.2.3/src/bloqade/squin/noise/__init__.py → bloqade_circuit-0.4.0/src/bloqade/squin/noise/_wrapper.py +7 -9
  51. bloqade_circuit-0.4.0/src/bloqade/squin/op/__init__.py +37 -0
  52. bloqade_circuit-0.4.0/src/bloqade/squin/op/_wrapper.py +105 -0
  53. bloqade_circuit-0.4.0/src/bloqade/squin/op/stdlib.py +62 -0
  54. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/squin/op/stmts.py +10 -0
  55. bloqade_circuit-0.4.0/src/bloqade/squin/passes/__init__.py +1 -0
  56. bloqade_circuit-0.4.0/src/bloqade/squin/passes/stim.py +68 -0
  57. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/squin/qubit.py +32 -37
  58. bloqade_circuit-0.4.0/src/bloqade/squin/rewrite/__init__.py +11 -0
  59. bloqade_circuit-0.4.0/src/bloqade/squin/rewrite/desugar.py +65 -0
  60. bloqade_circuit-0.4.0/src/bloqade/squin/rewrite/qubit_to_stim.py +61 -0
  61. bloqade_circuit-0.4.0/src/bloqade/squin/rewrite/squin_measure.py +73 -0
  62. bloqade_circuit-0.4.0/src/bloqade/squin/rewrite/stim_rewrite_util.py +153 -0
  63. bloqade_circuit-0.4.0/src/bloqade/squin/rewrite/wire_identity_elimination.py +24 -0
  64. bloqade_circuit-0.4.0/src/bloqade/squin/rewrite/wire_to_stim.py +52 -0
  65. bloqade_circuit-0.4.0/src/bloqade/squin/rewrite/wrap_analysis.py +72 -0
  66. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/squin/wire.py +5 -22
  67. bloqade_circuit-0.4.0/src/bloqade/stim/__init__.py +41 -0
  68. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/stim/_wrappers.py +18 -12
  69. bloqade_circuit-0.4.0/src/bloqade/stim/dialects/__init__.py +1 -0
  70. {bloqade_circuit-0.2.3/src/bloqade/stim/dialects/aux → bloqade_circuit-0.4.0/src/bloqade/stim/dialects/auxiliary}/__init__.py +13 -1
  71. {bloqade_circuit-0.2.3/src/bloqade/stim/dialects/aux → bloqade_circuit-0.4.0/src/bloqade/stim/dialects/auxiliary}/emit.py +18 -3
  72. {bloqade_circuit-0.2.3/src/bloqade/stim/dialects/aux → bloqade_circuit-0.4.0/src/bloqade/stim/dialects/auxiliary}/stmts/__init__.py +1 -0
  73. {bloqade_circuit-0.2.3/src/bloqade/stim/dialects/aux → bloqade_circuit-0.4.0/src/bloqade/stim/dialects/auxiliary}/stmts/annotate.py +8 -0
  74. bloqade_circuit-0.4.0/src/bloqade/stim/dialects/collapse/__init__.py +14 -0
  75. bloqade_circuit-0.2.3/src/bloqade/stim/dialects/collapse/emit.py → bloqade_circuit-0.4.0/src/bloqade/stim/dialects/collapse/emit_str.py +4 -2
  76. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/stim/dialects/collapse/stmts/pp_measure.py +1 -1
  77. bloqade_circuit-0.4.0/src/bloqade/stim/dialects/gate/__init__.py +18 -0
  78. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/stim/dialects/gate/emit.py +10 -3
  79. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/stim/dialects/gate/stmts/base.py +1 -1
  80. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/stim/dialects/gate/stmts/pp.py +1 -1
  81. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/stim/dialects/noise/emit.py +33 -2
  82. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/stim/dialects/noise/stmts.py +29 -0
  83. bloqade_circuit-0.4.0/src/bloqade/stim/emit/__init__.py +1 -0
  84. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/stim/groups.py +4 -2
  85. bloqade_circuit-0.4.0/src/bloqade/stim/parse/__init__.py +1 -0
  86. bloqade_circuit-0.4.0/src/bloqade/stim/parse/lowering.py +686 -0
  87. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/analysis/address/test_analysis.py +32 -0
  88. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/analysis/fidelity/test_fidelity.py +47 -88
  89. {bloqade_circuit-0.2.3/test/pyqrack/runtime/noise/native → bloqade_circuit-0.4.0/test/pyqrack/runtime/noise/qasm2}/test_loss.py +5 -7
  90. {bloqade_circuit-0.2.3/test/pyqrack/runtime/noise/native → bloqade_circuit-0.4.0/test/pyqrack/runtime/noise/qasm2}/test_pauli.py +20 -22
  91. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/pyqrack/test_squin.py +1 -12
  92. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/pyqrack/test_target.py +28 -5
  93. bloqade_circuit-0.4.0/test/qasm2/emit/test_extended_noise.py +139 -0
  94. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/qasm2/emit/test_qasm2_emit.py +74 -7
  95. bloqade_circuit-0.4.0/test/qasm2/parse/invalid_programs/invalid_if.qasm +9 -0
  96. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/qasm2/parse/programs/main.qasm +0 -4
  97. bloqade_circuit-0.4.0/test/qasm2/parse/programs/valid_if.qasm +7 -0
  98. bloqade_circuit-0.4.0/test/qasm2/parse/test_roundtrip.py +28 -0
  99. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/qasm2/passes/test_heuristic_noise.py +36 -42
  100. bloqade_circuit-0.4.0/test/qasm2/passes/test_unroll_if.py +105 -0
  101. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/qasm2/test_inline.py +3 -4
  102. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/qasm2/test_lowering.py +8 -11
  103. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/qasm2/test_native.py +24 -0
  104. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/qbraid/test_clean_circuit.py +5 -7
  105. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/qbraid/test_lowering.py +19 -20
  106. bloqade_circuit-0.4.0/test/squin/op/test_reset.py +58 -0
  107. bloqade_circuit-0.4.0/test/squin/stim/test_stim.py +440 -0
  108. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/squin/test_constprop.py +5 -6
  109. bloqade_circuit-0.4.0/test/squin/test_sugar.py +72 -0
  110. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/stim/dialects/stim/emit/test_stim_ctrl.py +4 -3
  111. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/stim/dialects/stim/emit/test_stim_detector.py +1 -1
  112. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/stim/dialects/stim/emit/test_stim_meas.py +2 -1
  113. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/stim/dialects/stim/emit/test_stim_noise.py +1 -1
  114. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/stim/dialects/stim/emit/test_stim_obs_inc.py +4 -1
  115. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/stim/dialects/stim/emit/test_stim_ppmeas.py +3 -3
  116. bloqade_circuit-0.4.0/test/stim/dialects/stim/emit/test_stim_qubit_coords.py +15 -0
  117. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/stim/dialects/stim/emit/test_stim_spp.py +3 -3
  118. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/stim/dialects/stim/test_stim_const.py +3 -2
  119. bloqade_circuit-0.4.0/test/stim/parse/base.py +12 -0
  120. bloqade_circuit-0.4.0/test/stim/parse/test_parse.py +122 -0
  121. bloqade_circuit-0.4.0/test/stim/parse/test_parse_clifford.py +45 -0
  122. bloqade_circuit-0.4.0/test/stim/parse/test_parse_control.py +24 -0
  123. bloqade_circuit-0.4.0/test/stim/parse/test_parse_custom.py +30 -0
  124. bloqade_circuit-0.4.0/test/stim/parse/test_parse_noise.py +52 -0
  125. bloqade_circuit-0.4.0/test/stim/parse/test_parse_spp.py +21 -0
  126. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/stim/wrapper/test_wrapper.py +32 -29
  127. bloqade_circuit-0.4.0/test/test_zone_model.py +36 -0
  128. bloqade_circuit-0.4.0/test/visual/__init__.py +0 -0
  129. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/uv.lock +662 -541
  130. bloqade_circuit-0.2.3/src/bloqade/noise/__init__.py +0 -2
  131. bloqade_circuit-0.2.3/src/bloqade/noise/native/_dialect.py +0 -3
  132. bloqade_circuit-0.2.3/src/bloqade/noise/native/_wrappers.py +0 -34
  133. bloqade_circuit-0.2.3/src/bloqade/noise/native/model.py +0 -346
  134. bloqade_circuit-0.2.3/src/bloqade/qasm2/dialects/core/__init__.py +0 -3
  135. bloqade_circuit-0.2.3/src/bloqade/qasm2/dialects/expr/__init__.py +0 -3
  136. bloqade_circuit-0.2.3/src/bloqade/qasm2/dialects/noise.py +0 -16
  137. bloqade_circuit-0.2.3/src/bloqade/qasm2/dialects/uop/__init__.py +0 -4
  138. bloqade_circuit-0.2.3/src/bloqade/squin/__init__.py +0 -2
  139. bloqade_circuit-0.2.3/src/bloqade/squin/op/__init__.py +0 -162
  140. bloqade_circuit-0.2.3/src/bloqade/squin/rewrite/measure_desugar.py +0 -33
  141. bloqade_circuit-0.2.3/src/bloqade/stim/__init__.py +0 -6
  142. bloqade_circuit-0.2.3/src/bloqade/stim/dialects/__init__.py +0 -5
  143. bloqade_circuit-0.2.3/src/bloqade/stim/dialects/collapse/__init__.py +0 -3
  144. bloqade_circuit-0.2.3/src/bloqade/stim/dialects/gate/__init__.py +0 -3
  145. bloqade_circuit-0.2.3/src/bloqade/stim/emit/__init__.py +0 -1
  146. bloqade_circuit-0.2.3/test/qasm2/parse/test_roundtrip.py +0 -30
  147. bloqade_circuit-0.2.3/test/squin/test_measure_sugar.py +0 -36
  148. bloqade_circuit-0.2.3/test/test_zone_model.py +0 -66
  149. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/.github/dependabot.yml +0 -0
  150. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/.github/workflows/ci.yml +0 -0
  151. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/.github/workflows/isort.yml +0 -0
  152. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/.github/workflows/lint.yml +0 -0
  153. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/.github/workflows/release.yml +0 -0
  154. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/.gitignore +0 -0
  155. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/.pre-commit-config.yaml +0 -0
  156. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/LICENSE +0 -0
  157. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/README.md +0 -0
  158. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/_typos.toml +0 -0
  159. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/justfile +0 -0
  160. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/analysis/__init__.py +0 -0
  161. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/analysis/address/__init__.py +0 -0
  162. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/analysis/address/analysis.py +0 -0
  163. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/analysis/address/lattice.py +0 -0
  164. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/analysis/fidelity/__init__.py +0 -0
  165. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/analysis/fidelity/analysis.py +0 -0
  166. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/device.py +0 -0
  167. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/pyqrack/__init__.py +0 -0
  168. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/pyqrack/base.py +0 -0
  169. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/pyqrack/noise/__init__.py +0 -0
  170. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/pyqrack/qasm2/__init__.py +0 -0
  171. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/pyqrack/qasm2/glob.py +0 -0
  172. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/pyqrack/qasm2/parallel.py +0 -0
  173. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/pyqrack/qasm2/uop.py +0 -0
  174. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/pyqrack/reg.py +0 -0
  175. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/pyqrack/squin/__init__.py +0 -0
  176. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/pyqrack/target.py +0 -0
  177. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qasm2/_wrappers.py +0 -0
  178. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qasm2/dialects/__init__.py +0 -0
  179. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qasm2/dialects/core/_dialect.py +0 -0
  180. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qasm2/dialects/core/_emit.py +0 -0
  181. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qasm2/dialects/core/_typeinfer.py +0 -0
  182. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qasm2/dialects/core/address.py +0 -0
  183. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qasm2/dialects/core/stmts.py +0 -0
  184. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qasm2/dialects/expr/_dialect.py +0 -0
  185. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qasm2/dialects/expr/_emit.py +0 -0
  186. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qasm2/dialects/expr/_from_python.py +0 -0
  187. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qasm2/dialects/expr/_interp.py +0 -0
  188. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qasm2/dialects/expr/stmts.py +0 -0
  189. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qasm2/dialects/glob.py +0 -0
  190. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qasm2/dialects/indexing.py +0 -0
  191. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qasm2/dialects/inline.py +0 -0
  192. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qasm2/dialects/parallel.py +0 -0
  193. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qasm2/dialects/uop/_dialect.py +0 -0
  194. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qasm2/dialects/uop/_emit.py +0 -0
  195. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qasm2/dialects/uop/stmts.py +0 -0
  196. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qasm2/emit/__init__.py +0 -0
  197. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qasm2/emit/base.py +0 -0
  198. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qasm2/emit/gate.py +0 -0
  199. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qasm2/glob.py +0 -0
  200. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qasm2/groups.py +0 -0
  201. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qasm2/parallel.py +0 -0
  202. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qasm2/parse/ast.py +0 -0
  203. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qasm2/parse/build.py +0 -0
  204. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qasm2/parse/parser.py +0 -0
  205. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qasm2/parse/print.py +0 -0
  206. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qasm2/parse/visitor.py +0 -0
  207. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qasm2/parse/visitor.pyi +0 -0
  208. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qasm2/passes/lift_qubits.py +0 -0
  209. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qasm2/passes/py2qasm.py +0 -0
  210. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qasm2/passes/qasm2py.py +0 -0
  211. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qasm2/rewrite/glob.py +0 -0
  212. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qasm2/rewrite/insert_qubits.py +0 -0
  213. {bloqade_circuit-0.2.3/src/bloqade/squin/analysis → bloqade_circuit-0.4.0/src/bloqade/qasm2/rewrite/noise}/__init__.py +0 -0
  214. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qasm2/rewrite/parallel_to_uop.py +0 -0
  215. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qasm2/rewrite/register.py +0 -0
  216. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qasm2/rewrite/uop_to_parallel.py +0 -0
  217. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qasm2/types.py +0 -0
  218. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qbraid/__init__.py +0 -0
  219. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qbraid/schema.py +0 -0
  220. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qbraid/simulation_result.py +0 -0
  221. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/qbraid/target.py +0 -0
  222. {bloqade_circuit-0.2.3/src/bloqade/squin/rewrite → bloqade_circuit-0.4.0/src/bloqade/squin/analysis}/__init__.py +0 -0
  223. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/squin/analysis/nsites/analysis.py +0 -0
  224. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/squin/analysis/nsites/lattice.py +0 -0
  225. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/squin/analysis/schedule.py +0 -0
  226. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/squin/noise/_dialect.py +0 -0
  227. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/squin/noise/stmts.py +0 -0
  228. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/squin/op/_dialect.py +0 -0
  229. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/squin/op/number.py +0 -0
  230. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/squin/op/rewrite.py +0 -0
  231. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/squin/op/traits.py +0 -0
  232. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/squin/op/types.py +0 -0
  233. {bloqade_circuit-0.2.3/src/bloqade/stim/dialects/aux → bloqade_circuit-0.4.0/src/bloqade/stim/dialects/auxiliary}/_dialect.py +0 -0
  234. {bloqade_circuit-0.2.3/src/bloqade/stim/dialects/aux → bloqade_circuit-0.4.0/src/bloqade/stim/dialects/auxiliary}/interp.py +0 -0
  235. {bloqade_circuit-0.2.3/src/bloqade/stim/dialects/aux → bloqade_circuit-0.4.0/src/bloqade/stim/dialects/auxiliary}/lowering.py +0 -0
  236. {bloqade_circuit-0.2.3/src/bloqade/stim/dialects/aux → bloqade_circuit-0.4.0/src/bloqade/stim/dialects/auxiliary}/stmts/const.py +0 -0
  237. {bloqade_circuit-0.2.3/src/bloqade/stim/dialects/aux → bloqade_circuit-0.4.0/src/bloqade/stim/dialects/auxiliary}/types.py +0 -0
  238. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/stim/dialects/collapse/_dialect.py +0 -0
  239. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/stim/dialects/collapse/stmts/__init__.py +0 -0
  240. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/stim/dialects/collapse/stmts/measure.py +0 -0
  241. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/stim/dialects/collapse/stmts/reset.py +0 -0
  242. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/stim/dialects/gate/_dialect.py +0 -0
  243. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/stim/dialects/gate/stmts/__init__.py +0 -0
  244. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/stim/dialects/gate/stmts/clifford_1q.py +0 -0
  245. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/stim/dialects/gate/stmts/clifford_2q.py +0 -0
  246. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/stim/dialects/gate/stmts/control_2q.py +0 -0
  247. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/stim/dialects/noise/__init__.py +0 -0
  248. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/stim/dialects/noise/_dialect.py +0 -0
  249. /bloqade_circuit-0.2.3/src/bloqade/stim/emit/stim.py → /bloqade_circuit-0.4.0/src/bloqade/stim/emit/stim_str.py +0 -0
  250. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/task.py +0 -0
  251. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/test_utils.py +0 -0
  252. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/types.py +0 -0
  253. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/visual/__init__.py +0 -0
  254. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/visual/animation/__init__.py +0 -0
  255. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/visual/animation/animate.py +0 -0
  256. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/visual/animation/base.py +0 -0
  257. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/visual/animation/gate_event.py +0 -0
  258. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/visual/animation/runtime/__init__.py +0 -0
  259. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/visual/animation/runtime/aod.py +0 -0
  260. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/visual/animation/runtime/atoms.py +0 -0
  261. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/visual/animation/runtime/ppoly.py +0 -0
  262. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/visual/animation/runtime/qpustate.py +0 -0
  263. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/src/bloqade/visual/animation/runtime/utils.py +0 -0
  264. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/__init__.py +0 -0
  265. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/analysis/address/test_lattice.py +0 -0
  266. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/pyqrack/__init__.py +0 -0
  267. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/pyqrack/runtime/__init__.py +0 -0
  268. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/pyqrack/runtime/noise/__init__.py +0 -0
  269. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/pyqrack/runtime/test_dyn_memory.py +0 -0
  270. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/pyqrack/runtime/test_qrack.py +0 -0
  271. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/qasm2/__init__.py +0 -0
  272. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/qasm2/analysis/test_dag.py +0 -0
  273. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/qasm2/emit/test_extended.py +0 -0
  274. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/qasm2/emit/test_qasm2.py +0 -0
  275. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/qasm2/parse/__init__.py +0 -0
  276. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/qasm2/parse/programs/README.md +0 -0
  277. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/qasm2/parse/programs/global.qasm +0 -0
  278. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/qasm2/parse/programs/iqft1.qasm +0 -0
  279. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/qasm2/parse/programs/noise.qasm +0 -0
  280. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/qasm2/parse/programs/para.qasm +0 -0
  281. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/qasm2/parse/programs/process_tomo.qasm +0 -0
  282. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/qasm2/parse/programs/qelib1.inc +0 -0
  283. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/qasm2/parse/programs/qft.qasm +0 -0
  284. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/qasm2/parse/programs/qft2.qasm +0 -0
  285. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/qasm2/parse/programs/rb.qasm +0 -0
  286. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/qasm2/parse/programs/rep_code.qasm +0 -0
  287. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/qasm2/parse/programs/ripple_carry_adder.qasm +0 -0
  288. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/qasm2/parse/programs/tele.qasm +0 -0
  289. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/qasm2/parse/test_ast.py +0 -0
  290. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/qasm2/passes/__init__.py +0 -0
  291. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/qasm2/passes/test_global_to_parallel.py +0 -0
  292. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/qasm2/passes/test_global_to_uop.py +0 -0
  293. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/qasm2/passes/test_parallel_to_uop.py +0 -0
  294. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/qasm2/passes/test_qasm2py.py +0 -0
  295. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/qasm2/passes/test_uop_to_parallel.py +0 -0
  296. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/qasm2/test_count.py +0 -0
  297. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/qasm2/test_two2one.py +0 -0
  298. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/qbraid/__init__.py +0 -0
  299. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/qbraid/test_target.py +0 -0
  300. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/sample/__init__.py +0 -0
  301. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/sample/test_noise_model.py +0 -0
  302. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/squin/analysis/test_nsites_analysis.py +0 -0
  303. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/squin/test_mult_rewrite.py +0 -0
  304. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/stim/__init__.py +0 -0
  305. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/stim/dialects/__init__.py +0 -0
  306. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/stim/dialects/stim/__init__.py +0 -0
  307. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/stim/dialects/stim/emit/__init__.py +0 -0
  308. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/stim/dialects/stim/emit/base.py +0 -0
  309. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/stim/dialects/stim/emit/test_stim_1q.py +0 -0
  310. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/stim/dialects/stim/test_stim_circuits.py +0 -0
  311. {bloqade_circuit-0.2.3/test/stim/wrapper → bloqade_circuit-0.4.0/test/stim/parse}/__init__.py +0 -0
  312. {bloqade_circuit-0.2.3/test/visual → bloqade_circuit-0.4.0/test/stim/wrapper}/__init__.py +0 -0
  313. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/test/test_serialization.py +0 -0
  314. {bloqade_circuit-0.2.3 → bloqade_circuit-0.4.0}/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.2.3
3
+ Version: 0.4.0
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
@@ -9,8 +9,8 @@ Requires-Dist: kirin-toolchain~=0.17.0
9
9
  Requires-Dist: numpy>=1.22.0
10
10
  Requires-Dist: pandas>=2.2.3
11
11
  Requires-Dist: pydantic<2.11.0,>=1.3.0
12
- Requires-Dist: pyqrack-cpu>=1.38.2; sys_platform != 'darwin'
13
- Requires-Dist: pyqrack>=1.38.2; sys_platform == 'darwin'
12
+ Requires-Dist: pyqrack-cpu<1.41,>=1.38.2; sys_platform != 'darwin'
13
+ Requires-Dist: pyqrack<1.41,>=1.38.2; sys_platform == 'darwin'
14
14
  Requires-Dist: rich>=13.9.4
15
15
  Requires-Dist: scipy>=1.13.1
16
16
  Provides-Extra: cirq
@@ -24,6 +24,8 @@ Provides-Extra: qasm2
24
24
  Requires-Dist: lark>=1.2.2; extra == 'qasm2'
25
25
  Provides-Extra: qbraid
26
26
  Requires-Dist: qbraid>=0.9.3; extra == 'qbraid'
27
+ Provides-Extra: stim
28
+ Requires-Dist: stim>=1.15.0; extra == 'stim'
27
29
  Provides-Extra: vis
28
30
  Requires-Dist: ffmpeg>=1.4; extra == 'vis'
29
31
  Requires-Dist: matplotlib>=3.9.2; extra == 'vis'
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "bloqade-circuit"
3
- version = "0.2.3"
3
+ version = "0.4.0"
4
4
  description = "The software development toolkit for neutral atom arrays."
5
5
  readme = "README.md"
6
6
  authors = [
@@ -17,8 +17,8 @@ dependencies = [
17
17
  "rich>=13.9.4",
18
18
  "pydantic>=1.3.0,<2.11.0",
19
19
  "pandas>=2.2.3",
20
- "pyqrack>=1.38.2 ; sys_platform == 'darwin'",
21
- "pyqrack-cpu>=1.38.2 ; sys_platform != 'darwin'",
20
+ "pyqrack>=1.38.2,<1.41; sys_platform == 'darwin'",
21
+ "pyqrack-cpu>=1.38.2,<1.41 ; sys_platform != 'darwin'",
22
22
  ]
23
23
 
24
24
  [project.optional-dependencies]
@@ -44,6 +44,9 @@ pyqrack-opencl = [
44
44
  pyqrack-cuda = [
45
45
  "pyqrack-cuda>=1.38.2",
46
46
  ]
47
+ stim = [
48
+ "stim>=1.15.0",
49
+ ]
47
50
 
48
51
  [build-system]
49
52
  requires = ["hatchling"]
@@ -79,6 +82,7 @@ dev-linux = [
79
82
  "matplotlib>=3.9.2",
80
83
  "pyqt5>=5.15.11",
81
84
  "tqdm>=4.67.1",
85
+ "stim>=1.15.0",
82
86
  ]
83
87
  dev-mac-arm = [
84
88
  "cirq-core[contrib]>=1.4.1",
@@ -89,6 +93,7 @@ dev-mac-arm = [
89
93
  "pyqt5>=5.15.11",
90
94
  "qbraid>=0.9.5",
91
95
  "tqdm>=4.67.1",
96
+ "stim>=1.15.0",
92
97
  ]
93
98
 
94
99
  [tool.isort]
@@ -75,6 +75,7 @@ class PyIndexing(interp.MethodTable):
75
75
  def getitem(self, interp: AddressAnalysis, frame: interp.Frame, stmt: py.GetItem):
76
76
  # Integer index into the thing being indexed
77
77
  idx = interp.get_const_value(int, stmt.index)
78
+
78
79
  # The object being indexed into
79
80
  obj = frame.get(stmt.obj)
80
81
  # The `data` attributes holds onto other Address types
@@ -144,13 +145,13 @@ class Scf(scf.absint.Methods):
144
145
  # NOTE: we need to actually run iteration in case there are
145
146
  # new allocations/re-assign in the loop body.
146
147
  for _ in iterable:
147
- with interp_.state.new_frame(interp_.new_frame(stmt)) as body_frame:
148
+ with interp_.new_frame(stmt) as body_frame:
148
149
  body_frame.entries.update(frame.entries)
149
150
  body_frame.set_values(
150
151
  block_args,
151
152
  (NotQubit(),) + loop_vars,
152
153
  )
153
- loop_vars = interp_.run_ssacfg_region(body_frame, stmt.body)
154
+ loop_vars = interp_.run_ssacfg_region(body_frame, stmt.body, ())
154
155
 
155
156
  if loop_vars is None:
156
157
  loop_vars = ()
@@ -64,9 +64,7 @@ class PyQrackSimulatorBase(AbstractSimulatorDevice[PyQrackSimulatorTask]):
64
64
  kwargs: dict[str, Any] | None = None,
65
65
  ) -> list[complex]:
66
66
  """Runs task and returns the state vector."""
67
- task = self.task(kernel, args, kwargs)
68
- task.run()
69
- return task.state.sim_reg.out_ket()
67
+ return self.task(kernel, args, kwargs).state_vector()
70
68
 
71
69
  @staticmethod
72
70
  def pauli_expectation(pauli: list[Pauli], qubits: list[PyQrackQubit]) -> float:
@@ -2,11 +2,11 @@ from typing import List
2
2
 
3
3
  from kirin import interp
4
4
 
5
- from bloqade.noise import native
6
5
  from bloqade.pyqrack import PyQrackInterpreter, reg
6
+ from bloqade.qasm2.dialects import noise
7
7
 
8
8
 
9
- @native.dialect.register(key="pyqrack")
9
+ @noise.dialect.register(key="pyqrack")
10
10
  class PyQrackMethods(interp.MethodTable):
11
11
  def apply_pauli_error(
12
12
  self,
@@ -27,12 +27,12 @@ class PyQrackMethods(interp.MethodTable):
27
27
 
28
28
  getattr(qarg.sim_reg, which)(qarg.addr)
29
29
 
30
- @interp.impl(native.PauliChannel)
30
+ @interp.impl(noise.PauliChannel)
31
31
  def single_qubit_error_channel(
32
32
  self,
33
33
  interp: PyQrackInterpreter,
34
34
  frame: interp.Frame,
35
- stmt: native.PauliChannel,
35
+ stmt: noise.PauliChannel,
36
36
  ):
37
37
  qargs: List[reg.PyQrackQubit] = frame.get(stmt.qargs)
38
38
 
@@ -43,12 +43,12 @@ class PyQrackMethods(interp.MethodTable):
43
43
 
44
44
  return ()
45
45
 
46
- @interp.impl(native.CZPauliChannel)
46
+ @interp.impl(noise.CZPauliChannel)
47
47
  def cz_pauli_channel(
48
48
  self,
49
49
  interp: PyQrackInterpreter,
50
50
  frame: interp.Frame,
51
- stmt: native.CZPauliChannel,
51
+ stmt: noise.CZPauliChannel,
52
52
  ):
53
53
 
54
54
  qargs: List[reg.PyQrackQubit] = frame.get(stmt.qargs)
@@ -80,12 +80,12 @@ class PyQrackMethods(interp.MethodTable):
80
80
 
81
81
  return ()
82
82
 
83
- @interp.impl(native.AtomLossChannel)
83
+ @interp.impl(noise.AtomLossChannel)
84
84
  def atom_loss_channel(
85
85
  self,
86
86
  interp: PyQrackInterpreter,
87
87
  frame: interp.Frame,
88
- stmt: native.AtomLossChannel,
88
+ stmt: noise.AtomLossChannel,
89
89
  ):
90
90
  qargs: List[reg.PyQrackQubit] = frame.get(stmt.qargs)
91
91
 
@@ -80,7 +80,10 @@ class PyQrackMethods(interp.MethodTable):
80
80
  @interp.impl(core.Reset)
81
81
  def reset(self, interp: PyQrackInterpreter, frame: interp.Frame, stmt: core.Reset):
82
82
  qarg: PyQrackQubit = frame.get(stmt.qarg)
83
- qarg.sim_reg.force_m(qarg.addr, 0)
83
+
84
+ if bool(qarg.sim_reg.m(qarg.addr)):
85
+ qarg.sim_reg.x(qarg.addr)
86
+
84
87
  return ()
85
88
 
86
89
  @interp.impl(core.CRegEq)
@@ -10,6 +10,7 @@ from .runtime import (
10
10
  RotRuntime,
11
11
  KronRuntime,
12
12
  MultRuntime,
13
+ ResetRuntime,
13
14
  ScaleRuntime,
14
15
  AdjointRuntime,
15
16
  ControlRuntime,
@@ -94,6 +95,12 @@ class PyQrackMethods(interp.MethodTable):
94
95
  global_ = isinstance(stmt, op.stmts.PhaseOp)
95
96
  return (PhaseOpRuntime(theta, global_=global_),)
96
97
 
98
+ @interp.impl(op.stmts.Reset)
99
+ def reset(
100
+ self, interp: PyQrackInterpreter, frame: interp.Frame, stmt: op.stmts.Reset
101
+ ) -> tuple[OperatorRuntimeABC]:
102
+ return (ResetRuntime(),)
103
+
97
104
  @interp.impl(op.stmts.X)
98
105
  @interp.impl(op.stmts.Y)
99
106
  @interp.impl(op.stmts.Z)
@@ -37,9 +37,11 @@ class PyQrackMethods(interp.MethodTable):
37
37
  qubits: ilist.IList[PyQrackQubit, Any] = frame.get(stmt.qubits)
38
38
  operator.broadcast_apply(qubits)
39
39
 
40
- def _measure_qubit(self, qbit: PyQrackQubit):
40
+ def _measure_qubit(self, qbit: PyQrackQubit, interp: PyQrackInterpreter):
41
41
  if qbit.is_active():
42
42
  return bool(qbit.sim_reg.m(qbit.addr))
43
+ else:
44
+ return interp.loss_m_result
43
45
 
44
46
  @interp.impl(qubit.MeasureQubitList)
45
47
  def measure_qubit_list(
@@ -49,7 +51,7 @@ class PyQrackMethods(interp.MethodTable):
49
51
  stmt: qubit.MeasureQubitList,
50
52
  ):
51
53
  qubits: ilist.IList[PyQrackQubit, Any] = frame.get(stmt.qubits)
52
- result = ilist.IList([self._measure_qubit(qbit) for qbit in qubits])
54
+ result = ilist.IList([self._measure_qubit(qbit, interp) for qbit in qubits])
53
55
  return (result,)
54
56
 
55
57
  @interp.impl(qubit.MeasureQubit)
@@ -57,29 +59,5 @@ class PyQrackMethods(interp.MethodTable):
57
59
  self, interp: PyQrackInterpreter, frame: interp.Frame, stmt: qubit.MeasureQubit
58
60
  ):
59
61
  qbit: PyQrackQubit = frame.get(stmt.qubit)
60
- result = self._measure_qubit(qbit)
62
+ result = self._measure_qubit(qbit, interp)
61
63
  return (result,)
62
-
63
- @interp.impl(qubit.MeasureAndReset)
64
- def measure_and_reset(
65
- self,
66
- interp: PyQrackInterpreter,
67
- frame: interp.Frame,
68
- stmt: qubit.MeasureAndReset,
69
- ):
70
- qubits: ilist.IList[PyQrackQubit, Any] = frame.get(stmt.qubits)
71
- result = []
72
- for qbit in qubits:
73
- if qbit.is_active():
74
- result.append(qbit.sim_reg.m(qbit.addr))
75
- else:
76
- result.append(None)
77
- qbit.sim_reg.force_m(qbit.addr, 0)
78
-
79
- return (ilist.IList(result),)
80
-
81
- @interp.impl(qubit.Reset)
82
- def reset(self, interp: PyQrackInterpreter, frame: interp.Frame, stmt: qubit.Reset):
83
- qubits: ilist.IList[PyQrackQubit, Any] = frame.get(stmt.qubits)
84
- for qbit in qubits:
85
- qbit.sim_reg.force_m(qbit.addr, 0)
@@ -41,6 +41,24 @@ class OperatorRuntimeABC:
41
41
  self.apply(*targets, **kwargs)
42
42
 
43
43
 
44
+ @dataclass(frozen=True)
45
+ class ResetRuntime(OperatorRuntimeABC):
46
+ """Reset the qubit to |0> state"""
47
+
48
+ @property
49
+ def n_sites(self) -> int:
50
+ return 1
51
+
52
+ def apply(self, *qubits: PyQrackQubit, adjoint: bool = False) -> None:
53
+ for qubit in qubits:
54
+ if not qubit.is_active():
55
+ continue
56
+
57
+ res: bool = qubit.sim_reg.m(qubit.addr)
58
+ if res:
59
+ qubit.sim_reg.x(qubit.addr)
60
+
61
+
44
62
  @dataclass(frozen=True)
45
63
  class OperatorRuntime(OperatorRuntimeABC):
46
64
  method_name: str
@@ -43,27 +43,9 @@ class PyQrackMethods(interp.MethodTable):
43
43
  ):
44
44
  w: PyQrackWire = frame.get(stmt.wire)
45
45
  qbit = w.qubit
46
- res: int = qbit.sim_reg.m(qbit.addr)
47
- return (res,)
48
46
 
49
- @interp.impl(wire.MeasureAndReset)
50
- def measure_and_reset(
51
- self,
52
- interp: PyQrackInterpreter,
53
- frame: interp.Frame,
54
- stmt: wire.MeasureAndReset,
55
- ):
56
- w: PyQrackWire = frame.get(stmt.wire)
57
- qbit = w.qubit
58
- res: int = qbit.sim_reg.m(qbit.addr)
59
- qbit.sim_reg.force_m(qbit.addr, False)
60
- new_w = PyQrackWire(qbit)
61
- return (new_w, res)
47
+ if not qbit.is_active():
48
+ return (interp.loss_m_result,)
62
49
 
63
- @interp.impl(wire.Reset)
64
- def reset(self, interp: PyQrackInterpreter, frame: interp.Frame, stmt: wire.Reset):
65
- w: PyQrackWire = frame.get(stmt.wire)
66
- qbit = w.qubit
67
- qbit.sim_reg.force_m(qbit.addr, False)
68
- new_w = PyQrackWire(qbit)
69
- return (new_w,)
50
+ res: bool = bool(qbit.sim_reg.m(qbit.addr))
51
+ return (res,)
@@ -1,4 +1,4 @@
1
- from typing import TypeVar, ParamSpec
1
+ from typing import TypeVar, ParamSpec, cast
2
2
  from dataclasses import dataclass
3
3
 
4
4
  from bloqade.task import AbstractSimulatorTask
@@ -19,12 +19,20 @@ class PyQrackSimulatorTask(AbstractSimulatorTask[Param, RetType, MemoryType]):
19
19
  pyqrack_interp: PyQrackInterpreter[MemoryType]
20
20
 
21
21
  def run(self) -> RetType:
22
- return self.pyqrack_interp.run(
23
- self.kernel,
24
- args=self.args,
25
- kwargs=self.kwargs,
22
+ return cast(
23
+ RetType,
24
+ self.pyqrack_interp.run(
25
+ self.kernel,
26
+ args=self.args,
27
+ kwargs=self.kwargs,
28
+ ),
26
29
  )
27
30
 
28
31
  @property
29
32
  def state(self) -> MemoryType:
30
33
  return self.pyqrack_interp.memory
34
+
35
+ def state_vector(self) -> list[complex]:
36
+ """Returns the state vector of the simulator."""
37
+ self.run()
38
+ return self.state.sim_reg.out_ket()
@@ -17,3 +17,4 @@ from .types import (
17
17
  )
18
18
  from .groups import gate as gate, main as main, extended as extended
19
19
  from ._wrappers import * # noqa: F403
20
+ from ._qasm_loading import loads as loads, loadfile as loadfile
@@ -0,0 +1,151 @@
1
+ import os
2
+ import logging
3
+ import pathlib
4
+ from typing import Any
5
+
6
+ from kirin import ir, lowering
7
+ from kirin.dialects import func
8
+
9
+ from . import parse
10
+ from .groups import main
11
+ from .parse.lowering import QASM2
12
+
13
+
14
+ def loads(
15
+ qasm: str,
16
+ *,
17
+ kernel_name: str = "main",
18
+ dialects: ir.DialectGroup | None = None,
19
+ returns: str | None = None,
20
+ globals: dict[str, Any] | None = None,
21
+ file: str | None = None,
22
+ lineno_offset: int = 0,
23
+ col_offset: int = 0,
24
+ compactify: bool = True,
25
+ ) -> ir.Method[[], None]:
26
+ """Loads a QASM2 string and returns the corresponding kernel object.
27
+
28
+ Args:
29
+ qasm (str): The QASM2 string to load.
30
+
31
+ Keyword Args:
32
+ kernel_name (str): The name of the kernel to load. Defaults to "main".
33
+ dialects (ir.DialectGroup | None): The dialects to use. Defaults to `qasm2.main`.
34
+ returns (str | None): The return type of the kernel. Defaults to None.
35
+ globals (dict[str, Any] | None): The global variables to use. Defaults to None.
36
+ file (str | None): The file name for error reporting. Defaults to None.
37
+ lineno_offset (int): The line number offset for error reporting. Defaults to 0.
38
+ col_offset (int): The column number offset for error reporting. Defaults to 0.
39
+ compactify (bool): Whether to compactify the output. Defaults to True.
40
+
41
+ Example:
42
+
43
+ ```python
44
+ from bloqade import qasm2
45
+ method = qasm2.loads('''
46
+ OPENQASM 2.0;
47
+ qreg q[2];
48
+ creg c[2];
49
+ h q[0];
50
+ cx q[0], q[1];
51
+ measure q[0] -> c[0];
52
+ ''')
53
+ ```
54
+ """
55
+ # TODO: add source info
56
+ stmt = parse.loads(qasm)
57
+ qasm2_lowering = QASM2(dialects or main)
58
+ frame = qasm2_lowering.get_frame(
59
+ stmt,
60
+ source=qasm,
61
+ file=file,
62
+ globals=globals,
63
+ lineno_offset=lineno_offset,
64
+ col_offset=col_offset,
65
+ compactify=compactify,
66
+ )
67
+
68
+ if returns is not None:
69
+ return_value = frame.get(returns)
70
+ if return_value is None:
71
+ raise lowering.BuildError(f"Cannot find return value {returns}")
72
+ else:
73
+ return_value = func.ConstantNone()
74
+ frame.push(return_value)
75
+
76
+ return_node = frame.push(func.Return(value_or_stmt=return_value))
77
+
78
+ body = frame.curr_region
79
+ code = func.Function(
80
+ sym_name=kernel_name,
81
+ signature=func.Signature((), return_node.value.type),
82
+ body=body,
83
+ )
84
+
85
+ return ir.Method(
86
+ mod=None,
87
+ py_func=None,
88
+ sym_name=kernel_name,
89
+ arg_names=[],
90
+ dialects=qasm2_lowering.dialects,
91
+ code=code,
92
+ )
93
+
94
+
95
+ def loadfile(
96
+ qasm_file: str | pathlib.Path,
97
+ *,
98
+ kernel_name: str = "main",
99
+ dialects: ir.DialectGroup | None = None,
100
+ returns: str | None = None,
101
+ globals: dict[str, Any] | None = None,
102
+ file: str | None = None,
103
+ lineno_offset: int = 0,
104
+ col_offset: int = 0,
105
+ compactify: bool = True,
106
+ ) -> ir.Method[[], None]:
107
+ """Loads a QASM2 file and returns the corresponding kernel object. See also `loads`.
108
+
109
+ Args:
110
+ qasm_file (str): The QASM2 file to load.
111
+
112
+ Keyword Args:
113
+ kernel_name (str): The name of the kernel to load. Defaults to "main".
114
+ dialects (ir.DialectGroup | None): The dialects to use. Defaults to `qasm2.main`.
115
+ returns (str | None): The return type of the kernel. Defaults to None.
116
+ globals (dict[str, Any] | None): The global variables to use. Defaults to None.
117
+ file (str | None): The file name for error reporting. Defaults to None.
118
+ lineno_offset (int): The line number offset for error reporting. Defaults to 0.
119
+ col_offset (int): The column number offset for error reporting. Defaults to 0.
120
+ compactify (bool): Whether to compactify the output. Defaults to True.
121
+ """
122
+ if isinstance(file, pathlib.Path):
123
+ qasm_file_: pathlib.Path = qasm_file # type: ignore
124
+ else:
125
+ qasm_file_ = pathlib.Path(*os.path.split(qasm_file))
126
+
127
+ if not qasm_file_.is_file():
128
+ raise FileNotFoundError(f"File {qasm_file_} does not exist")
129
+
130
+ if not qasm_file_.name.endswith(".qasm") or not qasm_file_.name.endswith(".qasm2"):
131
+ logging.warning(
132
+ f"File {qasm_file_} does not end with .qasm or .qasm2. "
133
+ "This may cause issues with loading the file."
134
+ )
135
+
136
+ kernel_name = file.name.replace(".qasm", "") if kernel_name is None else kernel_name
137
+
138
+ with qasm_file_.open("r") as f:
139
+ source = f.read()
140
+
141
+ return loads(
142
+ source,
143
+ kernel_name=kernel_name,
144
+ dialects=dialects,
145
+ returns=returns,
146
+ globals=globals,
147
+ file=file,
148
+ lineno_offset=lineno_offset,
149
+ col_offset=col_offset,
150
+ compactify=compactify,
151
+ )
@@ -0,0 +1,11 @@
1
+ from . import _emit as _emit, address as address, _typeinfer as _typeinfer
2
+ from .stmts import (
3
+ Reset as Reset,
4
+ CRegEq as CRegEq,
5
+ CRegGet as CRegGet,
6
+ CRegNew as CRegNew,
7
+ Measure as Measure,
8
+ QRegGet as QRegGet,
9
+ QRegNew as QRegNew,
10
+ )
11
+ from ._dialect import dialect as dialect
@@ -0,0 +1,20 @@
1
+ from . import _emit as _emit, _interp as _interp, _from_python as _from_python
2
+ from .stmts import (
3
+ Add as Add,
4
+ Cos as Cos,
5
+ Div as Div,
6
+ Exp as Exp,
7
+ Log as Log,
8
+ Mul as Mul,
9
+ Neg as Neg,
10
+ Pow as Pow,
11
+ Sin as Sin,
12
+ Sub as Sub,
13
+ Tan as Tan,
14
+ Sqrt as Sqrt,
15
+ ConstPI as ConstPI,
16
+ ConstInt as ConstInt,
17
+ ConstFloat as ConstFloat,
18
+ GateFunction as GateFunction,
19
+ )
20
+ from ._dialect import dialect as dialect
@@ -2,7 +2,6 @@
2
2
  moving towards a more general approach to noise modeling in the future."""
3
3
 
4
4
  from .model import (
5
- GateNoiseParams as GateNoiseParams,
6
5
  TwoRowZoneModel as TwoRowZoneModel,
7
6
  MoveNoiseModelABC as MoveNoiseModelABC,
8
7
  )
@@ -11,10 +10,5 @@ from .stmts import (
11
10
  CZPauliChannel as CZPauliChannel,
12
11
  AtomLossChannel as AtomLossChannel,
13
12
  )
14
- from .rewrite import RemoveNoisePass as RemoveNoisePass
15
13
  from ._dialect import dialect as dialect
16
- from ._wrappers import (
17
- pauli_channel as pauli_channel,
18
- cz_pauli_channel as cz_pauli_channel,
19
- atom_loss_channel as atom_loss_channel,
20
- )
14
+ from .fidelity import FidelityMethodTable as FidelityMethodTable
@@ -0,0 +1,3 @@
1
+ from kirin import ir
2
+
3
+ dialect = ir.Dialect("qasm2.noise")
@@ -1,14 +1,14 @@
1
1
  from kirin import interp
2
2
  from kirin.lattice import EmptyLattice
3
3
 
4
+ from bloqade.analysis.address import AddressQubit, AddressTuple
4
5
  from bloqade.analysis.fidelity import FidelityAnalysis
5
6
 
6
- from .native import dialect as native
7
- from .native.stmts import PauliChannel, CZPauliChannel, AtomLossChannel
8
- from ..analysis.address import AddressQubit, AddressTuple
7
+ from .stmts import PauliChannel, CZPauliChannel, AtomLossChannel
8
+ from ._dialect import dialect
9
9
 
10
10
 
11
- @native.register(key="circuit.fidelity")
11
+ @dialect.register(key="circuit.fidelity")
12
12
  class FidelityMethodTable(interp.MethodTable):
13
13
 
14
14
  @interp.impl(PauliChannel)