Changes in 23.11
    * Support for 23.11 NPU components and dependencies (core-driver, core-platform, Vela 3.10.0, CMSIS, CMSIS-NN and TensorFlow Lite Micro).
    * Increase minimum requirements of Python to 3.10
    * Update Python files to conform to Pylint
    * Adding support for Arm Cortex-M85 with GCC
    * Updates to documentation

Changes in 23.08
    * Support for 23.08 NPU components and dependencies (core-driver, core-platform, Vela 3.9.0, CMSIS, CMSIS-NN and TensorFlow Lite Micro).
    * Update Python package requirements for compatibility reasons.
    * Increase minimum requirements of Armclang to 6.19

Changes in 23.05
    * Support for 23.05 NPU components and dependencies (core-driver, core-platform, Vela 3.8.0, CMSIS, CMSIS-NN and TensorFlow Lite Micro).
    * Minor updates to CMSIS-pack dependencies.
    * Update Python package requirements for compatibility reasons.
    * Increase minimum requirements of Python to 3.9

Changes in 23.02
    * Support for 23.02 NPU components and dependencies (core-driver, core-platform, Vela 3.7.0, CMSIS, CMSIS-DSP, CMSIS-NN and TensorFlow Lite Micro).
    * Improvement to PMU counters - reducing cache maintenance burden for Arm Cortex-M55 CPUs when NPU is used.
    * Inclusive language updates.
    * Documentation updates including adding links to AN555 resources.
    * Updates to Python requirements file for virtual environment.

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 stop responding 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 stop responding after some period of inactivity.
