bloqade-circuit 0.5.2__py3-none-any.whl → 0.6.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.

@@ -4,6 +4,7 @@ from ._wrapper import (
4
4
  pp_error as pp_error,
5
5
  depolarize as depolarize,
6
6
  qubit_loss as qubit_loss,
7
+ depolarize2 as depolarize2,
7
8
  pauli_error as pauli_error,
8
9
  two_qubit_pauli_channel as two_qubit_pauli_channel,
9
10
  single_qubit_pauli_channel as single_qubit_pauli_channel,
@@ -20,6 +20,10 @@ def pp_error(op: Op, p: float) -> Op: ...
20
20
  def depolarize(p: float) -> Op: ...
21
21
 
22
22
 
23
+ @wraps(stmts.Depolarize2)
24
+ def depolarize2(p: float) -> Op: ...
25
+
26
+
23
27
  @wraps(stmts.SingleQubitPauliChannel)
24
28
  def single_qubit_pauli_channel(
25
29
  params: ilist.IList[float, Literal[3]] | list[float] | tuple[float, float, float],
@@ -33,7 +33,16 @@ class PPError(NoiseChannel):
33
33
  @statement(dialect=dialect)
34
34
  class Depolarize(NoiseChannel):
35
35
  """
36
- Apply depolarize error to qubit
36
+ Apply depolarize error to single qubit
37
+ """
38
+
39
+ p: ir.SSAValue = info.argument(types.Float)
40
+
41
+
42
+ @statement(dialect=dialect)
43
+ class Depolarize2(NoiseChannel):
44
+ """
45
+ Apply correlated depolarize error to two qubit
37
46
  """
38
47
 
39
48
  p: ir.SSAValue = info.argument(types.Float)
bloqade/squin/op/stmts.py CHANGED
@@ -103,7 +103,7 @@ class U3(PrimitiveOp):
103
103
  Note that we use the convention from the QASM2 specification, namely
104
104
 
105
105
  $$
106
- U_3(\theta, \phi, \lambda) = R_z(\phi) R_y(\theta) R_z(\lambda)
106
+ U_3(\\theta, \\phi, \\lambda) = R_z(\\phi) R_y(\\theta) R_z(\\lambda)
107
107
  $$
108
108
  """
109
109
 
@@ -119,7 +119,7 @@ class PhaseOp(PrimitiveOp):
119
119
  A phase operator.
120
120
 
121
121
  $$
122
- PhaseOp(\theta) = e^{i \theta} I
122
+ \\text{PhaseOp}(\\theta) = e^{i \\theta} I
123
123
  $$
124
124
  """
125
125
 
@@ -133,7 +133,7 @@ class ShiftOp(PrimitiveOp):
133
133
  A phase shift operator.
134
134
 
135
135
  $$
136
- Shift(\theta) = \\begin{bmatrix} 1 & 0 \\\\ 0 & e^{i \\theta} \\end{bmatrix}
136
+ \\text{Shift}(\\theta) = \\begin{bmatrix} 1 & 0 \\\\ 0 & e^{i \\theta} \\end{bmatrix}
137
137
  $$
138
138
  """
139
139
 
@@ -144,7 +144,7 @@ class ShiftOp(PrimitiveOp):
144
144
  @statement(dialect=dialect)
145
145
  class Reset(PrimitiveOp):
146
146
  """
147
- Reset operator for qubits or wires.
147
+ Reset operator for qubits and wires.
148
148
  """
149
149
 
150
150
  traits = frozenset({ir.Pure(), lowering.FromPythonCall(), FixedSites(1)})
@@ -126,6 +126,14 @@ class SquinU3ToClifford(RewriteRule):
126
126
  if theta is None or phi is None or lam is None:
127
127
  return ()
128
128
 
129
+ # For U3(2*pi*n, phi, lam) = U3(0, 0, lam + phi) which is a Z rotation.
130
+ if np.isclose(np.mod(theta, math.tau), 0):
131
+ lam = lam + phi
132
+ phi = 0.0
133
+ elif np.isclose(np.mod(theta + np.pi, math.tau), 0):
134
+ lam = lam - phi
135
+ phi = 0.0
136
+
129
137
  theta_half_pi: int | None = self.resolve_angle(theta)
130
138
  phi_half_pi: int | None = self.resolve_angle(phi)
131
139
  lam_half_pi: int | None = self.resolve_angle(lam)
@@ -54,7 +54,9 @@ class ApplyDesugarRule(RewriteRule):
54
54
  qubits = node.qubits
55
55
 
56
56
  if len(qubits) > 1 and all(q.type.is_subseteq(QubitType) for q in qubits):
57
- (qubits_ilist_stmt := ilist.New(qubits)).insert_before(node)
57
+ (qubits_ilist_stmt := ilist.New(qubits)).insert_before(
58
+ node
59
+ ) # qubits is just a tuple of SSAValues
58
60
  qubits_ilist = qubits_ilist_stmt.result
59
61
 
60
62
  elif len(qubits) == 1 and qubits[0].type.is_subseteq(QubitType):
@@ -76,34 +78,44 @@ class ApplyDesugarRule(RewriteRule):
76
78
  return RewriteResult()
77
79
 
78
80
  is_ilist = isinstance(qbit_stmt := qubits[0].stmt, ilist.New)
81
+
79
82
  if is_ilist:
80
- if len(qbit_stmt.values) != 1:
81
- return RewriteResult()
82
83
 
83
- if not isinstance(
84
- qbit_getindex_result := qbit_stmt.values[0], ir.ResultValue
84
+ if not all(
85
+ isinstance(qbit_getindex_result, ir.ResultValue)
86
+ for qbit_getindex_result in qbit_stmt.values
85
87
  ):
86
88
  return RewriteResult()
87
89
 
88
- qbit_getindex = qbit_getindex_result.stmt
90
+ # Get the parent statement that the qubit came from
91
+ # (should be a GetItem instance, see logic below)
92
+ qbit_getindices = [
93
+ qbit_getindex_result.stmt
94
+ for qbit_getindex_result in qbit_stmt.values
95
+ ]
89
96
  else:
90
- qbit_getindex = qubits[0].stmt
97
+ qbit_getindices = [qubit.stmt for qubit in qubits]
91
98
 
92
- if not isinstance(qbit_getindex, py.indexing.GetItem):
99
+ if any(
100
+ not isinstance(qbit_getindex, py.indexing.GetItem)
101
+ for qbit_getindex in qbit_getindices
102
+ ):
93
103
  return RewriteResult()
94
104
 
95
- if not qbit_getindex.obj.type.is_subseteq(
96
- ilist.IListType[QubitType, types.Any]
105
+ # The GetItem should have been applied on something that returns an IList of Qubits
106
+ if any(
107
+ not qbit_getindex.obj.type.is_subseteq(
108
+ ilist.IListType[QubitType, types.Any]
109
+ )
110
+ for qbit_getindex in qbit_getindices
97
111
  ):
98
112
  return RewriteResult()
99
113
 
100
114
  if is_ilist:
101
- values = qbit_stmt.values
115
+ qubits_ilist = qbit_stmt.result
102
116
  else:
103
- values = [qubits[0]]
104
-
105
- (qubits_ilist_stmt := ilist.New(values=values)).insert_before(node)
106
- qubits_ilist = qubits_ilist_stmt.result
117
+ (qubits_ilist_stmt := ilist.New(values=[qubits[0]])).insert_before(node)
118
+ qubits_ilist = qubits_ilist_stmt.result
107
119
  else:
108
120
  return RewriteResult()
109
121
 
@@ -11,7 +11,6 @@ from kirin.rewrite import (
11
11
  DeadCodeElimination,
12
12
  CommonSubexpressionElimination,
13
13
  )
14
- from kirin.analysis import const
15
14
  from kirin.dialects import scf, ilist
16
15
  from kirin.ir.method import Method
17
16
  from kirin.passes.abc import Pass
@@ -44,11 +43,6 @@ class SquinToStimPass(Pass):
44
43
 
45
44
  def unsafe_run(self, mt: Method) -> RewriteResult:
46
45
 
47
- cp_frame, _ = const.Propagate(dialects=mt.dialects).run_analysis(mt)
48
- cp_results = cp_frame.entries
49
-
50
- # Assume that address analysis and
51
- # wrapping has been done before this pass!
52
46
  # inline aggressively:
53
47
  rewrite_result = InlinePass(
54
48
  dialects=mt.dialects, no_raise=self.no_raise
@@ -117,11 +111,7 @@ class SquinToStimPass(Pass):
117
111
  )
118
112
 
119
113
  # Rewrite the noise statements first.
120
- rewrite_result = (
121
- Walk(SquinNoiseToStim(cp_results=cp_results))
122
- .rewrite(mt.code)
123
- .join(rewrite_result)
124
- )
114
+ rewrite_result = Walk(SquinNoiseToStim()).rewrite(mt.code).join(rewrite_result)
125
115
 
126
116
  # Wrap Rewrite + SquinToStim can happen w/ standard walk
127
117
  rewrite_result = Walk(SquinU3ToClifford()).rewrite(mt.code).join(rewrite_result)
@@ -1,14 +1,14 @@
1
- from typing import Dict, Tuple
1
+ from typing import Tuple
2
2
  from dataclasses import dataclass
3
3
 
4
4
  from kirin.ir import SSAValue, Statement
5
- from kirin.analysis import const
6
- from kirin.dialects import py
5
+ from kirin.dialects import py, ilist
7
6
  from kirin.rewrite.abc import RewriteRule, RewriteResult
8
7
 
9
- from bloqade.squin import wire, noise as squin_noise, qubit
8
+ from bloqade.squin import op, wire, noise as squin_noise, qubit
10
9
  from bloqade.stim.dialects import noise as stim_noise
11
10
  from bloqade.stim.rewrite.util import (
11
+ get_const_value,
12
12
  create_wire_passthrough,
13
13
  insert_qubit_idx_after_apply,
14
14
  )
@@ -17,8 +17,6 @@ from bloqade.stim.rewrite.util import (
17
17
  @dataclass
18
18
  class SquinNoiseToStim(RewriteRule):
19
19
 
20
- cp_results: Dict[SSAValue, const.Result]
21
-
22
20
  def rewrite_Statement(self, node: Statement) -> RewriteResult:
23
21
  match node:
24
22
  case qubit.Apply() | qubit.Broadcast():
@@ -34,17 +32,17 @@ class SquinNoiseToStim(RewriteRule):
34
32
  # this is an SSAValue, need it to be the actual operator
35
33
  applied_op = stmt.operator.owner
36
34
 
35
+ if isinstance(applied_op, squin_noise.stmts.QubitLoss):
36
+ return RewriteResult()
37
+
37
38
  if isinstance(applied_op, squin_noise.stmts.NoiseChannel):
38
39
 
39
40
  qubit_idx_ssas = insert_qubit_idx_after_apply(stmt=stmt)
40
41
  if qubit_idx_ssas is None:
41
42
  return RewriteResult()
42
43
 
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)
44
+ rewrite_method = getattr(self, f"rewrite_{type(applied_op).__name__}")
45
+ stim_stmt = rewrite_method(stmt, qubit_idx_ssas)
48
46
 
49
47
  if isinstance(stmt, (wire.Apply, wire.Broadcast)):
50
48
  create_wire_passthrough(stmt)
@@ -57,6 +55,29 @@ class SquinNoiseToStim(RewriteRule):
57
55
  return RewriteResult(has_done_something=True)
58
56
  return RewriteResult()
59
57
 
58
+ def rewrite_PauliError(
59
+ self,
60
+ stmt: qubit.Apply | qubit.Broadcast | wire.Broadcast | wire.Apply,
61
+ qubit_idx_ssas: Tuple[SSAValue],
62
+ ) -> Statement:
63
+ """Rewrite squin.noise.PauliError to XError, YError, ZError."""
64
+ squin_channel = stmt.operator.owner
65
+ assert isinstance(squin_channel, squin_noise.stmts.PauliError)
66
+ basis = squin_channel.basis.owner
67
+ assert isinstance(basis, op.stmts.PauliOp)
68
+ p = get_const_value(float, squin_channel.p)
69
+
70
+ p_stmt = py.Constant(p)
71
+ p_stmt.insert_before(stmt)
72
+
73
+ if isinstance(basis, op.stmts.X):
74
+ stim_stmt = stim_noise.XError(targets=qubit_idx_ssas, p=p_stmt.result)
75
+ elif isinstance(basis, op.stmts.Y):
76
+ stim_stmt = stim_noise.YError(targets=qubit_idx_ssas, p=p_stmt.result)
77
+ else:
78
+ stim_stmt = stim_noise.ZError(targets=qubit_idx_ssas, p=p_stmt.result)
79
+ return stim_stmt
80
+
60
81
  def rewrite_SingleQubitPauliChannel(
61
82
  self,
62
83
  stmt: qubit.Apply | qubit.Broadcast | wire.Broadcast | wire.Apply,
@@ -67,7 +88,7 @@ class SquinNoiseToStim(RewriteRule):
67
88
  squin_channel = stmt.operator.owner
68
89
  assert isinstance(squin_channel, squin_noise.stmts.SingleQubitPauliChannel)
69
90
 
70
- params = self.cp_results.get(squin_channel.params).data
91
+ params = get_const_value(ilist.IList, squin_channel.params)
71
92
  new_stmts = [
72
93
  p_x := py.Constant(params[0]),
73
94
  p_y := py.Constant(params[1]),
@@ -94,7 +115,7 @@ class SquinNoiseToStim(RewriteRule):
94
115
  squin_channel = stmt.operator.owner
95
116
  assert isinstance(squin_channel, squin_noise.stmts.TwoQubitPauliChannel)
96
117
 
97
- params = self.cp_results.get(squin_channel.params).data
118
+ params = get_const_value(ilist.IList, squin_channel.params)
98
119
  param_stmts = [py.Constant(p) for p in params]
99
120
  for param_stmt in param_stmts:
100
121
  param_stmt.insert_before(stmt)
@@ -118,3 +139,37 @@ class SquinNoiseToStim(RewriteRule):
118
139
  pzz=param_stmts[14].result,
119
140
  )
120
141
  return stim_stmt
142
+
143
+ def rewrite_Depolarize2(
144
+ self,
145
+ stmt: qubit.Apply | qubit.Broadcast | wire.Broadcast | wire.Apply,
146
+ qubit_idx_ssas: Tuple[SSAValue],
147
+ ) -> Statement:
148
+ """Rewrite squin.noise.Depolarize2 to stim.Depolarize2."""
149
+
150
+ squin_channel = stmt.operator.owner
151
+ assert isinstance(squin_channel, squin_noise.stmts.Depolarize2)
152
+
153
+ p = get_const_value(float, squin_channel.p)
154
+ p_stmt = py.Constant(p)
155
+ p_stmt.insert_before(stmt)
156
+
157
+ stim_stmt = stim_noise.Depolarize2(targets=qubit_idx_ssas, p=p_stmt.result)
158
+ return stim_stmt
159
+
160
+ def rewrite_Depolarize(
161
+ self,
162
+ stmt: qubit.Apply | qubit.Broadcast | wire.Broadcast | wire.Apply,
163
+ qubit_idx_ssas: Tuple[SSAValue],
164
+ ) -> Statement:
165
+ """Rewrite squin.noise.Depolarize to stim.Depolarize1."""
166
+
167
+ squin_channel = stmt.operator.owner
168
+ assert isinstance(squin_channel, squin_noise.stmts.Depolarize)
169
+
170
+ p = get_const_value(float, squin_channel.p)
171
+ p_stmt = py.Constant(p)
172
+ p_stmt.insert_before(stmt)
173
+
174
+ stim_stmt = stim_noise.Depolarize1(targets=qubit_idx_ssas, p=p_stmt.result)
175
+ return stim_stmt
@@ -1,4 +1,7 @@
1
- from kirin import ir
1
+ from typing import TypeVar
2
+
3
+ from kirin import ir, interp
4
+ from kirin.analysis import const
2
5
  from kirin.dialects import py
3
6
  from kirin.rewrite.abc import RewriteResult
4
7
 
@@ -201,3 +204,19 @@ def is_measure_result_used(
201
204
  Check if the result of a measure statement is used in the program.
202
205
  """
203
206
  return bool(stmt.result.uses)
207
+
208
+
209
+ T = TypeVar("T")
210
+
211
+
212
+ def get_const_value(typ: type[T], value: ir.SSAValue) -> T:
213
+ if isinstance(hint := value.hints.get("const"), const.Value):
214
+ data = hint.data
215
+ if isinstance(data, typ):
216
+ return hint.data
217
+ raise interp.InterpreterError(
218
+ f"Expected constant value <type = {typ}>, got {data}"
219
+ )
220
+ raise interp.InterpreterError(
221
+ f"Expected constant value <type = {typ}>, got {value}"
222
+ )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bloqade-circuit
3
- Version: 0.5.2
3
+ Version: 0.6.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
@@ -141,24 +141,24 @@ bloqade/squin/cirq/emit/noise.py,sha256=rESjGC_66s2Y4FwwYda4rY3mYHYjbqLlKE_vnqpZ
141
141
  bloqade/squin/cirq/emit/op.py,sha256=z54NP5KqMxffXeFGWamEzvunpTNrxmYuluurk4j2-ps,4000
142
142
  bloqade/squin/cirq/emit/qubit.py,sha256=Z2HUsZmJ5F2uHCPGru81ux2usoX77KwtS97_cgeJRMI,1910
143
143
  bloqade/squin/cirq/emit/runtime.py,sha256=dH7JSMt2mALPhVFjmZETQzvnTUQ3BFY5poe0YZpM5vQ,6819
144
- bloqade/squin/noise/__init__.py,sha256=HQl3FE0SZAGEX3qdveapCaMX391lgLvWeWnoE6Z2pYw,332
144
+ bloqade/squin/noise/__init__.py,sha256=xST2qojx6ZApRoiKIXOtifDzSpTZgo-67ja309FFvWw,364
145
145
  bloqade/squin/noise/_dialect.py,sha256=2IR98J-lXm5Y3srP9g-FD4JC-qTq2seureM6mKKq1xg,63
146
- bloqade/squin/noise/_wrapper.py,sha256=b2HymlFi1BTgAZRaXvRnujJsoXkowmxQFPRBgZso82g,750
146
+ bloqade/squin/noise/_wrapper.py,sha256=P8fkr1_2U47PtvqnQqeTI7VzThNIK17cNh2QX6ABh_w,815
147
147
  bloqade/squin/noise/rewrite.py,sha256=-IqFfDGnhuaFI-9b6PXjhSuiXFM1C5Qu0ibL5GvZldI,3917
148
- bloqade/squin/noise/stmts.py,sha256=jktv_7nlfE7PizsPVl-LXcu71eVOcubx1CHGmpUgel8,1689
148
+ bloqade/squin/noise/stmts.py,sha256=F8AsDp2xsLez9vkSamDW985MUCubz3TMRrE0L745GmI,1875
149
149
  bloqade/squin/op/__init__.py,sha256=6JOjPdzc6RKO4299ZFz4Jk-wtVyPlGTkakYewHBueXw,841
150
150
  bloqade/squin/op/_dialect.py,sha256=66G1IYqmsqUEaCTyUqn2shSHmGYduiTU8GfDXcoMvw4,55
151
151
  bloqade/squin/op/_wrapper.py,sha256=bg6MLA6u-qkPpo-sKL3lib1VVtQWKCe6RMZb57w8PJQ,1929
152
152
  bloqade/squin/op/number.py,sha256=yujWUqLrOAr8i8OBDsiS5M882wV7t08u345NgNA6TUc,95
153
153
  bloqade/squin/op/rewrite.py,sha256=Itxz_hTAPNLyLYeLS0PCVk143J1Z558UR7N9-urbnoU,1327
154
154
  bloqade/squin/op/stdlib.py,sha256=4UFK3wKImpums2v5a9OFKuVvz2TLYbYwidg3JYYEi2o,1073
155
- bloqade/squin/op/stmts.py,sha256=68dASDOK6IFqS4G02A5Wlnc4ThyyIrls4aurK09aqgE,5975
155
+ bloqade/squin/op/stmts.py,sha256=wPfEzial7_onG9zUaFxQ7iz2wrojQ1PIC9--NX-InFc,6001
156
156
  bloqade/squin/op/traits.py,sha256=jjsnzWtPtmQK7K3H_D2fvc8XiW1Y3EMBcgeyPax2sjc,1065
157
157
  bloqade/squin/op/types.py,sha256=ozUT0Bv9NuUxPjB2vAeqJ9cpdvUaBfP9trB5mybYxgc,663
158
- bloqade/squin/rewrite/U3_to_clifford.py,sha256=HpkFTqe-J0macb_aNs1QNs8wJDoUsmwf9Mtb0I3ZepI,5377
158
+ bloqade/squin/rewrite/U3_to_clifford.py,sha256=72ECWFrjeaEelR5e6IgNgaJXnTQ6ZXL4ZakZfXQbi8I,5670
159
159
  bloqade/squin/rewrite/__init__.py,sha256=cY1GbXQXKvDeXi0YE4PgjORm6iGBPk63xzMCpVjiCgw,349
160
160
  bloqade/squin/rewrite/canonicalize.py,sha256=hcfsn4ntsvnJ_cVnoUgcE5Zk9EqvwgixGArLPx4OjP0,2100
161
- bloqade/squin/rewrite/desugar.py,sha256=ZPZnhBvIpPYOZDCFsyja4-AL5KMGfH0h8kS-AGu6sHY,3526
161
+ bloqade/squin/rewrite/desugar.py,sha256=sZKqnwyoM7_gIEKbXOVE9aQKLrRiSfC8f6Lddada0So,4075
162
162
  bloqade/squin/rewrite/remove_dangling_qubits.py,sha256=iTuWV-03YW5wtYbSeKMlnnWjNzDj9SmflyqYPgoYGy8,469
163
163
  bloqade/squin/rewrite/wrap_analysis.py,sha256=JUPS4OAYbDHOK0VIrdz1pprSizISUfN7osuoP_P-bIo,2256
164
164
  bloqade/stim/__init__.py,sha256=QPZnQRWiiC66pwZ4yRiX2m5doqgPQorQLqc3b7fav2A,935
@@ -200,14 +200,14 @@ bloqade/stim/parse/__init__.py,sha256=l2DjReB2KkgrDjP_4nP6RnoziiOewoSeZfTno1sVYT
200
200
  bloqade/stim/parse/lowering.py,sha256=L-IcR_exlxsTVv4SQ0bhzIF4_L82P-GEdK6qRd6B86Y,23723
201
201
  bloqade/stim/passes/__init__.py,sha256=SO4OJLaRxq9Lt2AaUxNqiAz-eJnfWsJ6TijUAX64DM4,62
202
202
  bloqade/stim/passes/simplify_ifs.py,sha256=45lWKmc6ybt0KjEuE297IouPVJ7NwX_j9q4GNUsIkEc,690
203
- bloqade/stim/passes/squin_to_stim.py,sha256=jUch2SFE0LxgkTFEEdXRfMaM7hsMtIlXXBLfOmI9mqA,5439
203
+ bloqade/stim/passes/squin_to_stim.py,sha256=pZvSd1rmOnLRfZONctQAb6ORjcoMd1Qjpbhyf-7m-MQ,5125
204
204
  bloqade/stim/rewrite/__init__.py,sha256=SHWryh7rZHXOlIz8BMNpj-w7-8VQCRMLt6PfzYFbBfw,434
205
205
  bloqade/stim/rewrite/ifs_to_stim.py,sha256=LXkmmTIgi8-Exrz1EGjG8QpdRn6EV3HZM-bZeAaf-cQ,6718
206
206
  bloqade/stim/rewrite/py_constant_to_stim.py,sha256=PV8bHvn759-d_0JW4akaGSORW_oxigrlUBhAC51PJAU,1354
207
207
  bloqade/stim/rewrite/qubit_to_stim.py,sha256=oiKmi8BlBwXJq-8kGhN1nXgyxJ2UIt_9uouNkU1J8vs,2624
208
208
  bloqade/stim/rewrite/squin_measure.py,sha256=zPH2q_ciV2D615GK9l9LWGYmjv3dOju18jKMYERIL7c,4817
209
- bloqade/stim/rewrite/squin_noise.py,sha256=dNt3C2fHebPEYYqlY2eonqiQr7V6GwIl69mI9E5U61g,4265
210
- bloqade/stim/rewrite/util.py,sha256=XgQnY7UoGf-f-C9EKQzJUCp3H3aC9xQ2hdil7ygvWSg,6734
209
+ bloqade/stim/rewrite/squin_noise.py,sha256=NafmAiByT4Y5895fZM4Od8arKjsJuW6F5wvRpAFFo70,6240
210
+ bloqade/stim/rewrite/util.py,sha256=xnLDiEj45CBoG3mpG-ywE1Jjh1k_OVP4iI1A75VR6sw,7257
211
211
  bloqade/stim/rewrite/wire_identity_elimination.py,sha256=Cscu8yaSslPuW04HvbXx4HJ3JzdUZNUMyFqcvuc4sxY,795
212
212
  bloqade/stim/rewrite/wire_to_stim.py,sha256=rZY4Ya4I2b4C3tk84LvJvEi--jyUgza8WmtDtTxCajI,1814
213
213
  bloqade/stim/upstream/__init__.py,sha256=Skev79lMyfz2bFoih-Fn_9iXbMArqlKxHSd1agHAtlA,55
@@ -223,7 +223,7 @@ bloqade/visual/animation/runtime/atoms.py,sha256=EmjxhujLiHHPS_HtH_B-7TiqeHgvW5u
223
223
  bloqade/visual/animation/runtime/ppoly.py,sha256=JB9IP53N1w6adBJEue6J5Nmj818Id9JvrlgrmiQTU1I,1385
224
224
  bloqade/visual/animation/runtime/qpustate.py,sha256=rlmxQeJSvaohXrTpXQL5y-NJcpvfW33xPaYM1slv7cc,4270
225
225
  bloqade/visual/animation/runtime/utils.py,sha256=ju9IzOWX-vKwfpqUjlUKu3Ssr_UFPFFq-tzH_Nqyo_c,1212
226
- bloqade_circuit-0.5.2.dist-info/METADATA,sha256=NoyouHncNQUg995yqE8s3Tn4cO6X6Z3eacZtcxyEmd0,3849
227
- bloqade_circuit-0.5.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
228
- bloqade_circuit-0.5.2.dist-info/licenses/LICENSE,sha256=S5GIJwR6QCixPA9wryYb44ZEek0Nz4rt_zLUqP05UbU,13160
229
- bloqade_circuit-0.5.2.dist-info/RECORD,,
226
+ bloqade_circuit-0.6.0.dist-info/METADATA,sha256=frsGcfoDPFTPVqO-q6wD0wMPtXtSTxyrERi4krz2x7w,3849
227
+ bloqade_circuit-0.6.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
228
+ bloqade_circuit-0.6.0.dist-info/licenses/LICENSE,sha256=S5GIJwR6QCixPA9wryYb44ZEek0Nz4rt_zLUqP05UbU,13160
229
+ bloqade_circuit-0.6.0.dist-info/RECORD,,