Skip to content
heliaAOT
API Reference
HELIA HUB

Release notes

This page is rendered from the repository CHANGELOG.md, which release-please writes from the conventional-commit type of every squashed pull request. Releases are newest first. The 10 most recent releases are here in full; the whole history is in CHANGELOG.md.

  • ethosu: support ETHOS_U_STREAM_SPLIT boundaries (#952) (1e5e076)
  • fold SHAPE-derived FILL dims and infer UNPACK outputs (#958) (7d0eb39), refs #957
  • operators: accept int32 and int64 tensors in SQUEEZE and EXPAND_DIMS (c0cd51a), refs #944 #942
  • reshape: accept int32 and int64 tensors (1f24d43), refs #942 #938
  • squeeze: accept float16 on FP32-only platforms (f67b912), refs #948
  • air: keep views off owned storage and check graph structure (483920f), refs #934
  • run converted models through the LiteRT interpreter (b8d87e1)
  • transforms: keep a model output out of the constant arena when folding shape expressions (e6ad336), refs #938 #934
  • batch_matmul: transpose a constant operand at conversion time (01dfc4f), refs #932 #897
  • gather: accept constant int64 indices whose values fit int32 (#931) (18e5733), refs #806
  • plan: record each layer’s candidate kernels and whether its tables qualify for right-shift-only requantization (#813) (6e437da)
  • report: record rounding-safe FP16 overflow thresholds for packed convolutions fed from a model input (#813) (6e437da)
  • report: name table filters by heading, keep the skip link in place, and remove unused helpers, icon and styles (#717) (6e437da)
  • report: show per-tensor and per-channel quantization distinctly, and configuration paths relative to the configuration with an exact-config download (#717) (6e437da)
  • transforms: fold resource variables that provably never change into constants (#933) (b9a220c), refs #897
  • align report wording, the residency schema docstring, the third-party notices and the supported browser range (#717) (6e437da)
  • a conversion without a log file stops writing the previous one; CI test follow-ups (#925) (5964185), refs #916 #919 #923 #924
  • air: reject a custom operator code with a character other than an ASCII letter, digit, hyphen, space or underscore (#889) (6291599)
  • aot: render literal values in static operator parameter initializers, which strict ISO C requires (#854) (6291599)
  • aot: stop an MVE build of a non-MVE conversion only where the layer’s MVE build needs more (#891) (6291599)
  • cli: hold configuration warnings for the invocation that produced them and emit each once through its own logger (#890) (6291599)
  • cli: merge a setting given on the command line under its former name as its current name does (#895) (6291599)
  • deps: update certifi to 2026.10.23 for the emSign certificate incident (#927) (6634d0a), refs #922
  • docs: render each operator restriction once on the operators reference page (#887) (6291599)
  • heliaAOT 1.0, ahead-of-time compiled, allocation-free edge AI for Ambiq SoCs with a stable 1.x promise for the Python API, the configuration format and the generated C API (ee80fa9)
  • A looping –log-file symbolic link now exits 2 instead of producing a traceback with exit 1.
  • correct hydration, transform-options and site dependency notes (#900) (0c4c0d3), refs #812
  • add ConversionResult views and pass the 0-based layer index, not the AIR node id, as the operator callback’s op (C API 1.1.0)
  • make the custom-operator plugin, platform registration, interpreter and RegistryBundle names provisional
  • rename enum members to UPPER_CASE; the lowercase names remain aliases, but member.name is now uppercase
  • make ConversionResult compare by identity
  • make compiler helpers on promised classes private, and remove Registry.unfreeze and RegistryContext.unfreeze
  • move <prefix>_context_init from the public to the advanced generated C API
  • narrow the promised generated file names to the integration headers, the cmake, zephyr and nsx manifests and the plan, report and residency files
  • require ns-cmsis-nn 7.47.0 in generated modules
  • remove <prefix>_compiler.h from generated modules
  • start resource variables at their CALL_ONCE initial values
  • reject models LiteRT refuses: mismatched quantization on CONCATENATION, PACK, UNPACK, SPACE_TO_BATCH_ND, BATCH_TO_SPACE_ND, REDUCE_MAX, REDUCE_MIN, EXPAND_DIMS and FILL, a fused activation on CONCATENATION, and plain CALL
  • refuse an MVE build of a module converted without MVE when its kernels would differ
  • exit 2 for every rejected input, including a missing or unreadable model, an existing output without –force and a missing golden archive
  • let an operator or tensor rule that names an id outrank a rule that names only a type
  • stage constants from cold memory when a rule sets only constant_destination_memory
  • require unique decimal operator ids from custom parsers and transforms (OperatorIdError)
  • raise ModelLoadError for a missing model, and RegistryFrozenError and DuplicateRegistrationError from registries
  • raise UnsupportedModelError for STRIDED_SLICE ellipsis and new-axis masks and for a customCode with no letter or digit
  • check free-form custom-operator rules for unknown and removed keys
  • make –verbose 0 show errors only, including warnings raised while the configuration is read
  • reject a module directory that is a symbolic link, and a module.path component, module.name, module.prefix or golden-data name longer than 255 characters, with exit 2 on every OS
  • add ConversionResult views and pass the 0-based layer index, not the AIR node id, as the operator callback’s op (C API 1.1.0) (240db0a)
  • count TRANSPOSE_CONV and BATCH_MATMUL MACs, and stop counting rewritten transpose convolutions four times (240db0a)
  • deprecate platform.speeds and reject the former AirTensor field names (240db0a)
  • keep the verbose levels 0 to 3 and mark the cmsis_pack module type experimental (240db0a)
  • make compiler helpers on promised classes private, and remove Registry.unfreeze and RegistryContext.unfreeze (240db0a)
  • make ConversionResult compare by identity (240db0a)
  • make the custom-operator plugin, platform registration, interpreter and RegistryBundle names provisional (240db0a)
  • move <prefix>_context_init from the public to the advanced generated C API (240db0a)
  • narrow the promised generated file names to the integration headers, the cmake, zephyr and nsx manifests and the plan, report and residency files (240db0a)
  • remove <prefix>_compiler.h from generated modules (240db0a)
  • rename enum members to UPPER_CASE; the lowercase names remain aliases, but member.name is now uppercase (240db0a)
  • require ns-cmsis-nn 7.47.0 in generated modules (240db0a)
  • reserve status codes 1000-1999 for custom operators and pin the generated C API by digest (240db0a)
  • check free-form custom-operator rules for unknown and removed keys (240db0a)
  • deliver configuration and preflight warnings to –log-file (240db0a)
  • exit 2 for every rejected input, including a missing or unreadable model, an existing output without –force and a missing golden archive (240db0a)
  • let an operator or tensor rule that names an id outrank a rule that names only a type (240db0a)
  • make –verbose 0 show errors only, including warnings raised while the configuration is read (240db0a)
  • migrate former keys in memory.tensors attribute rules and reject two former spellings of one setting given together (240db0a)
  • raise ModelLoadError for a missing model, and RegistryFrozenError and DuplicateRegistrationError from registries (240db0a)
  • raise UnsupportedModelError for STRIDED_SLICE ellipsis and new-axis masks and for a customCode with no letter or digit (240db0a)
  • refuse an MVE build of a module converted without MVE when its kernels would differ (240db0a)
  • reject a module directory that is a symbolic link, and a module.path component, module.name, module.prefix or golden-data name longer than 255 characters, with exit 2 on every OS (240db0a)
  • reject models LiteRT refuses: mismatched quantization on CONCATENATION, PACK, UNPACK, SPACE_TO_BATCH_ND, BATCH_TO_SPACE_ND, REDUCE_MAX, REDUCE_MIN, EXPAND_DIMS and FILL, a fused activation on CONCATENATION, and plain CALL (240db0a)
  • report user mistakes in paths, logs and models as typed errors instead of tracebacks (240db0a)
  • require unique decimal operator ids from custom parsers and transforms (OperatorIdError) (240db0a)
  • share storage between resource-variable handles that name one variable (240db0a)
  • stage constants from cold memory when a rule sets only constant_destination_memory (240db0a)
  • start resource variables at their CALL_ONCE initial values (240db0a)
  • correct the user documentation against 0.31.0 and record the 0.32.0 changes (240db0a)
  • list-targets and target-info are deprecated: they print a warning on stderr and are removed in 2.0; use platforms list and platforms show NAME.
  • AotConverter.convert() returns a ConversionResult (output, prefix, plan, report, work_dir) instead of the internal code generation context; read those fields, or the residency report, instead of the context’s attributes, and result.work_dir (set with keep_work_dir) instead of the context’s work_path. ConvertArgs.from_yaml raises InvalidConfigError, a ConfigValueError, for a file it cannot load or a key or value that does not validate; catch ConfigValueError instead of FileNotFoundError, ValueError or ValidationError. model_validate still raises pydantic’s ValidationError. ConfigValueError no longer takes an exit_code argument; raise InvalidConfigError for a configuration rejected on its own or against the target, which exits 2. UnsupportedModelError is now a ConfigValueError, so except ConfigValueError and isinstance(error, ConfigValueError) also take unsupported models; put an except UnsupportedModelError before an except ConfigValueError. ModelLoadError is an OSError and no longer a FileNotFoundError; catch ModelLoadError or OSError for a model that cannot be loaded. helia_aot no longer lists subpackages in __all__, and each name is promised at one import path: import AotConverter and ConvertArgs from helia_aot, RegistryContext, RegistryBundle and build_default_registry_context from helia_aot.registry, AotOperator, CtxBufUsage, OperatorAttributes and OpCapability from helia_aot.aot.operators, the memory types from helia_aot.memory, and ValidCVarNameType and ValidModuleNameType from helia_aot.defines.
  • the plan’s platform.core and each report measurement’s core are now written as cpu. Read plan.platform.cpu and record.cpu, and call measurements_for(setting, target, cpu). A plan or report that still says core reads as before. OptimizationPlan and OptimizationReport no longer reject unknown fields, knobs, knob values or members. To check that a file holds only what one release writes, validate it against the json_schema object in that release’s plan-schema.json or report-schema.json (in docs/src/data/generated/ at the release’s tag); the files themselves are export envelopes and accept anything. The rename keeps schema_version 1, an exception made once before 1.0: a script that reads the raw JSON should read cpu and fall back to core, and heliaAOT 0.30 and earlier cannot read a plan or report this release writes. PlanOptimization.goal is now the string written, not an OptimizationGoal member; it still compares equal to the member.
  • generated modules no longer build against ns-cmsis-nn older than 7.46.0. Projects on 7.45.x or earlier must update ns-cmsis-nn before rebuilding a regenerated module.
  • let the accumulation knob select the FP16 depthwise entry (#852) (2a2a10b)
  • mark the generated module’s public C API and emit an API version (7dfb0a5), refs #845 #812
  • one deprecation mechanism, strict built-in operator attributes, and no dead settings (0270e7b), refs #844 #812
  • one source for errors and exit codes, a 1.0-sized Python API, and a public convert() result (017e8d2), refs #846 #812
  • read plans and reports from newer 1.x releases and name the plan’s CPU field cpu (f8a81ee), refs #843 #812
  • require ns-cmsis-nn 7.46.0 in generated modules (cf0adf3), refs #812 #356
  • aot: compile non-finite test-case values and classify floats by bit pattern (559d611), refs #820 #812
  • aot: emit constant initializers for per-tensor FULLY_CONNECTED (0aeab73), refs #851 #812
  • aot: end every generated file with a newline (341cb39), refs #831 #812
  • aot: generate valid C for models with no outputs (00b24be), refs #839 #812
  • convert the release probe model under one name (#803) (49f16db), refs #339
  • docs: classify the shared activations header as internal (e6dc537), refs #845 #812
  • e2e: verify toolchain downloads against pinned digests and reinstall stale trees (5f0043f), refs #804
  • follow LiteRT when an int8 LSTM cell clip quantizes to zero (af2af9f), refs #822 #812
  • lower float REDUCE_MAX/MIN to the TFLite-exact CORE entries (ada9fef)
  • lower float REDUCE_MAX/MIN to the TFLite-exact CORE entries (ada9fef), refs #810
  • make the declared dependency floors work, and test Python 3.12/3.13 and host clang (5729053), refs #836 #812
  • reject int8 LSTMs whose hidden intermediate quantization differs from the output state (9e2b2ce), refs #817 #812
  • release: bundle LiteRT in the Windows binary and smoke every binary before upload (ccc8e2b), refs #830 #812
  • release: keep release PRs from closing issues and pin what verification installs (972545c), refs #842 #847 #812
  • release: verify releases under the commit’s generation time and fail on missing goldens (6207368), refs #804 #339
  • write UTF-8 generated text, keep CLI output console-safe, and type malformed input errors (f36ae2f), refs #812
  • align the 1.x docs with the support decisions and LiteRT differences (51c7ea3), refs #812 #818
  • clarify fully connected and slice validation errors (c1e2759), closes #703 #732
  • clarify memory budgets and retained residency report paths (6a63d33)
  • clarify omitted operands and excess filter skips (#771) (79a92a5), closes #703
  • contain native golden-generation failures (1e1b74e)
  • declare Apollo510B EVB PSRAM (8fe74dc), closes #684
  • document root CLI options and reject malformed README markers (1120db1), closes #710 #727
  • enforce model options and reference execution error contracts (ac72c97)
  • honor partial STRIDED_SLICE vectors (514ca5e)
  • offer feasible memory budget remedies (efc1c44), closes #709
  • preserve importer payload consumers and diagnostics (fbc5183)
  • preserve resolved CORE dependency requirements (#795) (5d66018), closes #356 #336
  • reject unsupported int16 depthwise geometry (a343653), closes #714
  • reserve FP16 depthwise patch-row scratch (#781) (ff5ec3a), closes #779
  • retain direct depthwise kernels for the size policy (#772) (2781b0a), closes #529 #587
  • share binary floating shape validation (#766) (c833d41)
  • share floating mean shape validation (#767) (ab9bfac), closes #694
  • share unary floating shape validation (#759) (a463ff5)
  • support eager root version discovery (7177f1f)
  • validate fully connected operand references (1f68b45), closes #703
  • validate LiteRT tensor sources and scalar ranks (ff3c0f5)
  • validate selected CORE kernel argument domains (#793) (48f5129)
  • precompute SVDF kernel sums and resolve SVDF through a CORE provider plan (#800) (22ae96b), closes #336 #587
  • route int8 bilinear resize to direct Core kernels (#758) (d4379d6)
  • route int8 bilinear resize to direct Core kernels. (d4379d6), closes #356
  • describe current contracts without change history (#794) (fc1ee38), closes #336
  • require CORE 7.44.2 for corrected LiteRT conversions
  • require CORE 7.44.2 for corrected LiteRT conversions (c8a9520)
  • reject invalid configuration and proven shape operands (22695e3)

Earlier releases are in CHANGELOG.md.