bloqade-circuit 0.4.5__py3-none-any.whl → 0.5.0__py3-none-any.whl

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 (37) hide show
  1. bloqade/cirq_utils/__init__.py +7 -0
  2. bloqade/cirq_utils/lineprog.py +295 -0
  3. bloqade/cirq_utils/parallelize.py +400 -0
  4. bloqade/pyqrack/squin/op.py +7 -2
  5. bloqade/pyqrack/squin/runtime.py +4 -2
  6. bloqade/qasm2/dialects/expr/stmts.py +2 -20
  7. bloqade/qasm2/parse/lowering.py +1 -0
  8. bloqade/qasm2/passes/parallel.py +18 -0
  9. bloqade/qasm2/rewrite/__init__.py +1 -0
  10. bloqade/qasm2/rewrite/parallel_to_glob.py +82 -0
  11. bloqade/squin/__init__.py +1 -0
  12. bloqade/squin/_typeinfer.py +20 -0
  13. bloqade/squin/analysis/nsites/impls.py +6 -1
  14. bloqade/squin/cirq/lowering.py +19 -6
  15. bloqade/squin/op/__init__.py +1 -0
  16. bloqade/squin/op/_wrapper.py +4 -0
  17. bloqade/squin/op/stmts.py +20 -2
  18. bloqade/squin/qubit.py +8 -5
  19. bloqade/squin/rewrite/__init__.py +1 -0
  20. bloqade/squin/rewrite/canonicalize.py +60 -0
  21. bloqade/squin/rewrite/desugar.py +52 -5
  22. bloqade/squin/types.py +8 -0
  23. bloqade/squin/wire.py +91 -5
  24. bloqade/stim/__init__.py +1 -0
  25. bloqade/stim/_wrappers.py +4 -0
  26. bloqade/stim/dialects/noise/emit.py +1 -0
  27. bloqade/stim/dialects/noise/stmts.py +5 -0
  28. bloqade/stim/passes/squin_to_stim.py +16 -1
  29. bloqade/stim/rewrite/__init__.py +1 -0
  30. bloqade/stim/rewrite/qubit_to_stim.py +10 -6
  31. bloqade/stim/rewrite/squin_noise.py +120 -0
  32. bloqade/stim/rewrite/util.py +44 -9
  33. bloqade/stim/rewrite/wire_to_stim.py +8 -3
  34. {bloqade_circuit-0.4.5.dist-info → bloqade_circuit-0.5.0.dist-info}/METADATA +4 -2
  35. {bloqade_circuit-0.4.5.dist-info → bloqade_circuit-0.5.0.dist-info}/RECORD +37 -29
  36. {bloqade_circuit-0.4.5.dist-info → bloqade_circuit-0.5.0.dist-info}/WHEEL +0 -0
  37. {bloqade_circuit-0.4.5.dist-info → bloqade_circuit-0.5.0.dist-info}/licenses/LICENSE +0 -0
