Skip to content

Ops

ops

QubitAttr

Bases: StimPrintable, ParametrizedAttribute, TypeAttribute

Type for a single qubit.

Source code in xdsl/dialects/stim/ops.py
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
@irdl_attr_definition
class QubitAttr(StimPrintable, ParametrizedAttribute, TypeAttribute):
    """
    Type for a single qubit.
    """

    name = "stim.qubit"

    qubit: IntAttr

    def __init__(self, qubit: int | IntAttr) -> None:
        if not isinstance(qubit, IntAttr):
            qubit = IntAttr(qubit)
        super().__init__(qubit)

    @classmethod
    def parse_parameters(cls, parser: AttrParser) -> Sequence[IntAttr]:
        with parser.in_angle_brackets():
            qubit = parser.parse_integer(allow_negative=False, allow_boolean=False)
            return (IntAttr(qubit),)

    def print_parameters(self, printer: Printer) -> None:
        with printer.in_angle_brackets():
            printer.print_int(self.qubit.data)

    def print_stim(self, printer: StimPrinter):
        printer.print_string(f"{self.qubit.data}")

name = 'stim.qubit' class-attribute instance-attribute

qubit: IntAttr instance-attribute

__init__(qubit: int | IntAttr) -> None

Source code in xdsl/dialects/stim/ops.py
30
31
32
33
def __init__(self, qubit: int | IntAttr) -> None:
    if not isinstance(qubit, IntAttr):
        qubit = IntAttr(qubit)
    super().__init__(qubit)

parse_parameters(parser: AttrParser) -> Sequence[IntAttr] classmethod

Source code in xdsl/dialects/stim/ops.py
35
36
37
38
39
@classmethod
def parse_parameters(cls, parser: AttrParser) -> Sequence[IntAttr]:
    with parser.in_angle_brackets():
        qubit = parser.parse_integer(allow_negative=False, allow_boolean=False)
        return (IntAttr(qubit),)

print_parameters(printer: Printer) -> None

Source code in xdsl/dialects/stim/ops.py
41
42
43
def print_parameters(self, printer: Printer) -> None:
    with printer.in_angle_brackets():
        printer.print_int(self.qubit.data)

print_stim(printer: StimPrinter)

Source code in xdsl/dialects/stim/ops.py
45
46
def print_stim(self, printer: StimPrinter):
    printer.print_string(f"{self.qubit.data}")

QubitMappingAttr

Bases: StimPrintable, ParametrizedAttribute

This attribute provides a way to indicate the required connectivity or layout of physical qubits.

It consists of two parameters
  1. A co-ordinate array (currently it only anticipates a pair of qubits, but this is not fixed)
  2. A value associated with a qubit referred to in a circuit.

The co-ordinates may be used as a physical address of a qubit, or the relative address with respect to some known physical address.

Operations that attach this as a property may represent the lattice-like structure of a physical quantum computer by having a property with an ArrayAttr[QubitCoordsAttr].

Source code in xdsl/dialects/stim/ops.py
 49
 50
 51
 52
 53
 54
 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
 93
 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
