Compound Property
Introduced in version 3.8.1
Compound properties on the System device
A compound property is a virtual, user-defined property hosted on the System device whose value is computed from the properties of other devices through a small arithmetic expression. Compounds let an experiment present one user-facing knob (for example a single Frequency control) that internally distributes the value across several hardware properties (for example two channels of an RF generator).
Status: manual configuration only. There is no Hardware Wizard support for compound properties yet. They must be added by hand to the CFG file by editing the [Compound] section as described below. Once present, compounds appear under @System like any other property and can be referenced from PPL scripts and connected to GUI controls.
The [Compound] section
Every compound property is described by up to three keys in the [Compound] section. <Name> is the user-chosen name of the compound (it must not clash with an existing System property such as Shots, XReps etc.).
Entry |
Value |
Description |
<Name> |
<unit>, [read/(write)/rwrite/wread], [(nohshake)/hshake], [fu increment], [fu min_increment], [n significant digit], [fu minvalue], [fu maxvalue] |
Property metadata in the same comma-separated form used by the Dummy device |
<Name>.definition |
<forward expression> |
Required. The arithmetic expression evaluated to produce the compound's read value. Identifiers of the form |
<Name>.inverse[n1] |
<Target@Device>: <expression> |
One inverse rule per key, numbered contiguously from 1 ( |
Example
A single Frequency knob on the System device whose value is the sum of two RF-generator channels, and whose inverse splits any write equally between them:
Configuration file example:
[Compound] Frequency = Hz, rw, nohshake, 1MHz, 1Hz, 0, 0, 10GHz Frequency.definition = Freq1@RFGen + Freq2@RFGen Frequency.inverse1 = Freq1@RFGen: Frequency / 2 Frequency.inverse2 = Freq2@RFGen: Frequency / 2
With this configuration:
Action |
Result |
Read |
Returns |
Write |
Triggers |
Functions
Expressions may call built-in functions, written as a name immediately followed by a parenthesized, comma-separated argument list. Each argument is itself a full expression.
Comparison operators >, <, >=, <=, == and != are also available. They have the lowest precedence (evaluated after + - * /) and produce 1 when the comparison is true or 0 when false, so they can feed a condition or be used arithmetically — for example if(Mode@DEV > 3, 1, 2) or (A@D == 0) * 5.
Function |
Description |
|
Inline conditional. Returns |
|
Integer selector. The first argument |
|
Constrain |
|
Smallest or largest of one or more arguments (all are evaluated). Useful to enforce a floor or ceiling, or to combine several channels — for example |
|
Power decibel conversions: |
|
Voltage/amplitude decibel conversions: |
|
Power (exponentiation). Introduced in version 3.8.9 x raised to y. There is no ^ operator in the expression syntax, so this is the only way to take a power. Example: pow(2, 10) gives 1024. |
|
General math. Introduced in version 3.8.9 Square root, natural exponential, natural and base-10 logarithm, absolute value and arc tangent (result in radians).sqrt rejects a negative argument and the logarithms require a positive one. |
|
Convert between degrees and radians ( |
|
Power calibration, forward from AWG amplitude. Maps a normalized AWG |
|
Power calibration, forward from drive power. As |
|
Power calibration, inverse to AWG amplitude. Given a desired amplifier output power |
|
Power calibration, inverse to drive power. Given a desired amplifier output power |
|
Maximum linear AWG amplitude. Introduced in version 3.8.9 The highest normalized AWG amplitude that still lands inside the calibrated power range of calibrationcalIndex. Use it as the amplitude ceiling in your program. |
|
Maximum linear AWG amplitude across a band. Introduced in version 3.8.9 Aspcal_maxamp, but additionally keeping a pulse of the given bandwidth (Hz, full width) linear across the calibration's frequency model — the frequency correction boosts the edges of the band and spends part of the same headroom doing so. Equal to pcal_maxamp when the calibration has no frequency model. Take the lower of the two. |
For all pcal_* functions calIndex is the 0-based position in the [PowerCalibrations] table; an out-of-range index is reported as an evaluation error in the message log. The drive side is the AWG (amplitude in [0, 1] or drive power in dBm) and the amplifier output side is always power in dBm. Note the names are case-sensitive — use pcal_dBm, not pcal_dbm. See Power and Frequency Calibration for the calibration model, the .pcal curve, and how to find the maximum linear AWG level.
Behavior and limits
Topic |
Notes |
Live updates |
The read value of every compound is re-evaluated automatically once per server update tick whenever any of its referenced properties has changed since the last tick. The user-set value is preserved across these refreshes so that GUI input remains stable while the displayed read value tracks the underlying hardware. |
Initialization order |
The System device is constructed before any hardware driver, so referenced devices need not exist when the |
Self-reference |
A compound whose forward expression refers to itself (for example |
Multi-step writes |
Inverse rules are dispatched in numeric order and each goes through the standard |
Saved overrides |
User-customized MinValue, MaxValue, UserIncrement and scale settings made through the GUI are persisted in the |
Parsing errors |
Any forward or inverse expression that fails to parse causes the offending compound (or rule) to be skipped and an error to be posted to the message log. Other compounds in the section are unaffected. |
See also: System device, device setting wildcards, CFG file format.

