Bases: StimPrintable, ParametrizedAttribute
This attribute provides a way to indicate the required connectivity or layout of
physical qubits.
It consists of two parameters
- A co-ordinate array (currently it only anticipates a pair of qubits, but this is
not fixed)
- 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
| def print_stim(self, printer: StimPrinter):
printer.print_attribute(self.coords)
self.qubit_name.print_stim(printer)
|