# Objects with no resumable running state — serialization is intentionally
# not applicable. Reviewed, permanent opt-out (checked by check_serializable.py).
# Pure decode converters (scale-only, constant iscale):
i16_to_f32
i16u32_to_f32
i16u64_to_f32
i32_to_f32
i8_to_f32
uq15_to_f32
# Transforms — a plan/window fixed at construction, no cross-call state:
fft
fft2d
# By-value measurement analyzers — analyze(x) -> record, no state across calls:
tonemeas
nprmeas
imdmeas
# Feedforward polynomial-phase estimator — estimate(x) -> record, no state.
ppe
# Feedforward DSSS frame demod — one-shot burst analyzers, no running state.
burst_demod
# Periodic table lookup — pure function of (table, method, point), no state.
interp_table
# File-backed container I/O — the FILE* IS the state; a read cursor or a
# written count is meaningless without the OS handle, which cannot cross a
# checkpoint/pod boundary. No dp_state triplet; resume by re-opening the path.
wfm_reader
wfm_writer
# Observation sink, not a signal-path stage: nothing downstream depends on
# restoring it, so a resumed pipeline is bit-identical either way. Its ring is
# a live cross-thread SPSC handle in the same sense the readers' FILE* is —
# meaningless across a checkpoint/pod boundary. The probe table is setup-time
# config, restored by re-registering; `now` is borrowed from the pipeline's
# dp_sample_clock_t, not owned here.
dp_tlm
# The capture over that ring — the same argument, plus a stronger one. It owns
# an open FILE* and a live writer thread (the wfm_reader/wfm_writer case
# exactly), and its losslessness is a claim about ONE run, from open() to
# close(): the drop count it renders a verdict on is latched against the
# context at open. A resumed capture would carry a verdict that means nothing.
# Capture a new one instead.
dp_tlm_capture