@irdl_attr_definition
class QubitMappingAttr(StimPrintable, ParametrizedAttribute):
    """
    This attribute provides a way to indicate the required connectivity or layout of
    `physical` qubits.

    It consists of two parameters:
     1. A co-ordinate array (currently it only anticipates a pair of qubits, but this is
     not fixed)
     2. A value associated with a qubit referred to in a circuit.

    The co-ordinates may be used as a physical address of a qubit, or the relative
    address with respect to some known physical address.

    Operations that attach this as a property may represent the lattice-like structure
    of a physical quantum computer by having a property with an
    ArrayAttr[QubitCoordsAttr].
    """

    name = "stim.qubit_coord"

    coords: ArrayAttr[FloatData | IntAttr]
    qubit_name: QubitAttr

    def __init__(
        self,
        coords: list[float] | ArrayAttr[FloatData | IntAttr],
        qubit_name: int | QubitAttr,
    ) -> None:
        if not isinstance(qubit_name, QubitAttr):
            qubit_name = QubitAttr(qubit_name)
        if not isinstance(coords, ArrayAttr):
            coords = ArrayAttr(
                (IntAttr(int(arg))) if (type(arg) is int) else (FloatData(arg))
                for arg in coords
            )
        super().__init__(coords, qubit_name)

    @classmethod
    def parse_parameters(
        cls, parser: AttrParser
    ) -> tuple[ArrayAttr[FloatData | IntAttr], QubitAttr]:
        parser.parse_punctuation("<")
        coords = parser.parse_comma_separated_list(
            delimiter=parser.Delimiter.PAREN,
            parse=lambda: (
                IntAttr(x)
                if type(x := parser.parse_number(allow_boolean=False)) is int
                else FloatData(x)
            ),
        )
        parser.parse_punctuation(",")
        qubit = parser.parse_attribute()
        if not isinstance(qubit, QubitAttr):
            parser.raise_error("Expected qubit attr", at_position=parser.pos)
        parser.parse_punctuation(">")
        return (ArrayAttr(coords), qubit)

    def print_parameters(self, printer: Printer) -> None:
        with printer.in_angle_brackets():
            with printer.in_parens():
                printer.print_list(
                    self.coords,
                    lambda c: (
                        printer.print_int(c.data)
                        if isinstance(c, IntAttr)
                        else printer.print_float(c.data, f64)
                    ),
                )
            printer.print_string(", ")
            printer.print_attribute(self.qubit_name)

    def print_stim(self, printer: StimPrinter):
        printer.print_attribute(self.coords)
        self.qubit_name.print_stim(printer)

name = 'stim.qubit_coord' class-attribute instance-attribute

coords: ArrayAttr[FloatData | IntAttr] instance-attribute

qubit_name: QubitAttr instance-attribute

__init__(coords: list[float] | ArrayAttr[FloatData | IntAttr], qubit_name: int | QubitAttr) -> None

Source code in xdsl/dialects/stim/ops.py
73
74
75
76
77
78
79
80
81
82
83
84
85
def __init__(
    self,
    coords: list[float] | ArrayAttr[FloatData | IntAttr],
    qubit_name: int | QubitAttr,
) -> None:
    if not isinstance(qubit_name, QubitAttr):
        qubit_name = QubitAttr(qubit_name)
    if not isinstance(coords, ArrayAttr):
        coords = ArrayAttr(
            (IntAttr(int(arg))) if (type(arg) is int) else (FloatData(arg))
            for arg in coords
        )
    super().__init__(coords, qubit_name)

parse_parameters(parser: AttrParser) -> tuple[ArrayAttr[FloatData | IntAttr], QubitAttr] classmethod

Source code in xdsl/dialects/stim/ops.py
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
@classmethod
def parse_parameters(
    cls, parser: AttrParser
) -> tuple[ArrayAttr[FloatData | IntAttr], QubitAttr]:
    parser.parse_punctuation("<")
    coords = parser.parse_comma_separated_list(
        delimiter=parser.Delimiter.PAREN,
        parse=lambda: (
            IntAttr(x)
            if type(x := parser.parse_number(allow_boolean=False)) is int
            else FloatData(x)
        ),
    )
    parser.parse_punctuation(",")
    qubit = parser.parse_attribute()
    if not isinstance(qubit, QubitAttr):
        parser.raise_error("Expected qubit attr", at_position=parser.pos)
    parser.parse_punctuation(">")
    return (ArrayAttr(coords), qubit)

print_parameters(printer: Printer) -> None

Source code in xdsl/dialects/stim/ops.py
107
108
109
110
111
112
113
114
115
116
117
118
119
def print_parameters(self, printer: Printer) -> None:
    with printer.in_angle_brackets():
        with printer.in_parens():
            printer.print_list(
                self.coords,
                lambda c: (
                    printer.print_int(c.data)
                    if isinstance(c, IntAttr)
                    else printer.print_float(c.data, f64)
                ),
            )
        printer.print_string(", ")
        printer.print_attribute(self.qubit_name)

print_stim(printer: StimPrinter)

Source code in xdsl/dialects/stim/ops.py
121
122
123
def print_stim(self, printer: StimPrinter):
    printer.print_attribute(self.coords)
    self.qubit_name.print_stim(printer)

StimCircuitOp

Bases: StimPrintable, IRDLOperation

Base operation containing a stim program

