diff --git a/src/bloqade/qasm2/parse/lowering.py b/src/bloqade/qasm2/parse/lowering.py index 614732ea..b43e78ee 100644 --- a/src/bloqade/qasm2/parse/lowering.py +++ b/src/bloqade/qasm2/parse/lowering.py @@ -45,6 +45,7 @@ def loads( with state.frame( [stmt], globals=globals, + finalize_next=False, ) as frame: try: self.visit(state, stmt) @@ -398,7 +399,7 @@ def visit_BinOp(self, state: lowering.State[ast.Node], node: ast.BinOp): def visit_UnaryOp(self, state: lowering.State[ast.Node], node: ast.UnaryOp): if node.op == "-": stmt = expr.Neg(value=state.lower(node.operand).expect_one()) - return stmt.result + return state.current_frame.push(stmt).result else: return state.lower(node.operand).expect_one() diff --git a/test/qasm2/test_lowering.py b/test/qasm2/test_lowering.py index 09f5b082..eb245ad1 100644 --- a/test/qasm2/test_lowering.py +++ b/test/qasm2/test_lowering.py @@ -2,6 +2,7 @@ import tempfile import textwrap +from kirin import ir from kirin.dialects import func from bloqade import qasm2 @@ -42,3 +43,40 @@ def test_loadfile(): (ret := kernel.callable_region.blocks[0].last_stmt), func.Return ) assert ret.value.type.is_equal(qasm2.types.CRegType) + + +def test_negative_lowering(): + + mwe = """ + OPENQASM 2.0; + include "qelib1.inc"; + qreg q[1]; + rz(-0.2) q[0]; + """ + + entry = QASM2(qasm2.main).loads(mwe, "entry", returns="q") + + body = ir.Region( + ir.Block( + [ + (size := qasm2.expr.ConstInt(value=1)), + (qreg := qasm2.core.QRegNew(n_qubits=size.result)), + (phi := qasm2.expr.ConstFloat(value=0.2)), + (theta := qasm2.expr.Neg(phi.result)), + (idx := qasm2.expr.ConstInt(value=0)), + (qubit := qasm2.core.QRegGet(qreg.result, idx.result)), + (qasm2.uop.RZ(qubit.result, theta.result)), + (func.Return(qreg.result)), + ] + ) + ) + + code = func.Function( + sym_name="entry", + signature=func.Signature((), qasm2.QRegType), + body=body, + ) + + code.print() + + assert entry.code.is_structurally_equal(code)