2121
2222from __future__ import annotations
2323
24- from dataclasses import dataclass
24+ from dataclasses import asdict , dataclass
25+ from typing import Any
2526
2627import pyqasm
2728
@@ -33,11 +34,35 @@ def _complex_to_qasm(z: complex) -> str:
3334 sign = "+" if b >= 0 else "-"
3435 return f"{ a } { sign } { abs (b )} im"
3536
37+ @dataclass (frozen = True )
38+ class PulseParams :
39+ """Common parameters for building an OpenPulse calibration program.
40+
41+ frame_frequency (float): Initial frequency of the drive frame in Hz.
42+ frame_phase (float): Initial phase of the drive frame in radians.
43+ port_name (str): Name of the OpenPulse port.
44+ frame_name (str): Name of the OpenPulse frame.
45+ waveform_name (str): Identifier for the Gaussian waveform.
46+ defcal_name (str): Name of the generated calibration routine.
47+ qubit (int): Target qubit index for the calibration routine.
48+ """
49+
50+ frame_frequency : float = 5.0e9
51+ frame_phase : float = 0.0
52+ port_name : str = "d0"
53+ frame_name : str = "driveframe"
54+ waveform_name : str = "wf"
55+ defcal_name : str = "play_pulse"
56+ qubit : int = 0
3657
3758@dataclass (frozen = True )
3859class GaussianPulse :
3960 """A minimal Gaussian waveform spec for OpenPulse.
4061
62+ amplitude (complex): Complex amplitude of the Gaussian pulse.
63+ duration (str): Total pulse duration (e.g. "16ns").
64+ sigma (str): Standard deviation of the Gaussian envelope.
65+
4166 Notes:
4267 - duration/sigma are strings like "16ns", "100e-6s", etc.
4368 - amplitude is complex (OpenQASM complex literal).
@@ -54,50 +79,37 @@ def to_waveform_qasm(self, var_name: str = "wf") -> str:
5479
5580
5681def generate_program (
57- * ,
58- amplitude : complex = 1.0 + 0.0j ,
59- duration : str = "16ns" ,
60- sigma : str = "4ns" ,
61- frame_frequency : float = 5.0e9 ,
62- frame_phase : float = 0.0 ,
63- port_name : str = "d0" ,
64- frame_name : str = "driveframe" ,
65- waveform_name : str = "wf" ,
66- defcal_name : str = "play_gaussian" ,
67- qubit : int = 0 ,
82+ pulse : GaussianPulse ,
83+ params : PulseParams | None = None ,
84+ ** kwargs : Any ,
6885) -> "pyqasm.QasmModule" :
6986 """
7087 Load a Gaussian OpenPulse waveform program as a pyqasm module.
7188
7289 Args:
73- amplitude (complex): Complex amplitude of the Gaussian pulse.
74- duration (str): Total pulse duration (e.g. "16ns").
75- sigma (str): Standard deviation of the Gaussian envelope.
76- frame_frequency (float): Initial frequency of the drive frame in Hz.
77- frame_phase (float): Initial phase of the drive frame in radians.
78- port_name (str): Name of the OpenPulse port.
79- frame_name (str): Name of the OpenPulse frame.
80- waveform_name (str): Identifier for the Gaussian waveform.
81- defcal_name (str): Name of the generated calibration routine.
82- qubit (int): Target qubit index for the calibration routine.
90+ pulse (GaussianPulse): Pulse specification (amplitude, duration, sigma).
91+ params (PulseParams | None): Common OpenPulse/program parameters.
92+ **kwargs: Overrides for fields in PulseParams (e.g. frame_name="...", qubit=1).
8393
8494 Returns:
8595 (PyQasm Module) pyqasm module containing the Gaussian OpenPulse program
8696 """
87- pulse = GaussianPulse (amplitude = amplitude , duration = duration , sigma = sigma )
88- wf_line = pulse .to_waveform_qasm (var_name = waveform_name )
97+ params = params or PulseParams ()
98+ p = {** asdict (params ), ** kwargs }
99+
100+ wf_line = pulse .to_waveform_qasm (var_name = p ["waveform_name" ])
89101
90102 qasm = f"""OPENQASM 3.0;
91103defcalgrammar "openpulse";
92104
93105cal {{
94- port { port_name } ;
95- frame { frame_name } = newframe({ port_name } , { frame_frequency } , { frame_phase } );
106+ port { p [ " port_name" ] } ;
107+ frame { p [ " frame_name" ] } = newframe({ p [ " port_name" ] } , { p [ " frame_frequency" ] } , { p [ " frame_phase" ] } );
96108 { wf_line }
97109}}
98110
99- defcal { defcal_name } ${ qubit } {{
100- play({ frame_name } , { waveform_name } );
111+ defcal { p [ " defcal_name" ] } ${ p [ " qubit" ] } {{
112+ play({ p [ " frame_name" ] } , { p [ " waveform_name" ] } );
101113}}
102114"""
103115
0 commit comments