Source code in xdsl/dialects/stim/ops.py
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
@irdl_op_definition
class StimCircuitOp(StimPrintable, IRDLOperation):
    """
    Base operation containing a stim program
    """

    name = "stim.circuit"

    body = region_def("single_block")

    qubitlayout = opt_prop_def(ArrayAttr[QubitMappingAttr])

    assembly_format = "(`qubitlayout` $qubitlayout^)? attr-dict-with-keyword $body"

    def __init__(self, body: Region, qubitlayout: None | ArrayAttr[QubitMappingAttr]):
        super().__init__(regions=[body], properties={"qubitlayout": qubitlayout})

    def verify(self, verify_nested_ops: bool = True) -> None:
        return

    def print_stim(self, printer: StimPrinter):
        for op in self.body.block.ops:
            printer.print_op(op)
            printer.print_string("\n")
        printer.print_string("")

    def stim(self) -> str:
        io = StringIO()
        printer = StimPrinter(io)
        self.print_stim(printer)
        res = io.getvalue()
        return res

name = 'stim.circuit' class-attribute instance-attribute

body = region_def('single_block') class-attribute instance-attribute

qubitlayout = opt_prop_def(ArrayAttr[QubitMappingAttr]) class-attribute instance-attribute

assembly_format = '(`qubitlayout` $qubitlayout^)? attr-dict-with-keyword $body' class-attribute instance-attribute

__init__(body: Region, qubitlayout: None | ArrayAttr[QubitMappingAttr])

Source code in xdsl/dialects/stim/ops.py
140
141
def __init__(self, body: Region, qubitlayout: None | ArrayAttr[QubitMappingAttr]):
    super().__init__(regions=[body], properties={"qubitlayout": qubitlayout})

verify(verify_nested_ops: bool = True) -> None

Source code in xdsl/dialects/stim/ops.py
143
144
def verify(self, verify_nested_ops: bool = True) -> None:
    return

print_stim(printer: StimPrinter)

Source code in xdsl/dialects/stim/ops.py
146
147
148
149
150
def print_stim(self, printer: StimPrinter):
    for op in self.body.block.ops:
        printer.print_op(op)
        printer.print_string("\n")
    printer.print_string("")

stim() -> str

Source code in xdsl/dialects/stim/ops.py
152
153
154
155
156
157
def stim(self) -> str:
    io = StringIO()
    printer = StimPrinter(io)
    self.print_stim(printer)
    res = io.getvalue()
    return res

AnnotationOp dataclass

Bases: StimPrintable, IRDLOperation, ABC

Base Annotation operation.

This is used to indicate operations that are stim annotations, these do not have operational semantics, so this will be used during transforms to ignore these operations.

Source code in xdsl/dialects/stim/ops.py
173
174
175
176
177
178
179
180
class AnnotationOp(StimPrintable, IRDLOperation, ABC):
    """
    Base Annotation operation.

    This is used to indicate operations that are stim annotations,
    these do not have operational semantics,
    so this will be used during transforms to ignore these operations.
    """

QubitCoordsOp

Bases: AnnotationOp

Annotation operation that assigns a qubit reference to a coordinate.

Source code in xdsl/dialects/stim/ops.py
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
@irdl_op_definition
class QubitCoordsOp(AnnotationOp):
    """
    Annotation operation that assigns a qubit reference to a coordinate.
    """

    name = "stim.assign_qubit_coord"

    qubitmapping = prop_def(QubitMappingAttr)

    assembly_format = "$qubitmapping attr-dict"

    def __init__(self, qubitmapping: QubitMappingAttr):
        super().__init__(properties={"qubitmapping": qubitmapping})

    def print_stim(self, printer: StimPrinter) -> None:
        printer.print_string("QUBIT_COORDS")
        self.qubitmapping.print_stim(printer)

name = 'stim.assign_qubit_coord' class-attribute instance-attribute

qubitmapping = prop_def(QubitMappingAttr) class-attribute instance-attribute

assembly_format = '$qubitmapping attr-dict' class-attribute instance-attribute

__init__(qubitmapping: QubitMappingAttr)

Source code in xdsl/dialects/stim/ops.py
195
196
def __init__(self, qubitmapping: QubitMappingAttr):
    super().__init__(properties={"qubitmapping": qubitmapping})

print_stim(printer: StimPrinter) -> None

Source code in xdsl/dialects/stim/ops.py
198
199
200
def print_stim(self, printer: StimPrinter) -> None:
    printer.print_string("QUBIT_COORDS")
    self.qubitmapping.print_stim(printer)