Skip to content

Commit 8e8e024

Browse files
committed
extend qasm3 dumper with annotations in measurements
With this modification, qasm3 super extends annotations in measurements, which are only supported by mutable `Measure` subclass. ```python from qiskit import qasm3 from qiskit.circuit import annotation, QuantumCircuit, Measure class MidCircMeasurementAnnotation(annotation.Annotation): namespace = "qcf.mid_circ_measure" class MidCircuitMeasure(Measure): """A custom specialized measurement.""" def __init__(self, annotation_str=None): super().__init__(label=annotation_str) a = MidCircMeasurementAnnotation() a.namespace += "." + str(annotation_str) self.annotations = [a] ``` The annotation needs a serializers, but it is not used because, as defined above, does not have parameters: ```python class Serializer(annotation.OpenQASM3Serializer): def dump(self, annotation): pass def load(self, namespace, payload): pass ``` It can be used in this way: ```python measure_2 = MidCircuitMeasure("measure_2") measure_3 = MidCircuitMeasure("measure_3") circ = QuantumCircuit(2, 2) circ.append(measure_2, [0], [0]) circ.append(measure_3, [1], [0]) circ.append(measure_2, [0], [1]) circ.measure_all() handlers = {"qcf": Serializer()} print(qasm3.dumps(circ, annotation_handlers=handlers)) ``` ```C OPENQASM 3.0; include "stdgates.inc"; bit[2] c; bit[2] meas; qubit[2] q; @qcf.mid_circ_measure.measure_2AAA c[0] = measure q[0]; @qcf.mid_circ_measure.measure_3 c[0] = measure q[1]; @qcf.mid_circ_measure.measure_2AAA c[1] = measure q[0]; barrier q[0], q[1]; meas[0] = measure q[0]; meas[1] = measure q[1]; ```
1 parent 29d8bb0 commit 8e8e024

File tree

3 files changed

+26
-3
lines changed

3 files changed

+26
-3
lines changed

qiskit/qasm3/ast.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -388,11 +388,17 @@ class QuantumMeasurementAssignment(Statement):
388388
| indexIdentifier EQUALS quantumMeasurement # eg: bits = measure qubits;
389389
"""
390390

391-
__slots__ = ("identifier", "quantumMeasurement")
391+
__slots__ = ("identifier", "quantumMeasurement", "annotations")
392392

393-
def __init__(self, identifier: Identifier, quantumMeasurement: QuantumMeasurement):
393+
def __init__(
394+
self,
395+
identifier: Identifier,
396+
quantumMeasurement: QuantumMeasurement,
397+
annotations: Sequence[Annotation] = (),
398+
):
394399
self.identifier = identifier
395400
self.quantumMeasurement = quantumMeasurement
401+
self.annotations = tuple(annotations)
396402

397403

398404
class Designator(ASTNode):

qiskit/qasm3/exporter.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1003,7 +1003,22 @@ def build_current_scope(self) -> List[ast.Statement]:
10031003
[self._lookup_bit(operand) for operand in instruction.qubits]
10041004
)
10051005
clbit = self._lookup_bit(instruction.clbits[0])
1006-
nodes = [ast.QuantumMeasurementAssignment(clbit, measurement)]
1006+
nodes = [
1007+
ast.QuantumMeasurementAssignment(
1008+
clbit,
1009+
measurement,
1010+
)
1011+
]
1012+
if hasattr(instruction.operation, "annotations"):
1013+
annotations = [
1014+
self.build_annotation(annotation)
1015+
for annotation in instruction.operation.annotations
1016+
]
1017+
else:
1018+
annotations = []
1019+
nodes = [
1020+
ast.QuantumMeasurementAssignment(clbit, measurement, annotations=annotations)
1021+
]
10071022
elif isinstance(instruction.operation, Reset):
10081023
nodes = [
10091024
ast.QuantumReset(self._lookup_bit(operand)) for operand in instruction.qubits

qiskit/qasm3/printer.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,8 @@ def _visit_QuantumMeasurement(self, node: ast.QuantumMeasurement) -> None:
273273
self._visit_sequence(node.identifierList, separator=", ")
274274

275275
def _visit_QuantumMeasurementAssignment(self, node: ast.QuantumMeasurementAssignment) -> None:
276+
for annotation in reversed(node.annotations):
277+
self.visit(annotation)
276278
self._start_line()
277279
self.visit(node.identifier)
278280
self.stream.write(" = ")

0 commit comments

Comments
 (0)