Result bundle reference (run_summary.json, schema_version 4)
Every declared block and field of a result bundle’s run_summary.json, as helx show and helx validate bundle read it. Fields with default none are left out of the file when the run did not produce them. run_summary.schema.json next to this page is the same contract as JSON Schema.
Generated by scripts/render_references.py from the models; do not edit by hand.
RunSummaryV4
Section titled “RunSummaryV4”run_summary.json: the whole bundle, one case per file.
| Field | Type | Default | Meaning |
|---|---|---|---|
schema_version |
one of 4 |
required | Always 4 for this contract. |
generated_at |
datetime | required | When the bundle was written; timezone-aware, so two bundles can be ordered without guessing the writer’s clock. |
config |
block ConfigRecord |
required | The config the run was made from. |
provenance |
block Provenance |
required | Everything the numbers rest on: software, platform, target and values status. |
contract |
block ContractBlock |
required | The fixed promises of this result. |
run |
block RunBlock |
required | The case: names, memory mode, platform mode, runtime and NPU size. |
source |
block SourceBlock |
required | Where the model came from. |
vela |
block VelaBlock or null |
none | Vela’s compile-time figures; absent when Vela was bypassed. |
fvp |
block FvpBlock |
required | The FVP stage and its measurements. |
memory |
block MemoryBlock |
required | Placement and footprint. |
tensors |
block TensorEvidence or null |
none | Opt-in fixed input bytes, output specifications and reference comparison context. |
measurements |
block Measurements or null |
none | Indexed measured invocations and explicit population statistics; absent before execution. |
vela_energy |
block EnergyBlock or null |
none | Experimental energy, power and efficiency predicted from Vela’s estimates; never a measurement. |
energy_errors |
dict[one of measured_fvp_pmu, vela_compile_time_estimate, str] or null |
none | Energy estimates that were attempted and failed, keyed by basis (measured_fvp_pmu, vela_compile_time_estimate) with the reason. Absent when every attempted estimate succeeded; a basis listed here has no block above. |
per_layer |
block PerLayerBlock or null |
none | Per-layer attribution artifacts, when requested. |
per_segment |
block PerSegmentBlock or null |
none | Fenced per-segment measurements, when requested. |
artifacts |
block ArtifactsBlock |
required | The files the bundle carries. |
ConfigRecord
Section titled “ConfigRecord”The config the run was made from: where it was, and the name of its copy in the bundle.
| Field | Type | Default | Meaning |
|---|---|---|---|
path |
str | required | Resolved absolute path of the config the run was made from. |
copied_as |
str | required | File name of the copy of that config inside the bundle. |
Provenance
Section titled “Provenance”Everything a number rests on: software, platform definition, target, and the values’ status.
| Field | Type | Default | Meaning |
|---|---|---|---|
software |
block SoftwareVersions |
required | Versions of the tools that produced the numbers. |
platform |
block PlatformProvenance or null |
none | The platform definition and the SoC revision behind it. |
target |
block TargetProvenance or null |
none | The realization of the SoC the measurement is attributed to. |
values |
block ValuesProvenance or null |
none | How far the stored hardware values behind the run can be trusted. |
SoftwareVersions
Section titled “SoftwareVersions”The tools that produced the numbers.
| Field | Type | Default | Meaning |
|---|---|---|---|
helx |
str or null | none | helx version that wrote the bundle. |
helia_npu |
str or null | none | helia-npu version (SoC definitions, Vela system config, PMU programs). |
vela |
str or null | none | Vela compiler version. |
python |
str | required | Python interpreter version. |
fvp_subsystem |
str or null | none | Corstone FVP subsystem the runner was built for (corstone_300 or corstone_320), when the FVP stage ran. |
fvp_home |
str or null | none | The FVP install root (FVP_HOME) the model binary was taken from, so its exact version can be found. |
PlatformProvenance
Section titled “PlatformProvenance”Which platform definition, at which revision, from which kind of source.
| Field | Type | Default | Meaning |
|---|---|---|---|
name |
str | required | Platform the run was attributed to: a shipped name or the path the config gave. |
revision |
str or null | none | The platform history’s current revision label, or the SoC revision when no wrapper history is recorded. Energy-profile identity is recorded separately; compare both when comparing runs. |
origin |
str or null | none | golden, derived or custom, so a what-if number cannot pass as silicon. |
soc_id |
str or null | none | Canonical id of the SoC definition the platform rests on, e.g. atomiq110. |
soc_revision |
str or null | none | Which drop or stepping of the SoC the timing describes: the label with its date, e.g. v8 (2026-09-22). |
soc_stage |
str or null | none | Where that SoC revision sits in the part’s life: spec, rtl, silicon or released. |
energy_profile_id |
str or null | none | Selected platform energy-profile id; absent for inline energy or run.energy_model overrides. |
energy_profile_revision |
str or null | none | Revision of the selected energy characterization. |
energy_profile_sha256 |
str or null | none | SHA-256 of the captured energy-profile file bytes. |
TargetProvenance
Section titled “TargetProvenance”Which realization of the SoC the measurement is attributed to, and whether its timing stands for the part.
| Field | Type | Default | Meaning |
|---|---|---|---|
id |
str or null | none | helia-npu target id with its kind, e.g. atomiq110-fvp-corstone-320 (simulator). |
timing_is_representative |
bool or null | none | True when cycle counts on this target stand for the SoC’s timing; false for FPGA drops at other clock ratios and for simulators. |
ValuesProvenance
Section titled “ValuesProvenance”How far the stored hardware values behind this run can be trusted.
| Field | Type | Default | Meaning |
|---|---|---|---|
status |
one of confirmed, fitted, unverified or null |
none | The least trusted status among the hardware values the run depends on: confirmed, fitted or unverified. |
fitted |
list[str] or null | none | Values tuned to reproduce RTL or FPGA measurements, by dotted path; absent when there are none. |
unverified |
list[str] or null | none | Values that are a specification figure, estimate or placeholder, by dotted path; absent when there are none. |
ContractBlock
Section titled “ContractBlock”What the bundle promises: one result per config, and the bases every energy number rests on.
| Field | Type | Default | Meaning |
|---|---|---|---|
result |
one of one_config_one_result |
required | The bundle holds exactly one result for one config. |
placement |
str | required | Always exact: the placement recorded is the one compiled and run, not a nearest match. |
energy_model |
str | required | Shape of the energy model: NPU core energy per clocked cycle plus per-bit transfer energy. |
core_energy_basis |
str | required | Formula for core energy: npu_total_cycles times the reference core energy times the mode scaling. |
memory_energy_basis |
str | required | Formula for memory energy: completed data beats times per-bit energy times beat width times (1 + logic_overhead). |
RunBlock
Section titled “RunBlock”What was run, on what.
| Field | Type | Default | Meaning |
|---|---|---|---|
case_name |
str | required | The case directory name: the model name and the memory mode joined by two underscores. |
model |
str | required | Model name from the config, or the source file’s stem. |
memory_mode |
str | required | The Vela [Memory_Mode.*] section compiled: Sram_Only, Shared_Sram, Dedicated_Sram, or const_X__arena_Y__cache_Z for a custom placement. |
fvp_memory_mode |
str | required | The standard mode the runtime executed; differs from memory_mode only for a custom placement. |
mode |
str or null | none | Platform operating mode, i.e. the NPU clock: ULP or HP on AT110. |
runtime |
str or null | none | Inference runtime linked into the runner (tflite_micro, helia_rt or helia_aot), when the FVP stage built. |
runtime_backend |
str or null | none | Retained heliaRT backend: helia (heliaCORE); unset when the field does not apply. |
npu_mac_units |
int | required | The NPU’s MAC array size (MAC units per cycle), e.g. 256 for an Ethos-U85-256. |
npu_clock_hz |
float or null | none | The NPU clock of the mode the run used, Hz; measured cycles divided by it are the inference time. |
SourceBlock
Section titled “SourceBlock”Where the model came from and where it was cached.
| Field | Type | Default | Meaning |
|---|---|---|---|
given |
str | required | The source as the config or the command line spelled it. |
uri |
str | required | The resolved source URI (file, http, https or s3). |
scheme |
str | required | URI scheme of the source: file, http, https or s3. |
cached_path |
str | required | Local path of the model file the run compiled. |
cache_mode |
str | required | Whether downloaded models survive the run: persistent (kept under the cache root) or ephemeral. |
cache_root |
str | required | Root directory of the model cache. |
bytes |
int | required | Size of the model file, bytes. |
sha256 |
str or null | none | Observed source-model byte digest, distinct from the Vela/runner model digest. |
VelaBlock
Section titled “VelaBlock”What Vela reported for the compile. Cycles and bytes are Vela’s estimates, not measurements.
| Field | Type | Default | Meaning |
|---|---|---|---|
profile |
str | required | helx’s label for the Vela run: the SoC id and mode, the same string as system_config. |
system_config |
str | required | The [System_Config.*] section of the generated ini: SoC id and mode, e.g. atomiq110_HP. |
accelerator |
str or null | none | Vela’s accelerator configuration, e.g. Ethos_U85_256. |
memory_mode |
str or null | none | Vela’s own memory_mode column: the [Memory_Mode.*] section it compiled with. |
arena_cache_configured_bytes |
int | required | The –arena-cache-size handed to Vela, bytes. |
arena_cache_kib |
float or null | none | Vela’s own arena_cache_size column, KiB. |
core_clock_hz |
float or null | none | NPU clock Vela assumed, Hz. |
nn_macs |
float or null | none | MAC operations in one inference as Vela counted them. |
inference_time_s |
float or null | none | Vela’s own inference time, seconds: cycles_total over core_clock_hz, so it carries Vela’s memory model. |
cycles_total |
float or null | none | Vela’s total for one inference: per operation the slowest of its NPU and memory-access estimates, summed. Its Its memory estimate can exceed hardware costs at HP; compare cycles_npu with each sample’s active cycles. |
cycles_npu |
float or null | none | Vela’s estimate of NPU busy cycles; compare with measurements.samples[i].cycles.active. |
cycles_sram_access |
float or null | none | Vela’s estimate of the cycles bound by port 0 (Vela Sram) access. |
cycles_dram_access |
float or null | none | Vela’s estimate of the cycles bound by port 1 (Vela Dram) access. |
sram_total_bytes |
float or null | none | Bytes Vela expects to move over port 0 in one inference. |
dram_total_bytes |
float or null | none | Bytes Vela expects to move over port 1 in one inference. |
sram_bandwidth_gbps |
float or null | none | Port 0 bandwidth Vela assumed, GB/s. |
dram_bandwidth_gbps |
float or null | none | Port 1 bandwidth Vela assumed, GB/s. |
sram_used_kib |
float or null | none | Port 0 memory Vela’s plan occupies (arena plus weight cache), KiB. |
dram_used_kib |
float or null | none | Port 1 memory Vela’s plan occupies, KiB. |
on_chip_flash_kib |
float or null | none | Vela’s OnChipFlash usage, KiB; always 0 because helx assigns nothing to that area. |
off_chip_flash_kib |
float or null | none | Vela’s OffChipFlash usage, KiB; always 0 because helx assigns nothing to that area. |
weights_original_bytes |
float or null | none | Weight bytes in the input model. |
weights_encoded_bytes |
float or null | none | Weight bytes after Vela’s encoding and compression. |
command_stream_bytes |
int or null | none | Size of the Ethos-U command stream Vela emitted, bytes. |
FvpBlock
Section titled “FvpBlock”The FVP stage: how far it got, and the measurements when it ran.
| Field | Type | Default | Meaning |
|---|---|---|---|
stage |
one of disabled, configured-built, ran |
required | How far the FVP stage got: disabled, configured-built, or ran. |
requested_acquisition |
block AcquisitionPolicy or null |
none | Resolved build-time request; null warmup means automatic, not zero. Distinct from observed counts. |
enabled |
bool | required | Whether the config enabled the FVP stage. |
run_enabled |
bool or null | none | Whether the config asked to run the runner, not only build it. |
subsystem |
str or null | none | Corstone FVP subsystem: corstone_300 (its U55 or U65 model, as vela.accelerator says) or corstone_320. |
build_type |
str or null | none | Runner build type: Debug or Release. |
host_transport |
str or null | none | How the host collected the runner’s report from the FVP, from the subsystem’s profile. |
beat_bits |
int or null | none | Width of one AXI data beat on this SoC, bits, so traffic_beats can be turned into bytes. |
sram_burst_bytes |
int or null | none | AXI SRAM-port burst split the runner’s driver was built with (U85 AXI_LIMIT_SRAM_MAX_BEATS, U55/U65 AXI_LIMIT0/1_MAX_BEATS_BYTES), bytes: the platform’s, or a -DHELX_AXI_SRAM_MAX_BEATS in fvp.cmake_args. |
ext_burst_bytes |
int or null | none | AXI EXT-port burst split the runner’s driver was built with (U85 AXI_LIMIT_EXT_MAX_BEATS, U55/U65 AXI_LIMIT2/3_MAX_BEATS_BYTES), bytes: the platform’s, or a -DHELX_AXI_EXT_MAX_BEATS in fvp.cmake_args. |
sram_port_hash |
int or null | none | Address mask that picked the NPU’s SRAM port in the run (the FVP’s sram_hash0): the platform’s, or a -C ...sram_hash0 in fvp.fvp_args; absent when the FVP default (0x100, address bit 8) applied, and on build-only runs, since the FVP takes it at launch. U85 only. |
contention |
dict[str, block FvpContention] or null |
none | Emulated application traffic the run was configured with (run.contention), keyed by memory name; absent when there was none or nothing saw it. |
bus_trace |
block FvpBusTrace or null |
none | The NPU bus trace summary; absent unless fvp.bus_trace was enabled and the FVP ran. |
exit_code |
int or null | none | Exit code of the FVP process. |
warmup_invokes |
int or null | none | Inferences the runner ran, uncounted, before the measured one: 1 when the model has a CALL_ONCE init subgraph (resource-variable initialisation runs inside the first inference), else 0 by default. Explicit carry warmups can select another count; AOT reports its actual count, default 0. |
AcquisitionPolicy
Section titled “AcquisitionPolicy”Build-time lifecycle controls; None warmup preserves the runner’s automatic choice.
| Field | Type | Default | Meaning |
|---|---|---|---|
state |
one of carry, single |
carry |
carry retains variables across invokes; single permits one invoke on the initialized instance. |
warmup_invokes |
int or null | none | Uncounted warmup invokes. Unset: carry warms up once when CALL_ONCE is present; single uses zero. |
measured_invokes |
int | 1 |
Measured invokes on one initialized instance; single requires one. |
FvpContention
Section titled “FvpContention”One memory’s emulated application traffic (run.contention): what was asked for and what its port’s timing adapter was programmed with as a result.
| Field | Type | Default | Meaning |
|---|---|---|---|
port |
int | required | AXI port it was on in this run: 0 (SRAM class) or 1 (EXT). |
share_taken |
float | required | Fraction of the memory’s bandwidth other traffic took, 0 to below 1. |
extra_latency_ns |
float | required | Queueing latency added to reads and writes, ns. |
rate_window_cycles |
int | required | Timing-adapter window over which the reduced rate is enforced, NPU cycles (the run’s own unless the entry set one). |
applies_to_vela |
bool | required | Whether Vela compiled for the contended timing too (otherwise only the FVP saw it). |
bandwidth |
float | required | Beats per NPU cycle the port’s adapter was programmed with after contention (rounded to whole beats per window, as the adapter is built; not reflected if fvp.cmake_args overrides that adapter’s BWCAP or PULSE). |
read_latency |
int | required | Read latency after contention, NPU cycles. |
write_latency |
int | required | Write latency after contention, NPU cycles. |
FvpBusTrace
Section titled “FvpBusTrace”The NPU bus trace (fvp.bus_trace): every AXI transaction the NPU made on the FVP, summarised. The timeline, transfer sizes and a Perfetto trace are in the artifacts; the raw trace only when the config kept it.
| Field | Type | Default | Meaning |
|---|---|---|---|
status |
one of pass, fail |
required | pass when every check agrees. |
transactions |
int | required | AXI transactions traced. |
raw_trace_bytes |
int | required | Size of the trace the FVP wrote, bytes. |
step_cycles |
float or null | none | NPU cycles per FVP step: the FVP advances the NPU in steps and stamps each step’s transactions with one time, so this is the timeline’s finest resolution. |
fvp_time_scale |
float or null | none | FVP simulated seconds per second of NPU time, from the traced steps and the PMU cycle count (about 20 at a 500 MHz NPU clock on FVP 11.27). The timeline is in NPU time. |
npu_segments |
int | required | NPU invocations the trace shows: more than one when the model runs operators on the CPU between NPU segments. The timeline leaves the CPU time between them out, as the PMU leaves it out of the NPU’s cycles. |
timeline_rows |
int | required | Rows in the timeline CSV: one per FVP step, or whole steps merged so there are at most 2000. |
sram_port_hash |
int | required | Address mask whose parity assigned each SRAM-class transaction to SRAM0 or SRAM1 (the FVP default 0x100 when the run set none). |
stripe_bytes |
int or null | none | The SRAM interface changes at every multiple of this many bytes: the hash’s lowest set bit; absent for a zero hash, which puts every SRAM-class transaction on SRAM0. |
sram_transfers_crossing_stripe |
int | required | SRAM-class transactions that cross a multiple of stripe_bytes (with a one-bit hash, as on AT110, that is a transaction starting in one interface’s stripe and ending in the other’s); 0 when every burst fits a stripe. |
interfaces |
dict[str, block FvpBusTraceInterface] |
required | Per interface: sram0, sram1, ext. |
activity |
block FvpBusTraceActivity or null |
none | Which interfaces were active together; absent without both ports’ rates. |
checks |
dict[str, block FvpBusTraceCheck] |
required | The trace against the PMU (data beats per port and direction, SRAM0 reads), against the driver build (largest transfer within the burst), and against itself (time never goes back). |
FvpBusTraceInterface
Section titled “FvpBusTraceInterface”What one NPU memory interface carried over the inference, from the bus trace.
| Field | Type | Default | Meaning |
|---|---|---|---|
read_transfers |
int | required | Read transactions. |
write_transfers |
int | required | Write transactions. |
read_bytes |
int | required | Bytes read. |
write_bytes |
int | required | Bytes written. |
read_beats |
int | required | Read data beats, counting a partial beat as a whole one as the PMU does. |
write_beats |
int | required | Write data beats on the same basis. |
largest_transfer_bytes |
int | required | The largest single transaction, bytes: at most the burst the driver was built with. |
mean_busy_fraction |
float or null | none | Beats moved over the beats the port’s timing adapter allows in the inference’s NPU cycles (the fvp.port_utilization basis, with each interface’s writes counted exactly); absent without the port’s rate. |
peak_busy_fraction |
float or null | none | The busiest row of the timeline on the same basis. It can exceed 1 when a row is shorter than the port’s timing-adapter rate window, since the adapter caps the beats per window, not per cycle. |
FvpBusTraceActivity
Section titled “FvpBusTraceActivity”How the inference’s cycles divide by which interfaces were active (moving at least 5% of their rate) in each timeline row.
| Field | Type | Default | Meaning |
|---|---|---|---|
sram_only_fraction |
float | required | SRAM0 or SRAM1 active, EXT not. |
ext_only_fraction |
float | required | EXT active, neither SRAM interface. |
sram_and_ext_fraction |
float | required | EXT and at least one SRAM interface active together. |
idle_fraction |
float | required | No interface active. |
FvpBusTraceCheck
Section titled “FvpBusTraceCheck”One comparison of the trace with an independent source.
| Field | Type | Default | Meaning |
|---|---|---|---|
status |
one of pass, fail |
required | pass when the trace agrees. |
trace |
int | required | The figure from the trace. |
expected |
int | required | What it is checked against: the PMU’s count, the burst the driver was built with, or 0 for something that should not happen. |
MemoryBlock
Section titled “MemoryBlock”Footprint: where the regions live and how many bytes each thing takes.
| Field | Type | Default | Meaning |
|---|---|---|---|
const_placement |
str or null | none | Physical memory holding the weights. |
arena_placement |
str or null | none | Physical memory holding the tensor arena (activations). |
cache_placement |
str or null | none | Physical memory holding Vela’s weight cache. |
runtime_model_bytes |
int | required | Size of the model the runtime loaded (Vela’s output, or the original when Vela was bypassed), bytes. |
tensor_arena_configured_bytes |
int | required | Tensor arena size the runner was built with, bytes. |
tensor_arena_used_bytes |
int or null | none | Arena bytes the runtime reported using. |
aot |
block AotArenas or null |
none | The heliaAOT module’s arenas, when that engine linked the runner. |
AotArenas
Section titled “AotArenas”The heliaAOT module’s arenas, when that engine linked the runner.
| Field | Type | Default | Meaning |
|---|---|---|---|
constant_bytes |
int | required | Cold constants and generated staged-constant source storage, including source guards, bytes. |
mutable_bytes |
int | required | Writable runtime arenas: scratch, persistent and staged-constant destinations, bytes. |
total_bytes |
int | required | Constant plus mutable arena, bytes. |
constant_regions |
int | required | Number of constant regions the module declares. |
mutable_regions |
int | required | Number of writable runtime regions, including staged-constant destinations. |
TensorEvidence
Section titled “TensorEvidence”Build-bound input bytes and comparison context for opt-in tensor capture.
| Field | Type | Default | Meaning |
|---|---|---|---|
request_sha256 |
str | required | Canonical tensor-request digest reported by the compiled runner. |
inputs_explicit |
bool | required | Whether the request supplied input bytes rather than selecting implicit zeros. |
inputs |
tuple | required | Effective input bytes refilled before every invoke, including warmups. |
output_specs |
tuple | required | Fixed output metadata read from the actual runner model. |
references |
tuple | () |
One reference set per measured sample, or empty when only capturing outputs. |
comparison |
ComparisonPolicy | required | Numerical tolerance and NaN policy in stored-value units. |
TensorArtifact
Section titled “TensorArtifact”A fixed tensor whose raw bytes are retained in the result manifest.
| Field | Type | Default | Meaning |
|---|---|---|---|
spec |
TensorSpec | required | Exact model tensor index, name, dtype and fixed shape. |
path |
str | required | Bundle-relative binary artifact, with size/hash supplied by the manifest. |
ReferenceArtifacts
Section titled “ReferenceArtifacts”Reference output bytes for one measured invocation, with caller-declared provenance.
| Field | Type | Default | Meaning |
|---|---|---|---|
tensors |
tuple | required | All reference outputs in model-index order. |
origin |
one of files, host_litert, producer |
required | Declared source of these reference bytes. |
description |
str | required | Identifying reference context supplied by the caller. |
Measurements
Section titled “Measurements”A complete ordered sequence and statistics derived from that sequence.
| Field | Type | Default | Meaning |
|---|---|---|---|
acquisition |
block AcquisitionFacts |
required | The runner-observed lifecycle and measured count. |
samples |
tuple | required | All measured invocations in their execution order. |
statistics |
block MeasurementStatistics |
required | Population statistics recomputed from every retained sample. |
AcquisitionFacts
Section titled “AcquisitionFacts”Runner-reported lifecycle for the measured invocation sequence, excluding warmup counters.
| Field | Type | Default | Meaning |
|---|---|---|---|
state |
one of carry, single |
carry |
carry retains variables across invokes; single permits one invoke on the initialized instance. |
warmup_invokes |
int | required | Completed unmeasured invokes before the measured sequence. |
measured_invokes |
int | 1 |
Measured invokes on one initialized instance; single requires one. |
schema_id |
one of helx.acquisition |
helx.acquisition |
Runner acquisition protocol identifier. |
version |
one of 1 |
1 |
Runner acquisition protocol version. |
call_once_present |
bool or null | required | Interpreter CALL_ONCE detection; null for generated AOT initialization. |
initialization |
one of before_measurement, interpreter_allocate_and_first_invoke |
required | Where runtime state initialization occurred relative to measurement. |
MeasurementSample
Section titled “MeasurementSample”Counters and derived estimates for one indexed measured invocation, excluding warmups.
| Field | Type | Default | Meaning |
|---|---|---|---|
index |
int | required | Zero-based measured invocation index; warmups are excluded. |
pmu_profile |
one of default, ext_stall, default_ext_rd_stall, dv_align, port_stall, sram_stall, sram_transactions |
required | The event selection programmed for this invocation. |
output_tensors |
tuple | () |
Opt-in retained output bytes, in model-index order. |
verification |
block TensorVerification or null |
none | Optional numerical comparison against this sample’s retained reference set. |
outputs |
tuple | () |
Ordered output byte signatures captured after the measured invoke. |
cycles |
block FvpCycles or null |
none | NPU cycle counters from the PMU. |
traffic_beats |
block FvpTrafficBeats or null |
none | AXI data beats per port and direction from the PMU. |
traffic_transactions |
block FvpTrafficTransactions or null |
none | Accepted aggregate SRAM transactions in the same PMU window as traffic_beats; sram_transactions profile. |
port_utilization |
block FvpPortUtilization or null |
none | Average busy fraction of each NPU memory interface over the inference, from traffic_beats and the cycles; absent when the run had no counters, no cycles or no timing-adapter rates. |
latency_s |
float or null | none | NPU total cycles at the mode’s NPU clock: the latency one inference took on the NPU, seconds. |
utilization_fraction |
float or null | none | MACs performed over MACs the array could have performed: nn_macs / (npu_total_cycles * npu_mac_units), 0 to 1. |
pmu_overflow |
int or null | none | The NPU’s PMU overflow flag as the runner reported it; nonzero means a counter wrapped and the counts are short. |
energy |
block EnergyBlock or null |
none | Energy derived from this invocation’s PMU counters. |
sanity |
block SanityBlock or null |
none | Validation checks for this invocation’s counters. |
energy_error |
str or null | none | Why configured energy could not be estimated for this invocation. |
TensorVerification
Section titled “TensorVerification”Numerical comparison against the matching retained reference set; separate from integrity.
| Field | Type | Default | Meaning |
|---|---|---|---|
reference_index |
int | required | Index of the reference set in the bundle’s tensor evidence. |
matched |
bool | required | Whether all elements met the recorded comparison policy. |
tensors |
tuple | required | Mismatch counts and exact maximum finite absolute error for each output. |
FvpCycles
Section titled “FvpCycles”NPU cycle counters from the PMU; the stall and MAC counters depend on the PMU profile.
| Field | Type | Default | Meaning |
|---|---|---|---|
total |
int or null | none | NPU_TOTAL: cycles the NPU was clocked during the inference. |
active |
int or null | none | NPU_ACTIVE: cycles the NPU was executing work. |
idle |
int or null | none | NPU_IDLE: cycles the NPU was clocked but idle. |
elapsed |
int or null | none | NPU elapsed cycles between the driver starting and finishing the inference. |
mac_active |
int or null | none | MAC_ACTIVE: cycles the MAC array was busy (dv_align and port_stall profiles). |
mac_stalled_by_ib |
int or null | none | Cycles the MAC array stalled waiting on the input buffer (dv_align profile). |
mac_stalled_by_w_or_acc |
int or null | none | Cycles the MAC array stalled on weights or the accumulator (dv_align profile). |
sram_rd_stall_limit |
int or null | none | SRAM read outstanding-limit stall count (port_stall/sram_stall); U85 sums AXI ports, not exclusive lost time. |
sram_rd_tran_req_stalled |
int or null | none | SRAM read address-request backpressure (port_stall/sram_stall); U85 sums AXI ports, may overlap NPU work. |
sram_wr_stall_limit |
int or null | none | SRAM write outstanding-limit stall count (sram_stall); summed over AXI ports, not exclusive lost time. |
sram_wr_tran_req_stalled |
int or null | none | SRAM write address-request backpressure (sram_stall); summed over AXI ports, may overlap NPU work/read stalls. Does not count write-data backpressure; SRAM_WR_DATA_BEAT_STALLED is a separate event. |
ext_rd_stall_limit |
int or null | none | Cycles port 1 reads were stalled by the outstanding-transaction limit (ext_stall and port_stall profiles). |
ext_rd_tran_req_stalled |
int or null | none | Cycles a port 1 read request was stalled by the fabric (ext_stall, default_ext_rd_stall and port_stall profiles). |
cpu_wall |
int or null | none | Cortex-M DWT cycle count across the inference; only the heliaAOT runner emits it. |
mcu_systick_ticks |
int or null | none | SysTick ticks across the inference; only a runner built with HELX_MCU_WALL_PROBE emits it. |
FvpTrafficBeats
Section titled “FvpTrafficBeats”AXI data beats per port and direction, as the PMU counted them; fvp.beat_bits is the beat width.
| Field | Type | Default | Meaning |
|---|---|---|---|
sram_rd |
int or null | none | Read data beats received on port 0 (Arm AXI_SRAM class). |
sram_wr |
int or null | none | Write data beats written on port 0. |
sram0_rd |
int or null | none | Read data beats on the first SRAM-class interface alone (Ethos-U85). |
ext_rd |
int or null | none | Read data beats received on port 1 (Arm AXI_EXT class). |
ext_wr |
int or null | none | Write data beats written on port 1. |
ext0_rd |
int or null | none | Read data beats on the first EXT-class interface (Ethos-U85). |
ext1_rd |
int or null | none | Read data beats on the second EXT-class interface (Ethos-U85). |
FvpTrafficTransactions
Section titled “FvpTrafficTransactions”Accepted SRAM-class AXI transactions, summed across its interfaces in one invocation window.
| Field | Type | Default | Meaning |
|---|---|---|---|
sram_rd |
int or null | none | Accepted read requests, in transactions; null means not counted, zero means counted with no requests. |
sram_wr |
int or null | none | Accepted write requests, in transactions; not a completed-write count or a queue-depth measurement. |
FvpPortUtilization
Section titled “FvpPortUtilization”How busy each NPU memory interface was, averaged over the inference: data beats moved over the beats the
port’s timing adapter allows in the NPU cycles the inference took. 1 = saturated at this clock; normally 0 to 1, not
clipped (a figure above 1 means the counters exceed the programmed rate). A figure the counters cannot support is
absent, and basis says why.
| Field | Type | Default | Meaning |
|---|---|---|---|
sram0 |
float or null | none | First SRAM-class interface: SRAM0 read beats plus its share of SRAM writes, over total cycles x the port 0 beats per cycle (each SRAM interface is capped at that rate). |
sram1 |
float or null | none | Second SRAM-class interface: the remaining SRAM read beats plus its share of writes, on the same basis. |
ext |
float or null | none | EXT (port 1): EXT read and write beats over total cycles x the port 1 beats per cycle, treated as one interface (AT110 traffic uses one; basis says when both EXT interfaces carried reads). |
sram0_read_share |
float or null | none | SRAM0’s share of SRAM read beats: 0.5 is an even split between the two SRAM interfaces. |
saturated |
list[str] or null | none | Interfaces at or above 98% of their rate (SRAM0, SRAM1, EXT). Their figures stay exact here, and can exceed 1 at very low rates because the timing adapter admits whole transactions; people-facing views show them capped at 100% and marked saturated. |
basis |
str or null | none | Which counters the figures come from, what was assumed (helx’s PMU programs split SRAM reads, not writes, by interface, so writes are assumed to split like reads), and why any figure is absent. |
EnergyBlock
Section titled “EnergyBlock”Experimental energy by mode; basis identifies the simulator counter or compiler estimate source.
| Field | Type | Default | Meaning |
|---|---|---|---|
basis |
one of measured_fvp_pmu, vela_compile_time_estimate |
required | measured_fvp_pmu (from simulator PMU counters) or vela_compile_time_estimate (from Vela’s estimates). Neither identifies measured device energy or qualifies the energy model’s accuracy. |
modes |
dict[str, block EnergyMode] |
required | Energy by platform mode name. The measured block holds only the mode that ran; the Vela-estimate block projects every mode from the same counters. |
active_mode |
str or null | none | The mode the run executed in. |
model |
str or null | none | The energy model file, relative to the bundle, when it was kept. |
EnergyMode
Section titled “EnergyMode”Experimental energy, power and efficiency estimates for one inference in one operating mode.
| Field | Type | Default | Meaning |
|---|---|---|---|
total_mj |
float | required | Energy of one inference in this mode, mJ. |
core_uj |
float | required | NPU core energy, uJ. |
sram_uj |
float | required | Transfer energy over port 0 (Vela Sram class), uJ. |
ext_uj |
float | required | Transfer energy over port 1 (Vela Dram class), uJ. |
pj_per_mac |
float or null | none | Total energy over MAC operations, pJ per MAC; null for a network that does no MACs. |
gmacs_per_w |
float or null | none | Efficiency: giga-MACs per second per watt; null for a network that does no MACs. |
power_mw |
float or null | none | Average power over the inference time, mW. In energy that is measurements.samples[i].latency_s; in vela_energy it is vela.cycles_npu over vela.core_clock_hz, not vela.inference_time_s (which carries Vela’s memory model), except for a graph Vela gives no NPU cycles, where it falls back to vela.inference_time_s. |
share_core_fraction |
float | required | Core share of the total energy, 0 to 1. |
share_sram_fraction |
float | required | Port 0 transfer share of the total energy, 0 to 1. |
share_ext_fraction |
float | required | Port 1 transfer share of the total energy, 0 to 1. |
SanityBlock
Section titled “SanityBlock”Outcome of the post-run consistency checks on the PMU report.
Check names are those of helia_estimator.runtime.pmu_report.SanityCheck.
| Field | Type | Default | Meaning |
|---|---|---|---|
status |
one of pass, fail |
required | pass when every check held, else fail. |
checks |
dict[str, bool] | required | Each consistency check by name and whether it held. |
MeasurementStatistics
Section titled “MeasurementStatistics”Explicit population summaries; counter means and variances retain exact integer ratios.
| Field | Type | Default | Meaning |
|---|---|---|---|
counters |
dict[str, IntegerStatistics or null] | required | Exact summaries keyed by cycle or traffic field; null if any sample lacks the field. |
latency_s |
FloatStatistics or null | none | NPU latency population statistics in seconds, excluding warmups. |
energy_total_mj |
dict[str, FloatStatistics or null] | required | Modeled total-energy population statistics in millijoules for each mode. |
PerLayerBlock
Section titled “PerLayerBlock”Per-layer attribution artifacts, relative to the bundle.
| Field | Type | Default | Meaning |
|---|---|---|---|
per_layer_csv |
str or null | none | Per-layer cycle attribution from Vela’s verbose performance output. |
vela_verbose_log |
str or null | none | Vela’s stdout carrying the per-layer table. |
per_original_op_csv |
str or null | none | Per-layer figures folded back onto the original model’s operators. |
model_explorer_overlay |
str or null | none | JSON overlay for Model Explorer with per-operator figures. |
unavailable_reason |
str or null | none | Why calibrated attribution was omitted; raw Vela diagnostics remain available when present. |
PerSegmentBlock
Section titled “PerSegmentBlock”Fenced per-segment measurement artifacts, relative to the bundle.
| Field | Type | Default | Meaning |
|---|---|---|---|
segments |
int | required | Number of segments the fences cut the model into. |
tensor_arena_bytes |
int | required | Arena size of the fenced model, bytes. |
per_segment_csv |
str or null | none | Measured cycles per segment. |
fenced_model_tflite |
str or null | none | The model with ETHOS_U_STREAM_SPLIT fences inserted. |
fenced_vela_tflite |
str or null | none | The fenced model after Vela. |
fenced_vela_summary_csv |
str or null | none | Vela’s summary for the fenced compile. |
fenced_per_layer_csv |
str or null | none | Per-layer attribution of the fenced compile. |
estimated_vs_measured_csv |
str or null | none | Vela’s estimate against the measured cycles, per segment. |
npu_invocations |
int or null | none | NPU invocations measured, one row each in per_segment_csv. Fewer than segments when some fence segments hold only operators Vela left on the CPU (they start no invocation) or Vela removed fences after operators it folded into constants (the segments either side run as one invocation). Each row’s segment_index is the first fence segment it covers and its op range spans all of them. |
pmu_profile |
one of default, ext_stall, default_ext_rd_stall, dv_align, port_stall, sram_stall, sram_transactions or null |
none | The PMU program the fenced run counted with (fvp.pmu_profile): which counters per_segment_csv carries, e.g. the read-stall and MAC-active cycles of port_stall. All per-segment figures come from this one run. |
counters_check |
one of pass, fail or null |
none | pass when every counter the run reports sums over the segments to the run’s total, so no segment line was lost or misread; fail names the counters in counters_not_summing, including any only some segments carry, and all of them when the fenced log had no segment lines. Absent when there was nothing to compare (no run totals). |
counters_summed |
list[str] or null | none | The counters compared and found equal, by their run-total names (npu_total_cycles is the segments’ ccnt; npu_sram_rd_tran_req_stalled their sram_rd_tran_req_stalled_cycles). |
counters_not_summing |
list[str] or null | none | Counters, by run-total name, whose segment sum differs from the total or that some segments lack; absent when all agree. |
bus_trace_csv |
str or null | none | Each NPU invocation’s traffic from the fenced run’s bus trace (fvp.bus_trace), keyed as per_segment_csv is: the FVP steps it spans, transfers, bytes and beats per interface (SRAM0, SRAM1, EXT) and direction, and whether its beats equal its PMU counts. Absent without a trace, or when the trace’s segments could not be paired with the invocations (bus_trace_segments says how many it found). |
bus_trace_check |
one of pass, fail or null |
none | pass when the run printed segment lines, the trace splits into one segment per NPU invocation, each one’s beats equal that invocation’s PMU beat counts, and the whole-trace checks pass (beats against the run’s totals, time order, transfers within the burst). The trace’s segments come from its own timestamps, so this checks the split and the counts independently. Absent without fvp.bus_trace. |
bus_trace_segments |
int or null | none | NPU segments the fenced trace splits into; equal to npu_invocations when it is read right. |
bus_trace_invocations_not_matching |
list[int] or null | none | Invocations (npu_invocation) whose beats the trace does not reproduce: every one when the segment counts differ. Absent when all match. |
bus_trace_checks_failed |
list[str] or null | none | Whole-trace checks of the fenced trace that failed, by their fvp.bus_trace.checks names, or trace_read when the trace could not be read (the PMU results stand without it); absent when all pass. |
bus_trace_raw |
str or null | none | The fenced run’s raw bus trace, when the config kept it (fvp.bus_trace.keep_raw). |
layers_csv |
str or null | none | The fenced run layer by layer, one row per NPU invocation: its original operators, measured cycles and counters, traffic per port (from the bus trace when one was taken), busy and stall shares, Vela’s estimate, and its likely limit with the reason. |
layers_perfetto_json |
str or null | none | The same layers as a timeline to open at ui.perfetto.dev: end to end in fenced NPU time, a lane per likely limit, and a counter track per measured figure. |
cycles_by_limit |
dict[one of ext_bandwidth, sram_bandwidth, sram_latency, npu_engine, not_counted, int] or null |
none | Fenced NPU-active cycles of the layers on each likely-limit lane. The lanes are a heuristic: the busier port when at least 60% busy, else SRAM reads queued in at least 30% of the cycles (SRAM latency, mostly overlapped by other work), else the NPU engine when both ports and the SRAM read stalls were measured, else not_counted. |
ArtifactsBlock
Section titled “ArtifactsBlock”Paths of the files the bundle carries, relative to the bundle root; a file outside the bundle is not named.
| Field | Type | Default | Meaning |
|---|---|---|---|
root |
str | required | The artifacts directory, relative to the bundle. |
vela_tflite |
str or null | none | The Vela-compiled model. |
vela_summary_csv |
str or null | none | Vela’s summary CSV. |
vela_config |
str or null | none | The generated Vela ini the compile used. |
energy_model |
str or null | none | The energy model YAML the run used. |
runner_axf |
str or null | none | The built runner image. |
runner_input_tflite |
str or null | none | The model the runner was built with. |
fvp_stdout_log |
str or null | none | The FVP process’s stdout. |
fvp_stderr_log |
str or null | none | The FVP process’s stderr. |
fvp_uart_log |
str or null | none | The runner’s UART output, including the PMU report. |
runner_build_log |
str or null | none | The runner build’s CMake and compiler output, kept out of the terminal. |
bus_trace_timeline_csv |
str or null | none | Bus trace timeline: bytes and busy fraction per interface per slice of the inference. |
bus_trace_transfers_csv |
str or null | none | Bus trace transfer sizes: transactions per size, interface and direction. |
bus_trace_perfetto_json |
str or null | none | Bus trace timeline as a Chrome trace with one lane per interface; open it at ui.perfetto.dev. |
bus_trace_raw |
str or null | none | The FVP’s raw bus trace, when the config kept it (fvp.bus_trace.keep_raw). |