Client Experiment Configuration & Execution#
Experiments in the FIREQ platform are defined using a structured YAML specification and executed through the interactive client CLI. This document details the YAML file structure, parameter syntax rules, node configuration schemas, and the operational workflow.
1. YAML Configuration Architecture#
Experiment definitions are stored in YAML format (typically within the experiments/ directory). If that directory does not exist yet, the client creates it automatically when the experiment is launched. The file is then structured into three primary top-level sections:
preprocess: Defines static constants and reusable macros.variables: Specifies parameter sweeps using linear ranges.sys_config: Describes the target hardware configuration tree and node parameter callbacks.
Syntax & Prefix Rules#
The YAML parser relies on specialized prefixes to interpret values and construct the hardware execution graph:
%(Preprocess Macro): Resolved client-side from thepreprocessblock before sending configurations to the server (e.g.,%DEFAULT_PULSE_LEN).#(Sweep Reference): Binds a parameter to a sweepable dynamic variable defined in thevariablessection (e.g.,#freq,#gain).$(Dynamic Hardware Parameter): Maps directly to runtime parameter callbacks on server-side hardware nodes (e.g.,$duration,$gain,$rfrequency)._(Static Node Property): Specifies immutable structural metadata set during node instantiation (e.g.,_name,_envelope,_readout)./(Hardware Node Path): Identifies a target FPGA IP node within the system tree (e.g.,/axisGeneratorIP_0).
2. Hardware Node Configuration Reference#
This section details all available parameters, default behavior, and structural requirements for each node type in the sys_config hierarchy. Every experiment must also define the required top-level sys_config.$shots integer, which sets the number of acquisitions per sweep point.
2.1 Acquisition Node (/axisAcquisitionIP_*)#
Configures signal demodulation, output processing modes, and trigger timing.
Parameter |
Type |
Required |
Description |
|---|---|---|---|
|
|
Yes |
Acquisition window duration in nanoseconds ( |
|
|
Yes |
Data output mode: |
|
|
Yes |
Demodulation frequency in |
|
|
Yes |
Demodulation initial phase in radians |
|
|
Yes |
Trigger channel ( |
|
|
Yes |
Time-of-Flight calibration delay in nanoseconds ( |
2.2 Signal Generator Node (/axisGeneratorIP_*)#
Manages signal generation, RF frequency synthesis, and child definitions for pulse envelopes, pulse execution, and virtual gates.
Node-Level Parameters#
Parameter |
Type |
Required |
Description |
|---|---|---|---|
|
|
Yes |
Drive carrier frequency in |
|
|
Yes |
Readout carrier frequency in |
|
|
Yes |
Readout phase in radians |
|
|
Yes |
Readout trigger channel ( |
|
|
Yes |
Drive trigger channel ( |
|
|
No |
Seed value for the PRBS / LFSR generator |
|
|
No |
Sequence list of pulse names to be executed |
Child Node: Custom Envelope (envelope)#
Defines arbitrary IQ pulse waveforms stored in generator memory.
Parameter |
Type |
Default |
Description |
|---|---|---|---|
|
|
Required |
Unique name ( |
|
|
|
Uses hardware interpolation engine |
|
|
|
Enables symmetry optimization (requires |
|
|
|
Symmetry parity for I channel (required if |
|
|
|
Symmetry parity for Q channel (required if |
|
|
Required |
Array of normalized complex IQ values within \([-1.0, 1.0]\) |
Child Node: Pulse (pulse)#
Associates a pulse envelope with dynamic timing, scaling, and hardware crossbar target routing.
Parameter |
Type |
Default |
Description |
|---|---|---|---|
|
|
Required |
Unique identifier for the pulse gate |
|
|
|
Flags the pulse as a readout trigger pulse |
|
|
Required |
Target registered envelope name |
|
|
|
Swaps I and Q hardware output channels |
|
|
|
Holds the last waveform sample level at pulse completion |
|
|
|
DAC target mask for crossbar matrix routing |
|
|
Required |
Pulse duration in nanoseconds ( |
|
|
Required |
Normalized amplitude gain magnitude between |
Child Node: Virtual Z Gate (vzgate)#
Executes instantaneous software frame phase shifts without RF emission.
Parameter |
Type |
Default |
Description |
|---|---|---|---|
|
|
Required |
Unique identifier for the gate |
|
|
|
Applies phase shift to readout frame if |
|
|
Required |
Phase rotation angle normalized to \(2\pi\) |
2.3 Trigger Generator Node (/axisTriggerGenerator_*)#
Coordinates master timing frame periods and delayed hardware triggers.
Node-Level Parameters#
Parameter |
Type |
Required |
Description |
|---|---|---|---|
|
|
Yes |
Name of the trigger generator instance |
|
|
Yes |
Total repetition interval / frame period in nanoseconds ( |
Child Node: Delay Item (delay)#
Specifies channel-specific trigger delay offsets.
Parameter |
Type |
Default |
Description |
|---|---|---|---|
|
|
Required |
Identifier for the delay instance |
|
|
Required |
Trigger target type: |
|
|
Required |
Channel index or bitmask target |
|
|
Optional |
Sequence index for multi-drive delay tracking |
|
|
|
Fires a physical trigger upon delay counter expiration |
|
|
Required |
Timing delay value in nanoseconds ( |
3. Mutable Parameters & State Retention#
When a parameter is declared or modified through a YAML configuration, it remains persistent in server memory associated with its declared _name for the duration of the interactive session.
Incremental Modifications: If a pulse
rect_dis already initialized on the server, subsequent experiment configurations can update its parameters (e.g., changing$durationor$gain) simply by referencingrect_dwithout re-specifying static properties (_envelope,_dac_target).State Consistency: Because both client and server maintain state incrementally, changing hardware routing or resetting parameter states between disparate experiments may require executing
reset_allfrom the interactive CLI to avoid state pollution.
4. Complete Experiment Example#
Below is a complete specification incorporating preprocess variables, dynamic sweep parameter references, pulse definitions, and timing delays:
preprocess:
RO_TIME: 1500
TOF_VAL: 160
variables:
freq:
start: 2000
stop: 3000
num: 50
mode: lin
gain:
start: 0.05
stop: 0.5
num: 20
mode: lin
sys_config:
$shots: 1000
/axisGeneratorIP_0:
$dfrequency: 0
$rfrequency: "#freq"
$rphase: 0.0
$rchannel: 1
$dchannel: 0
pulse:
- _name: rect
_readout: true
_envelope: _RECTANGULAR
_dac_target: 1
$duration: 1000.0
$gain: "#gain"
/axisAcquisitionIP_0:
$duration: "%RO_TIME"
$output_type: accumulated
$rfrequency: "#freq"
$rphase: 0
$rchannel: 1
$tof: "%TOF_VAL"
/axisTriggerGenerator_0:
$experiment_duration: 102000.0
delay:
- _name: readout_delay_0
_ttype: readout
_channel_mask: 1
_index: 1
$delay: 100
Running an experiment#
To execute an experiment using the FIREQ environment
start the FIREQ server first:
python start_server.py
start the client:
python run_client.py
run an experiment:
run_yaml yaml_experiment_configurations_examples/<experiment_name>.yaml
wait for the acquisition to complete,
inspect the generated output files.