Bases: RewriteRule
flowchart TD
bloqade.stim.rewrite.qubit_to_stim.SquinQubitToStim[SquinQubitToStim]
click bloqade.stim.rewrite.qubit_to_stim.SquinQubitToStim href "" "bloqade.stim.rewrite.qubit_to_stim.SquinQubitToStim"
NOTE this require address analysis result to be wrapped before using this rule.
rewrite_ControlledGate
rewrite_ControlledGate(
stmt: ControlledGate,
) -> RewriteResult
Rewrite controlled gate nodes to their stim equivalent statements.
Address Analysis should have been run along with Wrap Analysis before this rewrite is applied.
Source code in .venv/lib/python3.12/site-packages/bloqade/stim/rewrite/qubit_to_stim.py
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132 | def rewrite_ControlledGate(self, stmt: gate.stmts.ControlledGate) -> RewriteResult:
"""
Rewrite controlled gate nodes to their stim equivalent statements.
Address Analysis should have been run along with Wrap Analysis before this rewrite is applied.
"""
controls_addr_attr = stmt.controls.hints.get("address", None)
targets_addr_attr = stmt.targets.hints.get("address", None)
if controls_addr_attr is None or targets_addr_attr is None:
return RewriteResult()
assert isinstance(controls_addr_attr, AddressAttribute)
assert isinstance(targets_addr_attr, AddressAttribute)
controls_idx_ssas = insert_qubit_idx_from_address(
address=controls_addr_attr, stmt_to_insert_before=stmt
)
targets_idx_ssas = insert_qubit_idx_from_address(
address=targets_addr_attr, stmt_to_insert_before=stmt
)
if controls_idx_ssas is None or targets_idx_ssas is None:
return RewriteResult()
# Get the name of the inputted stmt and see if there is an
# equivalently named statement in stim,
# then create an instance of that stim statement
stmt_name = type(stmt).__name__
stim_stmt_cls = getattr(stim_gate.stmts, stmt_name, None)
if stim_stmt_cls is None:
return RewriteResult()
stim_stmt = stim_stmt_cls(
targets=tuple(targets_idx_ssas), controls=tuple(controls_idx_ssas)
)
stmt.replace_by(stim_stmt)
return RewriteResult(has_done_something=True)
|
rewrite_SingleQubitGate
rewrite_SingleQubitGate(
stmt: SingleQubitGate,
) -> RewriteResult
Rewrite single qubit gate nodes to their stim equivalent statements.
Address Analysis should have been run along with Wrap Analysis before this rewrite is applied.
Source code in .venv/lib/python3.12/site-packages/bloqade/stim/rewrite/qubit_to_stim.py
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92 | def rewrite_SingleQubitGate(
self, stmt: gate.stmts.SingleQubitGate
) -> RewriteResult:
"""
Rewrite single qubit gate nodes to their stim equivalent statements.
Address Analysis should have been run along with Wrap Analysis before this rewrite is applied.
"""
qubit_addr_attr = stmt.qubits.hints.get("address", None)
if qubit_addr_attr is None:
return RewriteResult()
assert isinstance(qubit_addr_attr, AddressAttribute)
qubit_idx_ssas = insert_qubit_idx_from_address(
address=qubit_addr_attr, stmt_to_insert_before=stmt
)
if qubit_idx_ssas is None:
return RewriteResult()
# Get the name of the inputted stmt and see if there is an
# equivalently named statement in stim,
# then create an instance of that stim statement
stmt_name = type(stmt).__name__
stim_stmt_cls = getattr(stim_gate.stmts, stmt_name, None)
if stim_stmt_cls is None:
return RewriteResult()
if isinstance(stmt, gate.stmts.SingleQubitNonHermitianGate):
stim_stmt = stim_stmt_cls(
targets=tuple(qubit_idx_ssas), dagger=stmt.adjoint
)
else:
stim_stmt = stim_stmt_cls(targets=tuple(qubit_idx_ssas))
stmt.replace_by(stim_stmt)
return RewriteResult(has_done_something=True)
|