Skip to content

Commit 37a82a2

Browse files
committed
Made the implementation more modular and futureproof for other types of pulses
1 parent 6378606 commit 37a82a2

2 files changed

Lines changed: 42 additions & 30 deletions

File tree

qbraid_algorithms/openpulse/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,6 @@
1313
# limitations under the License.
1414

1515
"""OpenPulse generators for qbraid-algorithms."""
16-
from .gaussian import GaussianPulse, generate_program
16+
from .gaussian import GaussianPulse, PulseParams, generate_program
1717

18-
__all__ = ["GaussianPulse", "generate_program"]
18+
__all__ = ["GaussianPulse", "PulseParams", "generate_program"]

qbraid_algorithms/openpulse/gaussian.py

Lines changed: 40 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@
2121

2222
from __future__ import annotations
2323

24-
from dataclasses import dataclass
24+
from dataclasses import asdict, dataclass
25+
from typing import Any
2526

2627
import 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)
3859
class 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

5681
def 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;
91103
defcalgrammar "openpulse";
92104
93105
cal {{
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

Comments
 (0)