Skip to content

QuEL-1 continuous-wave output

Quel1BackendController can start and stop a long-running continuous-wave output on one QuEL-1 AWG channel. This is a controller-level capability for hardware validation and CW experiments. It is not exposed through Measurement or Experiment.

When to use it

Use this API when you need a steady output outside the finite MeasurementSchedule execution path, for example to check a mixer, frequency plan, analyzer trace, or intentional aliasing behavior.

The controller owns the running wavegen task, so stop the output through the same controller instance.

See also the guarded QuEL-1 continuous-wave notebook for a runnable hardware workflow.

Start an output

from qubex.backend.quel1 import Quel1BackendController

controller = Quel1BackendController()
controller.define_clockmaster(ipaddr="10.3.0.x")
controller.define_box(
    box_name="S173R",
    ipaddr_wss="10.1.0.x",
    boxtype="quel1se-riken8",
)
controller.connect(box_names="S173R")

config = controller.start_continuous_wave(
    box_name="S173R",
    port=2,
    channel=0,
    awg_freq_hz=7_812_500.0 * 20,
    amplitude=0.2,
)

awg_freq_hz is the AWG-baseband frequency. QuEL-1 CW output is generated by repeating one 128 ns chunk, so the frequency must be an integer multiple of 1 / 128 ns = 7.8125 MHz and stay within the AWG baseband Nyquist range.

The returned Quel1ContinuousWaveConfig records the resolved waveform name, actual AWG frequency, chunk cycles, LO/CNCO/FNCO values used for logging, the resolved output frequency when it can be computed, repeat counts, and nominal duration.

Keep current LO and NCO settings

By default, start_continuous_wave() does not call config_port() or update FNCO. It uses the current hardware LO/CNCO/FNCO settings and logs the values it can read from dump_port().

awg_freq_hz is still applied when configure_port=False; only the generated AWG waveform changes.

This default avoids changing the port phase reference as a side effect of starting CW output.

Update output settings explicitly

Pass configure_port=True only when the CW start should also update output settings. This can include LO/CNCO/FNCO, sideband, VATT, full-scale current, and RF switch state.

config = controller.start_continuous_wave(
    box_name="S173R",
    port=2,
    channel=0,
    awg_freq_hz=0.0,
    amplitude=0.1,
    configure_port=True,
    lo_freq_hz=10_500_000_000,
    cnco_freq_hz=2_250_000_000,
    fnco_freq_hz=750_000_000,
    sideband="U",
    vatt=2048,
    fullscale_current=39000,
    rfswitch="pass",
)

If any output setting argument is provided without configure_port=True, Qubex raises ValueError before touching hardware.

Stop outputs

Stop one remembered output by the same physical key:

stopped = controller.stop_continuous_wave(
    box_name="S173R",
    port=2,
    channel=0,
)

stop_continuous_wave() returns True when it found and cleared a remembered task, and False when that controller has no active task for the key.

Stop every remembered CW task:

controller.stop_all_continuous_waves()

disconnect() also calls stop_all_continuous_waves() on a best-effort basis before releasing backend resources.

Calling connect() with a different box set rebuilds the QuEL-1 runtime state. In that case, the controller stops remembered CW outputs before reconnecting.

Logging and alias warnings

On start, Qubex logs the LO/CNCO/FNCO/AWG frequencies, FNCO + AWG, and the computed RF output frequency in GHz when LO/CNCO/FNCO/sideband values are available at INFO level.

If abs(FNCO + AWG) exceeds 800 MHz, Qubex logs a warning because the output may contain aliasing. This condition is not an error; intentional aliasing tests can continue after the warning.