Skip to content

Commit 5ce65b7

Browse files
authored
fix: cast node.size to IntegerLiteral for qubit register size (#258)
Fixes bug [#240] by casting node.size into IntegerLiteral
1 parent a4d7f98 commit 5ce65b7

File tree

3 files changed

+89
-4
lines changed

3 files changed

+89
-4
lines changed

src/braket/default_simulator/openqasm/_helpers/functions.py

+8-2
Original file line numberDiff line numberDiff line change
@@ -98,10 +98,16 @@
9898
[BooleanLiteral(xv.value ^ yv.value) for xv, yv in zip(x.values, y.values)]
9999
),
100100
getattr(BinaryOperator, "<<"): lambda x, y: ArrayLiteral(
101-
x.values[y.value :] + [BooleanLiteral(False) for _ in range(y.value)]
101+
x.values[len(y.values) :] + [BooleanLiteral(False) for _ in range(len(y.values))]
102+
if isinstance(y, ArrayLiteral)
103+
else x.values[y.value :] + [BooleanLiteral(False) for _ in range(y.value)]
102104
),
103105
getattr(BinaryOperator, ">>"): lambda x, y: ArrayLiteral(
104-
[BooleanLiteral(False) for _ in range(y.value)] + x.values[: len(x.values) - y.value]
106+
[BooleanLiteral(False) for _ in range(len(y.values))]
107+
+ x.values[: len(x.values) - len(y.values)]
108+
if isinstance(y, ArrayLiteral)
109+
else [BooleanLiteral(False) for _ in range(y.value)]
110+
+ x.values[: len(x.values) - y.value]
105111
),
106112
getattr(UnaryOperator, "~"): lambda x: ArrayLiteral(
107113
[BooleanLiteral(not v.value) for v in x.values]

src/braket/default_simulator/openqasm/interpreter.py

+7-2
Original file line numberDiff line numberDiff line change
@@ -247,8 +247,13 @@ def _(self, node: Identifier) -> LiteralType:
247247

248248
@visit.register
249249
def _(self, node: QubitDeclaration) -> None:
250-
size = self.visit(node.size).value if node.size else 1
251-
self.context.add_qubits(node.qubit.name, size)
250+
size_arg = self.visit(node.size)
251+
if isinstance(size_arg, ArrayLiteral) and size_arg:
252+
size = "".join(str(cast_to(IntegerLiteral, qubit).value) for qubit in size_arg.values)
253+
self.context.add_qubits(node.qubit.name, int(size, 2))
254+
else:
255+
size = size_arg.value if size_arg else 1
256+
self.context.add_qubits(node.qubit.name, size)
252257

253258
@visit.register
254259
def _(self, node: QuantumReset) -> None:

test/unit_tests/braket/default_simulator/openqasm/test_interpreter.py

+74
Original file line numberDiff line numberDiff line change
@@ -2207,3 +2207,77 @@ def test_measure_invalid_qubit():
22072207
def test_measure_qubit_out_of_range(qasm, expected):
22082208
with pytest.raises(IndexError, match=expected):
22092209
Interpreter().build_circuit(qasm)
2210+
2211+
2212+
@pytest.mark.parametrize(
2213+
"qasm, expected",
2214+
[
2215+
(
2216+
"""
2217+
bit[2] b;
2218+
qubit["10"] r1;
2219+
b = measure r1;
2220+
""",
2221+
[0, 1],
2222+
),
2223+
(
2224+
"""
2225+
bit[3] b;
2226+
qubit["11"] r1;
2227+
b = measure r1;
2228+
""",
2229+
[0, 1, 2],
2230+
),
2231+
(
2232+
"""
2233+
bit[1] b;
2234+
qubit[!"1"] r1;
2235+
b = measure r1;
2236+
""",
2237+
[],
2238+
),
2239+
(
2240+
"""
2241+
qubit["1" ^ "0"] r1;
2242+
""",
2243+
[],
2244+
),
2245+
(
2246+
"""
2247+
bit[1] b;
2248+
qubit["1" != "0"] r1;
2249+
b = measure r1;
2250+
""",
2251+
[0],
2252+
),
2253+
(
2254+
"""
2255+
bit[1] b;
2256+
qubit["1" == "0"] r1;
2257+
b = measure r1;
2258+
""",
2259+
[],
2260+
),
2261+
(
2262+
"""
2263+
bit[1] b;
2264+
qubit[1] r1;
2265+
h r1["0" << "1"];
2266+
b = measure r1;
2267+
""",
2268+
[0],
2269+
),
2270+
(
2271+
"""
2272+
bit[2] b;
2273+
qubit[1] r1;
2274+
h r1["0" >> "1"];
2275+
b = measure r1;
2276+
""",
2277+
[0],
2278+
),
2279+
],
2280+
)
2281+
def test_circuit_from_string_literal(qasm, expected):
2282+
circ = Interpreter().build_circuit(source=qasm)
2283+
assert expected == circ.measured_qubits

0 commit comments

Comments
 (0)