Skip to content

Commit 85eaade

Browse files
authored
Merge pull request #37 from hodgestar/feature/add-extern-port-statement
Add parser support for "extern port" and "extern frame" statements
2 parents 9cd7eaa + f74ca27 commit 85eaade

File tree

4 files changed

+33
-0
lines changed

4 files changed

+33
-0
lines changed

source/grammar/openpulseParser.g4

+6
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ openpulseStatement:
3030
| endStatement
3131
| expressionStatement
3232
| externStatement
33+
| externFrameStatement
34+
| externPortStatement
3335
| forStatement
3436
| gateCallStatement
3537
| ifStatement
@@ -59,3 +61,7 @@ scalarType:
5961
| PORT
6062
| FRAME
6163
;
64+
65+
66+
externFrameStatement: EXTERN FRAME Identifier SEMICOLON;
67+
externPortStatement: EXTERN PORT Identifier SEMICOLON;

source/openpulse/openpulse/ast.py

+18
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,24 @@ class CalibrationBlock(QASMNode):
131131
body: List[Statement]
132132

133133

134+
@dataclass
135+
class ExternFrameStatement(QASMNode):
136+
"""
137+
Node representing an extern frame statement.
138+
"""
139+
140+
name: Identifier
141+
142+
143+
@dataclass
144+
class ExternPortStatement(QASMNode):
145+
"""
146+
Node representing an extern port statement.
147+
"""
148+
149+
name: Identifier
150+
151+
134152
# Override the class from openqasm3
135153
@dataclass
136154
class CalibrationStatement(Statement):

source/openpulse/openpulse/parser.py

+7
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
span,
4444
QASMNodeVisitor,
4545
_raise_from_context,
46+
_visit_identifier,
4647
parse as parse_qasm3,
4748
)
4849
from openqasm3.visitor import QASMVisitor
@@ -194,6 +195,12 @@ def visitCalibrationBlock(self, ctx: openpulseParser.CalibrationBlockContext):
194195
body=[self.visit(statement) for statement in ctx.openpulseStatement()]
195196
)
196197

198+
def visitExternFrameStatement(self, ctx: openpulseParser.OpenpulseStatementContext):
199+
return openpulse_ast.ExternFrameStatement(name=_visit_identifier(ctx.Identifier()))
200+
201+
def visitExternPortStatement(self, ctx: openpulseParser.OpenpulseStatementContext):
202+
return openpulse_ast.ExternPortStatement(name=_visit_identifier(ctx.Identifier()))
203+
197204
def visitScalarType(self, ctx: openpulseParser.ScalarTypeContext):
198205
if ctx.WAVEFORM() or ctx.PORT() or ctx.FRAME():
199206
return self._visitPulseType(ctx)

source/openpulse/tests/test_openpulse_parser.py

+2
Original file line numberDiff line numberDiff line change
@@ -399,9 +399,11 @@ def test_permissive_parsing(capsys):
399399
port xy_port;
400400
port tx_port;
401401
port rx_port;
402+
extern port cx_port;
402403
frame xy_frame = newframe(xy_port, 3714500000.0, 0);
403404
frame tx_frame = newframe(tx_port, 7883050000.0, 0);
404405
frame rx_frame = newframe(rx_port, 7883050000.0, 0);
406+
extern frame cx_frame;
405407
waveform rabi_pulse_wf = gaussian(1e-07, 2.5e-08, 1.0, 0.0);
406408
waveform readout_waveform_wf = constant(5e-06, 0.03);
407409
waveform readout_kernel_wf = constant(5e-06, 1.0);

0 commit comments

Comments
 (0)