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
@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
@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
105
106
107
108
109
110
111
112
113
114
115
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
117
118
119
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
122
123
124
125
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
@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
136
137
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
139
140
def verify(self, verify_nested_ops: bool = True) -> None:
    return

print_stim(printer: StimPrinter)

Source code in xdsl/dialects/stim/ops.py
142
143
144
145
146
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
148
149
150
151
152
153
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
169
170
171
172
173
174
175
176
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
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
@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
191
192
def __init__(self, qubitmapping: QubitMappingAttr):
    super().__init__(properties={"qubitmapping": qubitmapping})

print_stim(printer: StimPrinter) -> None

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