Skip to content

Commit 6ca3161

Browse files
allow annotations & statements in cal blocks
1 parent 5726a2a commit 6ca3161

3 files changed

Lines changed: 89 additions & 23 deletions

File tree

source/grammar/openpulseParser.g4

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -15,29 +15,32 @@ calibrationBlock: openpulseStatement*;
1515

1616
openpulseStatement:
1717
// Statements can be used in the cal or defcal body
18-
aliasDeclarationStatement
19-
| assignmentStatement
20-
| barrierStatement
21-
| boxStatement
22-
| breakStatement
23-
| classicalDeclarationStatement
24-
| constDeclarationStatement
25-
| continueStatement
26-
| defStatement
27-
| delayStatement
28-
| endStatement
29-
| expressionStatement
30-
| externStatement
31-
| forStatement
32-
| gateCallStatement
33-
| ifStatement
34-
| includeStatement
35-
| ioDeclarationStatement
36-
| quantumDeclarationStatement
37-
| resetStatement
38-
| returnStatement
39-
| whileStatement
40-
;
18+
pragma
19+
| annotation* (
20+
aliasDeclarationStatement
21+
| assignmentStatement
22+
| barrierStatement
23+
| boxStatement
24+
| breakStatement
25+
| classicalDeclarationStatement
26+
| constDeclarationStatement
27+
| continueStatement
28+
| defStatement
29+
| delayStatement
30+
| endStatement
31+
| expressionStatement
32+
| externStatement
33+
| forStatement
34+
| gateCallStatement
35+
| ifStatement
36+
| includeStatement
37+
| ioDeclarationStatement
38+
| quantumDeclarationStatement
39+
| resetStatement
40+
| returnStatement
41+
| whileStatement
42+
)
43+
;
4144

4245
/** In the following we extend existing OpenQASM nodes. Need to refresh whenever OpenQASM is updated. **/
4346
// We extend the scalarType with WAVEFORM, PORT and FRAME

source/openpulse/openpulse/parser.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,14 @@ def visitReturnStatement(self, ctx: qasm3Parser.ReturnStatementContext):
216216
expression = None
217217
return ast.ReturnStatement(expression=expression)
218218

219+
@span
220+
def visitOpenpulseStatement(self, ctx: openpulseParser.OpenpulseStatementContext):
221+
if ctx.pragma():
222+
return self.visit(ctx.pragma())
223+
out = self.visit(ctx.getChild(-1))
224+
out.annotations = [self.visit(annotation) for annotation in ctx.annotation()]
225+
return out
226+
219227

220228
# Reuse some QASMNodeVisitor methods in OpenPulseNodeVisitor
221229
# The following methods are overridden in OpenPulseNodeVisitor and thus not imported:

source/openpulse/tests/test_openpulse_parser.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from openpulse.parser import parse
88
from openpulse.ast import (
99
AngleType,
10+
Annotation,
1011
ArrayLiteral,
1112
ArrayType,
1213
CalibrationDefinition,
@@ -25,6 +26,7 @@
2526
Identifier,
2627
IntegerLiteral,
2728
IntType,
29+
Pragma,
2830
Program,
2931
QASMNode,
3032
QuantumBarrier,
@@ -268,6 +270,59 @@ def test_array():
268270
SpanGuard().visit(program)
269271

270272

273+
def test_annotation_in_cal_block():
274+
p = """
275+
cal {
276+
@foo
277+
int x = 10;
278+
}
279+
"""
280+
281+
program = parse(p)
282+
expected = Program(
283+
statements=[
284+
CalibrationStatement(
285+
body=[
286+
ClassicalDeclaration(
287+
type=IntType(),
288+
identifier=Identifier("x"),
289+
init_expression=IntegerLiteral(10),
290+
)
291+
]
292+
)
293+
]
294+
)
295+
# annotate the declaration
296+
expected.statements[0].body[0].annotations = [Annotation("foo")]
297+
assert _remove_spans(program) == expected
298+
299+
300+
def test_pragma_in_cal_block():
301+
p = """
302+
cal {
303+
#pragma foo bar
304+
int x = 10;
305+
}
306+
"""
307+
308+
program = parse(p)
309+
expected = Program(
310+
statements=[
311+
CalibrationStatement(
312+
body=[
313+
Pragma(command="foo bar"),
314+
ClassicalDeclaration(
315+
type=IntType(),
316+
identifier=Identifier("x"),
317+
init_expression=IntegerLiteral(10),
318+
),
319+
]
320+
)
321+
]
322+
)
323+
assert _remove_spans(program) == expected
324+
325+
271326
@pytest.mark.parametrize(
272327
"p",
273328
[

0 commit comments

Comments
 (0)