bloqade/stim/__init__.py CHANGED
@@ -31,6 +31,7 @@ from ._wrappers import (
31
31
  z_error as z_error,
32
32
  detector as detector,
33
33
  identity as identity,
34
+ qubit_loss as qubit_loss,
34
35
  depolarize1 as depolarize1,
35
36
  depolarize2 as depolarize2,
36
37
  pauli_string as pauli_string,
bloqade/stim/_wrappers.py CHANGED
@@ -190,3 +190,7 @@ def y_error(p: float, targets: tuple[int, ...]) -> None: ...
190
190
 
191
191
  @wraps(noise.ZError)
192
192
  def z_error(p: float, targets: tuple[int, ...]) -> None: ...
193
+
194
+
195
+ @wraps(noise.QubitLoss)
196
+ def qubit_loss(probs: tuple[float, ...], targets: tuple[int, ...]) -> None: ...
@@ -66,6 +66,7 @@ class EmitStimNoiseMethods(MethodTable):
66
66
  return ()
67
67
 
68
68
  @impl(stmts.TrivialError)
69
+ @impl(stmts.QubitLoss)
69
70
  def non_stim_error(
70
71
  self, emit: EmitStimMain, frame: EmitStrFrame, stmt: stmts.TrivialError
71
72
  ):
@@ -104,3 +104,8 @@ class TrivialCorrelatedError(NonStimCorrelatedError):
104
104
  @statement(dialect=dialect)
105
105
  class TrivialError(NonStimError):
106
106
  name = "TRIV_ERROR"
107
+
108
+
109
+ @statement(dialect=dialect)
110
+ class QubitLoss(NonStimError):
111
+ name = "loss"
@@ -8,6 +8,7 @@ from kirin.rewrite import (
8
8
  DeadCodeElimination,
9
9
  CommonSubexpressionElimination,
10
10
  )
11
+ from kirin.analysis import const
11
12
  from kirin.ir.method import Method
12
13
  from kirin.passes.abc import Pass
13
14
  from kirin.rewrite.abc import RewriteResult
@@ -16,11 +17,12 @@ from bloqade.stim.groups import main as stim_main_group
16
17
  from bloqade.stim.rewrite import (
17
18
  SquinWireToStim,
18
19
  PyConstantToStim,
20
+ SquinNoiseToStim,
19
21
  SquinQubitToStim,
20
22
  SquinMeasureToStim,
21
23
  SquinWireIdentityElimination,
22
24
  )
23
- from bloqade.squin.rewrite import RemoveDeadRegister
25
+ from bloqade.squin.rewrite import SquinU3ToClifford, RemoveDeadRegister
24
26
 
25
27
 
26
28
  @dataclass
@@ -31,10 +33,23 @@ class SquinToStim(Pass):
31
33
  # propagate constants
32
34
  rewrite_result = fold_pass(mt)
33
35
 
36
+ cp_frame, _ = const.Propagate(dialects=mt.dialects).run_analysis(mt)
37
+ cp_results = cp_frame.entries
38
+
34
39
  # Assume that address analysis and
35
40
  # wrapping has been done before this pass!
36
41
 
42
+ # Rewrite the noise statements first.
43
+ rewrite_result = (
44
+ Walk(SquinNoiseToStim(cp_results=cp_results))
45
+ .rewrite(mt.code)
46
+ .join(rewrite_result)
47
+ )
48
+
37
49
  # Wrap Rewrite + SquinToStim can happen w/ standard walk
50
+
51
+ rewrite_result = Walk(SquinU3ToClifford()).rewrite(mt.code).join(rewrite_result)
52
+
38
53
  rewrite_result = (
39
54
  Walk(
40
55
  Chain(
@@ -1,3 +1,4 @@
1
+ from .squin_noise import SquinNoiseToStim as SquinNoiseToStim
1
2
  from .wire_to_stim import SquinWireToStim as SquinWireToStim
2
3
  from .qubit_to_stim import SquinQubitToStim as SquinQubitToStim
3
4
  from .squin_measure import SquinMeasureToStim as SquinMeasureToStim
@@ -1,12 +1,13 @@
1
1
  from kirin import ir
2
2
  from kirin.rewrite.abc import RewriteRule, RewriteResult
3
3
 
4
- from bloqade.squin import op, qubit
4
+ from bloqade.squin import op, noise, qubit
5
5
  from bloqade.squin.rewrite import AddressAttribute
6
6
  from bloqade.stim.dialects import gate
7
7
  from bloqade.stim.rewrite.util import (
8
- SQUIN_STIM_GATE_MAPPING,
8
+ SQUIN_STIM_OP_MAPPING,
9
9
  rewrite_Control,
10
+ rewrite_QubitLoss,
10
11
  insert_qubit_idx_from_address,
11
12
  )
12
13
 
@@ -30,11 +31,17 @@ class SquinQubitToStim(RewriteRule):
30
31
 
31
32
  # this is an SSAValue, need it to be the actual operator
32
33
  applied_op = stmt.operator.owner
34
+
35
+ if isinstance(applied_op, noise.stmts.QubitLoss):
36
+ return rewrite_QubitLoss(stmt)
37
+
33
38
  assert isinstance(applied_op, op.stmts.Operator)
34
39
 
35
40
  if isinstance(applied_op, op.stmts.Control):
36
41
  return rewrite_Control(stmt)
37
42
 
43
+ # need to handle Control through separate means
44
+
38
45
  # check if its adjoint, assume its canonicalized so no nested adjoints.
39
46
  is_conj = False
40
47
  if isinstance(applied_op, op.stmts.Adjoint):
@@ -44,9 +51,7 @@ class SquinQubitToStim(RewriteRule):
44
51
  is_conj = True
45
52
  applied_op = applied_op.op.owner
46
53
 
47
- # need to handle Control through separate means
48
- # but we can handle X, Y, Z, H, and S here just fine
49
- stim_1q_op = SQUIN_STIM_GATE_MAPPING.get(type(applied_op))
54
+ stim_1q_op = SQUIN_STIM_OP_MAPPING.get(type(applied_op))
50
55
  if stim_1q_op is None:
51
56
  return RewriteResult()
52
57
 
@@ -55,7 +60,6 @@ class SquinQubitToStim(RewriteRule):
55
60
  if address_attr is None:
56
61
  return RewriteResult()
57
62
 
58
- # sometimes you can get a whole AddressReg...
59
63
  assert isinstance(address_attr, AddressAttribute)
60
64
  qubit_idx_ssas = insert_qubit_idx_from_address(
61
65
  address=address_attr, stmt_to_insert_before=stmt
@@ -0,0 +1,120 @@
1
+ from typing import Dict, Tuple
2
+ from dataclasses import dataclass
3
+
4
+ from kirin.ir import SSAValue, Statement
5
+ from kirin.analysis import const
6
+ from kirin.dialects import py
7
+ from kirin.rewrite.abc import RewriteRule, RewriteResult
8
+
9
+ from bloqade.squin import wire, noise as squin_noise, qubit
10
+ from bloqade.stim.dialects import noise as stim_noise
11
+ from bloqade.stim.rewrite.util import (
12
+ create_wire_passthrough,
13
+ insert_qubit_idx_after_apply,
14
+ )
15
+
16
+
17
+ @dataclass
18
+ class SquinNoiseToStim(RewriteRule):
19
+
20
+ cp_results: Dict[SSAValue, const.Result]
21
+
22
+ def rewrite_Statement(self, node: Statement) -> RewriteResult:
23
+ match node:
24
+ case qubit.Apply() | qubit.Broadcast():
25
+ return self.rewrite_Apply_and_Broadcast(node)
26
+ case _:
27
+ return RewriteResult()
28
+
29
+ def rewrite_Apply_and_Broadcast(
30
+ self, stmt: qubit.Apply | qubit.Broadcast
31
+ ) -> RewriteResult:
32
+ """Rewrite Apply and Broadcast to their stim statements."""
33
+
34
+ # this is an SSAValue, need it to be the actual operator
35
+ applied_op = stmt.operator.owner
36
+
37
+ if isinstance(applied_op, squin_noise.stmts.NoiseChannel):
38
+
39
+ qubit_idx_ssas = insert_qubit_idx_after_apply(stmt=stmt)
40
+ if qubit_idx_ssas is None:
41
+ return RewriteResult()
42
+
43
+ stim_stmt = None
44
+ if isinstance(applied_op, squin_noise.stmts.SingleQubitPauliChannel):
45
+ stim_stmt = self.rewrite_SingleQubitPauliChannel(stmt, qubit_idx_ssas)
46
+ elif isinstance(applied_op, squin_noise.stmts.TwoQubitPauliChannel):
47
+ stim_stmt = self.rewrite_TwoQubitPauliChannel(stmt, qubit_idx_ssas)
48
+
49
+ if isinstance(stmt, (wire.Apply, wire.Broadcast)):
50
+ create_wire_passthrough(stmt)
51
+
52
+ if stim_stmt is not None:
53
+ stmt.replace_by(stim_stmt)
54
+ if len(stmt.operator.owner.result.uses) == 0:
55
+ stmt.operator.owner.delete()
56
+
57
+ return RewriteResult(has_done_something=True)
58
+ return RewriteResult()
59
+
60
+ def rewrite_SingleQubitPauliChannel(
61
+ self,
62
+ stmt: qubit.Apply | qubit.Broadcast | wire.Broadcast | wire.Apply,
63
+ qubit_idx_ssas: Tuple[SSAValue],
64
+ ) -> Statement:
65
+ """Rewrite squin.noise.SingleQubitPauliChannel to stim.PauliChannel1."""
66
+
67
+ squin_channel = stmt.operator.owner
68
+ assert isinstance(squin_channel, squin_noise.stmts.SingleQubitPauliChannel)
69
+
70
+ params = self.cp_results.get(squin_channel.params).data
71
+ new_stmts = [
72
+ p_x := py.Constant(params[0]),
73
+ p_y := py.Constant(params[1]),
74
+ p_z := py.Constant(params[2]),
75
+ ]
76
+ for new_stmt in new_stmts:
77
+ new_stmt.insert_before(stmt)
78
+
79
+ stim_stmt = stim_noise.PauliChannel1(
80
+ targets=qubit_idx_ssas,
81
+ px=p_x.result,
82
+ py=p_y.result,
83
+ pz=p_z.result,
84
+ )
85
+ return stim_stmt
86
+
87
+ def rewrite_TwoQubitPauliChannel(
88
+ self,
89
+ stmt: qubit.Apply | qubit.Broadcast | wire.Broadcast | wire.Apply,
90
+ qubit_idx_ssas: Tuple[SSAValue],
91
+ ) -> Statement:
92
+ """Rewrite squin.noise.SingleQubitPauliChannel to stim.PauliChannel1."""
93
+
94
+ squin_channel = stmt.operator.owner
95
+ assert isinstance(squin_channel, squin_noise.stmts.TwoQubitPauliChannel)
96
+
97
+ params = self.cp_results.get(squin_channel.params).data
98
+ param_stmts = [py.Constant(p) for p in params]
99
+ for param_stmt in param_stmts:
100
+ param_stmt.insert_before(stmt)
101
+
102
+ stim_stmt = stim_noise.PauliChannel2(
103
+ targets=qubit_idx_ssas,
104
+ pix=param_stmts[0].result,
105
+ piy=param_stmts[1].result,
106
+ piz=param_stmts[2].result,
107
+ pxi=param_stmts[3].result,
108
+ pxx=param_stmts[4].result,
109
+ pxy=param_stmts[5].result,
110
+ pxz=param_stmts[6].result,
111
+ pyi=param_stmts[7].result,
112
+ pyx=param_stmts[8].result,
113
+ pyy=param_stmts[9].result,
114
+ pyz=param_stmts[10].result,
115
+ pzi=param_stmts[11].result,
116
+ pzx=param_stmts[12].result,
117
+ pzy=param_stmts[13].result,
118
+ pzz=param_stmts[14].result,
119
+ )
120
+ return stim_stmt
@@ -2,12 +2,12 @@ from kirin import ir
2
2
  from kirin.dialects import py
3
3
  from kirin.rewrite.abc import RewriteResult
4
4
 
5
- from bloqade.squin import op, wire, qubit
5
+ from bloqade.squin import op, wire, noise as squin_noise, qubit
6
6
  from bloqade.squin.rewrite import AddressAttribute
7
- from bloqade.stim.dialects import gate, collapse
7
+ from bloqade.stim.dialects import gate, noise as stim_noise, collapse
8
8
  from bloqade.analysis.address import AddressReg, AddressWire, AddressQubit, AddressTuple
9
9
 
10
- SQUIN_STIM_GATE_MAPPING = {
10
+ SQUIN_STIM_OP_MAPPING = {
11
11
  op.stmts.X: gate.X,
12
12
  op.stmts.Y: gate.Y,
13
13
  op.stmts.Z: gate.Z,
@@ -17,6 +17,7 @@ SQUIN_STIM_GATE_MAPPING = {
17
17
  op.stmts.SqrtY: gate.SqrtY,
18
18
  op.stmts.Identity: gate.Identity,
19
19
  op.stmts.Reset: collapse.RZ,
20
+ squin_noise.stmts.QubitLoss: stim_noise.QubitLoss,
20
21
  }
21
22
 
22
23
  # Squin allows creation of control gates where the gate can be any operator,
@@ -151,18 +152,52 @@ def rewrite_Control(
151
152
  stim_stmt = stim_gate(controls=ctrl_qubits, targets=target_qubits)
152
153
 
153
154
  if isinstance(stmt_with_ctrl, (wire.Apply, wire.Broadcast)):
154
- # have to "reroute" the input of these statements to directly plug in
155
- # to subsequent statements, remove dependency on the current statement
156
- for input_wire, output_wire in zip(
157
- stmt_with_ctrl.inputs, stmt_with_ctrl.results
158
- ):
159
- output_wire.replace_by(input_wire)
155
+ create_wire_passthrough(stmt_with_ctrl)
160
156
 
161
157
  stmt_with_ctrl.replace_by(stim_stmt)
162
158
 
163
159
  return RewriteResult(has_done_something=True)
164
160
 
165
161
 
162
+ def rewrite_QubitLoss(
163
+ stmt: qubit.Apply | qubit.Broadcast | wire.Broadcast | wire.Apply,
164
+ ) -> RewriteResult:
165
+ """
166
+ Rewrite QubitLoss statements to Stim's TrivialError.
167
+ """
168
+
169
+ squin_loss_op = stmt.operator.owner
170
+ assert isinstance(squin_loss_op, squin_noise.stmts.QubitLoss)
171
+
172
+ qubit_idx_ssas = insert_qubit_idx_after_apply(stmt=stmt)
173
+ if qubit_idx_ssas is None:
174
+ return RewriteResult()
175
+
176
+ stim_loss_stmt = stim_noise.QubitLoss(
177
+ targets=qubit_idx_ssas,
178
+ probs=(squin_loss_op.p,),
179
+ )
180
+
181
+ if isinstance(stmt, (wire.Apply, wire.Broadcast)):
182
+ create_wire_passthrough(stmt)
183
+
184
+ stmt.replace_by(stim_loss_stmt)
185
+ # NoiseChannels are not pure,
186
+ # need to manually delete because
187
+ # DCE won't touch them
188
+ stmt.operator.owner.delete()
189
+
190
+ return RewriteResult(has_done_something=True)
191
+
192
+
193
+ def create_wire_passthrough(stmt: wire.Apply | wire.Broadcast) -> None:
194
+
195
+ for input_wire, output_wire in zip(stmt.inputs, stmt.results):
196
+ # have to "reroute" the input of these statements to directly plug in
197
+ # to subsequent statements, remove dependency on the current statement
198
+ output_wire.replace_by(input_wire)
199
+
200
+
166
201
  def is_measure_result_used(
167
202
  stmt: qubit.MeasureQubit | qubit.MeasureQubitList | wire.Measure,
168
203
  ) -> bool:
@@ -1,10 +1,11 @@
1
1
  from kirin import ir
2
2
  from kirin.rewrite.abc import RewriteRule, RewriteResult
3
3
 
4
- from bloqade.squin import op, wire
4
+ from bloqade.squin import op, wire, noise
5
5
  from bloqade.stim.rewrite.util import (
6
- SQUIN_STIM_GATE_MAPPING,
6
+ SQUIN_STIM_OP_MAPPING,
7
7
  rewrite_Control,
8
+ rewrite_QubitLoss,
8
9
  insert_qubit_idx_from_wire_ssa,
9
10
  )
10
11
 
@@ -24,12 +25,16 @@ class SquinWireToStim(RewriteRule):
24
25
 
25
26
  # this is an SSAValue, need it to be the actual operator
26
27
  applied_op = stmt.operator.owner
28
+
29
+ if isinstance(applied_op, noise.stmts.QubitLoss):
30
+ return rewrite_QubitLoss(stmt)
31
+
27
32
  assert isinstance(applied_op, op.stmts.Operator)
28
33
 
29
34
  if isinstance(applied_op, op.stmts.Control):
30
35
  return rewrite_Control(stmt)
31
36
 
32
- stim_1q_op = SQUIN_STIM_GATE_MAPPING.get(type(applied_op))
37
+ stim_1q_op = SQUIN_STIM_OP_MAPPING.get(type(applied_op))
33
38
  if stim_1q_op is None:
34
39
  return RewriteResult()
35
40
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bloqade-circuit
3
- Version: 0.4.5
3
+ Version: 0.5.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
@@ -16,6 +16,7 @@ Requires-Dist: scipy>=1.13.1
16
16
  Provides-Extra: cirq
17
17
  Requires-Dist: cirq-core>=1.4.1; extra == 'cirq'
18
18
  Requires-Dist: cirq-core[contrib]>=1.4.1; extra == 'cirq'
19
+ Requires-Dist: qpsolvers[clarabel]>=4.7.0; extra == 'cirq'
19
20
  Provides-Extra: pyqrack-cuda
20
21
  Requires-Dist: pyqrack-cuda>=1.38.2; extra == 'pyqrack-cuda'
21
22
  Provides-Extra: pyqrack-opencl
@@ -29,7 +30,8 @@ Requires-Dist: stim>=1.15.0; extra == 'stim'
29
30
  Provides-Extra: vis
30
31
  Requires-Dist: ffmpeg>=1.4; extra == 'vis'
31
32
  Requires-Dist: matplotlib>=3.9.2; extra == 'vis'
32
- Requires-Dist: pyqt5>=5.15.11; extra == 'vis'
33
+ Requires-Dist: pyqt5>=5.15.11; (sys_platform == 'darwin') and extra == 'vis'
34
+ Requires-Dist: pyqt5>=5.15.11; (sys_platform == 'linux') and extra == 'vis'
33
35
  Requires-Dist: tqdm>=4.66.5; extra == 'vis'
34
36
  Description-Content-Type: text/markdown
35
37
 
@@ -9,6 +9,9 @@ bloqade/analysis/address/impls.py,sha256=c3FMF2LLkV_fwWaolIRTV7ueXC9qwAR6PUW9kDQ
9
9
  bloqade/analysis/address/lattice.py,sha256=dUq999feqPoBYkqEXe1hjHOn4TP_bkvKip8fyWQ-2-8,1755
10
10
  bloqade/analysis/fidelity/__init__.py,sha256=iJkhoHvCMU9bKxQqgxIWKQWvpqNFRgNBI5DK8-4RAB8,59
11
11
  bloqade/analysis/fidelity/analysis.py,sha256=G6JEYc8eeWJ9mwsbUAIzXuU2nrnTU4te41c04xE71gM,3218
12
+ bloqade/cirq_utils/__init__.py,sha256=RZTqtfAviI64lUrA6_XX6Bf83RC8VnKxrFaVx0lcxik,223
13
+ bloqade/cirq_utils/lineprog.py,sha256=JosrhfeOHI9FycUT_sYFj8TBzLpo97TL8zK-Ap2U4eQ,11021
14
+ bloqade/cirq_utils/parallelize.py,sha256=jnvZdA22UOkcIWVVulfhlN95Ha5q2ES-b1ZuQz--gOY,13770
12
15
  bloqade/pyqrack/__init__.py,sha256=lonTS-luJkTVujCCtgdZRC12V7FQdoFcozAI-byXwN0,810
13
16
  bloqade/pyqrack/base.py,sha256=9z61PaaAFqCBBwkgsDZSr-qr9IQ5OJ_JUvltmJ7Bgls,4407
14
17
  bloqade/pyqrack/device.py,sha256=cOdyT1k0b73QbOsEIu5KqxHW2OAWP86fi_3XGPhaWGA,7134
@@ -23,9 +26,9 @@ bloqade/pyqrack/qasm2/glob.py,sha256=EGe7sh9SuvpRW4V4rFcX6Gf7ot8iyThYbsdPeEBKzYM
23
26
  bloqade/pyqrack/qasm2/parallel.py,sha256=ITetuXOH2KUDpDOBuFnJoz2DhduvyBC72cOAOOixTaM,1606
24
27
  bloqade/pyqrack/qasm2/uop.py,sha256=bLZONsEK15ymFGIQwy7muQv-TX0mvLrECuMp1Y3XTfA,8612
25
28
  bloqade/pyqrack/squin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
- bloqade/pyqrack/squin/op.py,sha256=CY2qTYqFPwEceWt-iSiax6i_Bs2i9hQhzGR8ni_PmmA,4952
29
+ bloqade/pyqrack/squin/op.py,sha256=fHBPV6Q3sKj50K34KfnctacZoNQ8iFz4j5k3qTtRfnI,5123
27
30
  bloqade/pyqrack/squin/qubit.py,sha256=svQMbsLxv3yjiFMSRc4C7QGllzjtmlSWOsMY1mjTI8Q,2223
28
- bloqade/pyqrack/squin/runtime.py,sha256=806S23bJKbh2xBuZ0yPAgjs7ZxDHB-zqQtNeA--x9fw,15349
31
+ bloqade/pyqrack/squin/runtime.py,sha256=BM_xRoTpsRipL_Vt-N5UO-x2Nsgiafw3nwiqiuOeH68,15401
29
32
  bloqade/pyqrack/squin/wire.py,sha256=rqlAeU-r_EHOwJMqHrEAxpZ_rKsvUpwGG7MP4BW75Nw,1658
30
33
  bloqade/pyqrack/squin/noise/__init__.py,sha256=uXgRQPOrHNRp3k2ff2HD8mheUEaqxZPKEnwV-s4BiV4,31
31
34
  bloqade/pyqrack/squin/noise/native.py,sha256=KF4VGzU5Ps92DeLcIDIMsxQQtQ97z_3KUHqBPPkZFaM,2286
@@ -53,7 +56,7 @@ bloqade/qasm2/dialects/expr/_dialect.py,sha256=yu46u8FX8tTWAlMHv_YIOXZYiAuWYzB7-
53
56
  bloqade/qasm2/dialects/expr/_emit.py,sha256=GlT1ZuunltKh0wjfevNu5hig74jwxW8JFoI-oQ2GqWA,3270
54
57
  bloqade/qasm2/dialects/expr/_from_python.py,sha256=4wB9J0gMRZq1HnMzAjn6sk6qVpS2gWTlIrTZKKGOMQ8,3432
55
58
  bloqade/qasm2/dialects/expr/_interp.py,sha256=dQLDcWABpo107BtC6d18L5NmXYlRPPedGtGqlezRWJw,2395
56
- bloqade/qasm2/dialects/expr/stmts.py,sha256=bAsT4iT-L5I-NvwdWYxquoSHPy6XsDboo-xCtek8v5g,8582
59
+ bloqade/qasm2/dialects/expr/stmts.py,sha256=izU70b1mnnciEP8BrZO1ACyMBZy0CeN8sWescn1bQNg,8053
57
60
  bloqade/qasm2/dialects/noise/__init__.py,sha256=4YSXTFjt7TiQd0jqMZy2k6pfKbLyTamQlQ--jPTziLQ,512
58
61
  bloqade/qasm2/dialects/noise/_dialect.py,sha256=onK6l3wbM0IHwf3WMiWy7pDRQG0DyLTOzplBuj56psA,58
59
62
  bloqade/qasm2/dialects/noise/fidelity.py,sha256=Ft-Benmg1mvWYTPE_DkjMZP5-JfmiotIU_WfAWq8sCw,1632
@@ -74,7 +77,7 @@ bloqade/qasm2/emit/impls/noise.py,sha256=-N9PmCbz8MwC6xtd55GOpjDoWMyJPJBMVDWT3G8
74
77
  bloqade/qasm2/parse/__init__.py,sha256=01tlLfrR015nAAPWw3i_Cs9IXsShpXMnJMagcJ_Vuik,986
75
78
  bloqade/qasm2/parse/ast.py,sha256=a48ssf0D_xaE-27PsyeBD5lBvwN2Dojj-RWIBhy7jJE,2904
76
79
  bloqade/qasm2/parse/build.py,sha256=2CibD1ZRX3_aknmhb5XvFQcI2sBOn97DlQHomb9CMEw,10621
77
- bloqade/qasm2/parse/lowering.py,sha256=VRFhdDsgAeALVzJxmDtlRI3L1xLrAGnz_Zh-qNOChhM,20844
80
+ bloqade/qasm2/parse/lowering.py,sha256=aBIbvJWOdG5lauPiDhh1uNQ398814INtoWZrUZtpyEU,20879
78
81
  bloqade/qasm2/parse/parser.py,sha256=fxqp65dv8NnXE-Ie7ryLESfSH3Xr0unx1EBQysctiHM,121
79
82
  bloqade/qasm2/parse/print.py,sha256=PaigQ5RbcfhOteWvDdQHoKsTE3tcNefpVfh1sp5eZEI,8973
80
83
  bloqade/qasm2/parse/qasm2.lark,sha256=IYrBydUoVLn1VCNDPP5uNN5BHDET3fQ2yG11cOy900k,2238
@@ -85,15 +88,16 @@ bloqade/qasm2/passes/fold.py,sha256=NMT9MVpc7eWtqmdCztcztrfVewk5SCz5OTDMjSNPGaE,
85
88
  bloqade/qasm2/passes/glob.py,sha256=qGmUTJSvDPf6qatapg4U69bTRKOAwZEHcFdts3mRxjI,3563
86
89
  bloqade/qasm2/passes/lift_qubits.py,sha256=VgIuqaZecozA3cwGAq8Nzqdv8IqQlzyQv2XlaqY4H4g,759
87
90
  bloqade/qasm2/passes/noise.py,sha256=w7U91jOAabcCZZXm8uPxojsVRtcIkxtpZS2hwEDsDN0,2709
88
- bloqade/qasm2/passes/parallel.py,sha256=nvlCxu8LbIBez5LGXVVuKSa6KTC3DzK1mYUI3-kGSLk,5174
91
+ bloqade/qasm2/passes/parallel.py,sha256=hvdxnmVpWnBYWYXD1oHicPa5mVpqNN25J5BWRRASSXo,5725
89
92
  bloqade/qasm2/passes/py2qasm.py,sha256=PmdIrViQ_4PEYBKE5XEk4oqFO2sLF2s_2Etz6R9CBoQ,2167
90
93
  bloqade/qasm2/passes/qasm2py.py,sha256=beocXUoO2iM6sX85ML1eK8hp9_s5oupw8tqHWV1cDCo,2138
91
94
  bloqade/qasm2/passes/unroll_if.py,sha256=NBqgOcOJ4bEo9Osb2K-UATZVb77ckSgcWFpKlSkAnxI,771
92
- bloqade/qasm2/rewrite/__init__.py,sha256=2_3_FdYa5bzZ5YPnbaz9xQE2A8CfgFivufW6D0PukRc,690
95
+ bloqade/qasm2/rewrite/__init__.py,sha256=bWOcz2uPQErF6xHFlgHBAFPCZBaSHmLDrjXllzgjHSU,765
93
96
  bloqade/qasm2/rewrite/desugar.py,sha256=ABri2ubImrgYUWtuFj0EEh5FcICqjtKUSS2Ue4WlMdA,1007
94
97
  bloqade/qasm2/rewrite/glob.py,sha256=JzGDIY8ME9ZhNQ0g4d0FTpJuJlPu6G19myzo4zb6f_M,3119
95
98
  bloqade/qasm2/rewrite/insert_qubits.py,sha256=PpYNlJAl-TVtC1MJxIzOQWDetgW8OPXe6cLN1SMg2w0,1187
96
99
  bloqade/qasm2/rewrite/native_gates.py,sha256=GVutT1jf_gv9qaR5fLqjcmxcqCfMZTiQyg4Fq-TlmFM,18684
100
+ bloqade/qasm2/rewrite/parallel_to_glob.py,sha256=TQ5EAYIx7pLpydSeeF2Ta0h5evaHHXaRtvtgz1X3Kfo,2750
97
101
  bloqade/qasm2/rewrite/parallel_to_uop.py,sha256=_banEox20L_qU1GTvKjSSDBkFg49UlSE-POuTCKnrzY,2351
98
102
  bloqade/qasm2/rewrite/register.py,sha256=sghKMBlsls9YLO6baXZ_m692aNpWgMdxZhinNznQDks,1541
99
103
  bloqade/qasm2/rewrite/split_ifs.py,sha256=7MTDFREG0hSSNBzU8Gpc9S-D-vHlBHcE6Zw2Zr7auY0,2053
@@ -106,19 +110,21 @@ bloqade/qbraid/lowering.py,sha256=84RsPONWeQ_2beyOWBNoJbGFKuaMhsWtRiPivTCZ-Q0,11
106
110
  bloqade/qbraid/schema.py,sha256=dTPexUFOiBNBnFv0GEbGh6jpIbMIFHk4hFXmXbeihxA,7854
107
111
  bloqade/qbraid/simulation_result.py,sha256=zdCJcAdbQkEDzFFuC2q3gqOFTOLAXHk4wh8RRDB6cgc,3956
108
112
  bloqade/qbraid/target.py,sha256=LcFHHyLe74yBmrHI9251xHgLN_nUz35lN8RPNwrT6mI,3149
109
- bloqade/squin/__init__.py,sha256=0NKHHhSFtlITiAMShgKPkh6tvQbfPzqgBi4I2Wm_LCU,398
113
+ bloqade/squin/__init__.py,sha256=dFe6oAqR_4_utyMXj0NbKJ-3FRHhjYTvxcr1fqK7drE,428
114
+ bloqade/squin/_typeinfer.py,sha256=bilWfC6whTMwewFCqDgB6vDHZsgXPr3azNOYqqnvtB4,780
110
115
  bloqade/squin/groups.py,sha256=RXGJnNZUSXF_f5ljjhZ9At8UhaijayoxFoWvxEsUOWc,1310
111
116
  bloqade/squin/lowering.py,sha256=w-GyOKYZHHKCGA2slcgWNS97Q_znQU65PeYxEIkvChM,816
112
- bloqade/squin/qubit.py,sha256=psIZPtbQHsiToCXcT4wuuaZzEifaPVvk_SWrsgPbNwg,5067
113
- bloqade/squin/wire.py,sha256=kRmpC7P6qIOZOsuFJHJQyeNsEWcU2Of4ZgcdsMESnKA,3746
117
+ bloqade/squin/qubit.py,sha256=LgNJsm6qCyP7_O-lZg3YT8IiqzF5W5ff1VwQ79nXN4c,5148
118
+ bloqade/squin/types.py,sha256=T3lkqid4HEWuAK_wRns_p-K5DbLDwlldoyZtVay7A3o,119
119
+ bloqade/squin/wire.py,sha256=GZhF0EHCu7OU70zTV_N83yann-eQnYG_lM2u0QYFoAs,6596
114
120
  bloqade/squin/analysis/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
115
121
  bloqade/squin/analysis/schedule.py,sha256=buuC4bFuLuaSDK2BZfkRkh8ZdNicz9HkEv3FAnsDViE,7880
116
122
  bloqade/squin/analysis/nsites/__init__.py,sha256=RlQg7ivczXCXG5lMeL3ipYKj2oJKC4THu8orYf5PBYs,263
117
123
  bloqade/squin/analysis/nsites/analysis.py,sha256=rIe1RU1MZRItcE2aB8DYahLrv73HfD3IHCX3E_EGQ1c,1773
118
- bloqade/squin/analysis/nsites/impls.py,sha256=Q2buVBmUX1ghj48_SoMO-_0BASGkfnILZZOOFRnwzIQ,2772
124
+ bloqade/squin/analysis/nsites/impls.py,sha256=bVqO4E2hDzfYWwSG0pfj2j8oT1m0C3b42LdSHr4HQlo,2874
119
125
  bloqade/squin/analysis/nsites/lattice.py,sha256=ruh0808SHtj3ecuT-C3AZTsLY2j3DRhtezGiTZvcuVs,942
120
126
  bloqade/squin/cirq/__init__.py,sha256=fxvBvwX5VNfDmqkeM4GHguLQh53k-PJVsz89Eu0wRXw,8552
121
- bloqade/squin/cirq/lowering.py,sha256=ZrdulFJgzuOJHunCmPn9mpUEO1U2xq4gDTTNgSA4cSU,14914
127
+ bloqade/squin/cirq/lowering.py,sha256=tVbDBL7jlwXbp0ZLEjQ4zWdV1TSkcpwWgHOGxF8T1Hg,15660
122
128
  bloqade/squin/cirq/emit/emit_circuit.py,sha256=7puJ3eCFwE9VdPb9NAiSdyRNkoQPwo_uVykz9Yv7c14,3761
123
129
  bloqade/squin/cirq/emit/noise.py,sha256=rESjGC_66s2Y4FwwYda4rY3mYHYjbqLlKE_vnqpZDYI,1534
124
130
  bloqade/squin/cirq/emit/op.py,sha256=z54NP5KqMxffXeFGWamEzvunpTNrxmYuluurk4j2-ps,4000
@@ -129,22 +135,23 @@ bloqade/squin/noise/_dialect.py,sha256=2IR98J-lXm5Y3srP9g-FD4JC-qTq2seureM6mKKq1
129
135
  bloqade/squin/noise/_wrapper.py,sha256=b2HymlFi1BTgAZRaXvRnujJsoXkowmxQFPRBgZso82g,750
130
136
  bloqade/squin/noise/rewrite.py,sha256=-IqFfDGnhuaFI-9b6PXjhSuiXFM1C5Qu0ibL5GvZldI,3917
131
137
  bloqade/squin/noise/stmts.py,sha256=rktxkIdjdPUYek0MYh9uh83otkl-7UoADCoWHWf57J8,1678
132
- bloqade/squin/op/__init__.py,sha256=QLlvZlb2nDq-RTalRp7xe0v82YgXURsvyovvMA6j2mw,807
138
+ bloqade/squin/op/__init__.py,sha256=6JOjPdzc6RKO4299ZFz4Jk-wtVyPlGTkakYewHBueXw,841
133
139
  bloqade/squin/op/_dialect.py,sha256=66G1IYqmsqUEaCTyUqn2shSHmGYduiTU8GfDXcoMvw4,55
134
- bloqade/squin/op/_wrapper.py,sha256=rmQHXjRHFEr-bATbKEKL30w1wlDB7vmrQzDDRoLhRVw,1866
140
+ bloqade/squin/op/_wrapper.py,sha256=bg6MLA6u-qkPpo-sKL3lib1VVtQWKCe6RMZb57w8PJQ,1929
135
141
  bloqade/squin/op/number.py,sha256=yujWUqLrOAr8i8OBDsiS5M882wV7t08u345NgNA6TUc,95
136
142
  bloqade/squin/op/rewrite.py,sha256=Itxz_hTAPNLyLYeLS0PCVk143J1Z558UR7N9-urbnoU,1327
137
143
  bloqade/squin/op/stdlib.py,sha256=4UFK3wKImpums2v5a9OFKuVvz2TLYbYwidg3JYYEi2o,1073
138
- bloqade/squin/op/stmts.py,sha256=atPrr12Bc7D5xu_xavVgME3FBNqHQXQSAtMuh7xL0Dw,5491
144
+ bloqade/squin/op/stmts.py,sha256=68dASDOK6IFqS4G02A5Wlnc4ThyyIrls4aurK09aqgE,5975
139
145
  bloqade/squin/op/traits.py,sha256=jjsnzWtPtmQK7K3H_D2fvc8XiW1Y3EMBcgeyPax2sjc,1065
140
146
  bloqade/squin/op/types.py,sha256=ozUT0Bv9NuUxPjB2vAeqJ9cpdvUaBfP9trB5mybYxgc,663
141
147
  bloqade/squin/rewrite/U3_to_clifford.py,sha256=HpkFTqe-J0macb_aNs1QNs8wJDoUsmwf9Mtb0I3ZepI,5377
142
- bloqade/squin/rewrite/__init__.py,sha256=mxP01A2IeOT5HKHKBRRMCIPN4BPKfpYSlQkSjY78ugQ,282
143
- bloqade/squin/rewrite/desugar.py,sha256=fnxchVHIbLx96cv-g_jK7NCVV8t8mo52rs00JaPG7FM,1846
148
+ bloqade/squin/rewrite/__init__.py,sha256=cY1GbXQXKvDeXi0YE4PgjORm6iGBPk63xzMCpVjiCgw,349
149
+ bloqade/squin/rewrite/canonicalize.py,sha256=hcfsn4ntsvnJ_cVnoUgcE5Zk9EqvwgixGArLPx4OjP0,2100
150
+ bloqade/squin/rewrite/desugar.py,sha256=ZPZnhBvIpPYOZDCFsyja4-AL5KMGfH0h8kS-AGu6sHY,3526
144
151
  bloqade/squin/rewrite/remove_dangling_qubits.py,sha256=iTuWV-03YW5wtYbSeKMlnnWjNzDj9SmflyqYPgoYGy8,469
145
152
  bloqade/squin/rewrite/wrap_analysis.py,sha256=JUPS4OAYbDHOK0VIrdz1pprSizISUfN7osuoP_P-bIo,2256
146
- bloqade/stim/__init__.py,sha256=-TkpVoISvZ-HERL2LJfIMHs3Y4k-WdrGWM-_Rwe9q0o,905
147
- bloqade/stim/_wrappers.py,sha256=KBIIOaeYPnhR3SJSNHcEzihLMcph2tL2mRKhEH47Je8,3939
153
+ bloqade/stim/__init__.py,sha256=QPZnQRWiiC66pwZ4yRiX2m5doqgPQorQLqc3b7fav2A,935
154
+ bloqade/stim/_wrappers.py,sha256=Bx_cv-B5ifuFK9sJkURAFg3AzfDzS3oMObEEheX-Ieg,4045
148
155
  bloqade/stim/groups.py,sha256=Fx8G698BGO7hR8OwpPXGUEYdW4uCCPwbMp_3fJAqa8M,585
149
156
  bloqade/stim/dialects/__init__.py,sha256=A1Sq0jg8wi6MjRkzmuSBnHmO3EraD0pDFWz-dO6c6v8,89
150
157
  bloqade/stim/dialects/auxiliary/__init__.py,sha256=6f57a8k2-QBtqaB0GN8FxxTBlG82oZQbVIOxxq975g4,692
@@ -174,21 +181,22 @@ bloqade/stim/dialects/gate/stmts/control_2q.py,sha256=gZRtkpgAkiUFqx5Led2t1YjYbl
174
181
  bloqade/stim/dialects/gate/stmts/pp.py,sha256=yUNCrkYBM7wUCvtRqwP9_HYX0HsHVt6JZR4efM05838,487
175
182
  bloqade/stim/dialects/noise/__init__.py,sha256=WoDdIZnxelk8REiIWDKcrEW79xwISdTZlqlTjURb71Q,138
176
183
  bloqade/stim/dialects/noise/_dialect.py,sha256=SVUjAqBoGnxo13JlAlsxulIMo1QzfJb4SMSrFaCnfP4,57
177
- bloqade/stim/dialects/noise/emit.py,sha256=V44Xs6Z-64ZLB-6hhjRYjqlQeqpXPsiZS6eHkargipM,2909
178
- bloqade/stim/dialects/noise/stmts.py,sha256=0CV9aHUPo8ASdQmcpf8Lv0fGnEMl2xSr4f64DjiYPKQ,3582
184
+ bloqade/stim/dialects/noise/emit.py,sha256=BCxaJPLTU_pKkFgw9rtOzTIqZKP4o4NgDM-x128NX9s,2936
185
+ bloqade/stim/dialects/noise/stmts.py,sha256=WJOlhLMfazP6u7jMMpKeCpX-gIL8_D1jv33mxclHrz4,3661
179
186
  bloqade/stim/emit/__init__.py,sha256=N2dPQY7OyqPwHAStDeOgYg2yfxqxMOz-N7pD5Z4JwlI,73
180
187
  bloqade/stim/emit/stim_str.py,sha256=JyEBoIhLQASogZcUWHI9tMD4JoXYrEqUr2qaZ30gZdc,1491
181
188
  bloqade/stim/parse/__init__.py,sha256=l2DjReB2KkgrDjP_4nP6RnoziiOewoSeZfTno1sVYTw,59
182
189
  bloqade/stim/parse/lowering.py,sha256=L-IcR_exlxsTVv4SQ0bhzIF4_L82P-GEdK6qRd6B86Y,23723
183
190
  bloqade/stim/passes/__init__.py,sha256=KAWJPhZHf0cVDmr9o9LNRfZU8G9aS4adGC4EC7ci_E8,54
184
- bloqade/stim/passes/squin_to_stim.py,sha256=4CSWAevECGxYgtojzlH92YwRUlz_lDtedWNEylXKd0A,2752
185
- bloqade/stim/rewrite/__init__.py,sha256=S2sKUKtX4EGofhZRbewvyHN5s-CavPzseYufij3R5SQ,372
191
+ bloqade/stim/passes/squin_to_stim.py,sha256=ytPeYJiCRDBD1heB43I4V6AfORy9xs2V7n2fcv2kMyI,3239
192
+ bloqade/stim/rewrite/__init__.py,sha256=SHWryh7rZHXOlIz8BMNpj-w7-8VQCRMLt6PfzYFbBfw,434
186
193
  bloqade/stim/rewrite/py_constant_to_stim.py,sha256=PV8bHvn759-d_0JW4akaGSORW_oxigrlUBhAC51PJAU,1354
187
- bloqade/stim/rewrite/qubit_to_stim.py,sha256=VggIAS6EQ4a01YplDGJUMDpQ_q-UYD8C4g1xMC_zbcY,2509
194
+ bloqade/stim/rewrite/qubit_to_stim.py,sha256=Yzh1P_wzLXWqpP_YN4lvDmCS7aLIyZci2JWlHPNO9Xg,2524
188
195
  bloqade/stim/rewrite/squin_measure.py,sha256=1X3rcfGvVDSEXmvqlw4T0LQu2A8LFeNeqz1_zf_I8vA,2466
189
- bloqade/stim/rewrite/util.py,sha256=vpBbTv00odpnnyHTMJZRStb1ZQYfcgbOW5PT5Frf4jw,5847
196
+ bloqade/stim/rewrite/squin_noise.py,sha256=dNt3C2fHebPEYYqlY2eonqiQr7V6GwIl69mI9E5U61g,4265
197
+ bloqade/stim/rewrite/util.py,sha256=tAEi1aDirZ-H5vfxs5u_WWBwHRkBCU3zs_XRSUmWMEQ,6866
190
198
  bloqade/stim/rewrite/wire_identity_elimination.py,sha256=Cscu8yaSslPuW04HvbXx4HJ3JzdUZNUMyFqcvuc4sxY,795
191
- bloqade/stim/rewrite/wire_to_stim.py,sha256=vHtktd9pfjlEpInwN7pPhsIHCxTtHJJqJJhYpy0kIGg,1685
199
+ bloqade/stim/rewrite/wire_to_stim.py,sha256=rZY4Ya4I2b4C3tk84LvJvEi--jyUgza8WmtDtTxCajI,1814
192
200
  bloqade/visual/__init__.py,sha256=Y7d0YgovKhUFzjMeDvt0wGRUZ3re3SY6iO3e8xHXrr4,37
193
201
  bloqade/visual/animation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
194
202
  bloqade/visual/animation/animate.py,sha256=NSKs3YDWgTZH2-Tpx3cP1bBcIEWTEPqK5UFkY_IF_3k,8927
@@ -200,7 +208,7 @@ bloqade/visual/animation/runtime/atoms.py,sha256=EmjxhujLiHHPS_HtH_B-7TiqeHgvW5u
200
208
  bloqade/visual/animation/runtime/ppoly.py,sha256=JB9IP53N1w6adBJEue6J5Nmj818Id9JvrlgrmiQTU1I,1385
201
209
  bloqade/visual/animation/runtime/qpustate.py,sha256=rlmxQeJSvaohXrTpXQL5y-NJcpvfW33xPaYM1slv7cc,4270
202
210
  bloqade/visual/animation/runtime/utils.py,sha256=ju9IzOWX-vKwfpqUjlUKu3Ssr_UFPFFq-tzH_Nqyo_c,1212
203
- bloqade_circuit-0.4.5.dist-info/METADATA,sha256=8glVTUO-kiKWRlb-6bKJBAf--1A6rjOJgI6o1BJGL6w,3683
204
- bloqade_circuit-0.4.5.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
205
- bloqade_circuit-0.4.5.dist-info/licenses/LICENSE,sha256=S5GIJwR6QCixPA9wryYb44ZEek0Nz4rt_zLUqP05UbU,13160
206
- bloqade_circuit-0.4.5.dist-info/RECORD,,
211
+ bloqade_circuit-0.5.0.dist-info/METADATA,sha256=WQewYSavs5inq14laYhjQrHPOh289qP0sC-DXq8c5QM,3849
212
+ bloqade_circuit-0.5.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
213
+ bloqade_circuit-0.5.0.dist-info/licenses/LICENSE,sha256=S5GIJwR6QCixPA9wryYb44ZEek0Nz4rt_zLUqP05UbU,13160
214
+ bloqade_circuit-0.5.0.dist-info/RECORD,,