Changes in 22.11
    * Support for 22.11 NPU components and dependencies (core-driver, core-platform, Vela 3.6.0, CMSIS, TensorFlow Lite Micro)
    * CMSIS-NN is added as a new dependency due to it moving out of the core CMSIS repository.
    * Updates for Arm® Corstone™-310 platform.
    * Formal support for CMake presets.
    * Support for the new Arm Compiler 6.19
    * Published CMSIS-Pack under `resources` and related updates.
    * Bug fix for building with NPU disabled.

Changes in 22.08
    * Support for 22.08 NPU component and dependencies (core-driver, core-platform, Vela 3.5.0, CMSIS, TensorFlow Lite Micro).
    * Formal support for Arm® Corstone-310 Arm Virtual Hardware and FPGA implementations.
    * Added CMake presets.
    * Bug fix for Arm® Ethos-U65 NPU's default AXI burst length.
    * Provision to allow platform-agnostic use case API to be packaged as CMSIS pack.
    * Documentation updates.

Changes in 22.05
    * Support for 22.05 NPU component and dependencies (core-driver, core-platform, Vela 3.4.0, CMSIS, TensorFlow Lite Micro).
    * Restructuring of repository sources to allow generation of CMSIS packs.
    * Added support for Arm Cortex-M85, Armclang 6.18 is required
    * Reduce minimum requirements of Python to 3.7 to align with Vela 3.4.0.
    * Increase minimum requirements of CMake to 3.21.0
    * Documentation updates.
    * Various bug fixes.

Changes in 22.02
    * Support for 22.02 NPU component and dependencies (core-driver, core-platform, Vela 3.3.0, CMSIS, TensorFlow Lite Micro).
    * Added Object Detection use case.
    * Replace DSCNN with MicroNet for KWS and KWS_ASR use cases.
    * Increase minimum requirements of CMake to 3.15.6, Armclang to 6.16 and Python to 3.8
    * Initial restructuring of repository sources.
    * Documentation updates.
    * Various minor bug fixes.

Changes in 21.11
    * Support for 21.11 NPU component and dependencies (core-software, core-driver, Vela 3.2.0, CMSIS, TensorFlow Lite Micro).
    * Added dynamic load support for FVP for inference runner use-case.
    * Added support for different memory modes: Shared_Sram, Dedicated_Sram and Sram_Only.
    * Added Noise Reduction use case.
    * Updated support for Arm GNU Embedded Toolchain 10.3-2021.07 and Arm Compiler 6.17.
    * Documentation updates.
    * Changes to support AN552 design - the new Arm® Corstone™-300 implementation.

Changes in 21.08
    * Support for 21.05 NPU component (core-software, core-driver, Vela 3.0.0).
    * TensorFlow submodule changed to https://github.com/tensorflow/tflite-micro (tested with TensorFlow Lite Micro commit hash: f510d38d0eaa3195ce3af66e3f32648740f08afb).
    * Image classification model changed (from uint8 to int8 datatype).
    * Documentation updates, added support to Corstone-300 + Arm® Ethos-U65.
    * Various scripts improvements.
    * Added Visual Wake Word use case.

Changes in 21.05
    * Added script to download and optimize default models.
    * Added script to run default build flow.
    * Added a model for Anomaly Detection use case.
    * Added support for build with Arm GNU Embedded Toolchain (10.2.1).
    * Deprecated support for target subsystem SSE-200.

Changes in 21.03
    * Simple platform support added.
    * Model conditioning examples added.
    * Documentation updated.
    * Build changed to use sources of the dependency libraries.
    * Tests for native platform added.
    * Anomaly detection use-case added.

Changes in 20.11
    * SSE-200 and SSE-300 system support was added.
    * Support for simple fixed virtual platform for Arm® Ethos-U55 and Arm® Cortex-M55 removed.
    * Build cmake parameters changed: TARGET_SUBSYSTEM was added, TARGET_PLATFORM accepted values were changed.
    * Models with multiple output tensors support was added.
    * Generic inference runner use-case added.
    * ASR triggered by KWS added in the same use case (kws_asr). This also shows how to re-use tensor arena with two models using the same memory pool.

Changes in 20.09 release:
    * Support for TensorFlow Lite Micro version > 2.3.0 (tested with TensorFlow Lite Micro 2.4.0 commit hash: 5bbb8a2bd1def6865b1510175a3da5fd12387e10)
    * Added speech recognition use case example.
    * Updated NPU Fastmodel version to r0p2-00eac0-rc4

Changes in 20.08 release:
    * Added keyword spotting use case example.
    * Added person detection use case example.
Known issues:
    * telnet connection to FastModel environment may hang after some period of inactivity.

Changes in 20.05 release:
    * FastModel environment was built with FastModel Tools v11.10.22.
    * Mps3 FPGA build support was added.
    * Configurable timing-adaptor.
    * Added Active and Idle cycle counts for NPU and CPU profiling report.
    * Source code structure and build scripts refactored to support multiple ML use-cases.
    * Used EAC NPU software model and drivers.
    * Windows support for build scripts.
Known issues:
    * telnet connection to FastModel environment may hang after some period of inactivity.
