Skip to content

Qubit to stim

SquinQubitToStim

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
 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
133
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_RotationGate

rewrite_RotationGate(stmt: RotationGate) -> RewriteResult

Rewrite rotation gate nodes (Rx, Ry, Rz) to stim rotation gate statements. Emits as I[R_X/R_Y/R_Z(theta=...)] in Stim annotation format. 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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
def rewrite_RotationGate(self, stmt: gate.stmts.RotationGate) -> RewriteResult:
    """
    Rewrite rotation gate nodes (Rx, Ry, Rz) to stim rotation gate statements. Emits as I[R_X/R_Y/R_Z(theta=...)] in Stim annotation format.
    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()

    rotation_gate_map = {
        gate.stmts.Rx: stim_gate.stmts.Rx,
        gate.stmts.Ry: stim_gate.stmts.Ry,
        gate.stmts.Rz: stim_gate.stmts.Rz,
    }

    stim_stmt_cls = rotation_gate_map.get(type(stmt))
    if stim_stmt_cls is None:
        return RewriteResult()

    stim_stmt = stim_stmt_cls(targets=tuple(qubit_idx_ssas), angle=stmt.angle)
    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
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
93
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)

rewrite_U3Gate

rewrite_U3Gate(stmt: U3) -> RewriteResult

Rewrite U3 gate nodes to stim U3 gate statements. Emits as I[U3(theta=..., phi=..., lambda=...)] in Stim annotation format. 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
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
def rewrite_U3Gate(self, stmt: gate.stmts.U3) -> RewriteResult:
    """
    Rewrite U3 gate nodes to stim U3 gate statements. Emits as I[U3(theta=..., phi=..., lambda=...)] in Stim annotation format.
    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()

    stim_stmt = stim_gate.stmts.U3(
        targets=tuple(qubit_idx_ssas),
        theta=stmt.theta,
        phi=stmt.phi,
        lam=stmt.lam,
    )
    stmt.replace_by(stim_stmt)

    return RewriteResult(has_done_something=True)