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
 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)