diff --git a/CMakeLists.txt b/CMakeLists.txt
index 7b56fa3..e7cd9e1 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -30,6 +30,7 @@
 
 set(LOG_NAMES err warning info debug)
 set(ETHOSU_LOG_SEVERITY "warning" CACHE STRING "Driver log severity level ${LOG_NAMES} (Defaults to 'warning')")
+set(ETHOSU_TARGET_NPU_CONFIG "ethos-u55-128" CACHE STRING "Default NPU configuration")
 set_property(CACHE ETHOSU_LOG_SEVERITY PROPERTY STRINGS ${LOG_NAMES})
 
 #
@@ -53,7 +54,28 @@
 # Build driver library
 add_library(ethosu_core_driver STATIC)
 target_include_directories(ethosu_core_driver PUBLIC include)
-target_sources(ethosu_core_driver PRIVATE src/ethosu_driver.c src/ethosu_device_u55.c src/ethosu_pmu.c)
+target_sources(ethosu_core_driver PRIVATE src/ethosu_driver.c src/ethosu_pmu.c)
+
+string(TOLOWER ${ETHOSU_TARGET_NPU_CONFIG} ETHOSU_TARGET_NPU_CONFIG)
+if(ETHOSU_TARGET_NPU_CONFIG MATCHES "^ethos-(u[0-9]+|uz)-([0-9]+$)")
+    set(ETHOSU_ARCH ${CMAKE_MATCH_1})
+    set(ETHOSU_MACS ${CMAKE_MATCH_2})
+else()
+    message(FATAL_ERROR "Invalid Ethos-U target configuration '${ETHOSU_TARGET_NPU_CONFIG}")
+endif()
+
+target_compile_definitions(ethosu_core_driver PRIVATE
+    ETHOSU_ARCH=${ETHOSU_ARCH}
+    ETHOS$<UPPER_CASE:${ETHOSU_ARCH}>)
+
+if (ETHOSU_ARCH STREQUAL "u55" OR ETHOSU_ARCH STREQUAL "u65")
+    target_sources(ethosu_core_driver PRIVATE src/ethosu_device_u55_u65.c)
+else()
+    message(FATAL_ERROR "Invalid NPU configuration")
+endif()
+
+
+# Set the log level for the target
 target_compile_definitions(ethosu_core_driver PRIVATE ETHOSU_LOG_SEVERITY=${LOG_SEVERITY})
 
 # Install library and include files
@@ -67,6 +89,7 @@
 
 message(STATUS "*******************************************************")
 message(STATUS "PROJECT_NAME                           : ${PROJECT_NAME}")
+message(STATUS "ETHOSU_TARGET_NPU_CONFIG               : ${ETHOSU_TARGET_NPU_CONFIG}")
 message(STATUS "CMAKE_SYSTEM_PROCESSOR                 : ${CMAKE_SYSTEM_PROCESSOR}")
 message(STATUS "CMSIS_PATH                             : ${CMSIS_PATH}")
 message(STATUS "ETHOSU_LOG_SEVERITY                    : ${ETHOSU_LOG_SEVERITY}")
diff --git a/include/ethosu_device.h b/include/ethosu_device.h
deleted file mode 100644
index dad88ef..0000000
--- a/include/ethosu_device.h
+++ /dev/null
@@ -1,439 +0,0 @@
-/*
- * Copyright (c) 2019-2021 Arm Limited. All rights reserved.
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Licensed under the Apache License, Version 2.0 (the License); you may
- * not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an AS IS BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef ETHOSU_DEVICE_H
-#define ETHOSU_DEVICE_H
-
-/******************************************************************************
- * Includes
- ******************************************************************************/
-
-#include <stdbool.h>
-#include <stdint.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/******************************************************************************
- * Defines
- ******************************************************************************/
-
-#define ETHOSU_BASEP_INDEXES 8 ///< Number of base pointer indexes
-
-#ifndef ETHOSU_PMU_NCOUNTERS
-#define ETHOSU_PMU_NCOUNTERS 4
-#endif
-
-/******************************************************************************
- * Types
- ******************************************************************************/
-
-enum ethosu_error_codes
-{
-    ETHOSU_SUCCESS         = 0,  ///< Success
-    ETHOSU_GENERIC_FAILURE = -1, ///< Generic failure
-    ETHOSU_INVALID_PARAM   = -2  ///< Invalid parameter
-};
-
-struct ethosu_device
-{
-    volatile uintptr_t base_address;
-    uint32_t proto;
-    uint32_t pmcr;
-    uint32_t pmccntr[2];
-    uint32_t pmcnten;
-    uint32_t pmint;
-    uint32_t pmccntr_cfg;
-    uint32_t pmu_evcntr[ETHOSU_PMU_NCOUNTERS];
-    uint32_t pmu_evtypr[ETHOSU_PMU_NCOUNTERS];
-    uint32_t secure;
-    uint32_t privileged;
-};
-
-struct ethosu_id
-{
-    uint32_t version_status; ///< Version status
-    uint32_t version_minor;  ///< Version minor
-    uint32_t version_major;  ///< Version major
-    uint32_t product_major;  ///< Product major
-    uint32_t arch_patch_rev; ///< Architecture version patch
-    uint32_t arch_minor_rev; ///< Architecture version minor
-    uint32_t arch_major_rev; ///< Architecture version major
-};
-
-struct ethosu_config
-{
-    uint32_t macs_per_cc;        ///< MACs per clock cycle
-    uint32_t cmd_stream_version; ///< NPU command stream version
-    uint32_t shram_size;         ///< SHRAM size
-    uint32_t custom_dma;         ///< Custom DMA enabled
-};
-
-/**
- * Memory type parameter for set_regioncfg_reg:
- *   Counter{0,1}: Outstanding transactions for
- *   AXI port 0 for memory type/region a=0,b=1
- *   Counter{2,3}: Outstanding transactions for
- *   AXI port 1 for memory type/region a=2,b=3
- */
-enum ethosu_memory_type
-{
-    ETHOSU_AXI0_OUTSTANDING_COUNTER0 = 0, ///< NPU axi0_outstanding_counter0
-    ETHOSU_AXI0_OUTSTANDING_COUNTER1 = 1, ///< NPU axi0_outstanding_counter1
-    ETHOSU_AXI1_OUTSTANDING_COUNTER2 = 2, ///< NPU axi1_outstanding_counter2
-    ETHOSU_AXI1_OUTSTANDING_COUNTER3 = 3  ///< NPU axi1_outstanding_counter3
-};
-
-enum ethosu_axi_limit_beats
-{
-    ETHOSU_AXI_LIMIT_64_BYTES  = 0, ///< NPU AXI limit 64 byte burst split alignment.
-    ETHOSU_AXI_LIMIT_128_BYTES = 1, ///< NPU AXI limit 128 byte burst split alignment.
-    ETHOSU_AXI_LIMIT_256_BYTES = 2  ///< NPU AXI limit 256 byte burst split alignment.
-};
-
-enum ethosu_axi_limit_mem_type
-{
-    ETHOSU_MEM_TYPE_DEVICE_NON_BUFFERABLE                 = 0,
-    ETHOSU_MEM_TYPE_DEVICE_BUFFERABLE                     = 1,
-    ETHOSU_MEM_TYPE_NORMAL_NON_CACHEABLE_NON_BUFFERABLE   = 2,
-    ETHOSU_MEM_TYPE_NORMAL_NON_CACHEABLE_BUFFERABLE       = 3,
-    ETHOSU_MEM_TYPE_WRITE_THROUGH_NO_ALLOCATE             = 4,
-    ETHOSU_MEM_TYPE_WRITE_THROUGH_READ_ALLOCATE           = 5,
-    ETHOSU_MEM_TYPE_WRITE_THROUGH_WRITE_ALLOCATE          = 6,
-    ETHOSU_MEM_TYPE_WRITE_THROUGH_READ_AND_WRITE_ALLOCATE = 7,
-    ETHOSU_MEM_TYPE_WRITE_BACK_NO_ALLOCATE                = 8,
-    ETHOSU_MEM_TYPE_WRITE_BACK_READ_ALLOCATE              = 9,
-    ETHOSU_MEM_TYPE_WRITE_BACK_WRITE_ALLOCATE             = 10,
-    ETHOSU_MEM_TYPE_WRITE_BACK_READ_AND_WRITE_ALLOCATE    = 11
-};
-
-enum ethosu_clock_q_request
-{
-    ETHOSU_CLOCK_Q_DISABLE = 0, ///< Disble NPU signal ready for clock off.
-    ETHOSU_CLOCK_Q_ENABLE  = 1  ///< Enable NPU signal ready for clock off when stop+idle state reached.
-};
-
-enum ethosu_power_q_request
-{
-    ETHOSU_POWER_Q_DISABLE = 0, ///< Disble NPU signal ready for power off.
-    ETHOSU_POWER_Q_ENABLE  = 1  ///< Enable NPU signal ready for power off when stop+idle state reached.
-};
-
-/******************************************************************************
- * Prototypes
- ******************************************************************************/
-
-/**
- * Initialize the device.
- */
-enum ethosu_error_codes ethosu_dev_init(struct ethosu_device *dev,
-                                        const void *base_address,
-                                        uint32_t secure_enable,
-                                        uint32_t privilege_enable);
-
-/**
- * Get device id.
- */
-enum ethosu_error_codes ethosu_dev_get_id(struct ethosu_device *dev, struct ethosu_id *id);
-
-/**
- * Get device configuration.
- */
-enum ethosu_error_codes ethosu_dev_get_config(struct ethosu_device *dev, struct ethosu_config *config);
-
-/**
- * Execute a given command stream on NPU.
- * \param[in] cmd_stream_ptr   Pointer to the command stream
- * \param[in] cms_length       Command stream length
- * \param[in] base_addr        Pointer to array of base addresses
- *                             - 0: weight tensor
- *                             - 1: scratch tensor
- *                             - All input tensors
- *                             - All output tensors
- * \param[in] num_base_addr    Number of base addresses.
- * \return                     \ref ethosu_error_codes
- */
-enum ethosu_error_codes ethosu_dev_run_command_stream(struct ethosu_device *dev,
-                                                      const uint8_t *cmd_stream_ptr,
-                                                      uint32_t cms_length,
-                                                      const uint64_t *base_addr,
-                                                      int num_base_addr);
-
-/**
- * Check if IRQ is raised.
- * \param[out] irq_status      Pointer to IRQ status
- *                             - 0 IRQ not raised
- *                             - 1 IRQ raised
- * \return                     \ref ethosu_error_codes
- */
-enum ethosu_error_codes ethosu_dev_is_irq_raised(struct ethosu_device *dev, uint8_t *irq_status);
-
-/**
- * Clear IRQ status.
- * \return                     \ref ethosu_error_codes
- */
-enum ethosu_error_codes ethosu_dev_clear_irq_status(struct ethosu_device *dev);
-
-/**
- * Get the 16 bit status mask.
- * \param[out] irq_status_mask     Pointer to the status mask.
- *                                 The lower 16 bits of status reg are returned.
- *                                 bit0: state
- *                                 bit1: irq_raised
- *                                 bit2: bus_status
- *                                 bit3: reset_status
- *                                 bit4: cmd_parse_error
- *                                 bit5: cmd_end_reached
- *                                 bit6: pmu_irq_raised
- *                                 bit7-15: reserved
- * \return                         \ref ethosu_error_codes
- */
-
-enum ethosu_error_codes ethosu_dev_get_status_mask(struct ethosu_device *dev, uint16_t *status_mask);
-
-/**
- * Get current NPU status
- * \return                     32 bit status value
- */
-uint32_t ethosu_dev_get_status(struct ethosu_device *dev);
-
-/**
- * Get the 16 bit IRQ history mask.
- * \param[out] irq_history_mask    Pointer to the IRQ history mask.
- * \return                         \ref ethosu_error_codes
- */
-enum ethosu_error_codes ethosu_dev_get_irq_history_mask(struct ethosu_device *dev, uint16_t *irq_history_mask);
-
-/**
- * Clear the given bits in the
- *                                     IRQ history mask.
- * \param[in] irq_history_clear_mask   16 bit mask indicating which bits to
- *                                     clear in the IRQ history mask.
- * \return                             \ref ethosu_error_codes
- */
-enum ethosu_error_codes ethosu_dev_clear_irq_history_mask(struct ethosu_device *dev, uint16_t irq_history_clear_mask);
-
-/**
- * Perform a NPU soft reset.
- * \return                     \ref ethosu_error_codes
- */
-enum ethosu_error_codes ethosu_dev_soft_reset(struct ethosu_device *dev);
-
-/**
- * Wait for reset ready.
- * \return                     \ref ethosu_error_codes
- */
-enum ethosu_error_codes ethosu_dev_wait_for_reset(struct ethosu_device *dev);
-
-/**
- * Read and return the content of a given NPU APB
- *                             register range.
- * \param[in] start_address    Start address.
- * \param[in] num_reg          Number of registers to read.
- * \param[out] reg_p           Pointer to a output area, allocated by the
- *                             caller, where the register content shall be
- *                             written.
- * \return                     \ref ethosu_error_codes
- */
-enum ethosu_error_codes ethosu_dev_read_apb_reg(struct ethosu_device *dev,
-                                                uint32_t start_address,
-                                                uint16_t num_reg,
-                                                uint32_t *reg_p);
-
-/**
- * Set qconfig register. I.e.
- *                             AXI configuration for the command stream.
- * \param[in] memory_type      Memory_type to use for command stream:
- *                             enum ethosu_memory_type.
- * \return                     \ref ethosu_error_codes
- */
-enum ethosu_error_codes ethosu_dev_set_qconfig(struct ethosu_device *dev, enum ethosu_memory_type memory_type);
-
-/**
- * Set register REGIONCFG.
- *                             Base pointer configuration.
- *                             Bits[2*k+1:2*k] give the memory type for BASEP[k].
- * \param[in] region           Region field to set: 0 - 7.
- * \param[in] memory_type      Memory_type to use for region: enum ethosu_memory_type.
- * \return                     \ref ethosu_error_codes
- */
-enum ethosu_error_codes ethosu_dev_set_regioncfg(struct ethosu_device *dev,
-                                                 uint8_t region,
-                                                 enum ethosu_memory_type memory_type);
-
-/**
- * Set AXI limit parameters for port 0 counter 0.
- * \param[in] max_beats        Burst split alignment, \ref ethosu_axi_limit_beats.
- * \param[in] memtype          Cache policy \ref ethosu_axi_limit_mem_type
- * \param[in] max_reads        Maximum number of outstanding reads.
- * \param[in] max_writes       Maximum number of outstanding writes.
- * \return                     \ref ethosu_error_codes
- */
-enum ethosu_error_codes ethosu_dev_set_axi_limit0(struct ethosu_device *dev,
-                                                  enum ethosu_axi_limit_beats max_beats,
-                                                  enum ethosu_axi_limit_mem_type memtype,
-                                                  uint8_t max_reads,
-                                                  uint8_t max_writes);
-/**
- * Set AXI limit parameters for port 0 counter 1.
- * \param[in] max_beats        Burst split alignment, \ref ethosu_axi_limit_beats.
- * \param[in] memtype          Cache policy \ref ethosu_axi_limit_mem_type
- * \param[in] max_reads        Maximum number of outstanding reads.
- * \param[in] max_writes       Maximum number of outstanding writes.
- * \return                     \ref ethosu_error_codes
- */
-enum ethosu_error_codes ethosu_dev_set_axi_limit1(struct ethosu_device *dev,
-                                                  enum ethosu_axi_limit_beats max_beats,
-                                                  enum ethosu_axi_limit_mem_type memtype,
-                                                  uint8_t max_reads,
-                                                  uint8_t max_writes);
-/**
- * Set AXI limit parameters for port 1 counter 2.
- * \param[in] max_beats        Burst split alignment, \ref ethosu_axi_limit_beats.
- * \param[in] memtype          Cache policy \ref ethosu_axi_limit_mem_type
- * \param[in] max_reads        Maximum number of outstanding reads.
- * \param[in] max_writes       Maximum number of outstanding writes.
- * \return                     \ref ethosu_error_codes
- */
-enum ethosu_error_codes ethosu_dev_set_axi_limit2(struct ethosu_device *dev,
-                                                  enum ethosu_axi_limit_beats max_beats,
-                                                  enum ethosu_axi_limit_mem_type memtype,
-                                                  uint8_t max_reads,
-                                                  uint8_t max_writes);
-/**
- * Set AXI limit parameters for port 1 counter 3.
- * \param[in] max_beats        Burst split alignment, \ref ethosu_axi_limit_beats.
- * \param[in] memtype          Cache policy \ref ethosu_axi_limit_mem_type
- * \param[in] max_reads        Maximum number of outstanding reads.
- * \param[in] max_writes       Maximum number of outstanding writes.
- * \return                     \ref ethosu_error_codes
- */
-enum ethosu_error_codes ethosu_dev_set_axi_limit3(struct ethosu_device *dev,
-                                                  enum ethosu_axi_limit_beats max_beats,
-                                                  enum ethosu_axi_limit_mem_type memtype,
-                                                  uint8_t max_reads,
-                                                  uint8_t max_writes);
-
-/**
- * Get current command stream queue read position.
- * \return                     qread position
- */
-uint32_t ethosu_dev_get_qread(struct ethosu_device *dev);
-
-/**
- * Get revision of NPU
- * \param[out] revision        Pointer to revision read.
- * \return                     \ref ethosu_error_codes
- */
-enum ethosu_error_codes ethosu_dev_get_revision(struct ethosu_device *dev, uint32_t *revision);
-
-/**
- * Issue run command for the currently programmed
- *                             command stream, starting at current queue read
- *                             position.
- * \return                     \ref ethosu_error_codes
- */
-enum ethosu_error_codes ethosu_dev_set_command_run(struct ethosu_device *dev);
-
-/**
- * Dump a 1KB section of SHRAM.
- * \param[in] section          Section offset to 1KB section in SHRAM.
- * \param[out] shram_p         Pointer to a output area, allocated by the
- *                             caller, where the SHRAM content shall be
- *                             written.
- * \return                     \ref ethosu_error_codes
- */
-enum ethosu_error_codes ethosu_dev_get_shram_data(struct ethosu_device *dev, int section, uint32_t *shram_p);
-
-/**
- * Set clock and power q request enable bits.
- * \param[in] clock_q          Clock q ENABLE/DISABLE \ref clock_q_request.
- * \param[in] power_q          Power q ENABLE/DISABLE \ref power_q_request.
- * \return                     \ref ethosu_error_codes
- */
-enum ethosu_error_codes ethosu_dev_set_clock_and_power(struct ethosu_device *dev,
-                                                       enum ethosu_clock_q_request clock_q,
-                                                       enum ethosu_power_q_request power_q);
-
-/**
- * Read register.
- * \param[in] address          Address to read.
- * \return                     Register value.
- */
-uint32_t ethosu_dev_read_reg(struct ethosu_device *dev, uint32_t address);
-
-/**
- * Write register.
- * \param[in] address          Address to read.
- * \param[in] value            Value to be written.
- */
-void ethosu_dev_write_reg(struct ethosu_device *dev, uint32_t address, uint32_t value);
-
-/**
- * Write register with shadow variable.
- * \param[in] address          Address to read.
- * \param[in] value            Value to be written.
- */
-void ethosu_dev_write_reg_shadow(struct ethosu_device *dev, uint32_t address, uint32_t value, uint32_t *shadow);
-
-/**
- * Save the PMU configuration to ethosu_device struct.
- * \param[in] dev              Ethos-U device where the PMU configuration is
- *                             saved.
- * \return                     \ref ethosu_error_codes
- */
-enum ethosu_error_codes ethosu_dev_save_pmu_config(struct ethosu_device *dev);
-
-/**
- * Restore the PMU configuration from a ethosu_device struct.
- * \param[in] dev              Ethos-U device where the PMU configuration is
- *                             stored.
- * \return                     \ref ethosu_error_codes
- */
-enum ethosu_error_codes ethosu_dev_restore_pmu_config(struct ethosu_device *dev);
-
-/**
- * Save PMU counters to shadow variables in memory.
- * \param[in] dev              Ethos-U device where the PMU configuration is
- *                             stored.
- * \return                     \ref ethosu_error_codes
- */
-enum ethosu_error_codes ethosu_dev_save_pmu_counters(struct ethosu_device *dev);
-
-/**
- * Check if the PROT register value has changed compared to cached value.
- * \param[in] dev              Ethos-U device to check.
- * \return                     true if register value differs from cached value,
- *                             false otherwise.
- */
-bool ethosu_dev_prot_has_changed(struct ethosu_device *dev);
-
-/**
- * Check if the STATUS register has any error bits set or not.
- * \param[in] dev              Ethos-U device to check.
- * \return                     true if any error bits set,
- *                             false otherwise.
- */
-bool ethosu_dev_status_has_error(struct ethosu_device *dev);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // ETHOSU_DEVICE_H
diff --git a/include/ethosu_driver.h b/include/ethosu_driver.h
index 6f8f201..a7b2bdb 100644
--- a/include/ethosu_driver.h
+++ b/include/ethosu_driver.h
@@ -23,7 +23,7 @@
  * Includes
  ******************************************************************************/
 
-#include "ethosu_device.h"
+#include "ethosu_types.h"
 
 #include <stdbool.h>
 #include <stddef.h>
@@ -45,15 +45,17 @@
  * Types
  ******************************************************************************/
 
+// Forward declare
+struct ethosu_device;
+
 struct ethosu_driver
 {
-    struct ethosu_device dev;
+    struct ethosu_device *dev;
     struct ethosu_driver *next;
     void *semaphore;
     uint64_t fast_memory;
     size_t fast_memory_size;
     bool status_error;
-    bool abort_inference;
     bool dev_power_always_on;
     bool reserved;
     volatile bool irq_triggered;
@@ -68,12 +70,6 @@
     uint8_t patch;
 };
 
-struct ethosu_hw_info
-{
-    struct ethosu_id version;
-    struct ethosu_config cfg;
-};
-
 enum ethosu_request_clients
 {
     ETHOSU_PMU_REQUEST       = 0,
@@ -159,11 +155,6 @@
                   const int num_base_addr);
 
 /**
- * Abort Ethos-U inference.
- */
-void ethosu_abort(struct ethosu_driver *drv);
-
-/**
  * Set Ethos-U power mode.
  */
 void ethosu_set_power_mode(struct ethosu_driver *drv, bool always_on);
diff --git a/include/ethosu_types.h b/include/ethosu_types.h
new file mode 100644
index 0000000..a8062dd
--- /dev/null
+++ b/include/ethosu_types.h
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 2019-2021 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ETHOSU_TYPES_H
+#define ETHOSU_TYPES_H
+
+/******************************************************************************
+ * Includes
+ ******************************************************************************/
+
+#include <stdint.h>
+
+/******************************************************************************
+ * Types
+ ******************************************************************************/
+
+enum ethosu_error_codes
+{
+    ETHOSU_SUCCESS         = 0,  ///< Success
+    ETHOSU_GENERIC_FAILURE = -1, ///< Generic failure
+    ETHOSU_INVALID_PARAM   = -2  ///< Invalid parameter
+};
+
+enum ethosu_clock_q_request
+{
+    ETHOSU_CLOCK_Q_DISABLE   = 0, ///< Disable NPU signal ready for clock off.
+    ETHOSU_CLOCK_Q_ENABLE    = 1, ///< Enable NPU signal ready for clock off when stop+idle state reached.
+    ETHOSU_CLOCK_Q_UNCHANGED = 2  ///< Keep current clock q setting
+};
+
+enum ethosu_power_q_request
+{
+    ETHOSU_POWER_Q_DISABLE   = 0, ///< Disable NPU signal ready for power off.
+    ETHOSU_POWER_Q_ENABLE    = 1, ///< Enable NPU signal ready for power off when stop+idle state reached.
+    ETHOSU_POWER_Q_UNCHANGED = 2  ///< Keep current power q setting
+};
+
+struct ethosu_id
+{
+    uint32_t version_status; ///< Version status
+    uint32_t version_minor;  ///< Version minor
+    uint32_t version_major;  ///< Version major
+    uint32_t product_major;  ///< Product major
+    uint32_t arch_patch_rev; ///< Architecture version patch
+    uint32_t arch_minor_rev; ///< Architecture version minor
+    uint32_t arch_major_rev; ///< Architecture version major
+};
+
+struct ethosu_config
+{
+    uint32_t macs_per_cc;        ///< MACs per clock cycle
+    uint32_t cmd_stream_version; ///< NPU command stream version
+    uint32_t custom_dma;         ///< Custom DMA enabled
+};
+
+struct ethosu_hw_info
+{
+    struct ethosu_id version;
+    struct ethosu_config cfg;
+};
+#endif // ETHOSU_TYPES_H
diff --git a/src/ethosu55_interface.h b/src/ethosu55_interface.h
index 0d1ee6c..2d6d4fc 100644
--- a/src/ethosu55_interface.h
+++ b/src/ethosu55_interface.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019-2021 Arm Limited. All rights reserved.
+ * Copyright (c) 2020-2021 Arm Limited. All rights reserved.
  *
  * SPDX-License-Identifier: Apache-2.0
  *
@@ -35,15 +35,32 @@
 #define STRUCT struct
 #else
 #define STRUCT
-#include <stdexcept>
 #endif
 
+#if defined(__cplusplus) && defined(NPU_DISASSEMBLE)
+#include <iomanip>
+#include <sstream>
+#include <vector>
+#endif
+
+#if defined(__cplusplus) && !defined(NPU_NAMESPACE)
+#define NPU_NAMESPACE npu
+#endif
+
+#ifdef __cplusplus
+#include <cstring>
+#include <limits>
+#endif
+
+#ifdef __cplusplus
+namespace NPU_NAMESPACE
+{
+#endif
 #define NNX_ARCH_VERSION_MAJOR 1
-#define NNX_ARCH_VERSION_MINOR 0
-#define NNX_ARCH_VERSION_PATCH 6
+#define NNX_ARCH_VERSION_MINOR 1
+#define NNX_ARCH_VERSION_PATCH 0
 
 // Register offsets
-
 //
 // Register subpage BASE
 //
@@ -51,8 +68,8 @@
 #define NPU_REG_STATUS 0x0004
 #define NPU_REG_CMD 0x0008
 #define NPU_REG_RESET 0x000C
-#define NPU_REG_QBASE0 0x0010
-#define NPU_REG_QBASE1 0x0014
+#define NPU_REG_QBASE 0x0010
+#define NPU_REG_QBASE_HI 0x0014
 #define NPU_REG_QREAD 0x0018
 #define NPU_REG_QCONFIG 0x001C
 #define NPU_REG_QSIZE 0x0020
@@ -64,28 +81,14 @@
 #define NPU_REG_AXI_LIMIT1 0x0044
 #define NPU_REG_AXI_LIMIT2 0x0048
 #define NPU_REG_AXI_LIMIT3 0x004C
-#define BASE_REGISTERS_SIZE 0x0050
+#define BASE_REGISTERS_SIZE 0x0080
 
 //
 // Register subpage BASE_POINTERS
 //
-#define NPU_REG_BASEP0 0x0080
-#define NPU_REG_BASEP1 0x0084
-#define NPU_REG_BASEP2 0x0088
-#define NPU_REG_BASEP3 0x008C
-#define NPU_REG_BASEP4 0x0090
-#define NPU_REG_BASEP5 0x0094
-#define NPU_REG_BASEP6 0x0098
-#define NPU_REG_BASEP7 0x009C
-#define NPU_REG_BASEP8 0x00A0
-#define NPU_REG_BASEP9 0x00A4
-#define NPU_REG_BASEP10 0x00A8
-#define NPU_REG_BASEP11 0x00AC
-#define NPU_REG_BASEP12 0x00B0
-#define NPU_REG_BASEP13 0x00B4
-#define NPU_REG_BASEP14 0x00B8
-#define NPU_REG_BASEP15 0x00BC
-#define BASE_POINTERS_REGISTERS_SIZE 0x00C0
+#define NPU_REG_BASEP_BASE 0x0080
+#define NPU_REG_BASEP_ARRLEN 0x0008
+#define BASE_POINTERS_REGISTERS_SIZE 0x0100
 
 //
 // Register subpage DEBUG
@@ -98,27 +101,8 @@
 #define NPU_REG_CLKFORCE 0x0140
 #define NPU_REG_DEBUG_ADDRESS 0x0144
 #define NPU_REG_DEBUG_MISC 0x0148
-#define NPU_REG_DEBUGCORE 0x014C
 #define NPU_REG_DEBUG_BLOCK 0x0150
-#define DEBUG_REGISTERS_SIZE 0x0154
-
-//
-// Register subpage ID
-//
-#define NPU_REG_REVISION 0x0FC0
-#define NPU_REG_PID4 0x0FD0
-#define NPU_REG_PID5 0x0FD4
-#define NPU_REG_PID6 0x0FD8
-#define NPU_REG_PID7 0x0FDC
-#define NPU_REG_PID0 0x0FE0
-#define NPU_REG_PID1 0x0FE4
-#define NPU_REG_PID2 0x0FE8
-#define NPU_REG_PID3 0x0FEC
-#define NPU_REG_CID0 0x0FF0
-#define NPU_REG_CID1 0x0FF4
-#define NPU_REG_CID2 0x0FF8
-#define NPU_REG_CID3 0x0FFC
-#define ID_REGISTERS_SIZE 0x1000
+#define DEBUG_REGISTERS_SIZE 0x0180
 
 //
 // Register subpage PMU
@@ -130,404 +114,11 @@
 #define NPU_REG_PMOVSCLR 0x0190
 #define NPU_REG_PMINTSET 0x0194
 #define NPU_REG_PMINTCLR 0x0198
-#define NPU_REG_PMCCNTR_LO 0x01A0
+#define NPU_REG_PMCCNTR 0x01A0
 #define NPU_REG_PMCCNTR_HI 0x01A4
 #define NPU_REG_PMCCNTR_CFG 0x01A8
 #define NPU_REG_PMCAXI_CHAN 0x01AC
-#define NPU_REG_PMEVCNTR0 0x0300
-#define NPU_REG_PMEVCNTR1 0x0304
-#define NPU_REG_PMEVCNTR2 0x0308
-#define NPU_REG_PMEVCNTR3 0x030C
-#define NPU_REG_PMEVTYPER0 0x0380
-#define NPU_REG_PMEVTYPER1 0x0384
-#define NPU_REG_PMEVTYPER2 0x0388
-#define NPU_REG_PMEVTYPER3 0x038C
-#define PMU_REGISTERS_SIZE 0x0390
-
-//
-// Register subpage SHARED_BUFFER
-//
-#define NPU_REG_SHARED_BUFFER0 0x0400
-#define NPU_REG_SHARED_BUFFER1 0x0404
-#define NPU_REG_SHARED_BUFFER2 0x0408
-#define NPU_REG_SHARED_BUFFER3 0x040C
-#define NPU_REG_SHARED_BUFFER4 0x0410
-#define NPU_REG_SHARED_BUFFER5 0x0414
-#define NPU_REG_SHARED_BUFFER6 0x0418
-#define NPU_REG_SHARED_BUFFER7 0x041C
-#define NPU_REG_SHARED_BUFFER8 0x0420
-#define NPU_REG_SHARED_BUFFER9 0x0424
-#define NPU_REG_SHARED_BUFFER10 0x0428
-#define NPU_REG_SHARED_BUFFER11 0x042C
-#define NPU_REG_SHARED_BUFFER12 0x0430
-#define NPU_REG_SHARED_BUFFER13 0x0434
-#define NPU_REG_SHARED_BUFFER14 0x0438
-#define NPU_REG_SHARED_BUFFER15 0x043C
-#define NPU_REG_SHARED_BUFFER16 0x0440
-#define NPU_REG_SHARED_BUFFER17 0x0444
-#define NPU_REG_SHARED_BUFFER18 0x0448
-#define NPU_REG_SHARED_BUFFER19 0x044C
-#define NPU_REG_SHARED_BUFFER20 0x0450
-#define NPU_REG_SHARED_BUFFER21 0x0454
-#define NPU_REG_SHARED_BUFFER22 0x0458
-#define NPU_REG_SHARED_BUFFER23 0x045C
-#define NPU_REG_SHARED_BUFFER24 0x0460
-#define NPU_REG_SHARED_BUFFER25 0x0464
-#define NPU_REG_SHARED_BUFFER26 0x0468
-#define NPU_REG_SHARED_BUFFER27 0x046C
-#define NPU_REG_SHARED_BUFFER28 0x0470
-#define NPU_REG_SHARED_BUFFER29 0x0474
-#define NPU_REG_SHARED_BUFFER30 0x0478
-#define NPU_REG_SHARED_BUFFER31 0x047C
-#define NPU_REG_SHARED_BUFFER32 0x0480
-#define NPU_REG_SHARED_BUFFER33 0x0484
-#define NPU_REG_SHARED_BUFFER34 0x0488
-#define NPU_REG_SHARED_BUFFER35 0x048C
-#define NPU_REG_SHARED_BUFFER36 0x0490
-#define NPU_REG_SHARED_BUFFER37 0x0494
-#define NPU_REG_SHARED_BUFFER38 0x0498
-#define NPU_REG_SHARED_BUFFER39 0x049C
-#define NPU_REG_SHARED_BUFFER40 0x04A0
-#define NPU_REG_SHARED_BUFFER41 0x04A4
-#define NPU_REG_SHARED_BUFFER42 0x04A8
-#define NPU_REG_SHARED_BUFFER43 0x04AC
-#define NPU_REG_SHARED_BUFFER44 0x04B0
-#define NPU_REG_SHARED_BUFFER45 0x04B4
-#define NPU_REG_SHARED_BUFFER46 0x04B8
-#define NPU_REG_SHARED_BUFFER47 0x04BC
-#define NPU_REG_SHARED_BUFFER48 0x04C0
-#define NPU_REG_SHARED_BUFFER49 0x04C4
-#define NPU_REG_SHARED_BUFFER50 0x04C8
-#define NPU_REG_SHARED_BUFFER51 0x04CC
-#define NPU_REG_SHARED_BUFFER52 0x04D0
-#define NPU_REG_SHARED_BUFFER53 0x04D4
-#define NPU_REG_SHARED_BUFFER54 0x04D8
-#define NPU_REG_SHARED_BUFFER55 0x04DC
-#define NPU_REG_SHARED_BUFFER56 0x04E0
-#define NPU_REG_SHARED_BUFFER57 0x04E4
-#define NPU_REG_SHARED_BUFFER58 0x04E8
-#define NPU_REG_SHARED_BUFFER59 0x04EC
-#define NPU_REG_SHARED_BUFFER60 0x04F0
-#define NPU_REG_SHARED_BUFFER61 0x04F4
-#define NPU_REG_SHARED_BUFFER62 0x04F8
-#define NPU_REG_SHARED_BUFFER63 0x04FC
-#define NPU_REG_SHARED_BUFFER64 0x0500
-#define NPU_REG_SHARED_BUFFER65 0x0504
-#define NPU_REG_SHARED_BUFFER66 0x0508
-#define NPU_REG_SHARED_BUFFER67 0x050C
-#define NPU_REG_SHARED_BUFFER68 0x0510
-#define NPU_REG_SHARED_BUFFER69 0x0514
-#define NPU_REG_SHARED_BUFFER70 0x0518
-#define NPU_REG_SHARED_BUFFER71 0x051C
-#define NPU_REG_SHARED_BUFFER72 0x0520
-#define NPU_REG_SHARED_BUFFER73 0x0524
-#define NPU_REG_SHARED_BUFFER74 0x0528
-#define NPU_REG_SHARED_BUFFER75 0x052C
-#define NPU_REG_SHARED_BUFFER76 0x0530
-#define NPU_REG_SHARED_BUFFER77 0x0534
-#define NPU_REG_SHARED_BUFFER78 0x0538
-#define NPU_REG_SHARED_BUFFER79 0x053C
-#define NPU_REG_SHARED_BUFFER80 0x0540
-#define NPU_REG_SHARED_BUFFER81 0x0544
-#define NPU_REG_SHARED_BUFFER82 0x0548
-#define NPU_REG_SHARED_BUFFER83 0x054C
-#define NPU_REG_SHARED_BUFFER84 0x0550
-#define NPU_REG_SHARED_BUFFER85 0x0554
-#define NPU_REG_SHARED_BUFFER86 0x0558
-#define NPU_REG_SHARED_BUFFER87 0x055C
-#define NPU_REG_SHARED_BUFFER88 0x0560
-#define NPU_REG_SHARED_BUFFER89 0x0564
-#define NPU_REG_SHARED_BUFFER90 0x0568
-#define NPU_REG_SHARED_BUFFER91 0x056C
-#define NPU_REG_SHARED_BUFFER92 0x0570
-#define NPU_REG_SHARED_BUFFER93 0x0574
-#define NPU_REG_SHARED_BUFFER94 0x0578
-#define NPU_REG_SHARED_BUFFER95 0x057C
-#define NPU_REG_SHARED_BUFFER96 0x0580
-#define NPU_REG_SHARED_BUFFER97 0x0584
-#define NPU_REG_SHARED_BUFFER98 0x0588
-#define NPU_REG_SHARED_BUFFER99 0x058C
-#define NPU_REG_SHARED_BUFFER100 0x0590
-#define NPU_REG_SHARED_BUFFER101 0x0594
-#define NPU_REG_SHARED_BUFFER102 0x0598
-#define NPU_REG_SHARED_BUFFER103 0x059C
-#define NPU_REG_SHARED_BUFFER104 0x05A0
-#define NPU_REG_SHARED_BUFFER105 0x05A4
-#define NPU_REG_SHARED_BUFFER106 0x05A8
-#define NPU_REG_SHARED_BUFFER107 0x05AC
-#define NPU_REG_SHARED_BUFFER108 0x05B0
-#define NPU_REG_SHARED_BUFFER109 0x05B4
-#define NPU_REG_SHARED_BUFFER110 0x05B8
-#define NPU_REG_SHARED_BUFFER111 0x05BC
-#define NPU_REG_SHARED_BUFFER112 0x05C0
-#define NPU_REG_SHARED_BUFFER113 0x05C4
-#define NPU_REG_SHARED_BUFFER114 0x05C8
-#define NPU_REG_SHARED_BUFFER115 0x05CC
-#define NPU_REG_SHARED_BUFFER116 0x05D0
-#define NPU_REG_SHARED_BUFFER117 0x05D4
-#define NPU_REG_SHARED_BUFFER118 0x05D8
-#define NPU_REG_SHARED_BUFFER119 0x05DC
-#define NPU_REG_SHARED_BUFFER120 0x05E0
-#define NPU_REG_SHARED_BUFFER121 0x05E4
-#define NPU_REG_SHARED_BUFFER122 0x05E8
-#define NPU_REG_SHARED_BUFFER123 0x05EC
-#define NPU_REG_SHARED_BUFFER124 0x05F0
-#define NPU_REG_SHARED_BUFFER125 0x05F4
-#define NPU_REG_SHARED_BUFFER126 0x05F8
-#define NPU_REG_SHARED_BUFFER127 0x05FC
-#define NPU_REG_SHARED_BUFFER128 0x0600
-#define NPU_REG_SHARED_BUFFER129 0x0604
-#define NPU_REG_SHARED_BUFFER130 0x0608
-#define NPU_REG_SHARED_BUFFER131 0x060C
-#define NPU_REG_SHARED_BUFFER132 0x0610
-#define NPU_REG_SHARED_BUFFER133 0x0614
-#define NPU_REG_SHARED_BUFFER134 0x0618
-#define NPU_REG_SHARED_BUFFER135 0x061C
-#define NPU_REG_SHARED_BUFFER136 0x0620
-#define NPU_REG_SHARED_BUFFER137 0x0624
-#define NPU_REG_SHARED_BUFFER138 0x0628
-#define NPU_REG_SHARED_BUFFER139 0x062C
-#define NPU_REG_SHARED_BUFFER140 0x0630
-#define NPU_REG_SHARED_BUFFER141 0x0634
-#define NPU_REG_SHARED_BUFFER142 0x0638
-#define NPU_REG_SHARED_BUFFER143 0x063C
-#define NPU_REG_SHARED_BUFFER144 0x0640
-#define NPU_REG_SHARED_BUFFER145 0x0644
-#define NPU_REG_SHARED_BUFFER146 0x0648
-#define NPU_REG_SHARED_BUFFER147 0x064C
-#define NPU_REG_SHARED_BUFFER148 0x0650
-#define NPU_REG_SHARED_BUFFER149 0x0654
-#define NPU_REG_SHARED_BUFFER150 0x0658
-#define NPU_REG_SHARED_BUFFER151 0x065C
-#define NPU_REG_SHARED_BUFFER152 0x0660
-#define NPU_REG_SHARED_BUFFER153 0x0664
-#define NPU_REG_SHARED_BUFFER154 0x0668
-#define NPU_REG_SHARED_BUFFER155 0x066C
-#define NPU_REG_SHARED_BUFFER156 0x0670
-#define NPU_REG_SHARED_BUFFER157 0x0674
-#define NPU_REG_SHARED_BUFFER158 0x0678
-#define NPU_REG_SHARED_BUFFER159 0x067C
-#define NPU_REG_SHARED_BUFFER160 0x0680
-#define NPU_REG_SHARED_BUFFER161 0x0684
-#define NPU_REG_SHARED_BUFFER162 0x0688
-#define NPU_REG_SHARED_BUFFER163 0x068C
-#define NPU_REG_SHARED_BUFFER164 0x0690
-#define NPU_REG_SHARED_BUFFER165 0x0694
-#define NPU_REG_SHARED_BUFFER166 0x0698
-#define NPU_REG_SHARED_BUFFER167 0x069C
-#define NPU_REG_SHARED_BUFFER168 0x06A0
-#define NPU_REG_SHARED_BUFFER169 0x06A4
-#define NPU_REG_SHARED_BUFFER170 0x06A8
-#define NPU_REG_SHARED_BUFFER171 0x06AC
-#define NPU_REG_SHARED_BUFFER172 0x06B0
-#define NPU_REG_SHARED_BUFFER173 0x06B4
-#define NPU_REG_SHARED_BUFFER174 0x06B8
-#define NPU_REG_SHARED_BUFFER175 0x06BC
-#define NPU_REG_SHARED_BUFFER176 0x06C0
-#define NPU_REG_SHARED_BUFFER177 0x06C4
-#define NPU_REG_SHARED_BUFFER178 0x06C8
-#define NPU_REG_SHARED_BUFFER179 0x06CC
-#define NPU_REG_SHARED_BUFFER180 0x06D0
-#define NPU_REG_SHARED_BUFFER181 0x06D4
-#define NPU_REG_SHARED_BUFFER182 0x06D8
-#define NPU_REG_SHARED_BUFFER183 0x06DC
-#define NPU_REG_SHARED_BUFFER184 0x06E0
-#define NPU_REG_SHARED_BUFFER185 0x06E4
-#define NPU_REG_SHARED_BUFFER186 0x06E8
-#define NPU_REG_SHARED_BUFFER187 0x06EC
-#define NPU_REG_SHARED_BUFFER188 0x06F0
-#define NPU_REG_SHARED_BUFFER189 0x06F4
-#define NPU_REG_SHARED_BUFFER190 0x06F8
-#define NPU_REG_SHARED_BUFFER191 0x06FC
-#define NPU_REG_SHARED_BUFFER192 0x0700
-#define NPU_REG_SHARED_BUFFER193 0x0704
-#define NPU_REG_SHARED_BUFFER194 0x0708
-#define NPU_REG_SHARED_BUFFER195 0x070C
-#define NPU_REG_SHARED_BUFFER196 0x0710
-#define NPU_REG_SHARED_BUFFER197 0x0714
-#define NPU_REG_SHARED_BUFFER198 0x0718
-#define NPU_REG_SHARED_BUFFER199 0x071C
-#define NPU_REG_SHARED_BUFFER200 0x0720
-#define NPU_REG_SHARED_BUFFER201 0x0724
-#define NPU_REG_SHARED_BUFFER202 0x0728
-#define NPU_REG_SHARED_BUFFER203 0x072C
-#define NPU_REG_SHARED_BUFFER204 0x0730
-#define NPU_REG_SHARED_BUFFER205 0x0734
-#define NPU_REG_SHARED_BUFFER206 0x0738
-#define NPU_REG_SHARED_BUFFER207 0x073C
-#define NPU_REG_SHARED_BUFFER208 0x0740
-#define NPU_REG_SHARED_BUFFER209 0x0744
-#define NPU_REG_SHARED_BUFFER210 0x0748
-#define NPU_REG_SHARED_BUFFER211 0x074C
-#define NPU_REG_SHARED_BUFFER212 0x0750
-#define NPU_REG_SHARED_BUFFER213 0x0754
-#define NPU_REG_SHARED_BUFFER214 0x0758
-#define NPU_REG_SHARED_BUFFER215 0x075C
-#define NPU_REG_SHARED_BUFFER216 0x0760
-#define NPU_REG_SHARED_BUFFER217 0x0764
-#define NPU_REG_SHARED_BUFFER218 0x0768
-#define NPU_REG_SHARED_BUFFER219 0x076C
-#define NPU_REG_SHARED_BUFFER220 0x0770
-#define NPU_REG_SHARED_BUFFER221 0x0774
-#define NPU_REG_SHARED_BUFFER222 0x0778
-#define NPU_REG_SHARED_BUFFER223 0x077C
-#define NPU_REG_SHARED_BUFFER224 0x0780
-#define NPU_REG_SHARED_BUFFER225 0x0784
-#define NPU_REG_SHARED_BUFFER226 0x0788
-#define NPU_REG_SHARED_BUFFER227 0x078C
-#define NPU_REG_SHARED_BUFFER228 0x0790
-#define NPU_REG_SHARED_BUFFER229 0x0794
-#define NPU_REG_SHARED_BUFFER230 0x0798
-#define NPU_REG_SHARED_BUFFER231 0x079C
-#define NPU_REG_SHARED_BUFFER232 0x07A0
-#define NPU_REG_SHARED_BUFFER233 0x07A4
-#define NPU_REG_SHARED_BUFFER234 0x07A8
-#define NPU_REG_SHARED_BUFFER235 0x07AC
-#define NPU_REG_SHARED_BUFFER236 0x07B0
-#define NPU_REG_SHARED_BUFFER237 0x07B4
-#define NPU_REG_SHARED_BUFFER238 0x07B8
-#define NPU_REG_SHARED_BUFFER239 0x07BC
-#define NPU_REG_SHARED_BUFFER240 0x07C0
-#define NPU_REG_SHARED_BUFFER241 0x07C4
-#define NPU_REG_SHARED_BUFFER242 0x07C8
-#define NPU_REG_SHARED_BUFFER243 0x07CC
-#define NPU_REG_SHARED_BUFFER244 0x07D0
-#define NPU_REG_SHARED_BUFFER245 0x07D4
-#define NPU_REG_SHARED_BUFFER246 0x07D8
-#define NPU_REG_SHARED_BUFFER247 0x07DC
-#define NPU_REG_SHARED_BUFFER248 0x07E0
-#define NPU_REG_SHARED_BUFFER249 0x07E4
-#define NPU_REG_SHARED_BUFFER250 0x07E8
-#define NPU_REG_SHARED_BUFFER251 0x07EC
-#define NPU_REG_SHARED_BUFFER252 0x07F0
-#define NPU_REG_SHARED_BUFFER253 0x07F4
-#define NPU_REG_SHARED_BUFFER254 0x07F8
-#define NPU_REG_SHARED_BUFFER255 0x07FC
-#define SHARED_BUFFER_REGISTERS_SIZE 0x0800
-
-//
-// Register subpage TSU
-//
-#define NPU_REG_IFM_PAD_TOP 0x0800
-#define NPU_REG_IFM_PAD_LEFT 0x0804
-#define NPU_REG_IFM_PAD_RIGHT 0x0808
-#define NPU_REG_IFM_PAD_BOTTOM 0x080C
-#define NPU_REG_IFM_DEPTH_M1 0x0810
-#define NPU_REG_IFM_PRECISION 0x0814
-#define NPU_REG_IFM_UPSCALE 0x081C
-#define NPU_REG_IFM_ZERO_POINT 0x0824
-#define NPU_REG_IFM_WIDTH0_M1 0x0828
-#define NPU_REG_IFM_HEIGHT0_M1 0x082C
-#define NPU_REG_IFM_HEIGHT1_M1 0x0830
-#define NPU_REG_IFM_IB_END 0x0834
-#define NPU_REG_IFM_REGION 0x083C
-#define NPU_REG_OFM_WIDTH_M1 0x0844
-#define NPU_REG_OFM_HEIGHT_M1 0x0848
-#define NPU_REG_OFM_DEPTH_M1 0x084C
-#define NPU_REG_OFM_PRECISION 0x0850
-#define NPU_REG_OFM_BLK_WIDTH_M1 0x0854
-#define NPU_REG_OFM_BLK_HEIGHT_M1 0x0858
-#define NPU_REG_OFM_BLK_DEPTH_M1 0x085C
-#define NPU_REG_OFM_ZERO_POINT 0x0860
-#define NPU_REG_OFM_WIDTH0_M1 0x0868
-#define NPU_REG_OFM_HEIGHT0_M1 0x086C
-#define NPU_REG_OFM_HEIGHT1_M1 0x0870
-#define NPU_REG_OFM_REGION 0x087C
-#define NPU_REG_KERNEL_WIDTH_M1 0x0880
-#define NPU_REG_KERNEL_HEIGHT_M1 0x0884
-#define NPU_REG_KERNEL_STRIDE 0x0888
-#define NPU_REG_PARALLEL_MODE 0x088C
-#define NPU_REG_ACC_FORMAT 0x0890
-#define NPU_REG_ACTIVATION 0x0894
-#define NPU_REG_ACTIVATION_MIN 0x0898
-#define NPU_REG_ACTIVATION_MAX 0x089C
-#define NPU_REG_WEIGHT_REGION 0x08A0
-#define NPU_REG_SCALE_REGION 0x08A4
-#define NPU_REG_AB_START 0x08B4
-#define NPU_REG_BLOCKDEP 0x08BC
-#define NPU_REG_DMA0_SRC_REGION 0x08C0
-#define NPU_REG_DMA0_DST_REGION 0x08C4
-#define NPU_REG_DMA0_SIZE0 0x08C8
-#define NPU_REG_DMA0_SIZE1 0x08CC
-#define NPU_REG_IFM2_BROADCAST 0x0900
-#define NPU_REG_IFM2_SCALAR 0x0904
-#define NPU_REG_IFM2_PRECISION 0x0914
-#define NPU_REG_IFM2_ZERO_POINT 0x0924
-#define NPU_REG_IFM2_WIDTH0_M1 0x0928
-#define NPU_REG_IFM2_HEIGHT0_M1 0x092C
-#define NPU_REG_IFM2_HEIGHT1_M1 0x0930
-#define NPU_REG_IFM2_IB_START 0x0934
-#define NPU_REG_IFM2_REGION 0x093C
-#define NPU_REG_IFM_BASE0 0x0A00
-#define NPU_REG_IFM_BASE0_HI 0x0A04
-#define NPU_REG_IFM_BASE1 0x0A08
-#define NPU_REG_IFM_BASE1_HI 0x0A0C
-#define NPU_REG_IFM_BASE2 0x0A10
-#define NPU_REG_IFM_BASE2_HI 0x0A14
-#define NPU_REG_IFM_BASE3 0x0A18
-#define NPU_REG_IFM_BASE3_HI 0x0A1C
-#define NPU_REG_IFM_STRIDE_X 0x0A20
-#define NPU_REG_IFM_STRIDE_X_HI 0x0A24
-#define NPU_REG_IFM_STRIDE_Y 0x0A28
-#define NPU_REG_IFM_STRIDE_Y_HI 0x0A2C
-#define NPU_REG_IFM_STRIDE_C 0x0A30
-#define NPU_REG_IFM_STRIDE_C_HI 0x0A34
-#define NPU_REG_OFM_BASE0 0x0A40
-#define NPU_REG_OFM_BASE0_HI 0x0A44
-#define NPU_REG_OFM_BASE1 0x0A48
-#define NPU_REG_OFM_BASE1_HI 0x0A4C
-#define NPU_REG_OFM_BASE2 0x0A50
-#define NPU_REG_OFM_BASE2_HI 0x0A54
-#define NPU_REG_OFM_BASE3 0x0A58
-#define NPU_REG_OFM_BASE3_HI 0x0A5C
-#define NPU_REG_OFM_STRIDE_X 0x0A60
-#define NPU_REG_OFM_STRIDE_X_HI 0x0A64
-#define NPU_REG_OFM_STRIDE_Y 0x0A68
-#define NPU_REG_OFM_STRIDE_Y_HI 0x0A6C
-#define NPU_REG_OFM_STRIDE_C 0x0A70
-#define NPU_REG_OFM_STRIDE_C_HI 0x0A74
-#define NPU_REG_WEIGHT_BASE 0x0A80
-#define NPU_REG_WEIGHT_BASE_HI 0x0A84
-#define NPU_REG_WEIGHT_LENGTH 0x0A88
-#define NPU_REG_SCALE_BASE 0x0A90
-#define NPU_REG_SCALE_BASE_HI 0x0A94
-#define NPU_REG_SCALE_LENGTH 0x0A98
-#define NPU_REG_OFM_SCALE 0x0AA0
-#define NPU_REG_OFM_SCALE_SHIFT 0x0AA4
-#define NPU_REG_OPA_SCALE 0x0AA8
-#define NPU_REG_OPA_SCALE_SHIFT 0x0AAC
-#define NPU_REG_OPB_SCALE 0x0AB0
-#define NPU_REG_DMA0_SRC 0x0AC0
-#define NPU_REG_DMA0_SRC_HI 0x0AC4
-#define NPU_REG_DMA0_DST 0x0AC8
-#define NPU_REG_DMA0_DST_HI 0x0ACC
-#define NPU_REG_DMA0_LEN 0x0AD0
-#define NPU_REG_DMA0_LEN_HI 0x0AD4
-#define NPU_REG_DMA0_SKIP0 0x0AD8
-#define NPU_REG_DMA0_SKIP0_HI 0x0ADC
-#define NPU_REG_DMA0_SKIP1 0x0AE0
-#define NPU_REG_DMA0_SKIP1_HI 0x0AE4
-#define NPU_REG_IFM2_BASE0 0x0B00
-#define NPU_REG_IFM2_BASE0_HI 0x0B04
-#define NPU_REG_IFM2_BASE1 0x0B08
-#define NPU_REG_IFM2_BASE1_HI 0x0B0C
-#define NPU_REG_IFM2_BASE2 0x0B10
-#define NPU_REG_IFM2_BASE2_HI 0x0B14
-#define NPU_REG_IFM2_BASE3 0x0B18
-#define NPU_REG_IFM2_BASE3_HI 0x0B1C
-#define NPU_REG_IFM2_STRIDE_X 0x0B20
-#define NPU_REG_IFM2_STRIDE_X_HI 0x0B24
-#define NPU_REG_IFM2_STRIDE_Y 0x0B28
-#define NPU_REG_IFM2_STRIDE_Y_HI 0x0B2C
-#define NPU_REG_IFM2_STRIDE_C 0x0B30
-#define NPU_REG_IFM2_STRIDE_C_HI 0x0B34
-#define NPU_REG_WEIGHT1_BASE 0x0B40
-#define NPU_REG_WEIGHT1_BASE_HI 0x0B44
-#define NPU_REG_WEIGHT1_LENGTH 0x0B48
-#define NPU_REG_SCALE1_BASE 0x0B50
-#define NPU_REG_SCALE1_BASE_HI 0x0B54
-#define NPU_REG_SCALE1_LENGTH 0x0B58
-#define TSU_REGISTERS_SIZE 0x0B5C
+#define PMU_REGISTERS_SIZE 0x0200
 
 //
 // Register subpage TSU_DEBUG
@@ -571,47 +162,225 @@
 #define NPU_REG_CURRENT_CMD 0x02BC
 #define TSU_DEBUG_REGISTERS_SIZE 0x02C0
 
+//
+// Register subpage PMU_COUNTERS
+//
+#define NPU_REG_PMEVCNTR_BASE 0x0300
+#define NPU_REG_PMEVCNTR_ARRLEN 0x0004
+#define NPU_REG_PMEVTYPER_BASE 0x0380
+#define NPU_REG_PMEVTYPER_ARRLEN 0x0004
+#define PMU_COUNTERS_REGISTERS_SIZE 0x0400
+
+//
+// Register subpage SHARED_BUFFER
+//
+#define NPU_REG_SHARED_BUFFER_BASE 0x0400
+#define NPU_REG_SHARED_BUFFER_ARRLEN 0x0100
+#define SHARED_BUFFER_REGISTERS_SIZE 0x0800
+
+//
+// Register subpage TSU_IFM
+//
+#define NPU_REG_IFM_PAD_TOP 0x0800
+#define NPU_REG_IFM_PAD_LEFT 0x0804
+#define NPU_REG_IFM_PAD_RIGHT 0x0808
+#define NPU_REG_IFM_PAD_BOTTOM 0x080C
+#define NPU_REG_IFM_DEPTH_M1 0x0810
+#define NPU_REG_IFM_PRECISION 0x0814
+#define NPU_REG_IFM_UPSCALE 0x081C
+#define NPU_REG_IFM_ZERO_POINT 0x0824
+#define NPU_REG_IFM_WIDTH0_M1 0x0828
+#define NPU_REG_IFM_HEIGHT0_M1 0x082C
+#define NPU_REG_IFM_HEIGHT1_M1 0x0830
+#define NPU_REG_IFM_IB_END 0x0834
+#define NPU_REG_IFM_REGION 0x083C
+#define TSU_IFM_REGISTERS_SIZE 0x0840
+
+//
+// Register subpage TSU_OFM
+//
+#define NPU_REG_OFM_WIDTH_M1 0x0844
+#define NPU_REG_OFM_HEIGHT_M1 0x0848
+#define NPU_REG_OFM_DEPTH_M1 0x084C
+#define NPU_REG_OFM_PRECISION 0x0850
+#define NPU_REG_OFM_BLK_WIDTH_M1 0x0854
+#define NPU_REG_OFM_BLK_HEIGHT_M1 0x0858
+#define NPU_REG_OFM_BLK_DEPTH_M1 0x085C
+#define NPU_REG_OFM_ZERO_POINT 0x0860
+#define NPU_REG_OFM_WIDTH0_M1 0x0868
+#define NPU_REG_OFM_HEIGHT0_M1 0x086C
+#define NPU_REG_OFM_HEIGHT1_M1 0x0870
+#define NPU_REG_OFM_REGION 0x087C
+#define TSU_OFM_REGISTERS_SIZE 0x0880
+
+//
+// Register subpage TSU_KERNEL
+//
+#define NPU_REG_KERNEL_WIDTH_M1 0x0880
+#define NPU_REG_KERNEL_HEIGHT_M1 0x0884
+#define NPU_REG_KERNEL_STRIDE 0x0888
+#define NPU_REG_ACC_FORMAT 0x0890
+#define NPU_REG_ACTIVATION 0x0894
+#define NPU_REG_ACTIVATION_MIN 0x0898
+#define NPU_REG_ACTIVATION_MAX 0x089C
+#define NPU_REG_WEIGHT_REGION 0x08A0
+#define NPU_REG_SCALE_REGION 0x08A4
+#define NPU_REG_AB_START 0x08B4
+#define NPU_REG_BLOCKDEP 0x08BC
+#define TSU_KERNEL_REGISTERS_SIZE 0x08C0
+
+//
+// Register subpage TSU_DMA
+//
+#define NPU_REG_DMA0_SRC_REGION 0x08C0
+#define NPU_REG_DMA0_DST_REGION 0x08C4
+#define NPU_REG_DMA0_SIZE0 0x08C8
+#define NPU_REG_DMA0_SIZE1 0x08CC
+#define TSU_DMA_REGISTERS_SIZE 0x0900
+
+//
+// Register subpage TSU_IFM2
+//
+#define NPU_REG_IFM2_BROADCAST 0x0900
+#define NPU_REG_IFM2_SCALAR 0x0904
+#define NPU_REG_IFM2_PRECISION 0x0914
+#define NPU_REG_IFM2_ZERO_POINT 0x0924
+#define NPU_REG_IFM2_WIDTH0_M1 0x0928
+#define NPU_REG_IFM2_HEIGHT0_M1 0x092C
+#define NPU_REG_IFM2_HEIGHT1_M1 0x0930
+#define NPU_REG_IFM2_IB_START 0x0934
+#define NPU_REG_IFM2_REGION 0x093C
+#define TSU_IFM2_REGISTERS_SIZE 0x0940
+
+//
+// Register subpage TSU_IFM_BASE
+//
+#define NPU_REG_IFM_BASE0 0x0A00
+#define NPU_REG_IFM_BASE0_HI 0x0A04
+#define NPU_REG_IFM_BASE1 0x0A08
+#define NPU_REG_IFM_BASE1_HI 0x0A0C
+#define NPU_REG_IFM_BASE2 0x0A10
+#define NPU_REG_IFM_BASE2_HI 0x0A14
+#define NPU_REG_IFM_BASE3 0x0A18
+#define NPU_REG_IFM_BASE3_HI 0x0A1C
+#define NPU_REG_IFM_STRIDE_X 0x0A20
+#define NPU_REG_IFM_STRIDE_X_HI 0x0A24
+#define NPU_REG_IFM_STRIDE_Y 0x0A28
+#define NPU_REG_IFM_STRIDE_Y_HI 0x0A2C
+#define NPU_REG_IFM_STRIDE_C 0x0A30
+#define NPU_REG_IFM_STRIDE_C_HI 0x0A34
+#define TSU_IFM_BASE_REGISTERS_SIZE 0x0A40
+
+//
+// Register subpage TSU_OFM_BASE
+//
+#define NPU_REG_OFM_BASE0 0x0A40
+#define NPU_REG_OFM_BASE0_HI 0x0A44
+#define NPU_REG_OFM_BASE1 0x0A48
+#define NPU_REG_OFM_BASE1_HI 0x0A4C
+#define NPU_REG_OFM_BASE2 0x0A50
+#define NPU_REG_OFM_BASE2_HI 0x0A54
+#define NPU_REG_OFM_BASE3 0x0A58
+#define NPU_REG_OFM_BASE3_HI 0x0A5C
+#define NPU_REG_OFM_STRIDE_X 0x0A60
+#define NPU_REG_OFM_STRIDE_X_HI 0x0A64
+#define NPU_REG_OFM_STRIDE_Y 0x0A68
+#define NPU_REG_OFM_STRIDE_Y_HI 0x0A6C
+#define NPU_REG_OFM_STRIDE_C 0x0A70
+#define NPU_REG_OFM_STRIDE_C_HI 0x0A74
+#define TSU_OFM_BASE_REGISTERS_SIZE 0x0A80
+
+//
+// Register subpage TSU_WS_BASE
+//
+#define NPU_REG_WEIGHT_BASE 0x0A80
+#define NPU_REG_WEIGHT_BASE_HI 0x0A84
+#define NPU_REG_WEIGHT_LENGTH 0x0A88
+#define NPU_REG_SCALE_BASE 0x0A90
+#define NPU_REG_SCALE_BASE_HI 0x0A94
+#define NPU_REG_SCALE_LENGTH 0x0A98
+#define NPU_REG_OFM_SCALE 0x0AA0
+#define NPU_REG_OFM_SCALE_SHIFT 0x0AA4
+#define NPU_REG_OPA_SCALE 0x0AA8
+#define NPU_REG_OPA_SCALE_SHIFT 0x0AAC
+#define NPU_REG_OPB_SCALE 0x0AB0
+#define TSU_WS_BASE_REGISTERS_SIZE 0x0AC0
+
+//
+// Register subpage TSU_DMA_BASE
+//
+#define NPU_REG_DMA0_SRC 0x0AC0
+#define NPU_REG_DMA0_SRC_HI 0x0AC4
+#define NPU_REG_DMA0_DST 0x0AC8
+#define NPU_REG_DMA0_DST_HI 0x0ACC
+#define NPU_REG_DMA0_LEN 0x0AD0
+#define NPU_REG_DMA0_LEN_HI 0x0AD4
+#define TSU_DMA_BASE_REGISTERS_SIZE 0x0B00
+
+//
+// Register subpage TSU_IFM2_BASE
+//
+#define NPU_REG_IFM2_BASE0 0x0B00
+#define NPU_REG_IFM2_BASE0_HI 0x0B04
+#define NPU_REG_IFM2_BASE1 0x0B08
+#define NPU_REG_IFM2_BASE1_HI 0x0B0C
+#define NPU_REG_IFM2_BASE2 0x0B10
+#define NPU_REG_IFM2_BASE2_HI 0x0B14
+#define NPU_REG_IFM2_BASE3 0x0B18
+#define NPU_REG_IFM2_BASE3_HI 0x0B1C
+#define NPU_REG_IFM2_STRIDE_X 0x0B20
+#define NPU_REG_IFM2_STRIDE_X_HI 0x0B24
+#define NPU_REG_IFM2_STRIDE_Y 0x0B28
+#define NPU_REG_IFM2_STRIDE_Y_HI 0x0B2C
+#define NPU_REG_IFM2_STRIDE_C 0x0B30
+#define NPU_REG_IFM2_STRIDE_C_HI 0x0B34
+#define TSU_IFM2_BASE_REGISTERS_SIZE 0x0B40
+
+//
+// Register subpage TSU_WS1_BASE
+//
+#define TSU_WS1_BASE_REGISTERS_SIZE 0x0B80
+
+//
+// Register subpage TSU_USER_BASE
+//
+#define NPU_REG_USER_DEFINED_BASE 0x0B80
+#define NPU_REG_USER_DEFINED_ARRLEN 0x0008
+#define TSU_USER_BASE_REGISTERS_SIZE 0x0BC0
+
+//
+// Register subpage TSU_DMA_EBASE
+//
+#define TSU_DMA_EBASE_REGISTERS_SIZE 0x0C00
+
+//
+// Register subpage ID
+//
+#define NPU_REG_REVISION 0x0FC0
+#define NPU_REG_PID4 0x0FD0
+#define NPU_REG_PID5 0x0FD4
+#define NPU_REG_PID6 0x0FD8
+#define NPU_REG_PID7 0x0FDC
+#define NPU_REG_PID0 0x0FE0
+#define NPU_REG_PID1 0x0FE4
+#define NPU_REG_PID2 0x0FE8
+#define NPU_REG_PID3 0x0FEC
+#define NPU_REG_CID0 0x0FF0
+#define NPU_REG_CID1 0x0FF4
+#define NPU_REG_CID2 0x0FF8
+#define NPU_REG_CID3 0x0FFC
+#define ID_REGISTERS_SIZE 0x1000
+
 #ifdef __cplusplus
-
 // Enum types
-
-enum class acc_format : uint16_t
+enum class acc_format : uint8_t
 {
-    INT_32BIT = 0,
-    INT_40BIT = 1,
-    FP_S5_10  = 2,
+    I32 = 0,
+    I40 = 1,
+    F16 = 2,
 };
 
-enum class activation : uint16_t
-{
-    NONE      = 0,
-    TANH      = 3,
-    SIGMOID   = 4,
-    LUT_START = 16,
-    LUT_END   = 23,
-};
-
-enum class axi_mem_encoding_type : uint8_t
-{
-    DEVICE_NON_BUFFERABLE                 = 0x0,
-    DEVICE_BUFFERABLE                     = 0x1,
-    NORMAL_NON_CACHEABLE_NON_BUFFERABLE   = 0x2,
-    NORMAL_NON_CACHEABLE_BUFFERABLE       = 0x3,
-    WRITE_THROUGH_NO_ALLOCATE             = 0x4,
-    WRITE_THROUGH_READ_ALLOCATE           = 0x5,
-    WRITE_THROUGH_WRITE_ALLOCATE          = 0x6,
-    WRITE_THROUGH_READ_AND_WRITE_ALLOCATE = 0x7,
-    WRITE_BACK_NO_ALLOCATE                = 0x8,
-    WRITE_BACK_READ_ALLOCATE              = 0x9,
-    WRITE_BACK_WRITE_ALLOCATE             = 0xA,
-    WRITE_BACK_READ_AND_WRITE_ALLOCATE    = 0xB,
-    RESERVED_12                           = 0xC,
-    RESERVED_13                           = 0xD,
-    RESERVED_14                           = 0xE,
-    RESERVED_15                           = 0xF,
-};
-
-enum class clip_range : uint8_t
+enum class activation_clip_range : uint8_t
 {
     OFM_PRECISION = 0,
     FORCE_UINT8   = 2,
@@ -619,118 +388,205 @@
     FORCE_INT16   = 5,
 };
 
-enum class cmd0 : uint16_t
-{
-    NPU_OP_STOP               = 0x000,
-    NPU_OP_IRQ                = 0x001,
-    NPU_OP_CONV               = 0x002,
-    NPU_OP_DEPTHWISE          = 0x003,
-    NPU_OP_POOL               = 0x005,
-    NPU_OP_ELEMENTWISE        = 0x006,
-    NPU_OP_DMA_START          = 0x010,
-    NPU_OP_DMA_WAIT           = 0x011,
-    NPU_OP_KERNEL_WAIT        = 0x012,
-    NPU_OP_PMU_MASK           = 0x013,
-    NPU_SET_IFM_PAD_TOP       = 0x100,
-    NPU_SET_IFM_PAD_LEFT      = 0x101,
-    NPU_SET_IFM_PAD_RIGHT     = 0x102,
-    NPU_SET_IFM_PAD_BOTTOM    = 0x103,
-    NPU_SET_IFM_DEPTH_M1      = 0x104,
-    NPU_SET_IFM_PRECISION     = 0x105,
-    NPU_SET_IFM_UPSCALE       = 0x107,
-    NPU_SET_IFM_ZERO_POINT    = 0x109,
-    NPU_SET_IFM_WIDTH0_M1     = 0x10A,
-    NPU_SET_IFM_HEIGHT0_M1    = 0x10B,
-    NPU_SET_IFM_HEIGHT1_M1    = 0x10C,
-    NPU_SET_IFM_IB_END        = 0x10D,
-    NPU_SET_IFM_REGION        = 0x10F,
-    NPU_SET_OFM_WIDTH_M1      = 0x111,
-    NPU_SET_OFM_HEIGHT_M1     = 0x112,
-    NPU_SET_OFM_DEPTH_M1      = 0x113,
-    NPU_SET_OFM_PRECISION     = 0x114,
-    NPU_SET_OFM_BLK_WIDTH_M1  = 0x115,
-    NPU_SET_OFM_BLK_HEIGHT_M1 = 0x116,
-    NPU_SET_OFM_BLK_DEPTH_M1  = 0x117,
-    NPU_SET_OFM_ZERO_POINT    = 0x118,
-    NPU_SET_OFM_WIDTH0_M1     = 0x11A,
-    NPU_SET_OFM_HEIGHT0_M1    = 0x11B,
-    NPU_SET_OFM_HEIGHT1_M1    = 0x11C,
-    NPU_SET_OFM_REGION        = 0x11F,
-    NPU_SET_KERNEL_WIDTH_M1   = 0x120,
-    NPU_SET_KERNEL_HEIGHT_M1  = 0x121,
-    NPU_SET_KERNEL_STRIDE     = 0x122,
-    NPU_SET_PARALLEL_MODE     = 0x123,
-    NPU_SET_ACC_FORMAT        = 0x124,
-    NPU_SET_ACTIVATION        = 0x125,
-    NPU_SET_ACTIVATION_MIN    = 0x126,
-    NPU_SET_ACTIVATION_MAX    = 0x127,
-    NPU_SET_WEIGHT_REGION     = 0x128,
-    NPU_SET_SCALE_REGION      = 0x129,
-    NPU_SET_AB_START          = 0x12D,
-    NPU_SET_BLOCKDEP          = 0x12F,
-    NPU_SET_DMA0_SRC_REGION   = 0x130,
-    NPU_SET_DMA0_DST_REGION   = 0x131,
-    NPU_SET_DMA0_SIZE0        = 0x132,
-    NPU_SET_DMA0_SIZE1        = 0x133,
-    NPU_SET_IFM2_BROADCAST    = 0x180,
-    NPU_SET_IFM2_SCALAR       = 0x181,
-    NPU_SET_IFM2_PRECISION    = 0x185,
-    NPU_SET_IFM2_ZERO_POINT   = 0x189,
-    NPU_SET_IFM2_WIDTH0_M1    = 0x18A,
-    NPU_SET_IFM2_HEIGHT0_M1   = 0x18B,
-    NPU_SET_IFM2_HEIGHT1_M1   = 0x18C,
-    NPU_SET_IFM2_IB_START     = 0x18D,
-    NPU_SET_IFM2_REGION       = 0x18F,
-};
-
-enum class cmd1 : uint16_t
-{
-    NPU_SET_IFM_BASE0      = 0x000,
-    NPU_SET_IFM_BASE1      = 0x001,
-    NPU_SET_IFM_BASE2      = 0x002,
-    NPU_SET_IFM_BASE3      = 0x003,
-    NPU_SET_IFM_STRIDE_X   = 0x004,
-    NPU_SET_IFM_STRIDE_Y   = 0x005,
-    NPU_SET_IFM_STRIDE_C   = 0x006,
-    NPU_SET_OFM_BASE0      = 0x010,
-    NPU_SET_OFM_BASE1      = 0x011,
-    NPU_SET_OFM_BASE2      = 0x012,
-    NPU_SET_OFM_BASE3      = 0x013,
-    NPU_SET_OFM_STRIDE_X   = 0x014,
-    NPU_SET_OFM_STRIDE_Y   = 0x015,
-    NPU_SET_OFM_STRIDE_C   = 0x016,
-    NPU_SET_WEIGHT_BASE    = 0x020,
-    NPU_SET_WEIGHT_LENGTH  = 0x021,
-    NPU_SET_SCALE_BASE     = 0x022,
-    NPU_SET_SCALE_LENGTH   = 0x023,
-    NPU_SET_OFM_SCALE      = 0x024,
-    NPU_SET_OPA_SCALE      = 0x025,
-    NPU_SET_OPB_SCALE      = 0x026,
-    NPU_SET_DMA0_SRC       = 0x030,
-    NPU_SET_DMA0_DST       = 0x031,
-    NPU_SET_DMA0_LEN       = 0x032,
-    NPU_SET_DMA0_SKIP0     = 0x033,
-    NPU_SET_DMA0_SKIP1     = 0x034,
-    NPU_SET_IFM2_BASE0     = 0x080,
-    NPU_SET_IFM2_BASE1     = 0x081,
-    NPU_SET_IFM2_BASE2     = 0x082,
-    NPU_SET_IFM2_BASE3     = 0x083,
-    NPU_SET_IFM2_STRIDE_X  = 0x084,
-    NPU_SET_IFM2_STRIDE_Y  = 0x085,
-    NPU_SET_IFM2_STRIDE_C  = 0x086,
-    NPU_SET_WEIGHT1_BASE   = 0x090,
-    NPU_SET_WEIGHT1_LENGTH = 0x091,
-    NPU_SET_SCALE1_BASE    = 0x092,
-    NPU_SET_SCALE1_LENGTH  = 0x093,
-};
-
-enum class data_format : uint8_t
+enum class activation_format : uint8_t
 {
     NHWC    = 0,
     NHCWB16 = 1,
 };
 
-enum class elementwise_mode : uint16_t
+enum class activation_function : uint8_t
+{
+    RELU    = 0,
+    TANH    = 3,
+    SIGMOID = 4,
+    TABLE_0 = 16,
+    TABLE_1 = 17,
+    TABLE_2 = 18,
+    TABLE_3 = 19,
+    TABLE_4 = 20,
+    TABLE_5 = 21,
+    TABLE_6 = 22,
+    TABLE_7 = 23,
+};
+
+enum class activation_precision : uint8_t
+{
+    B8  = 0,
+    B16 = 1,
+    B32 = 2,
+    B64 = 3,
+};
+
+enum class activation_type : uint8_t
+{
+    UNSIGNED = 0,
+    SIGNED   = 1,
+};
+
+enum class axi_mem_encoding : uint8_t
+{
+    DEVICE_NON_BUFFERABLE                 = 0,
+    DEVICE_BUFFERABLE                     = 1,
+    NORMAL_NON_CACHEABLE_NON_BUFFERABLE   = 2,
+    NORMAL_NON_CACHEABLE_BUFFERABLE       = 3,
+    WRITE_THROUGH_NO_ALLOCATE             = 4,
+    WRITE_THROUGH_READ_ALLOCATE           = 5,
+    WRITE_THROUGH_WRITE_ALLOCATE          = 6,
+    WRITE_THROUGH_READ_AND_WRITE_ALLOCATE = 7,
+    WRITE_BACK_NO_ALLOCATE                = 8,
+    WRITE_BACK_READ_ALLOCATE              = 9,
+    WRITE_BACK_WRITE_ALLOCATE             = 10,
+    WRITE_BACK_READ_AND_WRITE_ALLOCATE    = 11,
+};
+
+enum class broadcast_mode : uint8_t
+{
+    DISABLE = 0,
+    ENABLE  = 1,
+};
+
+enum class cmd0_opcode : uint16_t
+{
+    NPU_OP_STOP               = 0,
+    NPU_OP_IRQ                = 1,
+    NPU_OP_CONV               = 2,
+    NPU_OP_DEPTHWISE          = 3,
+    NPU_OP_POOL               = 5,
+    NPU_OP_ELEMENTWISE        = 6,
+    NPU_OP_DMA_START          = 16,
+    NPU_OP_DMA_WAIT           = 17,
+    NPU_OP_KERNEL_WAIT        = 18,
+    NPU_OP_PMU_MASK           = 19,
+    NPU_SET_IFM_PAD_TOP       = 256,
+    NPU_SET_IFM_PAD_LEFT      = 257,
+    NPU_SET_IFM_PAD_RIGHT     = 258,
+    NPU_SET_IFM_PAD_BOTTOM    = 259,
+    NPU_SET_IFM_DEPTH_M1      = 260,
+    NPU_SET_IFM_PRECISION     = 261,
+    NPU_SET_IFM_UPSCALE       = 263,
+    NPU_SET_IFM_ZERO_POINT    = 265,
+    NPU_SET_IFM_WIDTH0_M1     = 266,
+    NPU_SET_IFM_HEIGHT0_M1    = 267,
+    NPU_SET_IFM_HEIGHT1_M1    = 268,
+    NPU_SET_IFM_IB_END        = 269,
+    NPU_SET_IFM_REGION        = 271,
+    NPU_SET_OFM_WIDTH_M1      = 273,
+    NPU_SET_OFM_HEIGHT_M1     = 274,
+    NPU_SET_OFM_DEPTH_M1      = 275,
+    NPU_SET_OFM_PRECISION     = 276,
+    NPU_SET_OFM_BLK_WIDTH_M1  = 277,
+    NPU_SET_OFM_BLK_HEIGHT_M1 = 278,
+    NPU_SET_OFM_BLK_DEPTH_M1  = 279,
+    NPU_SET_OFM_ZERO_POINT    = 280,
+    NPU_SET_OFM_WIDTH0_M1     = 282,
+    NPU_SET_OFM_HEIGHT0_M1    = 283,
+    NPU_SET_OFM_HEIGHT1_M1    = 284,
+    NPU_SET_OFM_REGION        = 287,
+    NPU_SET_KERNEL_WIDTH_M1   = 288,
+    NPU_SET_KERNEL_HEIGHT_M1  = 289,
+    NPU_SET_KERNEL_STRIDE     = 290,
+    NPU_SET_ACC_FORMAT        = 292,
+    NPU_SET_ACTIVATION        = 293,
+    NPU_SET_ACTIVATION_MIN    = 294,
+    NPU_SET_ACTIVATION_MAX    = 295,
+    NPU_SET_WEIGHT_REGION     = 296,
+    NPU_SET_SCALE_REGION      = 297,
+    NPU_SET_AB_START          = 301,
+    NPU_SET_BLOCKDEP          = 303,
+    NPU_SET_DMA0_SRC_REGION   = 304,
+    NPU_SET_DMA0_DST_REGION   = 305,
+    NPU_SET_DMA0_SIZE0        = 306,
+    NPU_SET_DMA0_SIZE1        = 307,
+    NPU_SET_IFM2_BROADCAST    = 384,
+    NPU_SET_IFM2_SCALAR       = 385,
+    NPU_SET_IFM2_PRECISION    = 389,
+    NPU_SET_IFM2_ZERO_POINT   = 393,
+    NPU_SET_IFM2_WIDTH0_M1    = 394,
+    NPU_SET_IFM2_HEIGHT0_M1   = 395,
+    NPU_SET_IFM2_HEIGHT1_M1   = 396,
+    NPU_SET_IFM2_IB_START     = 397,
+    NPU_SET_IFM2_REGION       = 399,
+};
+
+enum class cmd1_opcode : uint16_t
+{
+    NPU_SET_IFM_BASE0     = 0,
+    NPU_SET_IFM_BASE1     = 1,
+    NPU_SET_IFM_BASE2     = 2,
+    NPU_SET_IFM_BASE3     = 3,
+    NPU_SET_IFM_STRIDE_X  = 4,
+    NPU_SET_IFM_STRIDE_Y  = 5,
+    NPU_SET_IFM_STRIDE_C  = 6,
+    NPU_SET_OFM_BASE0     = 16,
+    NPU_SET_OFM_BASE1     = 17,
+    NPU_SET_OFM_BASE2     = 18,
+    NPU_SET_OFM_BASE3     = 19,
+    NPU_SET_OFM_STRIDE_X  = 20,
+    NPU_SET_OFM_STRIDE_Y  = 21,
+    NPU_SET_OFM_STRIDE_C  = 22,
+    NPU_SET_WEIGHT_BASE   = 32,
+    NPU_SET_WEIGHT_LENGTH = 33,
+    NPU_SET_SCALE_BASE    = 34,
+    NPU_SET_SCALE_LENGTH  = 35,
+    NPU_SET_OFM_SCALE     = 36,
+    NPU_SET_OPA_SCALE     = 37,
+    NPU_SET_OPB_SCALE     = 38,
+    NPU_SET_DMA0_SRC      = 48,
+    NPU_SET_DMA0_DST      = 49,
+    NPU_SET_DMA0_LEN      = 50,
+    NPU_SET_IFM2_BASE0    = 128,
+    NPU_SET_IFM2_BASE1    = 129,
+    NPU_SET_IFM2_BASE2    = 130,
+    NPU_SET_IFM2_BASE3    = 131,
+    NPU_SET_IFM2_STRIDE_X = 132,
+    NPU_SET_IFM2_STRIDE_Y = 133,
+    NPU_SET_IFM2_STRIDE_C = 134,
+    NPU_SET_USER_DEFINED0 = 160,
+    NPU_SET_USER_DEFINED1 = 161,
+    NPU_SET_USER_DEFINED2 = 162,
+    NPU_SET_USER_DEFINED3 = 163,
+    NPU_SET_USER_DEFINED4 = 164,
+    NPU_SET_USER_DEFINED5 = 165,
+    NPU_SET_USER_DEFINED6 = 166,
+    NPU_SET_USER_DEFINED7 = 167,
+};
+
+enum class cmd_ctrl : uint8_t
+{
+    CMD0_CTRL = 0,
+    CMD1_CTRL = 1,
+};
+
+enum class custom_dma_cs : uint8_t
+{
+    DISABLE = 0,
+    ENABLE  = 1,
+};
+
+enum class custom_dma : uint8_t
+{
+    NOT_IMPLEMENTED = 0,
+    IMPLEMENTED     = 1,
+};
+
+enum class dma_fault_src : uint8_t
+{
+    AXI_M0 = 0,
+    AXI_M1 = 1,
+};
+
+enum class dma_region_mode : uint8_t
+{
+    EXTERNAL = 0,
+    INTERNAL = 1,
+};
+
+enum class dma_stride_mode : uint8_t
+{
+    D1 = 0,
+};
+
+enum class elementwise_mode : uint8_t
 {
     MUL   = 0,
     ADD   = 1,
@@ -744,31 +600,52 @@
     SHL   = 9,
 };
 
-enum class ifm_precision : uint8_t
+enum class functional_safety : uint8_t
 {
-    U8  = 0,
-    S8  = 1,
-    U16 = 4,
-    S16 = 5,
-    S32 = 9,
+    NOT_IMPLEMENTED = 0,
+    IMPLEMENTED     = 1,
+};
+
+enum class ifm2_operand_order : uint8_t
+{
+    ORDER_B = 0,
+    ORDER_A = 1,
 };
 
 enum class ifm_scale_mode : uint8_t
 {
-    SCALE_16BIT     = 0,
-    SCALE_OPA_32BIT = 1,
-    SCALE_OPB_32BIT = 2,
+    OPA_OPB_16 = 0,
+    OPA_32     = 1,
+    OPB_32     = 2,
 };
 
-enum class macs_per_cc : uint8_t
+enum class ifm_upscale_mode : uint8_t
 {
-    MACS_PER_CC_IS_5 = 0x5,
-    MACS_PER_CC_IS_6 = 0x6,
-    MACS_PER_CC_IS_7 = 0x7,
-    MACS_PER_CC_IS_8 = 0x8,
+    NONE    = 0,
+    NEAREST = 1,
+    ZEROS   = 2,
 };
 
-enum class memory_type : uint8_t
+enum class kernel_decomposition : uint8_t
+{
+    D8X8 = 0,
+    D4X4 = 1,
+};
+
+enum class kernel_dilation : uint8_t
+{
+    NONE = 0,
+    X2   = 1,
+};
+
+enum class max_beats : uint8_t
+{
+    B64  = 0,
+    B128 = 1,
+    B256 = 2,
+};
+
+enum class mem_attr : uint8_t
 {
     AXI0_OUTSTANDING_COUNTER0 = 0,
     AXI0_OUTSTANDING_COUNTER1 = 1,
@@ -776,94 +653,102 @@
     AXI1_OUTSTANDING_COUNTER3 = 3,
 };
 
-enum class ofm_precision : uint8_t
+enum class ofm_scale_mode : uint8_t
 {
-    U8  = 0,
-    S8  = 1,
-    U16 = 2,
-    S16 = 3,
-    S32 = 5,
+    PER_CHANNEL = 0,
+    GLOBAL      = 1,
 };
 
-enum class pmu_event_type : uint16_t
+enum class pmu_axi_channel : uint8_t
 {
-    NO_EVENT                     = 0x00,
-    CYCLE                        = 0x11,
-    NPU_IDLE                     = 0x20,
-    CC_STALLED_ON_BLOCKDEP       = 0x21,
-    CC_STALLED_ON_SHRAM_RECONFIG = 0x22,
-    NPU_ACTIVE                   = 0x23,
-    MAC_ACTIVE                   = 0x30,
-    MAC_ACTIVE_8BIT              = 0x31,
-    MAC_ACTIVE_16BIT             = 0x32,
-    MAC_DPU_ACTIVE               = 0x33,
-    MAC_STALLED_BY_WD_ACC        = 0x34,
-    MAC_STALLED_BY_WD            = 0x35,
-    MAC_STALLED_BY_ACC           = 0x36,
-    MAC_STALLED_BY_IB            = 0x37,
-    MAC_ACTIVE_32BIT             = 0x38,
-    MAC_STALLED_BY_INT_W         = 0x39,
-    MAC_STALLED_BY_INT_ACC       = 0x3A,
-    AO_ACTIVE                    = 0x40,
-    AO_ACTIVE_8BIT               = 0x41,
-    AO_ACTIVE_16BIT              = 0x42,
-    AO_STALLED_BY_OFMP_OB        = 0x43,
-    AO_STALLED_BY_OFMP           = 0x44,
-    AO_STALLED_BY_OB             = 0x45,
-    AO_STALLED_BY_ACC_IB         = 0x46,
-    AO_STALLED_BY_ACC            = 0x47,
-    AO_STALLED_BY_IB             = 0x48,
-    WD_ACTIVE                    = 0x50,
-    WD_STALLED                   = 0x51,
-    WD_STALLED_BY_WS             = 0x52,
-    WD_STALLED_BY_WD_BUF         = 0x53,
-    WD_PARSE_ACTIVE              = 0x54,
-    WD_PARSE_STALLED             = 0x55,
-    WD_PARSE_STALLED_IN          = 0x56,
-    WD_PARSE_STALLED_OUT         = 0x57,
-    WD_TRANS_WS                  = 0x58,
-    WD_TRANS_WB                  = 0x59,
-    WD_TRANS_DW0                 = 0x5a,
-    WD_TRANS_DW1                 = 0x5b,
-    AXI0_RD_TRANS_ACCEPTED       = 0x80,
-    AXI0_RD_TRANS_COMPLETED      = 0x81,
-    AXI0_RD_DATA_BEAT_RECEIVED   = 0x82,
-    AXI0_RD_TRAN_REQ_STALLED     = 0x83,
-    AXI0_WR_TRANS_ACCEPTED       = 0x84,
-    AXI0_WR_TRANS_COMPLETED_M    = 0x85,
-    AXI0_WR_TRANS_COMPLETED_S    = 0x86,
-    AXI0_WR_DATA_BEAT_WRITTEN    = 0x87,
-    AXI0_WR_TRAN_REQ_STALLED     = 0x88,
-    AXI0_WR_DATA_BEAT_STALLED    = 0x89,
-    AXI0_ENABLED_CYCLES          = 0x8c,
-    AXI0_RD_STALL_LIMIT          = 0x8e,
-    AXI0_WR_STALL_LIMIT          = 0x8f,
-    AXI1_RD_TRANS_ACCEPTED       = 0x180,
-    AXI1_RD_TRANS_COMPLETED      = 0x181,
-    AXI1_RD_DATA_BEAT_RECEIVED   = 0x182,
-    AXI1_RD_TRAN_REQ_STALLED     = 0x183,
-    AXI1_WR_TRANS_ACCEPTED       = 0x184,
-    AXI1_WR_TRANS_COMPLETED_M    = 0x185,
-    AXI1_WR_TRANS_COMPLETED_S    = 0x186,
-    AXI1_WR_DATA_BEAT_WRITTEN    = 0x187,
-    AXI1_WR_TRAN_REQ_STALLED     = 0x188,
-    AXI1_WR_DATA_BEAT_STALLED    = 0x189,
-    AXI1_ENABLED_CYCLES          = 0x18c,
-    AXI1_RD_STALL_LIMIT          = 0x18e,
-    AXI1_WR_STALL_LIMIT          = 0x18f,
-    AXI_LATENCY_ANY              = 0xa0,
-    AXI_LATENCY_32               = 0xa1,
-    AXI_LATENCY_64               = 0xa2,
-    AXI_LATENCY_128              = 0xa3,
-    AXI_LATENCY_256              = 0xa4,
-    AXI_LATENCY_512              = 0xa5,
-    AXI_LATENCY_1024             = 0xa6,
-    ECC_DMA                      = 0xb0,
-    ECC_SB0                      = 0xb1,
-    ECC_SB1                      = 0x1b1,
+    RD_CMD        = 0,
+    RD_IFM        = 1,
+    RD_WEIGHTS    = 2,
+    RD_SCALE_BIAS = 3,
+    RD_MEM2MEM    = 4,
+    WR_OFM        = 8,
+    WR_MEM2MEM    = 9,
 };
 
-enum class pooling_mode : uint16_t
+enum class pmu_event : uint16_t
+{
+    NO_EVENT                     = 0,
+    CYCLE                        = 17,
+    NPU_IDLE                     = 32,
+    CC_STALLED_ON_BLOCKDEP       = 33,
+    CC_STALLED_ON_SHRAM_RECONFIG = 34,
+    NPU_ACTIVE                   = 35,
+    MAC_ACTIVE                   = 48,
+    MAC_ACTIVE_8BIT              = 49,
+    MAC_ACTIVE_16BIT             = 50,
+    MAC_DPU_ACTIVE               = 51,
+    MAC_STALLED_BY_WD_ACC        = 52,
+    MAC_STALLED_BY_WD            = 53,
+    MAC_STALLED_BY_ACC           = 54,
+    MAC_STALLED_BY_IB            = 55,
+    MAC_ACTIVE_32BIT             = 56,
+    MAC_STALLED_BY_INT_W         = 57,
+    MAC_STALLED_BY_INT_ACC       = 58,
+    AO_ACTIVE                    = 64,
+    AO_ACTIVE_8BIT               = 65,
+    AO_ACTIVE_16BIT              = 66,
+    AO_STALLED_BY_OFMP_OB        = 67,
+    AO_STALLED_BY_OFMP           = 68,
+    AO_STALLED_BY_OB             = 69,
+    AO_STALLED_BY_ACC_IB         = 70,
+    AO_STALLED_BY_ACC            = 71,
+    AO_STALLED_BY_IB             = 72,
+    WD_ACTIVE                    = 80,
+    WD_STALLED                   = 81,
+    WD_STALLED_BY_WS             = 82,
+    WD_STALLED_BY_WD_BUF         = 83,
+    WD_PARSE_ACTIVE              = 84,
+    WD_PARSE_STALLED             = 85,
+    WD_PARSE_STALLED_IN          = 86,
+    WD_PARSE_STALLED_OUT         = 87,
+    WD_TRANS_WS                  = 88,
+    WD_TRANS_WB                  = 89,
+    WD_TRANS_DW0                 = 90,
+    WD_TRANS_DW1                 = 91,
+    AXI0_RD_TRANS_ACCEPTED       = 128,
+    AXI0_RD_TRANS_COMPLETED      = 129,
+    AXI0_RD_DATA_BEAT_RECEIVED   = 130,
+    AXI0_RD_TRAN_REQ_STALLED     = 131,
+    AXI0_WR_TRANS_ACCEPTED       = 132,
+    AXI0_WR_TRANS_COMPLETED_M    = 133,
+    AXI0_WR_TRANS_COMPLETED_S    = 134,
+    AXI0_WR_DATA_BEAT_WRITTEN    = 135,
+    AXI0_WR_TRAN_REQ_STALLED     = 136,
+    AXI0_WR_DATA_BEAT_STALLED    = 137,
+    AXI0_ENABLED_CYCLES          = 140,
+    AXI0_RD_STALL_LIMIT          = 142,
+    AXI0_WR_STALL_LIMIT          = 143,
+    AXI_LATENCY_ANY              = 160,
+    AXI_LATENCY_32               = 161,
+    AXI_LATENCY_64               = 162,
+    AXI_LATENCY_128              = 163,
+    AXI_LATENCY_256              = 164,
+    AXI_LATENCY_512              = 165,
+    AXI_LATENCY_1024             = 166,
+    ECC_DMA                      = 176,
+    ECC_SB0                      = 177,
+    AXI1_RD_TRANS_ACCEPTED       = 384,
+    AXI1_RD_TRANS_COMPLETED      = 385,
+    AXI1_RD_DATA_BEAT_RECEIVED   = 386,
+    AXI1_RD_TRAN_REQ_STALLED     = 387,
+    AXI1_WR_TRANS_ACCEPTED       = 388,
+    AXI1_WR_TRANS_COMPLETED_M    = 389,
+    AXI1_WR_TRANS_COMPLETED_S    = 390,
+    AXI1_WR_DATA_BEAT_WRITTEN    = 391,
+    AXI1_WR_TRAN_REQ_STALLED     = 392,
+    AXI1_WR_DATA_BEAT_STALLED    = 393,
+    AXI1_ENABLED_CYCLES          = 396,
+    AXI1_RD_STALL_LIMIT          = 398,
+    AXI1_WR_STALL_LIMIT          = 399,
+    ECC_SB1                      = 433,
+};
+
+enum class pooling_mode : uint8_t
 {
     MAX        = 0,
     AVERAGE    = 1,
@@ -876,16 +761,9 @@
     PRIVILEGED = 1,
 };
 
-enum class resampling_mode : uint8_t
+enum class round_mode : uint8_t
 {
-    NONE      = 0,
-    NEAREST   = 1,
-    TRANSPOSE = 2,
-};
-
-enum class rounding : uint8_t
-{
-    TFL      = 0,
+    DBL      = 0,
     TRUNCATE = 1,
     NATURAL  = 2,
 };
@@ -896,182 +774,246 @@
     NON_SECURE = 1,
 };
 
-enum class shram_size : uint8_t
-{
-    SHRAM_96KB = 0x60,
-    SHRAM_48KB = 0x30,
-    SHRAM_24KB = 0x18,
-    SHRAM_16KB = 0x10,
-};
-
 enum class state : uint8_t
 {
     STOPPED = 0,
     RUNNING = 1,
 };
 
-enum class stride_mode : uint8_t
+enum class wd_core_slice_state : uint8_t
 {
-    STRIDE_MODE_1D = 0,
-    STRIDE_MODE_2D = 1,
-    STRIDE_MODE_3D = 2,
+    HEADER  = 0,
+    PALETTE = 1,
+    WEIGHTS = 2,
+};
+
+enum class wd_ctrl_state : uint8_t
+{
+    IDLE     = 0,
+    DRAIN    = 1,
+    OFD_INIT = 2,
+    OFD_RUN  = 3,
+};
+
+enum class weight_order : uint8_t
+{
+    DEPTH_FIRST       = 0,
+    PART_KERNEL_FIRST = 1,
 };
 
 #else
 
 enum acc_format
 {
-    ACC_FORMAT_INT_32BIT = 0,
-    ACC_FORMAT_INT_40BIT = 1,
-    ACC_FORMAT_FP_S5_10  = 2,
+    ACC_FORMAT_I32 = 0,
+    ACC_FORMAT_I40 = 1,
+    ACC_FORMAT_F16 = 2,
 };
 
-enum activation
+enum activation_clip_range
 {
-    ACTIVATION_NONE      = 0,
-    ACTIVATION_TANH      = 3,
-    ACTIVATION_SIGMOID   = 4,
-    ACTIVATION_LUT_START = 16,
-    ACTIVATION_LUT_END   = 23,
+    ACTIVATION_CLIP_RANGE_OFM_PRECISION = 0,
+    ACTIVATION_CLIP_RANGE_FORCE_UINT8   = 2,
+    ACTIVATION_CLIP_RANGE_FORCE_INT8    = 3,
+    ACTIVATION_CLIP_RANGE_FORCE_INT16   = 5,
 };
 
-enum axi_mem_encoding_type
+enum activation_format
 {
-    AXI_MEM_ENCODING_TYPE_DEVICE_NON_BUFFERABLE                 = 0x0,
-    AXI_MEM_ENCODING_TYPE_DEVICE_BUFFERABLE                     = 0x1,
-    AXI_MEM_ENCODING_TYPE_NORMAL_NON_CACHEABLE_NON_BUFFERABLE   = 0x2,
-    AXI_MEM_ENCODING_TYPE_NORMAL_NON_CACHEABLE_BUFFERABLE       = 0x3,
-    AXI_MEM_ENCODING_TYPE_WRITE_THROUGH_NO_ALLOCATE             = 0x4,
-    AXI_MEM_ENCODING_TYPE_WRITE_THROUGH_READ_ALLOCATE           = 0x5,
-    AXI_MEM_ENCODING_TYPE_WRITE_THROUGH_WRITE_ALLOCATE          = 0x6,
-    AXI_MEM_ENCODING_TYPE_WRITE_THROUGH_READ_AND_WRITE_ALLOCATE = 0x7,
-    AXI_MEM_ENCODING_TYPE_WRITE_BACK_NO_ALLOCATE                = 0x8,
-    AXI_MEM_ENCODING_TYPE_WRITE_BACK_READ_ALLOCATE              = 0x9,
-    AXI_MEM_ENCODING_TYPE_WRITE_BACK_WRITE_ALLOCATE             = 0xA,
-    AXI_MEM_ENCODING_TYPE_WRITE_BACK_READ_AND_WRITE_ALLOCATE    = 0xB,
-    AXI_MEM_ENCODING_TYPE_RESERVED_12                           = 0xC,
-    AXI_MEM_ENCODING_TYPE_RESERVED_13                           = 0xD,
-    AXI_MEM_ENCODING_TYPE_RESERVED_14                           = 0xE,
-    AXI_MEM_ENCODING_TYPE_RESERVED_15                           = 0xF,
+    ACTIVATION_FORMAT_NHWC    = 0,
+    ACTIVATION_FORMAT_NHCWB16 = 1,
 };
 
-enum clip_range
+enum activation_function
 {
-    CLIP_RANGE_OFM_PRECISION = 0,
-    CLIP_RANGE_FORCE_UINT8   = 2,
-    CLIP_RANGE_FORCE_INT8    = 3,
-    CLIP_RANGE_FORCE_INT16   = 5,
+    ACTIVATION_FUNCTION_RELU    = 0,
+    ACTIVATION_FUNCTION_TANH    = 3,
+    ACTIVATION_FUNCTION_SIGMOID = 4,
+    ACTIVATION_FUNCTION_TABLE_0 = 16,
+    ACTIVATION_FUNCTION_TABLE_1 = 17,
+    ACTIVATION_FUNCTION_TABLE_2 = 18,
+    ACTIVATION_FUNCTION_TABLE_3 = 19,
+    ACTIVATION_FUNCTION_TABLE_4 = 20,
+    ACTIVATION_FUNCTION_TABLE_5 = 21,
+    ACTIVATION_FUNCTION_TABLE_6 = 22,
+    ACTIVATION_FUNCTION_TABLE_7 = 23,
 };
 
-enum cmd0
+enum activation_precision
 {
-    CMD0_NPU_OP_STOP               = 0x000,
-    CMD0_NPU_OP_IRQ                = 0x001,
-    CMD0_NPU_OP_CONV               = 0x002,
-    CMD0_NPU_OP_DEPTHWISE          = 0x003,
-    CMD0_NPU_OP_POOL               = 0x005,
-    CMD0_NPU_OP_ELEMENTWISE        = 0x006,
-    CMD0_NPU_OP_DMA_START          = 0x010,
-    CMD0_NPU_OP_DMA_WAIT           = 0x011,
-    CMD0_NPU_OP_KERNEL_WAIT        = 0x012,
-    CMD0_NPU_OP_PMU_MASK           = 0x013,
-    CMD0_NPU_SET_IFM_PAD_TOP       = 0x100,
-    CMD0_NPU_SET_IFM_PAD_LEFT      = 0x101,
-    CMD0_NPU_SET_IFM_PAD_RIGHT     = 0x102,
-    CMD0_NPU_SET_IFM_PAD_BOTTOM    = 0x103,
-    CMD0_NPU_SET_IFM_DEPTH_M1      = 0x104,
-    CMD0_NPU_SET_IFM_PRECISION     = 0x105,
-    CMD0_NPU_SET_IFM_UPSCALE       = 0x107,
-    CMD0_NPU_SET_IFM_ZERO_POINT    = 0x109,
-    CMD0_NPU_SET_IFM_WIDTH0_M1     = 0x10A,
-    CMD0_NPU_SET_IFM_HEIGHT0_M1    = 0x10B,
-    CMD0_NPU_SET_IFM_HEIGHT1_M1    = 0x10C,
-    CMD0_NPU_SET_IFM_IB_END        = 0x10D,
-    CMD0_NPU_SET_IFM_REGION        = 0x10F,
-    CMD0_NPU_SET_OFM_WIDTH_M1      = 0x111,
-    CMD0_NPU_SET_OFM_HEIGHT_M1     = 0x112,
-    CMD0_NPU_SET_OFM_DEPTH_M1      = 0x113,
-    CMD0_NPU_SET_OFM_PRECISION     = 0x114,
-    CMD0_NPU_SET_OFM_BLK_WIDTH_M1  = 0x115,
-    CMD0_NPU_SET_OFM_BLK_HEIGHT_M1 = 0x116,
-    CMD0_NPU_SET_OFM_BLK_DEPTH_M1  = 0x117,
-    CMD0_NPU_SET_OFM_ZERO_POINT    = 0x118,
-    CMD0_NPU_SET_OFM_WIDTH0_M1     = 0x11A,
-    CMD0_NPU_SET_OFM_HEIGHT0_M1    = 0x11B,
-    CMD0_NPU_SET_OFM_HEIGHT1_M1    = 0x11C,
-    CMD0_NPU_SET_OFM_REGION        = 0x11F,
-    CMD0_NPU_SET_KERNEL_WIDTH_M1   = 0x120,
-    CMD0_NPU_SET_KERNEL_HEIGHT_M1  = 0x121,
-    CMD0_NPU_SET_KERNEL_STRIDE     = 0x122,
-    CMD0_NPU_SET_PARALLEL_MODE     = 0x123,
-    CMD0_NPU_SET_ACC_FORMAT        = 0x124,
-    CMD0_NPU_SET_ACTIVATION        = 0x125,
-    CMD0_NPU_SET_ACTIVATION_MIN    = 0x126,
-    CMD0_NPU_SET_ACTIVATION_MAX    = 0x127,
-    CMD0_NPU_SET_WEIGHT_REGION     = 0x128,
-    CMD0_NPU_SET_SCALE_REGION      = 0x129,
-    CMD0_NPU_SET_AB_START          = 0x12D,
-    CMD0_NPU_SET_BLOCKDEP          = 0x12F,
-    CMD0_NPU_SET_DMA0_SRC_REGION   = 0x130,
-    CMD0_NPU_SET_DMA0_DST_REGION   = 0x131,
-    CMD0_NPU_SET_DMA0_SIZE0        = 0x132,
-    CMD0_NPU_SET_DMA0_SIZE1        = 0x133,
-    CMD0_NPU_SET_IFM2_BROADCAST    = 0x180,
-    CMD0_NPU_SET_IFM2_SCALAR       = 0x181,
-    CMD0_NPU_SET_IFM2_PRECISION    = 0x185,
-    CMD0_NPU_SET_IFM2_ZERO_POINT   = 0x189,
-    CMD0_NPU_SET_IFM2_WIDTH0_M1    = 0x18A,
-    CMD0_NPU_SET_IFM2_HEIGHT0_M1   = 0x18B,
-    CMD0_NPU_SET_IFM2_HEIGHT1_M1   = 0x18C,
-    CMD0_NPU_SET_IFM2_IB_START     = 0x18D,
-    CMD0_NPU_SET_IFM2_REGION       = 0x18F,
+    ACTIVATION_PRECISION_B8  = 0,
+    ACTIVATION_PRECISION_B16 = 1,
+    ACTIVATION_PRECISION_B32 = 2,
+    ACTIVATION_PRECISION_B64 = 3,
 };
 
-enum cmd1
+enum activation_type
 {
-    CMD1_NPU_SET_IFM_BASE0      = 0x000,
-    CMD1_NPU_SET_IFM_BASE1      = 0x001,
-    CMD1_NPU_SET_IFM_BASE2      = 0x002,
-    CMD1_NPU_SET_IFM_BASE3      = 0x003,
-    CMD1_NPU_SET_IFM_STRIDE_X   = 0x004,
-    CMD1_NPU_SET_IFM_STRIDE_Y   = 0x005,
-    CMD1_NPU_SET_IFM_STRIDE_C   = 0x006,
-    CMD1_NPU_SET_OFM_BASE0      = 0x010,
-    CMD1_NPU_SET_OFM_BASE1      = 0x011,
-    CMD1_NPU_SET_OFM_BASE2      = 0x012,
-    CMD1_NPU_SET_OFM_BASE3      = 0x013,
-    CMD1_NPU_SET_OFM_STRIDE_X   = 0x014,
-    CMD1_NPU_SET_OFM_STRIDE_Y   = 0x015,
-    CMD1_NPU_SET_OFM_STRIDE_C   = 0x016,
-    CMD1_NPU_SET_WEIGHT_BASE    = 0x020,
-    CMD1_NPU_SET_WEIGHT_LENGTH  = 0x021,
-    CMD1_NPU_SET_SCALE_BASE     = 0x022,
-    CMD1_NPU_SET_SCALE_LENGTH   = 0x023,
-    CMD1_NPU_SET_OFM_SCALE      = 0x024,
-    CMD1_NPU_SET_OPA_SCALE      = 0x025,
-    CMD1_NPU_SET_OPB_SCALE      = 0x026,
-    CMD1_NPU_SET_DMA0_SRC       = 0x030,
-    CMD1_NPU_SET_DMA0_DST       = 0x031,
-    CMD1_NPU_SET_DMA0_LEN       = 0x032,
-    CMD1_NPU_SET_DMA0_SKIP0     = 0x033,
-    CMD1_NPU_SET_DMA0_SKIP1     = 0x034,
-    CMD1_NPU_SET_IFM2_BASE0     = 0x080,
-    CMD1_NPU_SET_IFM2_BASE1     = 0x081,
-    CMD1_NPU_SET_IFM2_BASE2     = 0x082,
-    CMD1_NPU_SET_IFM2_BASE3     = 0x083,
-    CMD1_NPU_SET_IFM2_STRIDE_X  = 0x084,
-    CMD1_NPU_SET_IFM2_STRIDE_Y  = 0x085,
-    CMD1_NPU_SET_IFM2_STRIDE_C  = 0x086,
-    CMD1_NPU_SET_WEIGHT1_BASE   = 0x090,
-    CMD1_NPU_SET_WEIGHT1_LENGTH = 0x091,
-    CMD1_NPU_SET_SCALE1_BASE    = 0x092,
-    CMD1_NPU_SET_SCALE1_LENGTH  = 0x093,
+    ACTIVATION_TYPE_UNSIGNED = 0,
+    ACTIVATION_TYPE_SIGNED   = 1,
 };
 
-enum data_format
+enum axi_mem_encoding
 {
-    DATA_FORMAT_NHWC    = 0,
-    DATA_FORMAT_NHCWB16 = 1,
+    AXI_MEM_ENCODING_DEVICE_NON_BUFFERABLE                 = 0,
+    AXI_MEM_ENCODING_DEVICE_BUFFERABLE                     = 1,
+    AXI_MEM_ENCODING_NORMAL_NON_CACHEABLE_NON_BUFFERABLE   = 2,
+    AXI_MEM_ENCODING_NORMAL_NON_CACHEABLE_BUFFERABLE       = 3,
+    AXI_MEM_ENCODING_WRITE_THROUGH_NO_ALLOCATE             = 4,
+    AXI_MEM_ENCODING_WRITE_THROUGH_READ_ALLOCATE           = 5,
+    AXI_MEM_ENCODING_WRITE_THROUGH_WRITE_ALLOCATE          = 6,
+    AXI_MEM_ENCODING_WRITE_THROUGH_READ_AND_WRITE_ALLOCATE = 7,
+    AXI_MEM_ENCODING_WRITE_BACK_NO_ALLOCATE                = 8,
+    AXI_MEM_ENCODING_WRITE_BACK_READ_ALLOCATE              = 9,
+    AXI_MEM_ENCODING_WRITE_BACK_WRITE_ALLOCATE             = 10,
+    AXI_MEM_ENCODING_WRITE_BACK_READ_AND_WRITE_ALLOCATE    = 11,
+};
+
+enum broadcast_mode
+{
+    BROADCAST_MODE_DISABLE = 0,
+    BROADCAST_MODE_ENABLE  = 1,
+};
+
+enum cmd0_opcode
+{
+    CMD0_OPCODE_NPU_OP_STOP               = 0,
+    CMD0_OPCODE_NPU_OP_IRQ                = 1,
+    CMD0_OPCODE_NPU_OP_CONV               = 2,
+    CMD0_OPCODE_NPU_OP_DEPTHWISE          = 3,
+    CMD0_OPCODE_NPU_OP_POOL               = 5,
+    CMD0_OPCODE_NPU_OP_ELEMENTWISE        = 6,
+    CMD0_OPCODE_NPU_OP_DMA_START          = 16,
+    CMD0_OPCODE_NPU_OP_DMA_WAIT           = 17,
+    CMD0_OPCODE_NPU_OP_KERNEL_WAIT        = 18,
+    CMD0_OPCODE_NPU_OP_PMU_MASK           = 19,
+    CMD0_OPCODE_NPU_SET_IFM_PAD_TOP       = 256,
+    CMD0_OPCODE_NPU_SET_IFM_PAD_LEFT      = 257,
+    CMD0_OPCODE_NPU_SET_IFM_PAD_RIGHT     = 258,
+    CMD0_OPCODE_NPU_SET_IFM_PAD_BOTTOM    = 259,
+    CMD0_OPCODE_NPU_SET_IFM_DEPTH_M1      = 260,
+    CMD0_OPCODE_NPU_SET_IFM_PRECISION     = 261,
+    CMD0_OPCODE_NPU_SET_IFM_UPSCALE       = 263,
+    CMD0_OPCODE_NPU_SET_IFM_ZERO_POINT    = 265,
+    CMD0_OPCODE_NPU_SET_IFM_WIDTH0_M1     = 266,
+    CMD0_OPCODE_NPU_SET_IFM_HEIGHT0_M1    = 267,
+    CMD0_OPCODE_NPU_SET_IFM_HEIGHT1_M1    = 268,
+    CMD0_OPCODE_NPU_SET_IFM_IB_END        = 269,
+    CMD0_OPCODE_NPU_SET_IFM_REGION        = 271,
+    CMD0_OPCODE_NPU_SET_OFM_WIDTH_M1      = 273,
+    CMD0_OPCODE_NPU_SET_OFM_HEIGHT_M1     = 274,
+    CMD0_OPCODE_NPU_SET_OFM_DEPTH_M1      = 275,
+    CMD0_OPCODE_NPU_SET_OFM_PRECISION     = 276,
+    CMD0_OPCODE_NPU_SET_OFM_BLK_WIDTH_M1  = 277,
+    CMD0_OPCODE_NPU_SET_OFM_BLK_HEIGHT_M1 = 278,
+    CMD0_OPCODE_NPU_SET_OFM_BLK_DEPTH_M1  = 279,
+    CMD0_OPCODE_NPU_SET_OFM_ZERO_POINT    = 280,
+    CMD0_OPCODE_NPU_SET_OFM_WIDTH0_M1     = 282,
+    CMD0_OPCODE_NPU_SET_OFM_HEIGHT0_M1    = 283,
+    CMD0_OPCODE_NPU_SET_OFM_HEIGHT1_M1    = 284,
+    CMD0_OPCODE_NPU_SET_OFM_REGION        = 287,
+    CMD0_OPCODE_NPU_SET_KERNEL_WIDTH_M1   = 288,
+    CMD0_OPCODE_NPU_SET_KERNEL_HEIGHT_M1  = 289,
+    CMD0_OPCODE_NPU_SET_KERNEL_STRIDE     = 290,
+    CMD0_OPCODE_NPU_SET_ACC_FORMAT        = 292,
+    CMD0_OPCODE_NPU_SET_ACTIVATION        = 293,
+    CMD0_OPCODE_NPU_SET_ACTIVATION_MIN    = 294,
+    CMD0_OPCODE_NPU_SET_ACTIVATION_MAX    = 295,
+    CMD0_OPCODE_NPU_SET_WEIGHT_REGION     = 296,
+    CMD0_OPCODE_NPU_SET_SCALE_REGION      = 297,
+    CMD0_OPCODE_NPU_SET_AB_START          = 301,
+    CMD0_OPCODE_NPU_SET_BLOCKDEP          = 303,
+    CMD0_OPCODE_NPU_SET_DMA0_SRC_REGION   = 304,
+    CMD0_OPCODE_NPU_SET_DMA0_DST_REGION   = 305,
+    CMD0_OPCODE_NPU_SET_DMA0_SIZE0        = 306,
+    CMD0_OPCODE_NPU_SET_DMA0_SIZE1        = 307,
+    CMD0_OPCODE_NPU_SET_IFM2_BROADCAST    = 384,
+    CMD0_OPCODE_NPU_SET_IFM2_SCALAR       = 385,
+    CMD0_OPCODE_NPU_SET_IFM2_PRECISION    = 389,
+    CMD0_OPCODE_NPU_SET_IFM2_ZERO_POINT   = 393,
+    CMD0_OPCODE_NPU_SET_IFM2_WIDTH0_M1    = 394,
+    CMD0_OPCODE_NPU_SET_IFM2_HEIGHT0_M1   = 395,
+    CMD0_OPCODE_NPU_SET_IFM2_HEIGHT1_M1   = 396,
+    CMD0_OPCODE_NPU_SET_IFM2_IB_START     = 397,
+    CMD0_OPCODE_NPU_SET_IFM2_REGION       = 399,
+};
+
+enum cmd1_opcode
+{
+    CMD1_OPCODE_NPU_SET_IFM_BASE0     = 0,
+    CMD1_OPCODE_NPU_SET_IFM_BASE1     = 1,
+    CMD1_OPCODE_NPU_SET_IFM_BASE2     = 2,
+    CMD1_OPCODE_NPU_SET_IFM_BASE3     = 3,
+    CMD1_OPCODE_NPU_SET_IFM_STRIDE_X  = 4,
+    CMD1_OPCODE_NPU_SET_IFM_STRIDE_Y  = 5,
+    CMD1_OPCODE_NPU_SET_IFM_STRIDE_C  = 6,
+    CMD1_OPCODE_NPU_SET_OFM_BASE0     = 16,
+    CMD1_OPCODE_NPU_SET_OFM_BASE1     = 17,
+    CMD1_OPCODE_NPU_SET_OFM_BASE2     = 18,
+    CMD1_OPCODE_NPU_SET_OFM_BASE3     = 19,
+    CMD1_OPCODE_NPU_SET_OFM_STRIDE_X  = 20,
+    CMD1_OPCODE_NPU_SET_OFM_STRIDE_Y  = 21,
+    CMD1_OPCODE_NPU_SET_OFM_STRIDE_C  = 22,
+    CMD1_OPCODE_NPU_SET_WEIGHT_BASE   = 32,
+    CMD1_OPCODE_NPU_SET_WEIGHT_LENGTH = 33,
+    CMD1_OPCODE_NPU_SET_SCALE_BASE    = 34,
+    CMD1_OPCODE_NPU_SET_SCALE_LENGTH  = 35,
+    CMD1_OPCODE_NPU_SET_OFM_SCALE     = 36,
+    CMD1_OPCODE_NPU_SET_OPA_SCALE     = 37,
+    CMD1_OPCODE_NPU_SET_OPB_SCALE     = 38,
+    CMD1_OPCODE_NPU_SET_DMA0_SRC      = 48,
+    CMD1_OPCODE_NPU_SET_DMA0_DST      = 49,
+    CMD1_OPCODE_NPU_SET_DMA0_LEN      = 50,
+    CMD1_OPCODE_NPU_SET_IFM2_BASE0    = 128,
+    CMD1_OPCODE_NPU_SET_IFM2_BASE1    = 129,
+    CMD1_OPCODE_NPU_SET_IFM2_BASE2    = 130,
+    CMD1_OPCODE_NPU_SET_IFM2_BASE3    = 131,
+    CMD1_OPCODE_NPU_SET_IFM2_STRIDE_X = 132,
+    CMD1_OPCODE_NPU_SET_IFM2_STRIDE_Y = 133,
+    CMD1_OPCODE_NPU_SET_IFM2_STRIDE_C = 134,
+    CMD1_OPCODE_NPU_SET_USER_DEFINED0 = 160,
+    CMD1_OPCODE_NPU_SET_USER_DEFINED1 = 161,
+    CMD1_OPCODE_NPU_SET_USER_DEFINED2 = 162,
+    CMD1_OPCODE_NPU_SET_USER_DEFINED3 = 163,
+    CMD1_OPCODE_NPU_SET_USER_DEFINED4 = 164,
+    CMD1_OPCODE_NPU_SET_USER_DEFINED5 = 165,
+    CMD1_OPCODE_NPU_SET_USER_DEFINED6 = 166,
+    CMD1_OPCODE_NPU_SET_USER_DEFINED7 = 167,
+};
+
+enum cmd_ctrl
+{
+    CMD_CTRL_CMD0_CTRL = 0,
+    CMD_CTRL_CMD1_CTRL = 1,
+};
+
+enum custom_dma_cs
+{
+    CUSTOM_DMA_CS_DISABLE = 0,
+    CUSTOM_DMA_CS_ENABLE  = 1,
+};
+
+enum custom_dma
+{
+    CUSTOM_DMA_NOT_IMPLEMENTED = 0,
+    CUSTOM_DMA_IMPLEMENTED     = 1,
+};
+
+enum dma_fault_src
+{
+    DMA_FAULT_SRC_AXI_M0 = 0,
+    DMA_FAULT_SRC_AXI_M1 = 1,
+};
+
+enum dma_region_mode
+{
+    DMA_REGION_MODE_EXTERNAL = 0,
+    DMA_REGION_MODE_INTERNAL = 1,
+};
+
+enum dma_stride_mode
+{
+    DMA_STRIDE_MODE_D1 = 0,
 };
 
 enum elementwise_mode
@@ -1088,123 +1030,152 @@
     ELEMENTWISE_MODE_SHL   = 9,
 };
 
-enum ifm_precision
+enum functional_safety
 {
-    IFM_PRECISION_U8  = 0,
-    IFM_PRECISION_S8  = 1,
-    IFM_PRECISION_U16 = 4,
-    IFM_PRECISION_S16 = 5,
-    IFM_PRECISION_S32 = 9,
+    FUNCTIONAL_SAFETY_NOT_IMPLEMENTED = 0,
+    FUNCTIONAL_SAFETY_IMPLEMENTED     = 1,
+};
+
+enum ifm2_operand_order
+{
+    IFM2_OPERAND_ORDER_ORDER_B = 0,
+    IFM2_OPERAND_ORDER_ORDER_A = 1,
 };
 
 enum ifm_scale_mode
 {
-    IFM_SCALE_MODE_SCALE_16BIT     = 0,
-    IFM_SCALE_MODE_SCALE_OPA_32BIT = 1,
-    IFM_SCALE_MODE_SCALE_OPB_32BIT = 2,
+    IFM_SCALE_MODE_OPA_OPB_16 = 0,
+    IFM_SCALE_MODE_OPA_32     = 1,
+    IFM_SCALE_MODE_OPB_32     = 2,
 };
 
-enum macs_per_cc
+enum ifm_upscale_mode
 {
-    MACS_PER_CC_MACS_PER_CC_IS_5 = 0x5,
-    MACS_PER_CC_MACS_PER_CC_IS_6 = 0x6,
-    MACS_PER_CC_MACS_PER_CC_IS_7 = 0x7,
-    MACS_PER_CC_MACS_PER_CC_IS_8 = 0x8,
+    IFM_UPSCALE_MODE_NONE    = 0,
+    IFM_UPSCALE_MODE_NEAREST = 1,
+    IFM_UPSCALE_MODE_ZEROS   = 2,
 };
 
-enum memory_type
+enum kernel_decomposition
 {
-    MEMORY_TYPE_AXI0_OUTSTANDING_COUNTER0 = 0,
-    MEMORY_TYPE_AXI0_OUTSTANDING_COUNTER1 = 1,
-    MEMORY_TYPE_AXI1_OUTSTANDING_COUNTER2 = 2,
-    MEMORY_TYPE_AXI1_OUTSTANDING_COUNTER3 = 3,
+    KERNEL_DECOMPOSITION_D8X8 = 0,
+    KERNEL_DECOMPOSITION_D4X4 = 1,
 };
 
-enum ofm_precision
+enum kernel_dilation
 {
-    OFM_PRECISION_U8  = 0,
-    OFM_PRECISION_S8  = 1,
-    OFM_PRECISION_U16 = 2,
-    OFM_PRECISION_S16 = 3,
-    OFM_PRECISION_S32 = 5,
+    KERNEL_DILATION_NONE = 0,
+    KERNEL_DILATION_X2   = 1,
 };
 
-enum pmu_event_type
+enum max_beats
 {
-    PMU_EVENT_TYPE_NO_EVENT                     = 0x00,
-    PMU_EVENT_TYPE_CYCLE                        = 0x11,
-    PMU_EVENT_TYPE_NPU_IDLE                     = 0x20,
-    PMU_EVENT_TYPE_CC_STALLED_ON_BLOCKDEP       = 0x21,
-    PMU_EVENT_TYPE_CC_STALLED_ON_SHRAM_RECONFIG = 0x22,
-    PMU_EVENT_TYPE_NPU_ACTIVE                   = 0x23,
-    PMU_EVENT_TYPE_MAC_ACTIVE                   = 0x30,
-    PMU_EVENT_TYPE_MAC_ACTIVE_8BIT              = 0x31,
-    PMU_EVENT_TYPE_MAC_ACTIVE_16BIT             = 0x32,
-    PMU_EVENT_TYPE_MAC_DPU_ACTIVE               = 0x33,
-    PMU_EVENT_TYPE_MAC_STALLED_BY_WD_ACC        = 0x34,
-    PMU_EVENT_TYPE_MAC_STALLED_BY_WD            = 0x35,
-    PMU_EVENT_TYPE_MAC_STALLED_BY_ACC           = 0x36,
-    PMU_EVENT_TYPE_MAC_STALLED_BY_IB            = 0x37,
-    PMU_EVENT_TYPE_MAC_ACTIVE_32BIT             = 0x38,
-    PMU_EVENT_TYPE_MAC_STALLED_BY_INT_W         = 0x39,
-    PMU_EVENT_TYPE_MAC_STALLED_BY_INT_ACC       = 0x3A,
-    PMU_EVENT_TYPE_AO_ACTIVE                    = 0x40,
-    PMU_EVENT_TYPE_AO_ACTIVE_8BIT               = 0x41,
-    PMU_EVENT_TYPE_AO_ACTIVE_16BIT              = 0x42,
-    PMU_EVENT_TYPE_AO_STALLED_BY_OFMP_OB        = 0x43,
-    PMU_EVENT_TYPE_AO_STALLED_BY_OFMP           = 0x44,
-    PMU_EVENT_TYPE_AO_STALLED_BY_OB             = 0x45,
-    PMU_EVENT_TYPE_AO_STALLED_BY_ACC_IB         = 0x46,
-    PMU_EVENT_TYPE_AO_STALLED_BY_ACC            = 0x47,
-    PMU_EVENT_TYPE_AO_STALLED_BY_IB             = 0x48,
-    PMU_EVENT_TYPE_WD_ACTIVE                    = 0x50,
-    PMU_EVENT_TYPE_WD_STALLED                   = 0x51,
-    PMU_EVENT_TYPE_WD_STALLED_BY_WS             = 0x52,
-    PMU_EVENT_TYPE_WD_STALLED_BY_WD_BUF         = 0x53,
-    PMU_EVENT_TYPE_WD_PARSE_ACTIVE              = 0x54,
-    PMU_EVENT_TYPE_WD_PARSE_STALLED             = 0x55,
-    PMU_EVENT_TYPE_WD_PARSE_STALLED_IN          = 0x56,
-    PMU_EVENT_TYPE_WD_PARSE_STALLED_OUT         = 0x57,
-    PMU_EVENT_TYPE_WD_TRANS_WS                  = 0x58,
-    PMU_EVENT_TYPE_WD_TRANS_WB                  = 0x59,
-    PMU_EVENT_TYPE_WD_TRANS_DW0                 = 0x5a,
-    PMU_EVENT_TYPE_WD_TRANS_DW1                 = 0x5b,
-    PMU_EVENT_TYPE_AXI0_RD_TRANS_ACCEPTED       = 0x80,
-    PMU_EVENT_TYPE_AXI0_RD_TRANS_COMPLETED      = 0x81,
-    PMU_EVENT_TYPE_AXI0_RD_DATA_BEAT_RECEIVED   = 0x82,
-    PMU_EVENT_TYPE_AXI0_RD_TRAN_REQ_STALLED     = 0x83,
-    PMU_EVENT_TYPE_AXI0_WR_TRANS_ACCEPTED       = 0x84,
-    PMU_EVENT_TYPE_AXI0_WR_TRANS_COMPLETED_M    = 0x85,
-    PMU_EVENT_TYPE_AXI0_WR_TRANS_COMPLETED_S    = 0x86,
-    PMU_EVENT_TYPE_AXI0_WR_DATA_BEAT_WRITTEN    = 0x87,
-    PMU_EVENT_TYPE_AXI0_WR_TRAN_REQ_STALLED     = 0x88,
-    PMU_EVENT_TYPE_AXI0_WR_DATA_BEAT_STALLED    = 0x89,
-    PMU_EVENT_TYPE_AXI0_ENABLED_CYCLES          = 0x8c,
-    PMU_EVENT_TYPE_AXI0_RD_STALL_LIMIT          = 0x8e,
-    PMU_EVENT_TYPE_AXI0_WR_STALL_LIMIT          = 0x8f,
-    PMU_EVENT_TYPE_AXI1_RD_TRANS_ACCEPTED       = 0x180,
-    PMU_EVENT_TYPE_AXI1_RD_TRANS_COMPLETED      = 0x181,
-    PMU_EVENT_TYPE_AXI1_RD_DATA_BEAT_RECEIVED   = 0x182,
-    PMU_EVENT_TYPE_AXI1_RD_TRAN_REQ_STALLED     = 0x183,
-    PMU_EVENT_TYPE_AXI1_WR_TRANS_ACCEPTED       = 0x184,
-    PMU_EVENT_TYPE_AXI1_WR_TRANS_COMPLETED_M    = 0x185,
-    PMU_EVENT_TYPE_AXI1_WR_TRANS_COMPLETED_S    = 0x186,
-    PMU_EVENT_TYPE_AXI1_WR_DATA_BEAT_WRITTEN    = 0x187,
-    PMU_EVENT_TYPE_AXI1_WR_TRAN_REQ_STALLED     = 0x188,
-    PMU_EVENT_TYPE_AXI1_WR_DATA_BEAT_STALLED    = 0x189,
-    PMU_EVENT_TYPE_AXI1_ENABLED_CYCLES          = 0x18c,
-    PMU_EVENT_TYPE_AXI1_RD_STALL_LIMIT          = 0x18e,
-    PMU_EVENT_TYPE_AXI1_WR_STALL_LIMIT          = 0x18f,
-    PMU_EVENT_TYPE_AXI_LATENCY_ANY              = 0xa0,
-    PMU_EVENT_TYPE_AXI_LATENCY_32               = 0xa1,
-    PMU_EVENT_TYPE_AXI_LATENCY_64               = 0xa2,
-    PMU_EVENT_TYPE_AXI_LATENCY_128              = 0xa3,
-    PMU_EVENT_TYPE_AXI_LATENCY_256              = 0xa4,
-    PMU_EVENT_TYPE_AXI_LATENCY_512              = 0xa5,
-    PMU_EVENT_TYPE_AXI_LATENCY_1024             = 0xa6,
-    PMU_EVENT_TYPE_ECC_DMA                      = 0xb0,
-    PMU_EVENT_TYPE_ECC_SB0                      = 0xb1,
-    PMU_EVENT_TYPE_ECC_SB1                      = 0x1b1,
+    MAX_BEATS_B64  = 0,
+    MAX_BEATS_B128 = 1,
+    MAX_BEATS_B256 = 2,
+};
+
+enum mem_attr
+{
+    MEM_ATTR_AXI0_OUTSTANDING_COUNTER0 = 0,
+    MEM_ATTR_AXI0_OUTSTANDING_COUNTER1 = 1,
+    MEM_ATTR_AXI1_OUTSTANDING_COUNTER2 = 2,
+    MEM_ATTR_AXI1_OUTSTANDING_COUNTER3 = 3,
+};
+
+enum ofm_scale_mode
+{
+    OFM_SCALE_MODE_PER_CHANNEL = 0,
+    OFM_SCALE_MODE_GLOBAL      = 1,
+};
+
+enum pmu_axi_channel
+{
+    PMU_AXI_CHANNEL_RD_CMD        = 0,
+    PMU_AXI_CHANNEL_RD_IFM        = 1,
+    PMU_AXI_CHANNEL_RD_WEIGHTS    = 2,
+    PMU_AXI_CHANNEL_RD_SCALE_BIAS = 3,
+    PMU_AXI_CHANNEL_RD_MEM2MEM    = 4,
+    PMU_AXI_CHANNEL_WR_OFM        = 8,
+    PMU_AXI_CHANNEL_WR_MEM2MEM    = 9,
+};
+
+enum pmu_event
+{
+    PMU_EVENT_NO_EVENT                     = 0,
+    PMU_EVENT_CYCLE                        = 17,
+    PMU_EVENT_NPU_IDLE                     = 32,
+    PMU_EVENT_CC_STALLED_ON_BLOCKDEP       = 33,
+    PMU_EVENT_CC_STALLED_ON_SHRAM_RECONFIG = 34,
+    PMU_EVENT_NPU_ACTIVE                   = 35,
+    PMU_EVENT_MAC_ACTIVE                   = 48,
+    PMU_EVENT_MAC_ACTIVE_8BIT              = 49,
+    PMU_EVENT_MAC_ACTIVE_16BIT             = 50,
+    PMU_EVENT_MAC_DPU_ACTIVE               = 51,
+    PMU_EVENT_MAC_STALLED_BY_WD_ACC        = 52,
+    PMU_EVENT_MAC_STALLED_BY_WD            = 53,
+    PMU_EVENT_MAC_STALLED_BY_ACC           = 54,
+    PMU_EVENT_MAC_STALLED_BY_IB            = 55,
+    PMU_EVENT_MAC_ACTIVE_32BIT             = 56,
+    PMU_EVENT_MAC_STALLED_BY_INT_W         = 57,
+    PMU_EVENT_MAC_STALLED_BY_INT_ACC       = 58,
+    PMU_EVENT_AO_ACTIVE                    = 64,
+    PMU_EVENT_AO_ACTIVE_8BIT               = 65,
+    PMU_EVENT_AO_ACTIVE_16BIT              = 66,
+    PMU_EVENT_AO_STALLED_BY_OFMP_OB        = 67,
+    PMU_EVENT_AO_STALLED_BY_OFMP           = 68,
+    PMU_EVENT_AO_STALLED_BY_OB             = 69,
+    PMU_EVENT_AO_STALLED_BY_ACC_IB         = 70,
+    PMU_EVENT_AO_STALLED_BY_ACC            = 71,
+    PMU_EVENT_AO_STALLED_BY_IB             = 72,
+    PMU_EVENT_WD_ACTIVE                    = 80,
+    PMU_EVENT_WD_STALLED                   = 81,
+    PMU_EVENT_WD_STALLED_BY_WS             = 82,
+    PMU_EVENT_WD_STALLED_BY_WD_BUF         = 83,
+    PMU_EVENT_WD_PARSE_ACTIVE              = 84,
+    PMU_EVENT_WD_PARSE_STALLED             = 85,
+    PMU_EVENT_WD_PARSE_STALLED_IN          = 86,
+    PMU_EVENT_WD_PARSE_STALLED_OUT         = 87,
+    PMU_EVENT_WD_TRANS_WS                  = 88,
+    PMU_EVENT_WD_TRANS_WB                  = 89,
+    PMU_EVENT_WD_TRANS_DW0                 = 90,
+    PMU_EVENT_WD_TRANS_DW1                 = 91,
+    PMU_EVENT_AXI0_RD_TRANS_ACCEPTED       = 128,
+    PMU_EVENT_AXI0_RD_TRANS_COMPLETED      = 129,
+    PMU_EVENT_AXI0_RD_DATA_BEAT_RECEIVED   = 130,
+    PMU_EVENT_AXI0_RD_TRAN_REQ_STALLED     = 131,
+    PMU_EVENT_AXI0_WR_TRANS_ACCEPTED       = 132,
+    PMU_EVENT_AXI0_WR_TRANS_COMPLETED_M    = 133,
+    PMU_EVENT_AXI0_WR_TRANS_COMPLETED_S    = 134,
+    PMU_EVENT_AXI0_WR_DATA_BEAT_WRITTEN    = 135,
+    PMU_EVENT_AXI0_WR_TRAN_REQ_STALLED     = 136,
+    PMU_EVENT_AXI0_WR_DATA_BEAT_STALLED    = 137,
+    PMU_EVENT_AXI0_ENABLED_CYCLES          = 140,
+    PMU_EVENT_AXI0_RD_STALL_LIMIT          = 142,
+    PMU_EVENT_AXI0_WR_STALL_LIMIT          = 143,
+    PMU_EVENT_AXI_LATENCY_ANY              = 160,
+    PMU_EVENT_AXI_LATENCY_32               = 161,
+    PMU_EVENT_AXI_LATENCY_64               = 162,
+    PMU_EVENT_AXI_LATENCY_128              = 163,
+    PMU_EVENT_AXI_LATENCY_256              = 164,
+    PMU_EVENT_AXI_LATENCY_512              = 165,
+    PMU_EVENT_AXI_LATENCY_1024             = 166,
+    PMU_EVENT_ECC_DMA                      = 176,
+    PMU_EVENT_ECC_SB0                      = 177,
+    PMU_EVENT_AXI1_RD_TRANS_ACCEPTED       = 384,
+    PMU_EVENT_AXI1_RD_TRANS_COMPLETED      = 385,
+    PMU_EVENT_AXI1_RD_DATA_BEAT_RECEIVED   = 386,
+    PMU_EVENT_AXI1_RD_TRAN_REQ_STALLED     = 387,
+    PMU_EVENT_AXI1_WR_TRANS_ACCEPTED       = 388,
+    PMU_EVENT_AXI1_WR_TRANS_COMPLETED_M    = 389,
+    PMU_EVENT_AXI1_WR_TRANS_COMPLETED_S    = 390,
+    PMU_EVENT_AXI1_WR_DATA_BEAT_WRITTEN    = 391,
+    PMU_EVENT_AXI1_WR_TRAN_REQ_STALLED     = 392,
+    PMU_EVENT_AXI1_WR_DATA_BEAT_STALLED    = 393,
+    PMU_EVENT_AXI1_ENABLED_CYCLES          = 396,
+    PMU_EVENT_AXI1_RD_STALL_LIMIT          = 398,
+    PMU_EVENT_AXI1_WR_STALL_LIMIT          = 399,
+    PMU_EVENT_ECC_SB1                      = 433,
 };
 
 enum pooling_mode
@@ -1220,18 +1191,11 @@
     PRIVILEGE_LEVEL_PRIVILEGED = 1,
 };
 
-enum resampling_mode
+enum round_mode
 {
-    RESAMPLING_MODE_NONE      = 0,
-    RESAMPLING_MODE_NEAREST   = 1,
-    RESAMPLING_MODE_TRANSPOSE = 2,
-};
-
-enum rounding
-{
-    ROUNDING_TFL      = 0,
-    ROUNDING_TRUNCATE = 1,
-    ROUNDING_NATURAL  = 2,
+    ROUND_MODE_DBL      = 0,
+    ROUND_MODE_TRUNCATE = 1,
+    ROUND_MODE_NATURAL  = 2,
 };
 
 enum security_level
@@ -1240,35 +1204,410 @@
     SECURITY_LEVEL_NON_SECURE = 1,
 };
 
-enum shram_size
-{
-    SHRAM_SIZE_SHRAM_96KB = 0x60,
-    SHRAM_SIZE_SHRAM_48KB = 0x30,
-    SHRAM_SIZE_SHRAM_24KB = 0x18,
-    SHRAM_SIZE_SHRAM_16KB = 0x10,
-};
-
 enum state
 {
     STATE_STOPPED = 0,
     STATE_RUNNING = 1,
 };
 
-enum stride_mode
+enum wd_core_slice_state
 {
-    STRIDE_MODE_STRIDE_MODE_1D = 0,
-    STRIDE_MODE_STRIDE_MODE_2D = 1,
-    STRIDE_MODE_STRIDE_MODE_3D = 2,
+    WD_CORE_SLICE_STATE_HEADER  = 0,
+    WD_CORE_SLICE_STATE_PALETTE = 1,
+    WD_CORE_SLICE_STATE_WEIGHTS = 2,
+};
+
+enum wd_ctrl_state
+{
+    WD_CTRL_STATE_IDLE     = 0,
+    WD_CTRL_STATE_DRAIN    = 1,
+    WD_CTRL_STATE_OFD_INIT = 2,
+    WD_CTRL_STATE_OFD_RUN  = 3,
+};
+
+enum weight_order
+{
+    WEIGHT_ORDER_DEPTH_FIRST       = 0,
+    WEIGHT_ORDER_PART_KERNEL_FIRST = 1,
 };
 
 #endif
 
+#ifdef NPU_DISASSEMBLE
+
+static const char *acc_format_str[] = {
+    "ACC_FORMAT_I32",
+    "ACC_FORMAT_I40",
+    "ACC_FORMAT_F16",
+};
+
+static const char *activation_clip_range_str[] = {
+    "ACTIVATION_CLIP_RANGE_OFM_PRECISION",
+    "ACTIVATION_CLIP_RANGE_FORCE_UINT8",
+    "ACTIVATION_CLIP_RANGE_FORCE_INT8",
+    "ACTIVATION_CLIP_RANGE_FORCE_INT16",
+};
+
+static const char *activation_format_str[] = {
+    "ACTIVATION_FORMAT_NHWC",
+    "ACTIVATION_FORMAT_NHCWB16",
+};
+
+static const char *activation_function_str[] = {
+    "ACTIVATION_FUNCTION_RELU",
+    "ACTIVATION_FUNCTION_TANH",
+    "ACTIVATION_FUNCTION_SIGMOID",
+    "ACTIVATION_FUNCTION_TABLE_0",
+    "ACTIVATION_FUNCTION_TABLE_1",
+    "ACTIVATION_FUNCTION_TABLE_2",
+    "ACTIVATION_FUNCTION_TABLE_3",
+    "ACTIVATION_FUNCTION_TABLE_4",
+    "ACTIVATION_FUNCTION_TABLE_5",
+    "ACTIVATION_FUNCTION_TABLE_6",
+    "ACTIVATION_FUNCTION_TABLE_7",
+};
+
+static const char *activation_precision_str[] = {
+    "ACTIVATION_PRECISION_B8",
+    "ACTIVATION_PRECISION_B16",
+    "ACTIVATION_PRECISION_B32",
+    "ACTIVATION_PRECISION_B64",
+};
+
+static const char *activation_type_str[] = {
+    "ACTIVATION_TYPE_UNSIGNED",
+    "ACTIVATION_TYPE_SIGNED",
+};
+
+static const char *axi_mem_encoding_str[] = {
+    "AXI_MEM_ENCODING_DEVICE_NON_BUFFERABLE",
+    "AXI_MEM_ENCODING_DEVICE_BUFFERABLE",
+    "AXI_MEM_ENCODING_NORMAL_NON_CACHEABLE_NON_BUFFERABLE",
+    "AXI_MEM_ENCODING_NORMAL_NON_CACHEABLE_BUFFERABLE",
+    "AXI_MEM_ENCODING_WRITE_THROUGH_NO_ALLOCATE",
+    "AXI_MEM_ENCODING_WRITE_THROUGH_READ_ALLOCATE",
+    "AXI_MEM_ENCODING_WRITE_THROUGH_WRITE_ALLOCATE",
+    "AXI_MEM_ENCODING_WRITE_THROUGH_READ_AND_WRITE_ALLOCATE",
+    "AXI_MEM_ENCODING_WRITE_BACK_NO_ALLOCATE",
+    "AXI_MEM_ENCODING_WRITE_BACK_READ_ALLOCATE",
+    "AXI_MEM_ENCODING_WRITE_BACK_WRITE_ALLOCATE",
+    "AXI_MEM_ENCODING_WRITE_BACK_READ_AND_WRITE_ALLOCATE",
+};
+
+static const char *broadcast_mode_str[] = {
+    "BROADCAST_MODE_DISABLE",
+    "BROADCAST_MODE_ENABLE",
+};
+
+static const char *cmd0_opcode_str[] = {
+    "CMD0_OPCODE_NPU_OP_STOP",
+    "CMD0_OPCODE_NPU_OP_IRQ",
+    "CMD0_OPCODE_NPU_OP_CONV",
+    "CMD0_OPCODE_NPU_OP_DEPTHWISE",
+    "CMD0_OPCODE_NPU_OP_POOL",
+    "CMD0_OPCODE_NPU_OP_ELEMENTWISE",
+    "CMD0_OPCODE_NPU_OP_DMA_START",
+    "CMD0_OPCODE_NPU_OP_DMA_WAIT",
+    "CMD0_OPCODE_NPU_OP_KERNEL_WAIT",
+    "CMD0_OPCODE_NPU_OP_PMU_MASK",
+    "CMD0_OPCODE_NPU_SET_IFM_PAD_TOP",
+    "CMD0_OPCODE_NPU_SET_IFM_PAD_LEFT",
+    "CMD0_OPCODE_NPU_SET_IFM_PAD_RIGHT",
+    "CMD0_OPCODE_NPU_SET_IFM_PAD_BOTTOM",
+    "CMD0_OPCODE_NPU_SET_IFM_DEPTH_M1",
+    "CMD0_OPCODE_NPU_SET_IFM_PRECISION",
+    "CMD0_OPCODE_NPU_SET_IFM_UPSCALE",
+    "CMD0_OPCODE_NPU_SET_IFM_ZERO_POINT",
+    "CMD0_OPCODE_NPU_SET_IFM_WIDTH0_M1",
+    "CMD0_OPCODE_NPU_SET_IFM_HEIGHT0_M1",
+    "CMD0_OPCODE_NPU_SET_IFM_HEIGHT1_M1",
+    "CMD0_OPCODE_NPU_SET_IFM_IB_END",
+    "CMD0_OPCODE_NPU_SET_IFM_REGION",
+    "CMD0_OPCODE_NPU_SET_OFM_WIDTH_M1",
+    "CMD0_OPCODE_NPU_SET_OFM_HEIGHT_M1",
+    "CMD0_OPCODE_NPU_SET_OFM_DEPTH_M1",
+    "CMD0_OPCODE_NPU_SET_OFM_PRECISION",
+    "CMD0_OPCODE_NPU_SET_OFM_BLK_WIDTH_M1",
+    "CMD0_OPCODE_NPU_SET_OFM_BLK_HEIGHT_M1",
+    "CMD0_OPCODE_NPU_SET_OFM_BLK_DEPTH_M1",
+    "CMD0_OPCODE_NPU_SET_OFM_ZERO_POINT",
+    "CMD0_OPCODE_NPU_SET_OFM_WIDTH0_M1",
+    "CMD0_OPCODE_NPU_SET_OFM_HEIGHT0_M1",
+    "CMD0_OPCODE_NPU_SET_OFM_HEIGHT1_M1",
+    "CMD0_OPCODE_NPU_SET_OFM_REGION",
+    "CMD0_OPCODE_NPU_SET_KERNEL_WIDTH_M1",
+    "CMD0_OPCODE_NPU_SET_KERNEL_HEIGHT_M1",
+    "CMD0_OPCODE_NPU_SET_KERNEL_STRIDE",
+    "CMD0_OPCODE_NPU_SET_ACC_FORMAT",
+    "CMD0_OPCODE_NPU_SET_ACTIVATION",
+    "CMD0_OPCODE_NPU_SET_ACTIVATION_MIN",
+    "CMD0_OPCODE_NPU_SET_ACTIVATION_MAX",
+    "CMD0_OPCODE_NPU_SET_WEIGHT_REGION",
+    "CMD0_OPCODE_NPU_SET_SCALE_REGION",
+    "CMD0_OPCODE_NPU_SET_AB_START",
+    "CMD0_OPCODE_NPU_SET_BLOCKDEP",
+    "CMD0_OPCODE_NPU_SET_DMA0_SRC_REGION",
+    "CMD0_OPCODE_NPU_SET_DMA0_DST_REGION",
+    "CMD0_OPCODE_NPU_SET_DMA0_SIZE0",
+    "CMD0_OPCODE_NPU_SET_DMA0_SIZE1",
+    "CMD0_OPCODE_NPU_SET_IFM2_BROADCAST",
+    "CMD0_OPCODE_NPU_SET_IFM2_SCALAR",
+    "CMD0_OPCODE_NPU_SET_IFM2_PRECISION",
+    "CMD0_OPCODE_NPU_SET_IFM2_ZERO_POINT",
+    "CMD0_OPCODE_NPU_SET_IFM2_WIDTH0_M1",
+    "CMD0_OPCODE_NPU_SET_IFM2_HEIGHT0_M1",
+    "CMD0_OPCODE_NPU_SET_IFM2_HEIGHT1_M1",
+    "CMD0_OPCODE_NPU_SET_IFM2_IB_START",
+    "CMD0_OPCODE_NPU_SET_IFM2_REGION",
+};
+
+static const char *cmd1_opcode_str[] = {
+    "CMD1_OPCODE_NPU_SET_IFM_BASE0",     "CMD1_OPCODE_NPU_SET_IFM_BASE1",     "CMD1_OPCODE_NPU_SET_IFM_BASE2",
+    "CMD1_OPCODE_NPU_SET_IFM_BASE3",     "CMD1_OPCODE_NPU_SET_IFM_STRIDE_X",  "CMD1_OPCODE_NPU_SET_IFM_STRIDE_Y",
+    "CMD1_OPCODE_NPU_SET_IFM_STRIDE_C",  "CMD1_OPCODE_NPU_SET_OFM_BASE0",     "CMD1_OPCODE_NPU_SET_OFM_BASE1",
+    "CMD1_OPCODE_NPU_SET_OFM_BASE2",     "CMD1_OPCODE_NPU_SET_OFM_BASE3",     "CMD1_OPCODE_NPU_SET_OFM_STRIDE_X",
+    "CMD1_OPCODE_NPU_SET_OFM_STRIDE_Y",  "CMD1_OPCODE_NPU_SET_OFM_STRIDE_C",  "CMD1_OPCODE_NPU_SET_WEIGHT_BASE",
+    "CMD1_OPCODE_NPU_SET_WEIGHT_LENGTH", "CMD1_OPCODE_NPU_SET_SCALE_BASE",    "CMD1_OPCODE_NPU_SET_SCALE_LENGTH",
+    "CMD1_OPCODE_NPU_SET_OFM_SCALE",     "CMD1_OPCODE_NPU_SET_OPA_SCALE",     "CMD1_OPCODE_NPU_SET_OPB_SCALE",
+    "CMD1_OPCODE_NPU_SET_DMA0_SRC",      "CMD1_OPCODE_NPU_SET_DMA0_DST",      "CMD1_OPCODE_NPU_SET_DMA0_LEN",
+    "CMD1_OPCODE_NPU_SET_IFM2_BASE0",    "CMD1_OPCODE_NPU_SET_IFM2_BASE1",    "CMD1_OPCODE_NPU_SET_IFM2_BASE2",
+    "CMD1_OPCODE_NPU_SET_IFM2_BASE3",    "CMD1_OPCODE_NPU_SET_IFM2_STRIDE_X", "CMD1_OPCODE_NPU_SET_IFM2_STRIDE_Y",
+    "CMD1_OPCODE_NPU_SET_IFM2_STRIDE_C", "CMD1_OPCODE_NPU_SET_USER_DEFINED0", "CMD1_OPCODE_NPU_SET_USER_DEFINED1",
+    "CMD1_OPCODE_NPU_SET_USER_DEFINED2", "CMD1_OPCODE_NPU_SET_USER_DEFINED3", "CMD1_OPCODE_NPU_SET_USER_DEFINED4",
+    "CMD1_OPCODE_NPU_SET_USER_DEFINED5", "CMD1_OPCODE_NPU_SET_USER_DEFINED6", "CMD1_OPCODE_NPU_SET_USER_DEFINED7",
+};
+
+static const char *cmd_ctrl_str[] = {
+    "CMD_CTRL_CMD0_CTRL",
+    "CMD_CTRL_CMD1_CTRL",
+};
+
+static const char *custom_dma_cs_str[] = {
+    "CUSTOM_DMA_CS_DISABLE",
+    "CUSTOM_DMA_CS_ENABLE",
+};
+
+static const char *custom_dma_str[] = {
+    "CUSTOM_DMA_NOT_IMPLEMENTED",
+    "CUSTOM_DMA_IMPLEMENTED",
+};
+
+static const char *dma_fault_src_str[] = {
+    "DMA_FAULT_SRC_AXI_M0",
+    "DMA_FAULT_SRC_AXI_M1",
+};
+
+static const char *dma_region_mode_str[] = {
+    "DMA_REGION_MODE_EXTERNAL",
+    "DMA_REGION_MODE_INTERNAL",
+};
+
+static const char *dma_stride_mode_str[] = {
+    "DMA_STRIDE_MODE_D1",
+};
+
+static const char *elementwise_mode_str[] = {
+    "ELEMENTWISE_MODE_MUL",
+    "ELEMENTWISE_MODE_ADD",
+    "ELEMENTWISE_MODE_SUB",
+    "ELEMENTWISE_MODE_MIN",
+    "ELEMENTWISE_MODE_MAX",
+    "ELEMENTWISE_MODE_LRELU",
+    "ELEMENTWISE_MODE_ABS",
+    "ELEMENTWISE_MODE_CLZ",
+    "ELEMENTWISE_MODE_SHR",
+    "ELEMENTWISE_MODE_SHL",
+};
+
+static const char *functional_safety_str[] = {
+    "FUNCTIONAL_SAFETY_NOT_IMPLEMENTED",
+    "FUNCTIONAL_SAFETY_IMPLEMENTED",
+};
+
+static const char *ifm2_operand_order_str[] = {
+    "IFM2_OPERAND_ORDER_ORDER_B",
+    "IFM2_OPERAND_ORDER_ORDER_A",
+};
+
+static const char *ifm_scale_mode_str[] = {
+    "IFM_SCALE_MODE_OPA_OPB_16",
+    "IFM_SCALE_MODE_OPA_32",
+    "IFM_SCALE_MODE_OPB_32",
+};
+
+static const char *ifm_upscale_mode_str[] = {
+    "IFM_UPSCALE_MODE_NONE",
+    "IFM_UPSCALE_MODE_NEAREST",
+    "IFM_UPSCALE_MODE_ZEROS",
+};
+
+static const char *kernel_decomposition_str[] = {
+    "KERNEL_DECOMPOSITION_D8X8",
+    "KERNEL_DECOMPOSITION_D4X4",
+};
+
+static const char *kernel_dilation_str[] = {
+    "KERNEL_DILATION_NONE",
+    "KERNEL_DILATION_X2",
+};
+
+static const char *max_beats_str[] = {
+    "MAX_BEATS_B64",
+    "MAX_BEATS_B128",
+    "MAX_BEATS_B256",
+};
+
+static const char *mem_attr_str[] = {
+    "MEM_ATTR_AXI0_OUTSTANDING_COUNTER0",
+    "MEM_ATTR_AXI0_OUTSTANDING_COUNTER1",
+    "MEM_ATTR_AXI1_OUTSTANDING_COUNTER2",
+    "MEM_ATTR_AXI1_OUTSTANDING_COUNTER3",
+};
+
+static const char *ofm_scale_mode_str[] = {
+    "OFM_SCALE_MODE_PER_CHANNEL",
+    "OFM_SCALE_MODE_GLOBAL",
+};
+
+static const char *pmu_axi_channel_str[] = {
+    "PMU_AXI_CHANNEL_RD_CMD",
+    "PMU_AXI_CHANNEL_RD_IFM",
+    "PMU_AXI_CHANNEL_RD_WEIGHTS",
+    "PMU_AXI_CHANNEL_RD_SCALE_BIAS",
+    "PMU_AXI_CHANNEL_RD_MEM2MEM",
+    "PMU_AXI_CHANNEL_WR_OFM",
+    "PMU_AXI_CHANNEL_WR_MEM2MEM",
+};
+
+static const char *pmu_event_str[] = {
+    "PMU_EVENT_NO_EVENT",
+    "PMU_EVENT_CYCLE",
+    "PMU_EVENT_NPU_IDLE",
+    "PMU_EVENT_CC_STALLED_ON_BLOCKDEP",
+    "PMU_EVENT_CC_STALLED_ON_SHRAM_RECONFIG",
+    "PMU_EVENT_NPU_ACTIVE",
+    "PMU_EVENT_MAC_ACTIVE",
+    "PMU_EVENT_MAC_ACTIVE_8BIT",
+    "PMU_EVENT_MAC_ACTIVE_16BIT",
+    "PMU_EVENT_MAC_DPU_ACTIVE",
+    "PMU_EVENT_MAC_STALLED_BY_WD_ACC",
+    "PMU_EVENT_MAC_STALLED_BY_WD",
+    "PMU_EVENT_MAC_STALLED_BY_ACC",
+    "PMU_EVENT_MAC_STALLED_BY_IB",
+    "PMU_EVENT_MAC_ACTIVE_32BIT",
+    "PMU_EVENT_MAC_STALLED_BY_INT_W",
+    "PMU_EVENT_MAC_STALLED_BY_INT_ACC",
+    "PMU_EVENT_AO_ACTIVE",
+    "PMU_EVENT_AO_ACTIVE_8BIT",
+    "PMU_EVENT_AO_ACTIVE_16BIT",
+    "PMU_EVENT_AO_STALLED_BY_OFMP_OB",
+    "PMU_EVENT_AO_STALLED_BY_OFMP",
+    "PMU_EVENT_AO_STALLED_BY_OB",
+    "PMU_EVENT_AO_STALLED_BY_ACC_IB",
+    "PMU_EVENT_AO_STALLED_BY_ACC",
+    "PMU_EVENT_AO_STALLED_BY_IB",
+    "PMU_EVENT_WD_ACTIVE",
+    "PMU_EVENT_WD_STALLED",
+    "PMU_EVENT_WD_STALLED_BY_WS",
+    "PMU_EVENT_WD_STALLED_BY_WD_BUF",
+    "PMU_EVENT_WD_PARSE_ACTIVE",
+    "PMU_EVENT_WD_PARSE_STALLED",
+    "PMU_EVENT_WD_PARSE_STALLED_IN",
+    "PMU_EVENT_WD_PARSE_STALLED_OUT",
+    "PMU_EVENT_WD_TRANS_WS",
+    "PMU_EVENT_WD_TRANS_WB",
+    "PMU_EVENT_WD_TRANS_DW0",
+    "PMU_EVENT_WD_TRANS_DW1",
+    "PMU_EVENT_AXI0_RD_TRANS_ACCEPTED",
+    "PMU_EVENT_AXI0_RD_TRANS_COMPLETED",
+    "PMU_EVENT_AXI0_RD_DATA_BEAT_RECEIVED",
+    "PMU_EVENT_AXI0_RD_TRAN_REQ_STALLED",
+    "PMU_EVENT_AXI0_WR_TRANS_ACCEPTED",
+    "PMU_EVENT_AXI0_WR_TRANS_COMPLETED_M",
+    "PMU_EVENT_AXI0_WR_TRANS_COMPLETED_S",
+    "PMU_EVENT_AXI0_WR_DATA_BEAT_WRITTEN",
+    "PMU_EVENT_AXI0_WR_TRAN_REQ_STALLED",
+    "PMU_EVENT_AXI0_WR_DATA_BEAT_STALLED",
+    "PMU_EVENT_AXI0_ENABLED_CYCLES",
+    "PMU_EVENT_AXI0_RD_STALL_LIMIT",
+    "PMU_EVENT_AXI0_WR_STALL_LIMIT",
+    "PMU_EVENT_AXI_LATENCY_ANY",
+    "PMU_EVENT_AXI_LATENCY_32",
+    "PMU_EVENT_AXI_LATENCY_64",
+    "PMU_EVENT_AXI_LATENCY_128",
+    "PMU_EVENT_AXI_LATENCY_256",
+    "PMU_EVENT_AXI_LATENCY_512",
+    "PMU_EVENT_AXI_LATENCY_1024",
+    "PMU_EVENT_ECC_DMA",
+    "PMU_EVENT_ECC_SB0",
+    "PMU_EVENT_AXI1_RD_TRANS_ACCEPTED",
+    "PMU_EVENT_AXI1_RD_TRANS_COMPLETED",
+    "PMU_EVENT_AXI1_RD_DATA_BEAT_RECEIVED",
+    "PMU_EVENT_AXI1_RD_TRAN_REQ_STALLED",
+    "PMU_EVENT_AXI1_WR_TRANS_ACCEPTED",
+    "PMU_EVENT_AXI1_WR_TRANS_COMPLETED_M",
+    "PMU_EVENT_AXI1_WR_TRANS_COMPLETED_S",
+    "PMU_EVENT_AXI1_WR_DATA_BEAT_WRITTEN",
+    "PMU_EVENT_AXI1_WR_TRAN_REQ_STALLED",
+    "PMU_EVENT_AXI1_WR_DATA_BEAT_STALLED",
+    "PMU_EVENT_AXI1_ENABLED_CYCLES",
+    "PMU_EVENT_AXI1_RD_STALL_LIMIT",
+    "PMU_EVENT_AXI1_WR_STALL_LIMIT",
+    "PMU_EVENT_ECC_SB1",
+};
+
+static const char *pooling_mode_str[] = {
+    "POOLING_MODE_MAX",
+    "POOLING_MODE_AVERAGE",
+    "POOLING_MODE_REDUCE_SUM",
+};
+
+static const char *privilege_level_str[] = {
+    "PRIVILEGE_LEVEL_USER",
+    "PRIVILEGE_LEVEL_PRIVILEGED",
+};
+
+static const char *round_mode_str[] = {
+    "ROUND_MODE_DBL",
+    "ROUND_MODE_TRUNCATE",
+    "ROUND_MODE_NATURAL",
+};
+
+static const char *security_level_str[] = {
+    "SECURITY_LEVEL_SECURE",
+    "SECURITY_LEVEL_NON_SECURE",
+};
+
+static const char *state_str[] = {
+    "STATE_STOPPED",
+    "STATE_RUNNING",
+};
+
+static const char *wd_core_slice_state_str[] = {
+    "WD_CORE_SLICE_STATE_HEADER",
+    "WD_CORE_SLICE_STATE_PALETTE",
+    "WD_CORE_SLICE_STATE_WEIGHTS",
+};
+
+static const char *wd_ctrl_state_str[] = {
+    "WD_CTRL_STATE_IDLE",
+    "WD_CTRL_STATE_DRAIN",
+    "WD_CTRL_STATE_OFD_INIT",
+    "WD_CTRL_STATE_OFD_RUN",
+};
+
+static const char *weight_order_str[] = {
+    "WEIGHT_ORDER_DEPTH_FIRST",
+    "WEIGHT_ORDER_PART_KERNEL_FIRST",
+};
+
+#endif
+
+// Register type structs
 // id_r - ID register
 struct id_r
 {
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
+#ifndef __cplusplus
     union
     {
         struct
@@ -1276,7 +1615,7 @@
             uint32_t version_status : 4; // This is the version of the product
             uint32_t version_minor : 4;  // This is the n for the P part of an RnPn release number
             uint32_t version_major : 4;  // This is the n for the R part of an RnPn release number
-            uint32_t product_major : 4;  // This is the X part of the ML00X product number
+            uint32_t product_major : 4;  // Product major ID number (unique per base product)
             uint32_t arch_patch_rev : 4; // This is the patch number of the architecture version a.b
             uint32_t
                 arch_minor_rev : 8; // This is the minor architecture version number, b in the architecture version a.b
@@ -1285,31 +1624,28 @@
         };
         uint32_t word;
     };
-#ifdef __cplusplus
+#else
+  private:
+    uint32_t word0;
+
   public:
-    CONSTEXPR id_r() :
-        version_status(static_cast<uint32_t>(1)), version_minor(static_cast<uint32_t>(0x0)),
-        version_major(static_cast<uint32_t>(0x1)), product_major(static_cast<uint32_t>(4)),
-        arch_patch_rev(static_cast<uint32_t>(6)), arch_minor_rev(static_cast<uint32_t>(0)),
-        arch_major_rev(static_cast<uint32_t>(1))
-    {
-    }
-    CONSTEXPR id_r(uint32_t init) : word(init) {}
+    CONSTEXPR id_r() : word0(269500929) {}
+    CONSTEXPR id_r(uint32_t init) : word0(init) {}
     CONSTEXPR void operator=(uint32_t value)
     {
-        word = value;
+        word0 = value;
     }
     void operator=(uint32_t value) volatile
     {
-        word = value;
+        word0 = value;
     }
     CONSTEXPR operator uint32_t()
     {
-        return word;
+        return word0;
     }
     operator uint32_t() volatile
     {
-        return word;
+        return word0;
     }
     id_r copy() volatile
     {
@@ -1317,118 +1653,116 @@
     }
     CONSTEXPR uint32_t get_version_status() const
     {
-        uint32_t value = static_cast<uint32_t>(version_status);
+        uint32_t value = static_cast<uint32_t>(((1U << 4) - 1) & (word0 >> 0));
         return value;
     }
     uint32_t get_version_status() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(version_status);
+        uint32_t value = static_cast<uint32_t>(((1U << 4) - 1) & (word0 >> 0));
         return value;
     }
     CONSTEXPR id_r &set_version_status(uint32_t value)
     {
-        version_status = ((1u << 4) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 4) - 1)) << 0) & word0) | ((((1U << 4) - 1) & static_cast<uint32_t>(value)) << 0);
         return *this;
     }
     CONSTEXPR uint32_t get_version_minor() const
     {
-        uint32_t value = static_cast<uint32_t>(version_minor);
+        uint32_t value = static_cast<uint32_t>(((1U << 4) - 1) & (word0 >> 4));
         return value;
     }
     uint32_t get_version_minor() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(version_minor);
+        uint32_t value = static_cast<uint32_t>(((1U << 4) - 1) & (word0 >> 4));
         return value;
     }
     CONSTEXPR id_r &set_version_minor(uint32_t value)
     {
-        version_minor = ((1u << 4) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 4) - 1)) << 4) & word0) | ((((1U << 4) - 1) & static_cast<uint32_t>(value)) << 4);
         return *this;
     }
     CONSTEXPR uint32_t get_version_major() const
     {
-        uint32_t value = static_cast<uint32_t>(version_major);
+        uint32_t value = static_cast<uint32_t>(((1U << 4) - 1) & (word0 >> 8));
         return value;
     }
     uint32_t get_version_major() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(version_major);
+        uint32_t value = static_cast<uint32_t>(((1U << 4) - 1) & (word0 >> 8));
         return value;
     }
     CONSTEXPR id_r &set_version_major(uint32_t value)
     {
-        version_major = ((1u << 4) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 4) - 1)) << 8) & word0) | ((((1U << 4) - 1) & static_cast<uint32_t>(value)) << 8);
         return *this;
     }
     CONSTEXPR uint32_t get_product_major() const
     {
-        uint32_t value = static_cast<uint32_t>(product_major);
+        uint32_t value = static_cast<uint32_t>(((1U << 4) - 1) & (word0 >> 12));
         return value;
     }
     uint32_t get_product_major() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(product_major);
+        uint32_t value = static_cast<uint32_t>(((1U << 4) - 1) & (word0 >> 12));
         return value;
     }
     CONSTEXPR id_r &set_product_major(uint32_t value)
     {
-        product_major = ((1u << 4) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 4) - 1)) << 12) & word0) | ((((1U << 4) - 1) & static_cast<uint32_t>(value)) << 12);
         return *this;
     }
     CONSTEXPR uint32_t get_arch_patch_rev() const
     {
-        uint32_t value = static_cast<uint32_t>(arch_patch_rev);
+        uint32_t value = static_cast<uint32_t>(((1U << 4) - 1) & (word0 >> 16));
         return value;
     }
     uint32_t get_arch_patch_rev() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(arch_patch_rev);
+        uint32_t value = static_cast<uint32_t>(((1U << 4) - 1) & (word0 >> 16));
         return value;
     }
     CONSTEXPR id_r &set_arch_patch_rev(uint32_t value)
     {
-        arch_patch_rev = ((1u << 4) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 4) - 1)) << 16) & word0) | ((((1U << 4) - 1) & static_cast<uint32_t>(value)) << 16);
         return *this;
     }
     CONSTEXPR uint32_t get_arch_minor_rev() const
     {
-        uint32_t value = static_cast<uint32_t>(arch_minor_rev);
+        uint32_t value = static_cast<uint32_t>(((1U << 8) - 1) & (word0 >> 20));
         return value;
     }
     uint32_t get_arch_minor_rev() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(arch_minor_rev);
+        uint32_t value = static_cast<uint32_t>(((1U << 8) - 1) & (word0 >> 20));
         return value;
     }
     CONSTEXPR id_r &set_arch_minor_rev(uint32_t value)
     {
-        arch_minor_rev = ((1u << 8) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 8) - 1)) << 20) & word0) | ((((1U << 8) - 1) & static_cast<uint32_t>(value)) << 20);
         return *this;
     }
     CONSTEXPR uint32_t get_arch_major_rev() const
     {
-        uint32_t value = static_cast<uint32_t>(arch_major_rev);
+        uint32_t value = static_cast<uint32_t>(((1U << 4) - 1) & (word0 >> 28));
         return value;
     }
     uint32_t get_arch_major_rev() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(arch_major_rev);
+        uint32_t value = static_cast<uint32_t>(((1U << 4) - 1) & (word0 >> 28));
         return value;
     }
     CONSTEXPR id_r &set_arch_major_rev(uint32_t value)
     {
-        arch_major_rev = ((1u << 4) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 4) - 1)) << 28) & word0) | ((((1U << 4) - 1) & static_cast<uint32_t>(value)) << 28);
         return *this;
     }
-#endif //__cplusplus
+#endif
 };
 
 // status_r - Register describes the current operating status of the NPU
 struct status_r
 {
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
+#ifndef __cplusplus
     union
     {
         struct
@@ -1452,235 +1786,227 @@
             uint32_t ecc_fault : 1; // ECC state for internal RAMs: 0=no fault 1=ECC fault signalled. Can only be
                                     // cleared by reset
             uint32_t reserved0 : 2;
-            uint32_t faulting_interface : 1; // Faulting interface on bus abort. 0=AXI-M0 1=AXI-M1
+            uint32_t faulting_interface : 1; // Faulting interface on bus abort
             uint32_t faulting_channel : 4;  // Faulting channel on a bus abort. Read: 0=Cmd 1=IFM 2=Weights 3=Scale+Bias
                                             // 4=Mem2Mem; Write: 8=OFM 9=Mem2Mem
             uint32_t irq_history_mask : 16; // IRQ History mask
         };
         uint32_t word;
     };
-#ifdef __cplusplus
+#else
+  private:
+    uint32_t word0;
+
   public:
-    CONSTEXPR status_r() :
-        state(static_cast<uint32_t>(::state::STOPPED)), irq_raised(static_cast<uint32_t>(0x0)),
-        bus_status(static_cast<uint32_t>(0x0)), reset_status(static_cast<uint32_t>(0x1)),
-        cmd_parse_error(static_cast<uint32_t>(0x0)), cmd_end_reached(static_cast<uint32_t>(0x0)),
-        pmu_irq_raised(static_cast<uint32_t>(0x0)), wd_fault(static_cast<uint32_t>(0x0)),
-        ecc_fault(static_cast<uint32_t>(0x0)), reserved0(static_cast<uint32_t>(0)),
-        faulting_interface(static_cast<uint32_t>(0x0)), faulting_channel(static_cast<uint32_t>(0x0)),
-        irq_history_mask(static_cast<uint32_t>(0x0))
-    {
-    }
-    CONSTEXPR status_r(uint32_t init) : word(init) {}
+    CONSTEXPR status_r() : word0(8) {}
+    CONSTEXPR status_r(uint32_t init) : word0(init) {}
     CONSTEXPR void operator=(uint32_t value)
     {
-        word = value;
+        word0 = value;
     }
     void operator=(uint32_t value) volatile
     {
-        word = value;
+        word0 = value;
     }
     CONSTEXPR operator uint32_t()
     {
-        return word;
+        return word0;
     }
     operator uint32_t() volatile
     {
-        return word;
+        return word0;
     }
     status_r copy() volatile
     {
         return *this;
     }
-    CONSTEXPR ::state get_state() const
+    CONSTEXPR NPU_NAMESPACE::state get_state() const
     {
-        ::state value = static_cast<::state>(state);
+        NPU_NAMESPACE::state value = static_cast<NPU_NAMESPACE::state>(((1U << 1) - 1) & (word0 >> 0));
         return value;
     }
-    ::state get_state() const volatile
+    NPU_NAMESPACE::state get_state() const volatile
     {
-        ::state value = static_cast<::state>(state);
+        NPU_NAMESPACE::state value = static_cast<NPU_NAMESPACE::state>(((1U << 1) - 1) & (word0 >> 0));
         return value;
     }
-    CONSTEXPR status_r &set_state(::state value)
+    CONSTEXPR status_r &set_state(NPU_NAMESPACE::state value)
     {
-        state = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 0) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 0);
         return *this;
     }
     CONSTEXPR uint32_t get_irq_raised() const
     {
-        uint32_t value = static_cast<uint32_t>(irq_raised);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 1));
         return value;
     }
     uint32_t get_irq_raised() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(irq_raised);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 1));
         return value;
     }
     CONSTEXPR status_r &set_irq_raised(uint32_t value)
     {
-        irq_raised = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 1) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 1);
         return *this;
     }
     CONSTEXPR uint32_t get_bus_status() const
     {
-        uint32_t value = static_cast<uint32_t>(bus_status);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
         return value;
     }
     uint32_t get_bus_status() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(bus_status);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
         return value;
     }
     CONSTEXPR status_r &set_bus_status(uint32_t value)
     {
-        bus_status = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 2) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 2);
         return *this;
     }
     CONSTEXPR uint32_t get_reset_status() const
     {
-        uint32_t value = static_cast<uint32_t>(reset_status);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 3));
         return value;
     }
     uint32_t get_reset_status() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(reset_status);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 3));
         return value;
     }
     CONSTEXPR status_r &set_reset_status(uint32_t value)
     {
-        reset_status = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 3) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 3);
         return *this;
     }
     CONSTEXPR uint32_t get_cmd_parse_error() const
     {
-        uint32_t value = static_cast<uint32_t>(cmd_parse_error);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 4));
         return value;
     }
     uint32_t get_cmd_parse_error() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(cmd_parse_error);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 4));
         return value;
     }
     CONSTEXPR status_r &set_cmd_parse_error(uint32_t value)
     {
-        cmd_parse_error = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 4) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 4);
         return *this;
     }
     CONSTEXPR uint32_t get_cmd_end_reached() const
     {
-        uint32_t value = static_cast<uint32_t>(cmd_end_reached);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 5));
         return value;
     }
     uint32_t get_cmd_end_reached() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(cmd_end_reached);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 5));
         return value;
     }
     CONSTEXPR status_r &set_cmd_end_reached(uint32_t value)
     {
-        cmd_end_reached = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 5) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 5);
         return *this;
     }
     CONSTEXPR uint32_t get_pmu_irq_raised() const
     {
-        uint32_t value = static_cast<uint32_t>(pmu_irq_raised);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 6));
         return value;
     }
     uint32_t get_pmu_irq_raised() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(pmu_irq_raised);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 6));
         return value;
     }
     CONSTEXPR status_r &set_pmu_irq_raised(uint32_t value)
     {
-        pmu_irq_raised = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 6) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 6);
         return *this;
     }
     CONSTEXPR uint32_t get_wd_fault() const
     {
-        uint32_t value = static_cast<uint32_t>(wd_fault);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 7));
         return value;
     }
     uint32_t get_wd_fault() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(wd_fault);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 7));
         return value;
     }
     CONSTEXPR status_r &set_wd_fault(uint32_t value)
     {
-        wd_fault = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 7) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 7);
         return *this;
     }
     CONSTEXPR uint32_t get_ecc_fault() const
     {
-        uint32_t value = static_cast<uint32_t>(ecc_fault);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 8));
         return value;
     }
     uint32_t get_ecc_fault() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(ecc_fault);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 8));
         return value;
     }
     CONSTEXPR status_r &set_ecc_fault(uint32_t value)
     {
-        ecc_fault = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 8) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 8);
         return *this;
     }
-    CONSTEXPR uint32_t get_faulting_interface() const
+    CONSTEXPR NPU_NAMESPACE::dma_fault_src get_faulting_interface() const
     {
-        uint32_t value = static_cast<uint32_t>(faulting_interface);
+        NPU_NAMESPACE::dma_fault_src value = static_cast<NPU_NAMESPACE::dma_fault_src>(((1U << 1) - 1) & (word0 >> 11));
         return value;
     }
-    uint32_t get_faulting_interface() const volatile
+    NPU_NAMESPACE::dma_fault_src get_faulting_interface() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(faulting_interface);
+        NPU_NAMESPACE::dma_fault_src value = static_cast<NPU_NAMESPACE::dma_fault_src>(((1U << 1) - 1) & (word0 >> 11));
         return value;
     }
-    CONSTEXPR status_r &set_faulting_interface(uint32_t value)
+    CONSTEXPR status_r &set_faulting_interface(NPU_NAMESPACE::dma_fault_src value)
     {
-        faulting_interface = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 11) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 11);
         return *this;
     }
     CONSTEXPR uint32_t get_faulting_channel() const
     {
-        uint32_t value = static_cast<uint32_t>(faulting_channel);
+        uint32_t value = static_cast<uint32_t>(((1U << 4) - 1) & (word0 >> 12));
         return value;
     }
     uint32_t get_faulting_channel() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(faulting_channel);
+        uint32_t value = static_cast<uint32_t>(((1U << 4) - 1) & (word0 >> 12));
         return value;
     }
     CONSTEXPR status_r &set_faulting_channel(uint32_t value)
     {
-        faulting_channel = ((1u << 4) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 4) - 1)) << 12) & word0) | ((((1U << 4) - 1) & static_cast<uint32_t>(value)) << 12);
         return *this;
     }
     CONSTEXPR uint32_t get_irq_history_mask() const
     {
-        uint32_t value = static_cast<uint32_t>(irq_history_mask);
+        uint32_t value = static_cast<uint32_t>(((1U << 16) - 1) & (word0 >> 16));
         return value;
     }
     uint32_t get_irq_history_mask() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(irq_history_mask);
+        uint32_t value = static_cast<uint32_t>(((1U << 16) - 1) & (word0 >> 16));
         return value;
     }
     CONSTEXPR status_r &set_irq_history_mask(uint32_t value)
     {
-        irq_history_mask = ((1u << 16) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 16) - 1)) << 16) & word0) | ((((1U << 16) - 1) & static_cast<uint32_t>(value)) << 16);
         return *this;
     }
-#endif //__cplusplus
+#endif
 };
 
 // cmd_r - Command register, reads as last written command
 struct cmd_r
 {
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
+#ifndef __cplusplus
     union
     {
         struct
@@ -1689,7 +2015,7 @@
                                                       // no effect
             uint32_t clear_irq : 1; // Write 1 to clear the IRQ status in the STATUS register. Writing 0 has no effect
             uint32_t clock_q_enable : 1; // Write 1 to this bit to enable clock off using clock q-interface and enable
-                                         // the master clock gate
+                                         // the requester clock gate
             uint32_t power_q_enable : 1; // Write 1 to this bit to enable power off using power q-interface
             uint32_t
                 stop_request : 1; // Write 1 to this bit to request STOP after completing any already-started commands
@@ -1698,31 +2024,28 @@
         };
         uint32_t word;
     };
-#ifdef __cplusplus
+#else
+  private:
+    uint32_t word0;
+
   public:
-    CONSTEXPR cmd_r() :
-        transition_to_running_state(static_cast<uint32_t>(0x0)), clear_irq(static_cast<uint32_t>(0x0)),
-        clock_q_enable(static_cast<uint32_t>(0x1)), power_q_enable(static_cast<uint32_t>(0x1)),
-        stop_request(static_cast<uint32_t>(0x0)), reserved0(static_cast<uint32_t>(0)),
-        clear_irq_history(static_cast<uint32_t>(0x0))
-    {
-    }
-    CONSTEXPR cmd_r(uint32_t init) : word(init) {}
+    CONSTEXPR cmd_r() : word0(12) {}
+    CONSTEXPR cmd_r(uint32_t init) : word0(init) {}
     CONSTEXPR void operator=(uint32_t value)
     {
-        word = value;
+        word0 = value;
     }
     void operator=(uint32_t value) volatile
     {
-        word = value;
+        word0 = value;
     }
     CONSTEXPR operator uint32_t()
     {
-        return word;
+        return word0;
     }
     operator uint32_t() volatile
     {
-        return word;
+        return word0;
     }
     cmd_r copy() volatile
     {
@@ -1730,103 +2053,101 @@
     }
     CONSTEXPR uint32_t get_transition_to_running_state() const
     {
-        uint32_t value = static_cast<uint32_t>(transition_to_running_state);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 0));
         return value;
     }
     uint32_t get_transition_to_running_state() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(transition_to_running_state);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 0));
         return value;
     }
     CONSTEXPR cmd_r &set_transition_to_running_state(uint32_t value)
     {
-        transition_to_running_state = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 0) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 0);
         return *this;
     }
     CONSTEXPR uint32_t get_clear_irq() const
     {
-        uint32_t value = static_cast<uint32_t>(clear_irq);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 1));
         return value;
     }
     uint32_t get_clear_irq() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(clear_irq);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 1));
         return value;
     }
     CONSTEXPR cmd_r &set_clear_irq(uint32_t value)
     {
-        clear_irq = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 1) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 1);
         return *this;
     }
     CONSTEXPR uint32_t get_clock_q_enable() const
     {
-        uint32_t value = static_cast<uint32_t>(clock_q_enable);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
         return value;
     }
     uint32_t get_clock_q_enable() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(clock_q_enable);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
         return value;
     }
     CONSTEXPR cmd_r &set_clock_q_enable(uint32_t value)
     {
-        clock_q_enable = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 2) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 2);
         return *this;
     }
     CONSTEXPR uint32_t get_power_q_enable() const
     {
-        uint32_t value = static_cast<uint32_t>(power_q_enable);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 3));
         return value;
     }
     uint32_t get_power_q_enable() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(power_q_enable);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 3));
         return value;
     }
     CONSTEXPR cmd_r &set_power_q_enable(uint32_t value)
     {
-        power_q_enable = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 3) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 3);
         return *this;
     }
     CONSTEXPR uint32_t get_stop_request() const
     {
-        uint32_t value = static_cast<uint32_t>(stop_request);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 4));
         return value;
     }
     uint32_t get_stop_request() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(stop_request);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 4));
         return value;
     }
     CONSTEXPR cmd_r &set_stop_request(uint32_t value)
     {
-        stop_request = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 4) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 4);
         return *this;
     }
     CONSTEXPR uint32_t get_clear_irq_history() const
     {
-        uint32_t value = static_cast<uint32_t>(clear_irq_history);
+        uint32_t value = static_cast<uint32_t>(((1U << 16) - 1) & (word0 >> 16));
         return value;
     }
     uint32_t get_clear_irq_history() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(clear_irq_history);
+        uint32_t value = static_cast<uint32_t>(((1U << 16) - 1) & (word0 >> 16));
         return value;
     }
     CONSTEXPR cmd_r &set_clear_irq_history(uint32_t value)
     {
-        clear_irq_history = ((1u << 16) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 16) - 1)) << 16) & word0) | ((((1U << 16) - 1) & static_cast<uint32_t>(value)) << 16);
         return *this;
     }
-#endif //__cplusplus
+#endif
 };
 
 // reset_r - Request Reset and new security mode
 struct reset_r
 {
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
+#ifndef __cplusplus
     union
     {
         struct
@@ -1837,203 +2158,154 @@
         };
         uint32_t word;
     };
-#ifdef __cplusplus
+#else
+  private:
+    uint32_t word0;
+
   public:
-    CONSTEXPR reset_r() :
-        pending_CPL(static_cast<uint32_t>(::privilege_level::USER)),
-        pending_CSL(static_cast<uint32_t>(::security_level::SECURE)), reserved0(static_cast<uint32_t>(0))
-    {
-    }
-    CONSTEXPR reset_r(uint32_t init) : word(init) {}
+    CONSTEXPR reset_r() : word0(0) {}
+    CONSTEXPR reset_r(uint32_t init) : word0(init) {}
     CONSTEXPR void operator=(uint32_t value)
     {
-        word = value;
+        word0 = value;
     }
     void operator=(uint32_t value) volatile
     {
-        word = value;
+        word0 = value;
     }
     CONSTEXPR operator uint32_t()
     {
-        return word;
+        return word0;
     }
     operator uint32_t() volatile
     {
-        return word;
+        return word0;
     }
     reset_r copy() volatile
     {
         return *this;
     }
-    CONSTEXPR ::privilege_level get_pending_CPL() const
+    CONSTEXPR NPU_NAMESPACE::privilege_level get_pending_CPL() const
     {
-        ::privilege_level value = static_cast<::privilege_level>(pending_CPL);
+        NPU_NAMESPACE::privilege_level value =
+            static_cast<NPU_NAMESPACE::privilege_level>(((1U << 1) - 1) & (word0 >> 0));
         return value;
     }
-    ::privilege_level get_pending_CPL() const volatile
+    NPU_NAMESPACE::privilege_level get_pending_CPL() const volatile
     {
-        ::privilege_level value = static_cast<::privilege_level>(pending_CPL);
+        NPU_NAMESPACE::privilege_level value =
+            static_cast<NPU_NAMESPACE::privilege_level>(((1U << 1) - 1) & (word0 >> 0));
         return value;
     }
-    CONSTEXPR reset_r &set_pending_CPL(::privilege_level value)
+    CONSTEXPR reset_r &set_pending_CPL(NPU_NAMESPACE::privilege_level value)
     {
-        pending_CPL = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 0) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 0);
         return *this;
     }
-    CONSTEXPR ::security_level get_pending_CSL() const
+    CONSTEXPR NPU_NAMESPACE::security_level get_pending_CSL() const
     {
-        ::security_level value = static_cast<::security_level>(pending_CSL);
+        NPU_NAMESPACE::security_level value =
+            static_cast<NPU_NAMESPACE::security_level>(((1U << 1) - 1) & (word0 >> 1));
         return value;
     }
-    ::security_level get_pending_CSL() const volatile
+    NPU_NAMESPACE::security_level get_pending_CSL() const volatile
     {
-        ::security_level value = static_cast<::security_level>(pending_CSL);
+        NPU_NAMESPACE::security_level value =
+            static_cast<NPU_NAMESPACE::security_level>(((1U << 1) - 1) & (word0 >> 1));
         return value;
     }
-    CONSTEXPR reset_r &set_pending_CSL(::security_level value)
+    CONSTEXPR reset_r &set_pending_CSL(NPU_NAMESPACE::security_level value)
     {
-        pending_CSL = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 1) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 1);
         return *this;
     }
-#endif //__cplusplus
+#endif
 };
 
-// qbase0_r - Base address of command queue bits [31:0]. The address is 4 byte aligned
-struct qbase0_r
+// qbase_r - Base address of command queue. The address is 4 byte aligned
+struct qbase_r
 {
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
+#ifndef __cplusplus
     union
     {
-        uint32_t QBASE0; // The 4 byte aligned lower bytes of the base address value for the command stream
-        uint32_t word;
+        struct
+        {
+            uint32_t offset : 32; // Offset
+            uint32_t reserved0 : 32;
+        };
+        uint32_t word[2];
     };
-#ifdef __cplusplus
-  public:
-    CONSTEXPR qbase0_r() : QBASE0(static_cast<uint32_t>(0x00000000)) {}
-    CONSTEXPR qbase0_r(uint32_t init) : word(init) {}
-    CONSTEXPR void operator=(uint32_t value)
-    {
-        word = value;
-    }
-    void operator=(uint32_t value) volatile
-    {
-        word = value;
-    }
-    CONSTEXPR operator uint32_t()
-    {
-        return word;
-    }
-    operator uint32_t() volatile
-    {
-        return word;
-    }
-    qbase0_r copy() volatile
-    {
-        return *this;
-    }
-    CONSTEXPR uint32_t get_QBASE0() const
-    {
-        uint32_t value = static_cast<uint32_t>(QBASE0);
-        return value;
-    }
-    uint32_t get_QBASE0() const volatile
-    {
-        uint32_t value = static_cast<uint32_t>(QBASE0);
-        return value;
-    }
-    CONSTEXPR qbase0_r &set_QBASE0(uint32_t value)
-    {
-        QBASE0 = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
 
-// qbase1_r - Address extension bits [47:32] bits for queue base
-struct qbase1_r
-{
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
-    union
-    {
-        uint32_t QBASE1; // The 4 byte aligned upper bytes of the base address value for the command stream
-        uint32_t word;
-    };
-#ifdef __cplusplus
   public:
-    CONSTEXPR qbase1_r() : QBASE1(static_cast<uint32_t>(0x00000000)) {}
-    CONSTEXPR qbase1_r(uint32_t init) : word(init) {}
-    CONSTEXPR void operator=(uint32_t value)
+    CONSTEXPR qbase_r() : word0(0), word1(0) {}
+    CONSTEXPR qbase_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
     {
-        word = value;
     }
-    void operator=(uint32_t value) volatile
+    CONSTEXPR void operator=(uint64_t value)
     {
-        word = value;
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
     }
-    CONSTEXPR operator uint32_t()
+    void operator=(uint64_t value) volatile
     {
-        return word;
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
     }
-    operator uint32_t() volatile
+    CONSTEXPR operator uint64_t()
     {
-        return word;
+        return (static_cast<uint64_t>(word1) << 32) | word0;
     }
-    qbase1_r copy() volatile
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    qbase_r copy() volatile
     {
         return *this;
     }
-    CONSTEXPR uint32_t get_QBASE1() const
-    {
-        uint32_t value = static_cast<uint32_t>(QBASE1);
-        return value;
-    }
-    uint32_t get_QBASE1() const volatile
-    {
-        uint32_t value = static_cast<uint32_t>(QBASE1);
-        return value;
-    }
-    CONSTEXPR qbase1_r &set_QBASE1(uint32_t value)
-    {
-        QBASE1 = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
+#endif
 };
 
 // qread_r - Read offset in the command stream in bytes. Multiple of 4 in the range 0 to 16 MB
 struct qread_r
 {
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
+#ifndef __cplusplus
     union
     {
-        uint32_t QREAD; // The read offset of the current command under execution
+        struct
+        {
+            uint32_t QREAD : 32; // The read offset of the current command under execution
+        };
         uint32_t word;
     };
-#ifdef __cplusplus
+#else
+  private:
+    uint32_t word0;
+
   public:
-    CONSTEXPR qread_r() : QREAD(static_cast<uint32_t>(0x00000000)) {}
-    CONSTEXPR qread_r(uint32_t init) : word(init) {}
+    CONSTEXPR qread_r() : word0(0) {}
+    CONSTEXPR qread_r(uint32_t init) : word0(init) {}
     CONSTEXPR void operator=(uint32_t value)
     {
-        word = value;
+        word0 = value;
     }
     void operator=(uint32_t value) volatile
     {
-        word = value;
+        word0 = value;
     }
     CONSTEXPR operator uint32_t()
     {
-        return word;
+        return word0;
     }
     operator uint32_t() volatile
     {
-        return word;
+        return word0;
     }
     qread_r copy() volatile
     {
@@ -2041,105 +2313,114 @@
     }
     CONSTEXPR uint32_t get_QREAD() const
     {
-        uint32_t value = static_cast<uint32_t>(QREAD);
+        uint32_t value = static_cast<uint32_t>(word0);
         return value;
     }
     uint32_t get_QREAD() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(QREAD);
+        uint32_t value = static_cast<uint32_t>(word0);
         return value;
     }
     CONSTEXPR qread_r &set_QREAD(uint32_t value)
     {
-        QREAD = static_cast<uint32_t>(value);
+        word0 = static_cast<uint32_t>(value);
         return *this;
     }
-#endif //__cplusplus
+#endif
 };
 
 // qconfig_r - AXI configuration for the command stream in the range 0-3. Same encoding as for REGIONCFG
 struct qconfig_r
 {
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
+#ifndef __cplusplus
     union
     {
-        uint32_t QCONFIG; // AXI configuration for the command stream in the range 0-3
+        struct
+        {
+            uint32_t cmd_region0 : 2; // Command region configuration
+            uint32_t reserved0 : 30;
+        };
         uint32_t word;
     };
-#ifdef __cplusplus
+#else
+  private:
+    uint32_t word0;
+
   public:
-    CONSTEXPR qconfig_r() : QCONFIG(static_cast<uint32_t>(0x00000000)) {}
-    CONSTEXPR qconfig_r(uint32_t init) : word(init) {}
+    CONSTEXPR qconfig_r() : word0(0) {}
+    CONSTEXPR qconfig_r(uint32_t init) : word0(init) {}
     CONSTEXPR void operator=(uint32_t value)
     {
-        word = value;
+        word0 = value;
     }
     void operator=(uint32_t value) volatile
     {
-        word = value;
+        word0 = value;
     }
     CONSTEXPR operator uint32_t()
     {
-        return word;
+        return word0;
     }
     operator uint32_t() volatile
     {
-        return word;
+        return word0;
     }
     qconfig_r copy() volatile
     {
         return *this;
     }
-    CONSTEXPR uint32_t get_QCONFIG() const
+    CONSTEXPR NPU_NAMESPACE::mem_attr get_cmd_region0() const
     {
-        uint32_t value = static_cast<uint32_t>(QCONFIG);
+        NPU_NAMESPACE::mem_attr value = static_cast<NPU_NAMESPACE::mem_attr>(((1U << 2) - 1) & (word0 >> 0));
         return value;
     }
-    uint32_t get_QCONFIG() const volatile
+    NPU_NAMESPACE::mem_attr get_cmd_region0() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(QCONFIG);
+        NPU_NAMESPACE::mem_attr value = static_cast<NPU_NAMESPACE::mem_attr>(((1U << 2) - 1) & (word0 >> 0));
         return value;
     }
-    CONSTEXPR qconfig_r &set_QCONFIG(uint32_t value)
+    CONSTEXPR qconfig_r &set_cmd_region0(NPU_NAMESPACE::mem_attr value)
     {
-        QCONFIG = static_cast<uint32_t>(value);
+        word0 = (((~((1U << 2) - 1)) << 0) & word0) | ((((1U << 2) - 1) & static_cast<uint32_t>(value)) << 0);
         return *this;
     }
-#endif //__cplusplus
+#endif
 };
 
 // qsize_r - Size of the command stream in bytes. Multiple of 4 in the range 0 to 16 MB
 struct qsize_r
 {
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
+#ifndef __cplusplus
     union
     {
-        uint32_t QSIZE; // Size of the next command stream to be executed by the NPU
+        struct
+        {
+            uint32_t QSIZE : 32; // Size of the next command stream to be executed by the NPU
+        };
         uint32_t word;
     };
-#ifdef __cplusplus
+#else
+  private:
+    uint32_t word0;
+
   public:
-    CONSTEXPR qsize_r() : QSIZE(static_cast<uint32_t>(0x00000000)) {}
-    CONSTEXPR qsize_r(uint32_t init) : word(init) {}
+    CONSTEXPR qsize_r() : word0(0) {}
+    CONSTEXPR qsize_r(uint32_t init) : word0(init) {}
     CONSTEXPR void operator=(uint32_t value)
     {
-        word = value;
+        word0 = value;
     }
     void operator=(uint32_t value) volatile
     {
-        word = value;
+        word0 = value;
     }
     CONSTEXPR operator uint32_t()
     {
-        return word;
+        return word0;
     }
     operator uint32_t() volatile
     {
-        return word;
+        return word0;
     }
     qsize_r copy() volatile
     {
@@ -2147,28 +2428,26 @@
     }
     CONSTEXPR uint32_t get_QSIZE() const
     {
-        uint32_t value = static_cast<uint32_t>(QSIZE);
+        uint32_t value = static_cast<uint32_t>(word0);
         return value;
     }
     uint32_t get_QSIZE() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(QSIZE);
+        uint32_t value = static_cast<uint32_t>(word0);
         return value;
     }
     CONSTEXPR qsize_r &set_QSIZE(uint32_t value)
     {
-        QSIZE = static_cast<uint32_t>(value);
+        word0 = static_cast<uint32_t>(value);
         return *this;
     }
-#endif //__cplusplus
+#endif
 };
 
-// prot_r - Protection level configured for the NPU when acting as an AXI master
+// prot_r - Protection level configured for the NPU when acting as an AXI requester
 struct prot_r
 {
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
+#ifndef __cplusplus
     union
     {
         struct
@@ -2179,208 +2458,244 @@
         };
         uint32_t word;
     };
-#ifdef __cplusplus
+#else
+  private:
+    uint32_t word0;
+
   public:
-    CONSTEXPR prot_r() :
-        active_CPL(static_cast<uint32_t>(::privilege_level::USER)),
-        active_CSL(static_cast<uint32_t>(::security_level::SECURE)), reserved0(static_cast<uint32_t>(0))
-    {
-    }
-    CONSTEXPR prot_r(uint32_t init) : word(init) {}
+    CONSTEXPR prot_r() : word0(0) {}
+    CONSTEXPR prot_r(uint32_t init) : word0(init) {}
     CONSTEXPR void operator=(uint32_t value)
     {
-        word = value;
+        word0 = value;
     }
     void operator=(uint32_t value) volatile
     {
-        word = value;
+        word0 = value;
     }
     CONSTEXPR operator uint32_t()
     {
-        return word;
+        return word0;
     }
     operator uint32_t() volatile
     {
-        return word;
+        return word0;
     }
     prot_r copy() volatile
     {
         return *this;
     }
-    CONSTEXPR ::privilege_level get_active_CPL() const
+    CONSTEXPR NPU_NAMESPACE::privilege_level get_active_CPL() const
     {
-        ::privilege_level value = static_cast<::privilege_level>(active_CPL);
+        NPU_NAMESPACE::privilege_level value =
+            static_cast<NPU_NAMESPACE::privilege_level>(((1U << 1) - 1) & (word0 >> 0));
         return value;
     }
-    ::privilege_level get_active_CPL() const volatile
+    NPU_NAMESPACE::privilege_level get_active_CPL() const volatile
     {
-        ::privilege_level value = static_cast<::privilege_level>(active_CPL);
+        NPU_NAMESPACE::privilege_level value =
+            static_cast<NPU_NAMESPACE::privilege_level>(((1U << 1) - 1) & (word0 >> 0));
         return value;
     }
-    CONSTEXPR prot_r &set_active_CPL(::privilege_level value)
+    CONSTEXPR prot_r &set_active_CPL(NPU_NAMESPACE::privilege_level value)
     {
-        active_CPL = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 0) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 0);
         return *this;
     }
-    CONSTEXPR ::security_level get_active_CSL() const
+    CONSTEXPR NPU_NAMESPACE::security_level get_active_CSL() const
     {
-        ::security_level value = static_cast<::security_level>(active_CSL);
+        NPU_NAMESPACE::security_level value =
+            static_cast<NPU_NAMESPACE::security_level>(((1U << 1) - 1) & (word0 >> 1));
         return value;
     }
-    ::security_level get_active_CSL() const volatile
+    NPU_NAMESPACE::security_level get_active_CSL() const volatile
     {
-        ::security_level value = static_cast<::security_level>(active_CSL);
+        NPU_NAMESPACE::security_level value =
+            static_cast<NPU_NAMESPACE::security_level>(((1U << 1) - 1) & (word0 >> 1));
         return value;
     }
-    CONSTEXPR prot_r &set_active_CSL(::security_level value)
+    CONSTEXPR prot_r &set_active_CSL(NPU_NAMESPACE::security_level value)
     {
-        active_CSL = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 1) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 1);
         return *this;
     }
-#endif //__cplusplus
+#endif
 };
 
 // config_r - RTL configuration
 struct config_r
 {
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
+#ifndef __cplusplus
     union
     {
         struct
         {
-            uint32_t macs_per_cc : 4;        // The log2(macs/clock cycle). Valid encoding range is 5 to 8 for 32 to 256
-                                             // MACs/clock cycle.
-            uint32_t cmd_stream_version : 4; // command stream version accepted by this NPU.
-            uint32_t shram_size : 8;         // Size in KB of SHRAM in the range 8 to 48.
-            uint32_t reserved0 : 11;
-            uint32_t custom_dma : 1; // Custom DMA enable bit.
-            uint32_t product : 4;    // Product configuration
+            uint32_t macs_per_cc : 4;        // The log2(macs/clock cycle)
+            uint32_t cmd_stream_version : 4; // command stream version accepted by this NPU
+            uint32_t shram_size : 8;         // Total size in KB of internal SHRAM
+            uint32_t reserved0 : 10;
+            uint32_t functional_safety : 1; // Functional safety configuration
+            uint32_t custom_dma : 1;        // Custom DMA configuration
+            uint32_t product : 4;           // Product configuration
         };
         uint32_t word;
     };
-#ifdef __cplusplus
+#else
+  private:
+    uint32_t word0;
+
   public:
-    CONSTEXPR config_r() :
-        macs_per_cc(static_cast<uint32_t>(0)), cmd_stream_version(static_cast<uint32_t>(0x0)),
-        shram_size(static_cast<uint32_t>(0)), reserved0(static_cast<uint32_t>(0)), product(static_cast<uint32_t>(0))
-    {
-    }
-    CONSTEXPR config_r(uint32_t init) : word(init) {}
+    CONSTEXPR config_r() : word0(0) {}
+    CONSTEXPR config_r(uint32_t init) : word0(init) {}
     CONSTEXPR void operator=(uint32_t value)
     {
-        word = value;
+        word0 = value;
     }
     void operator=(uint32_t value) volatile
     {
-        word = value;
+        word0 = value;
     }
     CONSTEXPR operator uint32_t()
     {
-        return word;
+        return word0;
     }
     operator uint32_t() volatile
     {
-        return word;
+        return word0;
     }
     config_r copy() volatile
     {
         return *this;
     }
-    CONSTEXPR ::macs_per_cc get_macs_per_cc() const
+    CONSTEXPR uint32_t get_macs_per_cc() const
     {
-        ::macs_per_cc value = static_cast<::macs_per_cc>(macs_per_cc);
+        uint32_t value = static_cast<uint32_t>(((1U << 4) - 1) & (word0 >> 0));
         return value;
     }
-    ::macs_per_cc get_macs_per_cc() const volatile
+    uint32_t get_macs_per_cc() const volatile
     {
-        ::macs_per_cc value = static_cast<::macs_per_cc>(macs_per_cc);
+        uint32_t value = static_cast<uint32_t>(((1U << 4) - 1) & (word0 >> 0));
         return value;
     }
-    CONSTEXPR config_r &set_macs_per_cc(::macs_per_cc value)
+    CONSTEXPR config_r &set_macs_per_cc(uint32_t value)
     {
-        macs_per_cc = ((1u << 4) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 4) - 1)) << 0) & word0) | ((((1U << 4) - 1) & static_cast<uint32_t>(value)) << 0);
         return *this;
     }
     CONSTEXPR uint32_t get_cmd_stream_version() const
     {
-        uint32_t value = static_cast<uint32_t>(cmd_stream_version);
+        uint32_t value = static_cast<uint32_t>(((1U << 4) - 1) & (word0 >> 4));
         return value;
     }
     uint32_t get_cmd_stream_version() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(cmd_stream_version);
+        uint32_t value = static_cast<uint32_t>(((1U << 4) - 1) & (word0 >> 4));
         return value;
     }
     CONSTEXPR config_r &set_cmd_stream_version(uint32_t value)
     {
-        cmd_stream_version = ((1u << 4) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 4) - 1)) << 4) & word0) | ((((1U << 4) - 1) & static_cast<uint32_t>(value)) << 4);
         return *this;
     }
-    CONSTEXPR ::shram_size get_shram_size() const
+    CONSTEXPR uint32_t get_shram_size() const
     {
-        ::shram_size value = static_cast<::shram_size>(shram_size);
+        uint32_t value = static_cast<uint32_t>(((1U << 8) - 1) & (word0 >> 8));
         return value;
     }
-    ::shram_size get_shram_size() const volatile
+    uint32_t get_shram_size() const volatile
     {
-        ::shram_size value = static_cast<::shram_size>(shram_size);
+        uint32_t value = static_cast<uint32_t>(((1U << 8) - 1) & (word0 >> 8));
         return value;
     }
-    CONSTEXPR config_r &set_shram_size(::shram_size value)
+    CONSTEXPR config_r &set_shram_size(uint32_t value)
     {
-        shram_size = ((1u << 8) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 8) - 1)) << 8) & word0) | ((((1U << 8) - 1) & static_cast<uint32_t>(value)) << 8);
+        return *this;
+    }
+    CONSTEXPR NPU_NAMESPACE::functional_safety get_functional_safety() const
+    {
+        NPU_NAMESPACE::functional_safety value =
+            static_cast<NPU_NAMESPACE::functional_safety>(((1U << 1) - 1) & (word0 >> 26));
+        return value;
+    }
+    NPU_NAMESPACE::functional_safety get_functional_safety() const volatile
+    {
+        NPU_NAMESPACE::functional_safety value =
+            static_cast<NPU_NAMESPACE::functional_safety>(((1U << 1) - 1) & (word0 >> 26));
+        return value;
+    }
+    CONSTEXPR config_r &set_functional_safety(NPU_NAMESPACE::functional_safety value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 26) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 26);
+        return *this;
+    }
+    CONSTEXPR NPU_NAMESPACE::custom_dma get_custom_dma() const
+    {
+        NPU_NAMESPACE::custom_dma value = static_cast<NPU_NAMESPACE::custom_dma>(((1U << 1) - 1) & (word0 >> 27));
+        return value;
+    }
+    NPU_NAMESPACE::custom_dma get_custom_dma() const volatile
+    {
+        NPU_NAMESPACE::custom_dma value = static_cast<NPU_NAMESPACE::custom_dma>(((1U << 1) - 1) & (word0 >> 27));
+        return value;
+    }
+    CONSTEXPR config_r &set_custom_dma(NPU_NAMESPACE::custom_dma value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 27) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 27);
         return *this;
     }
     CONSTEXPR uint32_t get_product() const
     {
-        uint32_t value = static_cast<uint32_t>(product);
+        uint32_t value = static_cast<uint32_t>(((1U << 4) - 1) & (word0 >> 28));
         return value;
     }
     uint32_t get_product() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(product);
+        uint32_t value = static_cast<uint32_t>(((1U << 4) - 1) & (word0 >> 28));
         return value;
     }
     CONSTEXPR config_r &set_product(uint32_t value)
     {
-        product = ((1u << 4) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 4) - 1)) << 28) & word0) | ((((1U << 4) - 1) & static_cast<uint32_t>(value)) << 28);
         return *this;
     }
-#endif //__cplusplus
+#endif
 };
 
 // lock_r - Lock register. This register is designed for driver use and does not affect NPU functionality
 struct lock_r
 {
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
+#ifndef __cplusplus
     union
     {
-        uint32_t LOCK; // 32 bit value for LOCK configuration
+        struct
+        {
+            uint32_t LOCK : 32; // 32 bit value for LOCK configuration
+        };
         uint32_t word;
     };
-#ifdef __cplusplus
+#else
+  private:
+    uint32_t word0;
+
   public:
-    CONSTEXPR lock_r() : LOCK(static_cast<uint32_t>(0x00000000)) {}
-    CONSTEXPR lock_r(uint32_t init) : word(init) {}
+    CONSTEXPR lock_r() : word0(0) {}
+    CONSTEXPR lock_r(uint32_t init) : word0(init) {}
     CONSTEXPR void operator=(uint32_t value)
     {
-        word = value;
+        word0 = value;
     }
     void operator=(uint32_t value) volatile
     {
-        word = value;
+        word0 = value;
     }
     CONSTEXPR operator uint32_t()
     {
-        return word;
+        return word0;
     }
     operator uint32_t() volatile
     {
-        return word;
+        return word0;
     }
     lock_r copy() volatile
     {
@@ -2388,1518 +2703,705 @@
     }
     CONSTEXPR uint32_t get_LOCK() const
     {
-        uint32_t value = static_cast<uint32_t>(LOCK);
+        uint32_t value = static_cast<uint32_t>(word0);
         return value;
     }
     uint32_t get_LOCK() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(LOCK);
+        uint32_t value = static_cast<uint32_t>(word0);
         return value;
     }
     CONSTEXPR lock_r &set_LOCK(uint32_t value)
     {
-        LOCK = static_cast<uint32_t>(value);
+        word0 = static_cast<uint32_t>(value);
         return *this;
     }
-#endif //__cplusplus
+#endif
 };
 
 // regioncfg_r - Region memory type configuration. Bits[2*k+1:2*k] give the memory type for REGION[k]
 struct regioncfg_r
 {
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
+#ifndef __cplusplus
     union
     {
         struct
         {
-            uint32_t region0 : 2; // Bits for Region0 Configurion
-            uint32_t region1 : 2; // Bits for Region1 Configurion
-            uint32_t region2 : 2; // Bits for Region2 Configurion
-            uint32_t region3 : 2; // Bits for Region3 Configurion
-            uint32_t region4 : 2; // Bits for Region4 Configurion
-            uint32_t region5 : 2; // Bits for Region5 Configurion
-            uint32_t region6 : 2; // Bits for Region6 Configurion
-            uint32_t region7 : 2; // Bits for Region7 Configurion
+            uint32_t region0 : 2; // Bits for Region0 Configuration
+            uint32_t region1 : 2; // Bits for Region1 Configuration
+            uint32_t region2 : 2; // Bits for Region2 Configuration
+            uint32_t region3 : 2; // Bits for Region3 Configuration
+            uint32_t region4 : 2; // Bits for Region4 Configuration
+            uint32_t region5 : 2; // Bits for Region5 Configuration
+            uint32_t region6 : 2; // Bits for Region6 Configuration
+            uint32_t region7 : 2; // Bits for Region7 Configuration
             uint32_t reserved0 : 16;
         };
         uint32_t word;
     };
-#ifdef __cplusplus
+#else
+  private:
+    uint32_t word0;
+
   public:
-    CONSTEXPR regioncfg_r() :
-        region0(static_cast<uint32_t>(::memory_type::AXI0_OUTSTANDING_COUNTER0)),
-        region1(static_cast<uint32_t>(::memory_type::AXI0_OUTSTANDING_COUNTER0)),
-        region2(static_cast<uint32_t>(::memory_type::AXI0_OUTSTANDING_COUNTER0)),
-        region3(static_cast<uint32_t>(::memory_type::AXI0_OUTSTANDING_COUNTER0)),
-        region4(static_cast<uint32_t>(::memory_type::AXI0_OUTSTANDING_COUNTER0)),
-        region5(static_cast<uint32_t>(::memory_type::AXI0_OUTSTANDING_COUNTER0)),
-        region6(static_cast<uint32_t>(::memory_type::AXI0_OUTSTANDING_COUNTER0)),
-        region7(static_cast<uint32_t>(::memory_type::AXI0_OUTSTANDING_COUNTER0)), reserved0(static_cast<uint32_t>(0))
-    {
-    }
-    CONSTEXPR regioncfg_r(uint32_t init) : word(init) {}
+    CONSTEXPR regioncfg_r() : word0(0) {}
+    CONSTEXPR regioncfg_r(uint32_t init) : word0(init) {}
     CONSTEXPR void operator=(uint32_t value)
     {
-        word = value;
+        word0 = value;
     }
     void operator=(uint32_t value) volatile
     {
-        word = value;
+        word0 = value;
     }
     CONSTEXPR operator uint32_t()
     {
-        return word;
+        return word0;
     }
     operator uint32_t() volatile
     {
-        return word;
+        return word0;
     }
     regioncfg_r copy() volatile
     {
         return *this;
     }
-    CONSTEXPR ::memory_type get_region0() const
+    CONSTEXPR NPU_NAMESPACE::mem_attr get_region0() const
     {
-        ::memory_type value = static_cast<::memory_type>(region0);
+        NPU_NAMESPACE::mem_attr value = static_cast<NPU_NAMESPACE::mem_attr>(((1U << 2) - 1) & (word0 >> 0));
         return value;
     }
-    ::memory_type get_region0() const volatile
+    NPU_NAMESPACE::mem_attr get_region0() const volatile
     {
-        ::memory_type value = static_cast<::memory_type>(region0);
+        NPU_NAMESPACE::mem_attr value = static_cast<NPU_NAMESPACE::mem_attr>(((1U << 2) - 1) & (word0 >> 0));
         return value;
     }
-    CONSTEXPR regioncfg_r &set_region0(::memory_type value)
+    CONSTEXPR regioncfg_r &set_region0(NPU_NAMESPACE::mem_attr value)
     {
-        region0 = ((1u << 2) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 2) - 1)) << 0) & word0) | ((((1U << 2) - 1) & static_cast<uint32_t>(value)) << 0);
         return *this;
     }
-    CONSTEXPR ::memory_type get_region1() const
+    CONSTEXPR NPU_NAMESPACE::mem_attr get_region1() const
     {
-        ::memory_type value = static_cast<::memory_type>(region1);
+        NPU_NAMESPACE::mem_attr value = static_cast<NPU_NAMESPACE::mem_attr>(((1U << 2) - 1) & (word0 >> 2));
         return value;
     }
-    ::memory_type get_region1() const volatile
+    NPU_NAMESPACE::mem_attr get_region1() const volatile
     {
-        ::memory_type value = static_cast<::memory_type>(region1);
+        NPU_NAMESPACE::mem_attr value = static_cast<NPU_NAMESPACE::mem_attr>(((1U << 2) - 1) & (word0 >> 2));
         return value;
     }
-    CONSTEXPR regioncfg_r &set_region1(::memory_type value)
+    CONSTEXPR regioncfg_r &set_region1(NPU_NAMESPACE::mem_attr value)
     {
-        region1 = ((1u << 2) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 2) - 1)) << 2) & word0) | ((((1U << 2) - 1) & static_cast<uint32_t>(value)) << 2);
         return *this;
     }
-    CONSTEXPR ::memory_type get_region2() const
+    CONSTEXPR NPU_NAMESPACE::mem_attr get_region2() const
     {
-        ::memory_type value = static_cast<::memory_type>(region2);
+        NPU_NAMESPACE::mem_attr value = static_cast<NPU_NAMESPACE::mem_attr>(((1U << 2) - 1) & (word0 >> 4));
         return value;
     }
-    ::memory_type get_region2() const volatile
+    NPU_NAMESPACE::mem_attr get_region2() const volatile
     {
-        ::memory_type value = static_cast<::memory_type>(region2);
+        NPU_NAMESPACE::mem_attr value = static_cast<NPU_NAMESPACE::mem_attr>(((1U << 2) - 1) & (word0 >> 4));
         return value;
     }
-    CONSTEXPR regioncfg_r &set_region2(::memory_type value)
+    CONSTEXPR regioncfg_r &set_region2(NPU_NAMESPACE::mem_attr value)
     {
-        region2 = ((1u << 2) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 2) - 1)) << 4) & word0) | ((((1U << 2) - 1) & static_cast<uint32_t>(value)) << 4);
         return *this;
     }
-    CONSTEXPR ::memory_type get_region3() const
+    CONSTEXPR NPU_NAMESPACE::mem_attr get_region3() const
     {
-        ::memory_type value = static_cast<::memory_type>(region3);
+        NPU_NAMESPACE::mem_attr value = static_cast<NPU_NAMESPACE::mem_attr>(((1U << 2) - 1) & (word0 >> 6));
         return value;
     }
-    ::memory_type get_region3() const volatile
+    NPU_NAMESPACE::mem_attr get_region3() const volatile
     {
-        ::memory_type value = static_cast<::memory_type>(region3);
+        NPU_NAMESPACE::mem_attr value = static_cast<NPU_NAMESPACE::mem_attr>(((1U << 2) - 1) & (word0 >> 6));
         return value;
     }
-    CONSTEXPR regioncfg_r &set_region3(::memory_type value)
+    CONSTEXPR regioncfg_r &set_region3(NPU_NAMESPACE::mem_attr value)
     {
-        region3 = ((1u << 2) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 2) - 1)) << 6) & word0) | ((((1U << 2) - 1) & static_cast<uint32_t>(value)) << 6);
         return *this;
     }
-    CONSTEXPR ::memory_type get_region4() const
+    CONSTEXPR NPU_NAMESPACE::mem_attr get_region4() const
     {
-        ::memory_type value = static_cast<::memory_type>(region4);
+        NPU_NAMESPACE::mem_attr value = static_cast<NPU_NAMESPACE::mem_attr>(((1U << 2) - 1) & (word0 >> 8));
         return value;
     }
-    ::memory_type get_region4() const volatile
+    NPU_NAMESPACE::mem_attr get_region4() const volatile
     {
-        ::memory_type value = static_cast<::memory_type>(region4);
+        NPU_NAMESPACE::mem_attr value = static_cast<NPU_NAMESPACE::mem_attr>(((1U << 2) - 1) & (word0 >> 8));
         return value;
     }
-    CONSTEXPR regioncfg_r &set_region4(::memory_type value)
+    CONSTEXPR regioncfg_r &set_region4(NPU_NAMESPACE::mem_attr value)
     {
-        region4 = ((1u << 2) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 2) - 1)) << 8) & word0) | ((((1U << 2) - 1) & static_cast<uint32_t>(value)) << 8);
         return *this;
     }
-    CONSTEXPR ::memory_type get_region5() const
+    CONSTEXPR NPU_NAMESPACE::mem_attr get_region5() const
     {
-        ::memory_type value = static_cast<::memory_type>(region5);
+        NPU_NAMESPACE::mem_attr value = static_cast<NPU_NAMESPACE::mem_attr>(((1U << 2) - 1) & (word0 >> 10));
         return value;
     }
-    ::memory_type get_region5() const volatile
+    NPU_NAMESPACE::mem_attr get_region5() const volatile
     {
-        ::memory_type value = static_cast<::memory_type>(region5);
+        NPU_NAMESPACE::mem_attr value = static_cast<NPU_NAMESPACE::mem_attr>(((1U << 2) - 1) & (word0 >> 10));
         return value;
     }
-    CONSTEXPR regioncfg_r &set_region5(::memory_type value)
+    CONSTEXPR regioncfg_r &set_region5(NPU_NAMESPACE::mem_attr value)
     {
-        region5 = ((1u << 2) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 2) - 1)) << 10) & word0) | ((((1U << 2) - 1) & static_cast<uint32_t>(value)) << 10);
         return *this;
     }
-    CONSTEXPR ::memory_type get_region6() const
+    CONSTEXPR NPU_NAMESPACE::mem_attr get_region6() const
     {
-        ::memory_type value = static_cast<::memory_type>(region6);
+        NPU_NAMESPACE::mem_attr value = static_cast<NPU_NAMESPACE::mem_attr>(((1U << 2) - 1) & (word0 >> 12));
         return value;
     }
-    ::memory_type get_region6() const volatile
+    NPU_NAMESPACE::mem_attr get_region6() const volatile
     {
-        ::memory_type value = static_cast<::memory_type>(region6);
+        NPU_NAMESPACE::mem_attr value = static_cast<NPU_NAMESPACE::mem_attr>(((1U << 2) - 1) & (word0 >> 12));
         return value;
     }
-    CONSTEXPR regioncfg_r &set_region6(::memory_type value)
+    CONSTEXPR regioncfg_r &set_region6(NPU_NAMESPACE::mem_attr value)
     {
-        region6 = ((1u << 2) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 2) - 1)) << 12) & word0) | ((((1U << 2) - 1) & static_cast<uint32_t>(value)) << 12);
         return *this;
     }
-    CONSTEXPR ::memory_type get_region7() const
+    CONSTEXPR NPU_NAMESPACE::mem_attr get_region7() const
     {
-        ::memory_type value = static_cast<::memory_type>(region7);
+        NPU_NAMESPACE::mem_attr value = static_cast<NPU_NAMESPACE::mem_attr>(((1U << 2) - 1) & (word0 >> 14));
         return value;
     }
-    ::memory_type get_region7() const volatile
+    NPU_NAMESPACE::mem_attr get_region7() const volatile
     {
-        ::memory_type value = static_cast<::memory_type>(region7);
+        NPU_NAMESPACE::mem_attr value = static_cast<NPU_NAMESPACE::mem_attr>(((1U << 2) - 1) & (word0 >> 14));
         return value;
     }
-    CONSTEXPR regioncfg_r &set_region7(::memory_type value)
+    CONSTEXPR regioncfg_r &set_region7(NPU_NAMESPACE::mem_attr value)
     {
-        region7 = ((1u << 2) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 2) - 1)) << 14) & word0) | ((((1U << 2) - 1) & static_cast<uint32_t>(value)) << 14);
         return *this;
     }
-#endif //__cplusplus
+#endif
 };
 
 // axi_limit0_r - AXI limits for port 0 counter 0
 struct axi_limit0_r
 {
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
+#ifndef __cplusplus
     union
     {
         struct
         {
-            uint32_t max_beats : 2; // Burst split alignment: 0=64 bytes, 1=128 bytes, 2=256 bytes, 3=reserved
+            uint32_t max_beats : 2; // Burst split alignment
             uint32_t reserved0 : 2;
             uint32_t memtype : 4; // Memtype to be used to encode AxCACHE signals
             uint32_t reserved1 : 8;
             uint32_t
-                max_outstanding_read_m1 : 8; // Maximum number of outstanding AXI read transactions - 1 in range 0 to 31
-            uint32_t max_outstanding_write_m1 : 8; // Maximum number of outstanding AXI write transactions - 1 in range
+                max_outstanding_read_m1 : 5; // Maximum number of outstanding AXI read transactions - 1 in range 0 to 31
+            uint32_t reserved2 : 3;
+            uint32_t max_outstanding_write_m1 : 4; // Maximum number of outstanding AXI write transactions - 1 in range
                                                    // 0 to 15
+            uint32_t reserved3 : 4;
         };
         uint32_t word;
     };
-#ifdef __cplusplus
+#else
+  private:
+    uint32_t word0;
+
   public:
-    CONSTEXPR axi_limit0_r() :
-        max_beats(static_cast<uint32_t>(0x0)), reserved0(static_cast<uint32_t>(0)),
-        memtype(static_cast<uint32_t>(::axi_mem_encoding_type::DEVICE_NON_BUFFERABLE)),
-        reserved1(static_cast<uint32_t>(0)), max_outstanding_read_m1(static_cast<uint32_t>(0x00)),
-        max_outstanding_write_m1(static_cast<uint32_t>(0x00))
-    {
-    }
-    CONSTEXPR axi_limit0_r(uint32_t init) : word(init) {}
+    CONSTEXPR axi_limit0_r() : word0(0) {}
+    CONSTEXPR axi_limit0_r(uint32_t init) : word0(init) {}
     CONSTEXPR void operator=(uint32_t value)
     {
-        word = value;
+        word0 = value;
     }
     void operator=(uint32_t value) volatile
     {
-        word = value;
+        word0 = value;
     }
     CONSTEXPR operator uint32_t()
     {
-        return word;
+        return word0;
     }
     operator uint32_t() volatile
     {
-        return word;
+        return word0;
     }
     axi_limit0_r copy() volatile
     {
         return *this;
     }
-    CONSTEXPR uint32_t get_max_beats() const
+    CONSTEXPR NPU_NAMESPACE::max_beats get_max_beats() const
     {
-        uint32_t value = static_cast<uint32_t>(max_beats);
+        NPU_NAMESPACE::max_beats value = static_cast<NPU_NAMESPACE::max_beats>(((1U << 2) - 1) & (word0 >> 0));
         return value;
     }
-    uint32_t get_max_beats() const volatile
+    NPU_NAMESPACE::max_beats get_max_beats() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(max_beats);
+        NPU_NAMESPACE::max_beats value = static_cast<NPU_NAMESPACE::max_beats>(((1U << 2) - 1) & (word0 >> 0));
         return value;
     }
-    CONSTEXPR axi_limit0_r &set_max_beats(uint32_t value)
+    CONSTEXPR axi_limit0_r &set_max_beats(NPU_NAMESPACE::max_beats value)
     {
-        max_beats = ((1u << 2) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 2) - 1)) << 0) & word0) | ((((1U << 2) - 1) & static_cast<uint32_t>(value)) << 0);
         return *this;
     }
-    CONSTEXPR ::axi_mem_encoding_type get_memtype() const
+    CONSTEXPR NPU_NAMESPACE::axi_mem_encoding get_memtype() const
     {
-        ::axi_mem_encoding_type value = static_cast<::axi_mem_encoding_type>(memtype);
+        NPU_NAMESPACE::axi_mem_encoding value =
+            static_cast<NPU_NAMESPACE::axi_mem_encoding>(((1U << 4) - 1) & (word0 >> 4));
         return value;
     }
-    ::axi_mem_encoding_type get_memtype() const volatile
+    NPU_NAMESPACE::axi_mem_encoding get_memtype() const volatile
     {
-        ::axi_mem_encoding_type value = static_cast<::axi_mem_encoding_type>(memtype);
+        NPU_NAMESPACE::axi_mem_encoding value =
+            static_cast<NPU_NAMESPACE::axi_mem_encoding>(((1U << 4) - 1) & (word0 >> 4));
         return value;
     }
-    CONSTEXPR axi_limit0_r &set_memtype(::axi_mem_encoding_type value)
+    CONSTEXPR axi_limit0_r &set_memtype(NPU_NAMESPACE::axi_mem_encoding value)
     {
-        memtype = ((1u << 4) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 4) - 1)) << 4) & word0) | ((((1U << 4) - 1) & static_cast<uint32_t>(value)) << 4);
         return *this;
     }
     CONSTEXPR uint32_t get_max_outstanding_read_m1() const
     {
-        uint32_t value = static_cast<uint32_t>(max_outstanding_read_m1);
+        uint32_t value = static_cast<uint32_t>(((1U << 5) - 1) & (word0 >> 16));
         return value;
     }
     uint32_t get_max_outstanding_read_m1() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(max_outstanding_read_m1);
+        uint32_t value = static_cast<uint32_t>(((1U << 5) - 1) & (word0 >> 16));
         return value;
     }
     CONSTEXPR axi_limit0_r &set_max_outstanding_read_m1(uint32_t value)
     {
-        max_outstanding_read_m1 = ((1u << 8) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 5) - 1)) << 16) & word0) | ((((1U << 5) - 1) & static_cast<uint32_t>(value)) << 16);
         return *this;
     }
     CONSTEXPR uint32_t get_max_outstanding_write_m1() const
     {
-        uint32_t value = static_cast<uint32_t>(max_outstanding_write_m1);
+        uint32_t value = static_cast<uint32_t>(((1U << 4) - 1) & (word0 >> 24));
         return value;
     }
     uint32_t get_max_outstanding_write_m1() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(max_outstanding_write_m1);
+        uint32_t value = static_cast<uint32_t>(((1U << 4) - 1) & (word0 >> 24));
         return value;
     }
     CONSTEXPR axi_limit0_r &set_max_outstanding_write_m1(uint32_t value)
     {
-        max_outstanding_write_m1 = ((1u << 8) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 4) - 1)) << 24) & word0) | ((((1U << 4) - 1) & static_cast<uint32_t>(value)) << 24);
         return *this;
     }
-#endif //__cplusplus
+#endif
 };
 
 // axi_limit1_r - AXI limits for port 0 counter 1
 struct axi_limit1_r
 {
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
+#ifndef __cplusplus
     union
     {
         struct
         {
-            uint32_t max_beats : 2; // Burst split alignment: 0=64 bytes, 1=128 bytes, 2=256 bytes, 3=reserved
+            uint32_t max_beats : 2; // Burst split alignment
             uint32_t reserved0 : 2;
             uint32_t memtype : 4; // Memtype to be used to encode AxCACHE signals
             uint32_t reserved1 : 8;
             uint32_t
-                max_outstanding_read_m1 : 8; // Maximum number of outstanding AXI read transactions - 1 in range 0 to 31
-            uint32_t max_outstanding_write_m1 : 8; // Maximum number of outstanding AXI write transactions - 1 in range
+                max_outstanding_read_m1 : 5; // Maximum number of outstanding AXI read transactions - 1 in range 0 to 31
+            uint32_t reserved2 : 3;
+            uint32_t max_outstanding_write_m1 : 4; // Maximum number of outstanding AXI write transactions - 1 in range
                                                    // 0 to 15
+            uint32_t reserved3 : 4;
         };
         uint32_t word;
     };
-#ifdef __cplusplus
+#else
+  private:
+    uint32_t word0;
+
   public:
-    CONSTEXPR axi_limit1_r() :
-        max_beats(static_cast<uint32_t>(0x0)), reserved0(static_cast<uint32_t>(0)),
-        memtype(static_cast<uint32_t>(::axi_mem_encoding_type::DEVICE_NON_BUFFERABLE)),
-        reserved1(static_cast<uint32_t>(0)), max_outstanding_read_m1(static_cast<uint32_t>(0x00)),
-        max_outstanding_write_m1(static_cast<uint32_t>(0x00))
-    {
-    }
-    CONSTEXPR axi_limit1_r(uint32_t init) : word(init) {}
+    CONSTEXPR axi_limit1_r() : word0(0) {}
+    CONSTEXPR axi_limit1_r(uint32_t init) : word0(init) {}
     CONSTEXPR void operator=(uint32_t value)
     {
-        word = value;
+        word0 = value;
     }
     void operator=(uint32_t value) volatile
     {
-        word = value;
+        word0 = value;
     }
     CONSTEXPR operator uint32_t()
     {
-        return word;
+        return word0;
     }
     operator uint32_t() volatile
     {
-        return word;
+        return word0;
     }
     axi_limit1_r copy() volatile
     {
         return *this;
     }
-    CONSTEXPR uint32_t get_max_beats() const
+    CONSTEXPR NPU_NAMESPACE::max_beats get_max_beats() const
     {
-        uint32_t value = static_cast<uint32_t>(max_beats);
+        NPU_NAMESPACE::max_beats value = static_cast<NPU_NAMESPACE::max_beats>(((1U << 2) - 1) & (word0 >> 0));
         return value;
     }
-    uint32_t get_max_beats() const volatile
+    NPU_NAMESPACE::max_beats get_max_beats() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(max_beats);
+        NPU_NAMESPACE::max_beats value = static_cast<NPU_NAMESPACE::max_beats>(((1U << 2) - 1) & (word0 >> 0));
         return value;
     }
-    CONSTEXPR axi_limit1_r &set_max_beats(uint32_t value)
+    CONSTEXPR axi_limit1_r &set_max_beats(NPU_NAMESPACE::max_beats value)
     {
-        max_beats = ((1u << 2) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 2) - 1)) << 0) & word0) | ((((1U << 2) - 1) & static_cast<uint32_t>(value)) << 0);
         return *this;
     }
-    CONSTEXPR ::axi_mem_encoding_type get_memtype() const
+    CONSTEXPR NPU_NAMESPACE::axi_mem_encoding get_memtype() const
     {
-        ::axi_mem_encoding_type value = static_cast<::axi_mem_encoding_type>(memtype);
+        NPU_NAMESPACE::axi_mem_encoding value =
+            static_cast<NPU_NAMESPACE::axi_mem_encoding>(((1U << 4) - 1) & (word0 >> 4));
         return value;
     }
-    ::axi_mem_encoding_type get_memtype() const volatile
+    NPU_NAMESPACE::axi_mem_encoding get_memtype() const volatile
     {
-        ::axi_mem_encoding_type value = static_cast<::axi_mem_encoding_type>(memtype);
+        NPU_NAMESPACE::axi_mem_encoding value =
+            static_cast<NPU_NAMESPACE::axi_mem_encoding>(((1U << 4) - 1) & (word0 >> 4));
         return value;
     }
-    CONSTEXPR axi_limit1_r &set_memtype(::axi_mem_encoding_type value)
+    CONSTEXPR axi_limit1_r &set_memtype(NPU_NAMESPACE::axi_mem_encoding value)
     {
-        memtype = ((1u << 4) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 4) - 1)) << 4) & word0) | ((((1U << 4) - 1) & static_cast<uint32_t>(value)) << 4);
         return *this;
     }
     CONSTEXPR uint32_t get_max_outstanding_read_m1() const
     {
-        uint32_t value = static_cast<uint32_t>(max_outstanding_read_m1);
+        uint32_t value = static_cast<uint32_t>(((1U << 5) - 1) & (word0 >> 16));
         return value;
     }
     uint32_t get_max_outstanding_read_m1() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(max_outstanding_read_m1);
+        uint32_t value = static_cast<uint32_t>(((1U << 5) - 1) & (word0 >> 16));
         return value;
     }
     CONSTEXPR axi_limit1_r &set_max_outstanding_read_m1(uint32_t value)
     {
-        max_outstanding_read_m1 = ((1u << 8) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 5) - 1)) << 16) & word0) | ((((1U << 5) - 1) & static_cast<uint32_t>(value)) << 16);
         return *this;
     }
     CONSTEXPR uint32_t get_max_outstanding_write_m1() const
     {
-        uint32_t value = static_cast<uint32_t>(max_outstanding_write_m1);
+        uint32_t value = static_cast<uint32_t>(((1U << 4) - 1) & (word0 >> 24));
         return value;
     }
     uint32_t get_max_outstanding_write_m1() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(max_outstanding_write_m1);
+        uint32_t value = static_cast<uint32_t>(((1U << 4) - 1) & (word0 >> 24));
         return value;
     }
     CONSTEXPR axi_limit1_r &set_max_outstanding_write_m1(uint32_t value)
     {
-        max_outstanding_write_m1 = ((1u << 8) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 4) - 1)) << 24) & word0) | ((((1U << 4) - 1) & static_cast<uint32_t>(value)) << 24);
         return *this;
     }
-#endif //__cplusplus
+#endif
 };
 
 // axi_limit2_r - AXI limits for port 1 counter 2
 struct axi_limit2_r
 {
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
+#ifndef __cplusplus
     union
     {
         struct
         {
-            uint32_t max_beats : 2; // Burst split alignment: 0=64 bytes, 1=128 bytes, 2=256 bytes, 3=reserved
+            uint32_t max_beats : 2; // Burst split alignment
             uint32_t reserved0 : 2;
             uint32_t memtype : 4; // Memtype to be used to encode AxCACHE signals
             uint32_t reserved1 : 8;
             uint32_t
-                max_outstanding_read_m1 : 8; // Maximum number of outstanding AXI read transactions - 1 in range 0 to 31
-            uint32_t max_outstanding_write_m1 : 8; // Maximum number of outstanding AXI write transactions - 1 in range
+                max_outstanding_read_m1 : 5; // Maximum number of outstanding AXI read transactions - 1 in range 0 to 31
+            uint32_t reserved2 : 3;
+            uint32_t max_outstanding_write_m1 : 4; // Maximum number of outstanding AXI write transactions - 1 in range
                                                    // 0 to 15
+            uint32_t reserved3 : 4;
         };
         uint32_t word;
     };
-#ifdef __cplusplus
+#else
+  private:
+    uint32_t word0;
+
   public:
-    CONSTEXPR axi_limit2_r() :
-        max_beats(static_cast<uint32_t>(0x0)), reserved0(static_cast<uint32_t>(0)),
-        memtype(static_cast<uint32_t>(::axi_mem_encoding_type::DEVICE_NON_BUFFERABLE)),
-        reserved1(static_cast<uint32_t>(0)), max_outstanding_read_m1(static_cast<uint32_t>(0x00)),
-        max_outstanding_write_m1(static_cast<uint32_t>(0x00))
-    {
-    }
-    CONSTEXPR axi_limit2_r(uint32_t init) : word(init) {}
+    CONSTEXPR axi_limit2_r() : word0(0) {}
+    CONSTEXPR axi_limit2_r(uint32_t init) : word0(init) {}
     CONSTEXPR void operator=(uint32_t value)
     {
-        word = value;
+        word0 = value;
     }
     void operator=(uint32_t value) volatile
     {
-        word = value;
+        word0 = value;
     }
     CONSTEXPR operator uint32_t()
     {
-        return word;
+        return word0;
     }
     operator uint32_t() volatile
     {
-        return word;
+        return word0;
     }
     axi_limit2_r copy() volatile
     {
         return *this;
     }
-    CONSTEXPR uint32_t get_max_beats() const
+    CONSTEXPR NPU_NAMESPACE::max_beats get_max_beats() const
     {
-        uint32_t value = static_cast<uint32_t>(max_beats);
+        NPU_NAMESPACE::max_beats value = static_cast<NPU_NAMESPACE::max_beats>(((1U << 2) - 1) & (word0 >> 0));
         return value;
     }
-    uint32_t get_max_beats() const volatile
+    NPU_NAMESPACE::max_beats get_max_beats() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(max_beats);
+        NPU_NAMESPACE::max_beats value = static_cast<NPU_NAMESPACE::max_beats>(((1U << 2) - 1) & (word0 >> 0));
         return value;
     }
-    CONSTEXPR axi_limit2_r &set_max_beats(uint32_t value)
+    CONSTEXPR axi_limit2_r &set_max_beats(NPU_NAMESPACE::max_beats value)
     {
-        max_beats = ((1u << 2) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 2) - 1)) << 0) & word0) | ((((1U << 2) - 1) & static_cast<uint32_t>(value)) << 0);
         return *this;
     }
-    CONSTEXPR ::axi_mem_encoding_type get_memtype() const
+    CONSTEXPR NPU_NAMESPACE::axi_mem_encoding get_memtype() const
     {
-        ::axi_mem_encoding_type value = static_cast<::axi_mem_encoding_type>(memtype);
+        NPU_NAMESPACE::axi_mem_encoding value =
+            static_cast<NPU_NAMESPACE::axi_mem_encoding>(((1U << 4) - 1) & (word0 >> 4));
         return value;
     }
-    ::axi_mem_encoding_type get_memtype() const volatile
+    NPU_NAMESPACE::axi_mem_encoding get_memtype() const volatile
     {
-        ::axi_mem_encoding_type value = static_cast<::axi_mem_encoding_type>(memtype);
+        NPU_NAMESPACE::axi_mem_encoding value =
+            static_cast<NPU_NAMESPACE::axi_mem_encoding>(((1U << 4) - 1) & (word0 >> 4));
         return value;
     }
-    CONSTEXPR axi_limit2_r &set_memtype(::axi_mem_encoding_type value)
+    CONSTEXPR axi_limit2_r &set_memtype(NPU_NAMESPACE::axi_mem_encoding value)
     {
-        memtype = ((1u << 4) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 4) - 1)) << 4) & word0) | ((((1U << 4) - 1) & static_cast<uint32_t>(value)) << 4);
         return *this;
     }
     CONSTEXPR uint32_t get_max_outstanding_read_m1() const
     {
-        uint32_t value = static_cast<uint32_t>(max_outstanding_read_m1);
+        uint32_t value = static_cast<uint32_t>(((1U << 5) - 1) & (word0 >> 16));
         return value;
     }
     uint32_t get_max_outstanding_read_m1() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(max_outstanding_read_m1);
+        uint32_t value = static_cast<uint32_t>(((1U << 5) - 1) & (word0 >> 16));
         return value;
     }
     CONSTEXPR axi_limit2_r &set_max_outstanding_read_m1(uint32_t value)
     {
-        max_outstanding_read_m1 = ((1u << 8) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 5) - 1)) << 16) & word0) | ((((1U << 5) - 1) & static_cast<uint32_t>(value)) << 16);
         return *this;
     }
     CONSTEXPR uint32_t get_max_outstanding_write_m1() const
     {
-        uint32_t value = static_cast<uint32_t>(max_outstanding_write_m1);
+        uint32_t value = static_cast<uint32_t>(((1U << 4) - 1) & (word0 >> 24));
         return value;
     }
     uint32_t get_max_outstanding_write_m1() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(max_outstanding_write_m1);
+        uint32_t value = static_cast<uint32_t>(((1U << 4) - 1) & (word0 >> 24));
         return value;
     }
     CONSTEXPR axi_limit2_r &set_max_outstanding_write_m1(uint32_t value)
     {
-        max_outstanding_write_m1 = ((1u << 8) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 4) - 1)) << 24) & word0) | ((((1U << 4) - 1) & static_cast<uint32_t>(value)) << 24);
         return *this;
     }
-#endif //__cplusplus
+#endif
 };
 
 // axi_limit3_r - AXI limits for port 1 counter 3
 struct axi_limit3_r
 {
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
+#ifndef __cplusplus
     union
     {
         struct
         {
-            uint32_t max_beats : 2; // Burst split alignment: 0=64 bytes, 1=128 bytes, 2=256 bytes, 3=reserved
+            uint32_t max_beats : 2; // Burst split alignment
             uint32_t reserved0 : 2;
             uint32_t memtype : 4; // Memtype to be used to encode AxCACHE signals
             uint32_t reserved1 : 8;
             uint32_t
-                max_outstanding_read_m1 : 8; // Maximum number of outstanding AXI read transactions - 1 in range 0 to 31
-            uint32_t max_outstanding_write_m1 : 8; // Maximum number of outstanding AXI write transactions - 1 in range
+                max_outstanding_read_m1 : 5; // Maximum number of outstanding AXI read transactions - 1 in range 0 to 31
+            uint32_t reserved2 : 3;
+            uint32_t max_outstanding_write_m1 : 4; // Maximum number of outstanding AXI write transactions - 1 in range
                                                    // 0 to 15
+            uint32_t reserved3 : 4;
         };
         uint32_t word;
     };
-#ifdef __cplusplus
+#else
+  private:
+    uint32_t word0;
+
   public:
-    CONSTEXPR axi_limit3_r() :
-        max_beats(static_cast<uint32_t>(0x0)), reserved0(static_cast<uint32_t>(0)),
-        memtype(static_cast<uint32_t>(::axi_mem_encoding_type::DEVICE_NON_BUFFERABLE)),
-        reserved1(static_cast<uint32_t>(0)), max_outstanding_read_m1(static_cast<uint32_t>(0x00)),
-        max_outstanding_write_m1(static_cast<uint32_t>(0x00))
-    {
-    }
-    CONSTEXPR axi_limit3_r(uint32_t init) : word(init) {}
+    CONSTEXPR axi_limit3_r() : word0(0) {}
+    CONSTEXPR axi_limit3_r(uint32_t init) : word0(init) {}
     CONSTEXPR void operator=(uint32_t value)
     {
-        word = value;
+        word0 = value;
     }
     void operator=(uint32_t value) volatile
     {
-        word = value;
+        word0 = value;
     }
     CONSTEXPR operator uint32_t()
     {
-        return word;
+        return word0;
     }
     operator uint32_t() volatile
     {
-        return word;
+        return word0;
     }
     axi_limit3_r copy() volatile
     {
         return *this;
     }
-    CONSTEXPR uint32_t get_max_beats() const
+    CONSTEXPR NPU_NAMESPACE::max_beats get_max_beats() const
     {
-        uint32_t value = static_cast<uint32_t>(max_beats);
+        NPU_NAMESPACE::max_beats value = static_cast<NPU_NAMESPACE::max_beats>(((1U << 2) - 1) & (word0 >> 0));
         return value;
     }
-    uint32_t get_max_beats() const volatile
+    NPU_NAMESPACE::max_beats get_max_beats() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(max_beats);
+        NPU_NAMESPACE::max_beats value = static_cast<NPU_NAMESPACE::max_beats>(((1U << 2) - 1) & (word0 >> 0));
         return value;
     }
-    CONSTEXPR axi_limit3_r &set_max_beats(uint32_t value)
+    CONSTEXPR axi_limit3_r &set_max_beats(NPU_NAMESPACE::max_beats value)
     {
-        max_beats = ((1u << 2) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 2) - 1)) << 0) & word0) | ((((1U << 2) - 1) & static_cast<uint32_t>(value)) << 0);
         return *this;
     }
-    CONSTEXPR ::axi_mem_encoding_type get_memtype() const
+    CONSTEXPR NPU_NAMESPACE::axi_mem_encoding get_memtype() const
     {
-        ::axi_mem_encoding_type value = static_cast<::axi_mem_encoding_type>(memtype);
+        NPU_NAMESPACE::axi_mem_encoding value =
+            static_cast<NPU_NAMESPACE::axi_mem_encoding>(((1U << 4) - 1) & (word0 >> 4));
         return value;
     }
-    ::axi_mem_encoding_type get_memtype() const volatile
+    NPU_NAMESPACE::axi_mem_encoding get_memtype() const volatile
     {
-        ::axi_mem_encoding_type value = static_cast<::axi_mem_encoding_type>(memtype);
+        NPU_NAMESPACE::axi_mem_encoding value =
+            static_cast<NPU_NAMESPACE::axi_mem_encoding>(((1U << 4) - 1) & (word0 >> 4));
         return value;
     }
-    CONSTEXPR axi_limit3_r &set_memtype(::axi_mem_encoding_type value)
+    CONSTEXPR axi_limit3_r &set_memtype(NPU_NAMESPACE::axi_mem_encoding value)
     {
-        memtype = ((1u << 4) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 4) - 1)) << 4) & word0) | ((((1U << 4) - 1) & static_cast<uint32_t>(value)) << 4);
         return *this;
     }
     CONSTEXPR uint32_t get_max_outstanding_read_m1() const
     {
-        uint32_t value = static_cast<uint32_t>(max_outstanding_read_m1);
+        uint32_t value = static_cast<uint32_t>(((1U << 5) - 1) & (word0 >> 16));
         return value;
     }
     uint32_t get_max_outstanding_read_m1() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(max_outstanding_read_m1);
+        uint32_t value = static_cast<uint32_t>(((1U << 5) - 1) & (word0 >> 16));
         return value;
     }
     CONSTEXPR axi_limit3_r &set_max_outstanding_read_m1(uint32_t value)
     {
-        max_outstanding_read_m1 = ((1u << 8) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 5) - 1)) << 16) & word0) | ((((1U << 5) - 1) & static_cast<uint32_t>(value)) << 16);
         return *this;
     }
     CONSTEXPR uint32_t get_max_outstanding_write_m1() const
     {
-        uint32_t value = static_cast<uint32_t>(max_outstanding_write_m1);
+        uint32_t value = static_cast<uint32_t>(((1U << 4) - 1) & (word0 >> 24));
         return value;
     }
     uint32_t get_max_outstanding_write_m1() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(max_outstanding_write_m1);
+        uint32_t value = static_cast<uint32_t>(((1U << 4) - 1) & (word0 >> 24));
         return value;
     }
     CONSTEXPR axi_limit3_r &set_max_outstanding_write_m1(uint32_t value)
     {
-        max_outstanding_write_m1 = ((1u << 8) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 4) - 1)) << 24) & word0) | ((((1U << 4) - 1) & static_cast<uint32_t>(value)) << 24);
         return *this;
     }
-#endif //__cplusplus
+#endif
 };
 
-// basep0_r - Lower 32 bits of the Base pointer for region index 0
-struct basep0_r
+// basep_r - The driver can use this address to relocate the command stream on region 0
+struct basep_r
 {
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
-    union
-    {
-        uint32_t addr_word; // The low word of the 64-bit address
-        uint32_t word;
-    };
-#ifdef __cplusplus
-  public:
-    CONSTEXPR basep0_r() : addr_word(static_cast<uint32_t>(0)) {}
-    CONSTEXPR basep0_r(uint32_t init) : word(init) {}
-    CONSTEXPR void operator=(uint32_t value)
-    {
-        word = value;
-    }
-    void operator=(uint32_t value) volatile
-    {
-        word = value;
-    }
-    CONSTEXPR operator uint32_t()
-    {
-        return word;
-    }
-    operator uint32_t() volatile
-    {
-        return word;
-    }
-    basep0_r copy() volatile
-    {
-        return *this;
-    }
-    CONSTEXPR uint32_t get_addr_word() const
-    {
-        uint32_t value = static_cast<uint32_t>(addr_word);
-        return value;
-    }
-    uint32_t get_addr_word() const volatile
-    {
-        uint32_t value = static_cast<uint32_t>(addr_word);
-        return value;
-    }
-    CONSTEXPR basep0_r &set_addr_word(uint32_t value)
-    {
-        addr_word = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// basep1_r - Upper 32 bits of the Base pointer for region index 0
-struct basep1_r
-{
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
-    union
-    {
-        uint32_t addr_word; // The high word of the 64-bit address
-        uint32_t word;
-    };
-#ifdef __cplusplus
-  public:
-    CONSTEXPR basep1_r() : addr_word(static_cast<uint32_t>(0)) {}
-    CONSTEXPR basep1_r(uint32_t init) : word(init) {}
-    CONSTEXPR void operator=(uint32_t value)
-    {
-        word = value;
-    }
-    void operator=(uint32_t value) volatile
-    {
-        word = value;
-    }
-    CONSTEXPR operator uint32_t()
-    {
-        return word;
-    }
-    operator uint32_t() volatile
-    {
-        return word;
-    }
-    basep1_r copy() volatile
-    {
-        return *this;
-    }
-    CONSTEXPR uint32_t get_addr_word() const
-    {
-        uint32_t value = static_cast<uint32_t>(addr_word);
-        return value;
-    }
-    uint32_t get_addr_word() const volatile
-    {
-        uint32_t value = static_cast<uint32_t>(addr_word);
-        return value;
-    }
-    CONSTEXPR basep1_r &set_addr_word(uint32_t value)
-    {
-        addr_word = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// basep2_r - Lower 32 bits of the Base pointer for region index 1
-struct basep2_r
-{
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
-    union
-    {
-        uint32_t addr_word; // The low word of the 64-bit address
-        uint32_t word;
-    };
-#ifdef __cplusplus
-  public:
-    CONSTEXPR basep2_r() : addr_word(static_cast<uint32_t>(0)) {}
-    CONSTEXPR basep2_r(uint32_t init) : word(init) {}
-    CONSTEXPR void operator=(uint32_t value)
-    {
-        word = value;
-    }
-    void operator=(uint32_t value) volatile
-    {
-        word = value;
-    }
-    CONSTEXPR operator uint32_t()
-    {
-        return word;
-    }
-    operator uint32_t() volatile
-    {
-        return word;
-    }
-    basep2_r copy() volatile
-    {
-        return *this;
-    }
-    CONSTEXPR uint32_t get_addr_word() const
-    {
-        uint32_t value = static_cast<uint32_t>(addr_word);
-        return value;
-    }
-    uint32_t get_addr_word() const volatile
-    {
-        uint32_t value = static_cast<uint32_t>(addr_word);
-        return value;
-    }
-    CONSTEXPR basep2_r &set_addr_word(uint32_t value)
-    {
-        addr_word = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// basep3_r - Upper 32 bits of the Base pointer for region index 1
-struct basep3_r
-{
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
-    union
-    {
-        uint32_t addr_word; // The high word of the 64-bit address
-        uint32_t word;
-    };
-#ifdef __cplusplus
-  public:
-    CONSTEXPR basep3_r() : addr_word(static_cast<uint32_t>(0)) {}
-    CONSTEXPR basep3_r(uint32_t init) : word(init) {}
-    CONSTEXPR void operator=(uint32_t value)
-    {
-        word = value;
-    }
-    void operator=(uint32_t value) volatile
-    {
-        word = value;
-    }
-    CONSTEXPR operator uint32_t()
-    {
-        return word;
-    }
-    operator uint32_t() volatile
-    {
-        return word;
-    }
-    basep3_r copy() volatile
-    {
-        return *this;
-    }
-    CONSTEXPR uint32_t get_addr_word() const
-    {
-        uint32_t value = static_cast<uint32_t>(addr_word);
-        return value;
-    }
-    uint32_t get_addr_word() const volatile
-    {
-        uint32_t value = static_cast<uint32_t>(addr_word);
-        return value;
-    }
-    CONSTEXPR basep3_r &set_addr_word(uint32_t value)
-    {
-        addr_word = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// basep4_r - Lower 32 bits of the Base pointer for region index 2
-struct basep4_r
-{
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
-    union
-    {
-        uint32_t addr_word; // The low word of the 64-bit address
-        uint32_t word;
-    };
-#ifdef __cplusplus
-  public:
-    CONSTEXPR basep4_r() : addr_word(static_cast<uint32_t>(0)) {}
-    CONSTEXPR basep4_r(uint32_t init) : word(init) {}
-    CONSTEXPR void operator=(uint32_t value)
-    {
-        word = value;
-    }
-    void operator=(uint32_t value) volatile
-    {
-        word = value;
-    }
-    CONSTEXPR operator uint32_t()
-    {
-        return word;
-    }
-    operator uint32_t() volatile
-    {
-        return word;
-    }
-    basep4_r copy() volatile
-    {
-        return *this;
-    }
-    CONSTEXPR uint32_t get_addr_word() const
-    {
-        uint32_t value = static_cast<uint32_t>(addr_word);
-        return value;
-    }
-    uint32_t get_addr_word() const volatile
-    {
-        uint32_t value = static_cast<uint32_t>(addr_word);
-        return value;
-    }
-    CONSTEXPR basep4_r &set_addr_word(uint32_t value)
-    {
-        addr_word = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// basep5_r - Upper 32 bits of the Base pointer for region index 2
-struct basep5_r
-{
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
-    union
-    {
-        uint32_t addr_word; // The high word of the 64-bit address
-        uint32_t word;
-    };
-#ifdef __cplusplus
-  public:
-    CONSTEXPR basep5_r() : addr_word(static_cast<uint32_t>(0)) {}
-    CONSTEXPR basep5_r(uint32_t init) : word(init) {}
-    CONSTEXPR void operator=(uint32_t value)
-    {
-        word = value;
-    }
-    void operator=(uint32_t value) volatile
-    {
-        word = value;
-    }
-    CONSTEXPR operator uint32_t()
-    {
-        return word;
-    }
-    operator uint32_t() volatile
-    {
-        return word;
-    }
-    basep5_r copy() volatile
-    {
-        return *this;
-    }
-    CONSTEXPR uint32_t get_addr_word() const
-    {
-        uint32_t value = static_cast<uint32_t>(addr_word);
-        return value;
-    }
-    uint32_t get_addr_word() const volatile
-    {
-        uint32_t value = static_cast<uint32_t>(addr_word);
-        return value;
-    }
-    CONSTEXPR basep5_r &set_addr_word(uint32_t value)
-    {
-        addr_word = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// basep6_r - Lower 32 bits of the Base pointer for region index 3
-struct basep6_r
-{
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
-    union
-    {
-        uint32_t addr_word; // The low word of the 64-bit address
-        uint32_t word;
-    };
-#ifdef __cplusplus
-  public:
-    CONSTEXPR basep6_r() : addr_word(static_cast<uint32_t>(0)) {}
-    CONSTEXPR basep6_r(uint32_t init) : word(init) {}
-    CONSTEXPR void operator=(uint32_t value)
-    {
-        word = value;
-    }
-    void operator=(uint32_t value) volatile
-    {
-        word = value;
-    }
-    CONSTEXPR operator uint32_t()
-    {
-        return word;
-    }
-    operator uint32_t() volatile
-    {
-        return word;
-    }
-    basep6_r copy() volatile
-    {
-        return *this;
-    }
-    CONSTEXPR uint32_t get_addr_word() const
-    {
-        uint32_t value = static_cast<uint32_t>(addr_word);
-        return value;
-    }
-    uint32_t get_addr_word() const volatile
-    {
-        uint32_t value = static_cast<uint32_t>(addr_word);
-        return value;
-    }
-    CONSTEXPR basep6_r &set_addr_word(uint32_t value)
-    {
-        addr_word = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// basep7_r - Upper 32 bits of the Base pointer for region index 3
-struct basep7_r
-{
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
-    union
-    {
-        uint32_t addr_word; // The high word of the 64-bit address
-        uint32_t word;
-    };
-#ifdef __cplusplus
-  public:
-    CONSTEXPR basep7_r() : addr_word(static_cast<uint32_t>(0)) {}
-    CONSTEXPR basep7_r(uint32_t init) : word(init) {}
-    CONSTEXPR void operator=(uint32_t value)
-    {
-        word = value;
-    }
-    void operator=(uint32_t value) volatile
-    {
-        word = value;
-    }
-    CONSTEXPR operator uint32_t()
-    {
-        return word;
-    }
-    operator uint32_t() volatile
-    {
-        return word;
-    }
-    basep7_r copy() volatile
-    {
-        return *this;
-    }
-    CONSTEXPR uint32_t get_addr_word() const
-    {
-        uint32_t value = static_cast<uint32_t>(addr_word);
-        return value;
-    }
-    uint32_t get_addr_word() const volatile
-    {
-        uint32_t value = static_cast<uint32_t>(addr_word);
-        return value;
-    }
-    CONSTEXPR basep7_r &set_addr_word(uint32_t value)
-    {
-        addr_word = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// basep8_r - Lower 32 bits of the Base pointer for region index 4
-struct basep8_r
-{
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
-    union
-    {
-        uint32_t addr_word; // The low word of the 64-bit address
-        uint32_t word;
-    };
-#ifdef __cplusplus
-  public:
-    CONSTEXPR basep8_r() : addr_word(static_cast<uint32_t>(0)) {}
-    CONSTEXPR basep8_r(uint32_t init) : word(init) {}
-    CONSTEXPR void operator=(uint32_t value)
-    {
-        word = value;
-    }
-    void operator=(uint32_t value) volatile
-    {
-        word = value;
-    }
-    CONSTEXPR operator uint32_t()
-    {
-        return word;
-    }
-    operator uint32_t() volatile
-    {
-        return word;
-    }
-    basep8_r copy() volatile
-    {
-        return *this;
-    }
-    CONSTEXPR uint32_t get_addr_word() const
-    {
-        uint32_t value = static_cast<uint32_t>(addr_word);
-        return value;
-    }
-    uint32_t get_addr_word() const volatile
-    {
-        uint32_t value = static_cast<uint32_t>(addr_word);
-        return value;
-    }
-    CONSTEXPR basep8_r &set_addr_word(uint32_t value)
-    {
-        addr_word = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// basep9_r - Upper 32 bits of the Base pointer for region index 4
-struct basep9_r
-{
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
-    union
-    {
-        uint32_t addr_word; // The high word of the 64-bit address
-        uint32_t word;
-    };
-#ifdef __cplusplus
-  public:
-    CONSTEXPR basep9_r() : addr_word(static_cast<uint32_t>(0)) {}
-    CONSTEXPR basep9_r(uint32_t init) : word(init) {}
-    CONSTEXPR void operator=(uint32_t value)
-    {
-        word = value;
-    }
-    void operator=(uint32_t value) volatile
-    {
-        word = value;
-    }
-    CONSTEXPR operator uint32_t()
-    {
-        return word;
-    }
-    operator uint32_t() volatile
-    {
-        return word;
-    }
-    basep9_r copy() volatile
-    {
-        return *this;
-    }
-    CONSTEXPR uint32_t get_addr_word() const
-    {
-        uint32_t value = static_cast<uint32_t>(addr_word);
-        return value;
-    }
-    uint32_t get_addr_word() const volatile
-    {
-        uint32_t value = static_cast<uint32_t>(addr_word);
-        return value;
-    }
-    CONSTEXPR basep9_r &set_addr_word(uint32_t value)
-    {
-        addr_word = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// basep10_r - Lower 32 bits of the Base pointer for region index 5
-struct basep10_r
-{
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
-    union
-    {
-        uint32_t addr_word; // The low word of the 64-bit address
-        uint32_t word;
-    };
-#ifdef __cplusplus
-  public:
-    CONSTEXPR basep10_r() : addr_word(static_cast<uint32_t>(0)) {}
-    CONSTEXPR basep10_r(uint32_t init) : word(init) {}
-    CONSTEXPR void operator=(uint32_t value)
-    {
-        word = value;
-    }
-    void operator=(uint32_t value) volatile
-    {
-        word = value;
-    }
-    CONSTEXPR operator uint32_t()
-    {
-        return word;
-    }
-    operator uint32_t() volatile
-    {
-        return word;
-    }
-    basep10_r copy() volatile
-    {
-        return *this;
-    }
-    CONSTEXPR uint32_t get_addr_word() const
-    {
-        uint32_t value = static_cast<uint32_t>(addr_word);
-        return value;
-    }
-    uint32_t get_addr_word() const volatile
-    {
-        uint32_t value = static_cast<uint32_t>(addr_word);
-        return value;
-    }
-    CONSTEXPR basep10_r &set_addr_word(uint32_t value)
-    {
-        addr_word = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// basep11_r - Upper 32 bits of the Base pointer for region index 5
-struct basep11_r
-{
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
-    union
-    {
-        uint32_t addr_word; // The high word of the 64-bit address
-        uint32_t word;
-    };
-#ifdef __cplusplus
-  public:
-    CONSTEXPR basep11_r() : addr_word(static_cast<uint32_t>(0)) {}
-    CONSTEXPR basep11_r(uint32_t init) : word(init) {}
-    CONSTEXPR void operator=(uint32_t value)
-    {
-        word = value;
-    }
-    void operator=(uint32_t value) volatile
-    {
-        word = value;
-    }
-    CONSTEXPR operator uint32_t()
-    {
-        return word;
-    }
-    operator uint32_t() volatile
-    {
-        return word;
-    }
-    basep11_r copy() volatile
-    {
-        return *this;
-    }
-    CONSTEXPR uint32_t get_addr_word() const
-    {
-        uint32_t value = static_cast<uint32_t>(addr_word);
-        return value;
-    }
-    uint32_t get_addr_word() const volatile
-    {
-        uint32_t value = static_cast<uint32_t>(addr_word);
-        return value;
-    }
-    CONSTEXPR basep11_r &set_addr_word(uint32_t value)
-    {
-        addr_word = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// basep12_r - Lower 32 bits of the Base pointer for region index 6
-struct basep12_r
-{
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
-    union
-    {
-        uint32_t addr_word; // The low word of the 64-bit address
-        uint32_t word;
-    };
-#ifdef __cplusplus
-  public:
-    CONSTEXPR basep12_r() : addr_word(static_cast<uint32_t>(0)) {}
-    CONSTEXPR basep12_r(uint32_t init) : word(init) {}
-    CONSTEXPR void operator=(uint32_t value)
-    {
-        word = value;
-    }
-    void operator=(uint32_t value) volatile
-    {
-        word = value;
-    }
-    CONSTEXPR operator uint32_t()
-    {
-        return word;
-    }
-    operator uint32_t() volatile
-    {
-        return word;
-    }
-    basep12_r copy() volatile
-    {
-        return *this;
-    }
-    CONSTEXPR uint32_t get_addr_word() const
-    {
-        uint32_t value = static_cast<uint32_t>(addr_word);
-        return value;
-    }
-    uint32_t get_addr_word() const volatile
-    {
-        uint32_t value = static_cast<uint32_t>(addr_word);
-        return value;
-    }
-    CONSTEXPR basep12_r &set_addr_word(uint32_t value)
-    {
-        addr_word = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// basep13_r - Upper 32 bits of the Base pointer for region index 6
-struct basep13_r
-{
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
-    union
-    {
-        uint32_t addr_word; // The high word of the 64-bit address
-        uint32_t word;
-    };
-#ifdef __cplusplus
-  public:
-    CONSTEXPR basep13_r() : addr_word(static_cast<uint32_t>(0)) {}
-    CONSTEXPR basep13_r(uint32_t init) : word(init) {}
-    CONSTEXPR void operator=(uint32_t value)
-    {
-        word = value;
-    }
-    void operator=(uint32_t value) volatile
-    {
-        word = value;
-    }
-    CONSTEXPR operator uint32_t()
-    {
-        return word;
-    }
-    operator uint32_t() volatile
-    {
-        return word;
-    }
-    basep13_r copy() volatile
-    {
-        return *this;
-    }
-    CONSTEXPR uint32_t get_addr_word() const
-    {
-        uint32_t value = static_cast<uint32_t>(addr_word);
-        return value;
-    }
-    uint32_t get_addr_word() const volatile
-    {
-        uint32_t value = static_cast<uint32_t>(addr_word);
-        return value;
-    }
-    CONSTEXPR basep13_r &set_addr_word(uint32_t value)
-    {
-        addr_word = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// basep14_r - Lower 32 bits of the Base pointer for region index 7
-struct basep14_r
-{
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
-    union
-    {
-        uint32_t addr_word; // The low word of the 64-bit address
-        uint32_t word;
-    };
-#ifdef __cplusplus
-  public:
-    CONSTEXPR basep14_r() : addr_word(static_cast<uint32_t>(0)) {}
-    CONSTEXPR basep14_r(uint32_t init) : word(init) {}
-    CONSTEXPR void operator=(uint32_t value)
-    {
-        word = value;
-    }
-    void operator=(uint32_t value) volatile
-    {
-        word = value;
-    }
-    CONSTEXPR operator uint32_t()
-    {
-        return word;
-    }
-    operator uint32_t() volatile
-    {
-        return word;
-    }
-    basep14_r copy() volatile
-    {
-        return *this;
-    }
-    CONSTEXPR uint32_t get_addr_word() const
-    {
-        uint32_t value = static_cast<uint32_t>(addr_word);
-        return value;
-    }
-    uint32_t get_addr_word() const volatile
-    {
-        uint32_t value = static_cast<uint32_t>(addr_word);
-        return value;
-    }
-    CONSTEXPR basep14_r &set_addr_word(uint32_t value)
-    {
-        addr_word = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// basep15_r - Upper 32 bits of the Base pointer for region index 7
-struct basep15_r
-{
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
-    union
-    {
-        uint32_t addr_word; // The high word of the 64-bit address
-        uint32_t word;
-    };
-#ifdef __cplusplus
-  public:
-    CONSTEXPR basep15_r() : addr_word(static_cast<uint32_t>(0)) {}
-    CONSTEXPR basep15_r(uint32_t init) : word(init) {}
-    CONSTEXPR void operator=(uint32_t value)
-    {
-        word = value;
-    }
-    void operator=(uint32_t value) volatile
-    {
-        word = value;
-    }
-    CONSTEXPR operator uint32_t()
-    {
-        return word;
-    }
-    operator uint32_t() volatile
-    {
-        return word;
-    }
-    basep15_r copy() volatile
-    {
-        return *this;
-    }
-    CONSTEXPR uint32_t get_addr_word() const
-    {
-        uint32_t value = static_cast<uint32_t>(addr_word);
-        return value;
-    }
-    uint32_t get_addr_word() const volatile
-    {
-        uint32_t value = static_cast<uint32_t>(addr_word);
-        return value;
-    }
-    CONSTEXPR basep15_r &set_addr_word(uint32_t value)
-    {
-        addr_word = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// wd_status_r - WD_STATUS of core DEBUGCORE
-struct wd_status_r
-{
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
+#ifndef __cplusplus
     union
     {
         struct
         {
-            uint32_t core_slice_state : 2; // STATE_HEADER=0, STATE_PALETTE=1, STATE_WEIGHTS=2
+            uint32_t offset : 32; // Offset
+            uint32_t reserved0 : 32;
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR basep_r() : word0(0), word1(0) {}
+    CONSTEXPR basep_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    basep_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// wd_status_r - WD_STATUS
+struct wd_status_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t core_slice_state : 2; // WD core slice parser state
             uint32_t core_idle : 1;        // Core idle
-            uint32_t ctrl_state : 2;       // IDLE=0, DRAIN=1, OFD_INIT=2, OFD_RUN=3
+            uint32_t ctrl_state : 2;       // WD control state
             uint32_t ctrl_idle : 1;        // All stripe jobs idle (all weights consumed)
             uint32_t write_buf_index0 : 3; // current write index for next data from core
             uint32_t write_buf_valid0 : 1; // write buf valid (full)
@@ -3912,212 +3414,207 @@
         };
         uint32_t word;
     };
-#ifdef __cplusplus
+#else
+  private:
+    uint32_t word0;
+
   public:
-    CONSTEXPR wd_status_r() :
-        core_slice_state(static_cast<uint32_t>(0)), core_idle(static_cast<uint32_t>(0)),
-        ctrl_state(static_cast<uint32_t>(0)), ctrl_idle(static_cast<uint32_t>(0)),
-        write_buf_index0(static_cast<uint32_t>(0)), write_buf_valid0(static_cast<uint32_t>(0)),
-        write_buf_idle0(static_cast<uint32_t>(0)), write_buf_index1(static_cast<uint32_t>(0)),
-        write_buf_valid1(static_cast<uint32_t>(0)), write_buf_idle1(static_cast<uint32_t>(0)),
-        events(static_cast<uint32_t>(0)), reserved0(static_cast<uint32_t>(0))
-    {
-    }
-    CONSTEXPR wd_status_r(uint32_t init) : word(init) {}
+    CONSTEXPR wd_status_r() : word0(0) {}
+    CONSTEXPR wd_status_r(uint32_t init) : word0(init) {}
     CONSTEXPR void operator=(uint32_t value)
     {
-        word = value;
+        word0 = value;
     }
     void operator=(uint32_t value) volatile
     {
-        word = value;
+        word0 = value;
     }
     CONSTEXPR operator uint32_t()
     {
-        return word;
+        return word0;
     }
     operator uint32_t() volatile
     {
-        return word;
+        return word0;
     }
     wd_status_r copy() volatile
     {
         return *this;
     }
-    CONSTEXPR uint32_t get_core_slice_state() const
+    CONSTEXPR NPU_NAMESPACE::wd_core_slice_state get_core_slice_state() const
     {
-        uint32_t value = static_cast<uint32_t>(core_slice_state);
+        NPU_NAMESPACE::wd_core_slice_state value =
+            static_cast<NPU_NAMESPACE::wd_core_slice_state>(((1U << 2) - 1) & (word0 >> 0));
         return value;
     }
-    uint32_t get_core_slice_state() const volatile
+    NPU_NAMESPACE::wd_core_slice_state get_core_slice_state() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(core_slice_state);
+        NPU_NAMESPACE::wd_core_slice_state value =
+            static_cast<NPU_NAMESPACE::wd_core_slice_state>(((1U << 2) - 1) & (word0 >> 0));
         return value;
     }
-    CONSTEXPR wd_status_r &set_core_slice_state(uint32_t value)
+    CONSTEXPR wd_status_r &set_core_slice_state(NPU_NAMESPACE::wd_core_slice_state value)
     {
-        core_slice_state = ((1u << 2) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 2) - 1)) << 0) & word0) | ((((1U << 2) - 1) & static_cast<uint32_t>(value)) << 0);
         return *this;
     }
     CONSTEXPR uint32_t get_core_idle() const
     {
-        uint32_t value = static_cast<uint32_t>(core_idle);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
         return value;
     }
     uint32_t get_core_idle() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(core_idle);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
         return value;
     }
     CONSTEXPR wd_status_r &set_core_idle(uint32_t value)
     {
-        core_idle = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 2) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 2);
         return *this;
     }
-    CONSTEXPR uint32_t get_ctrl_state() const
+    CONSTEXPR NPU_NAMESPACE::wd_ctrl_state get_ctrl_state() const
     {
-        uint32_t value = static_cast<uint32_t>(ctrl_state);
+        NPU_NAMESPACE::wd_ctrl_state value = static_cast<NPU_NAMESPACE::wd_ctrl_state>(((1U << 2) - 1) & (word0 >> 3));
         return value;
     }
-    uint32_t get_ctrl_state() const volatile
+    NPU_NAMESPACE::wd_ctrl_state get_ctrl_state() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(ctrl_state);
+        NPU_NAMESPACE::wd_ctrl_state value = static_cast<NPU_NAMESPACE::wd_ctrl_state>(((1U << 2) - 1) & (word0 >> 3));
         return value;
     }
-    CONSTEXPR wd_status_r &set_ctrl_state(uint32_t value)
+    CONSTEXPR wd_status_r &set_ctrl_state(NPU_NAMESPACE::wd_ctrl_state value)
     {
-        ctrl_state = ((1u << 2) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 2) - 1)) << 3) & word0) | ((((1U << 2) - 1) & static_cast<uint32_t>(value)) << 3);
         return *this;
     }
     CONSTEXPR uint32_t get_ctrl_idle() const
     {
-        uint32_t value = static_cast<uint32_t>(ctrl_idle);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 5));
         return value;
     }
     uint32_t get_ctrl_idle() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(ctrl_idle);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 5));
         return value;
     }
     CONSTEXPR wd_status_r &set_ctrl_idle(uint32_t value)
     {
-        ctrl_idle = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 5) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 5);
         return *this;
     }
     CONSTEXPR uint32_t get_write_buf_index0() const
     {
-        uint32_t value = static_cast<uint32_t>(write_buf_index0);
+        uint32_t value = static_cast<uint32_t>(((1U << 3) - 1) & (word0 >> 6));
         return value;
     }
     uint32_t get_write_buf_index0() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(write_buf_index0);
+        uint32_t value = static_cast<uint32_t>(((1U << 3) - 1) & (word0 >> 6));
         return value;
     }
     CONSTEXPR wd_status_r &set_write_buf_index0(uint32_t value)
     {
-        write_buf_index0 = ((1u << 3) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 3) - 1)) << 6) & word0) | ((((1U << 3) - 1) & static_cast<uint32_t>(value)) << 6);
         return *this;
     }
     CONSTEXPR uint32_t get_write_buf_valid0() const
     {
-        uint32_t value = static_cast<uint32_t>(write_buf_valid0);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 9));
         return value;
     }
     uint32_t get_write_buf_valid0() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(write_buf_valid0);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 9));
         return value;
     }
     CONSTEXPR wd_status_r &set_write_buf_valid0(uint32_t value)
     {
-        write_buf_valid0 = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 9) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 9);
         return *this;
     }
     CONSTEXPR uint32_t get_write_buf_idle0() const
     {
-        uint32_t value = static_cast<uint32_t>(write_buf_idle0);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 10));
         return value;
     }
     uint32_t get_write_buf_idle0() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(write_buf_idle0);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 10));
         return value;
     }
     CONSTEXPR wd_status_r &set_write_buf_idle0(uint32_t value)
     {
-        write_buf_idle0 = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 10) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 10);
         return *this;
     }
     CONSTEXPR uint32_t get_write_buf_index1() const
     {
-        uint32_t value = static_cast<uint32_t>(write_buf_index1);
+        uint32_t value = static_cast<uint32_t>(((1U << 3) - 1) & (word0 >> 11));
         return value;
     }
     uint32_t get_write_buf_index1() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(write_buf_index1);
+        uint32_t value = static_cast<uint32_t>(((1U << 3) - 1) & (word0 >> 11));
         return value;
     }
     CONSTEXPR wd_status_r &set_write_buf_index1(uint32_t value)
     {
-        write_buf_index1 = ((1u << 3) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 3) - 1)) << 11) & word0) | ((((1U << 3) - 1) & static_cast<uint32_t>(value)) << 11);
         return *this;
     }
     CONSTEXPR uint32_t get_write_buf_valid1() const
     {
-        uint32_t value = static_cast<uint32_t>(write_buf_valid1);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 14));
         return value;
     }
     uint32_t get_write_buf_valid1() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(write_buf_valid1);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 14));
         return value;
     }
     CONSTEXPR wd_status_r &set_write_buf_valid1(uint32_t value)
     {
-        write_buf_valid1 = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 14) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 14);
         return *this;
     }
     CONSTEXPR uint32_t get_write_buf_idle1() const
     {
-        uint32_t value = static_cast<uint32_t>(write_buf_idle1);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 15));
         return value;
     }
     uint32_t get_write_buf_idle1() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(write_buf_idle1);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 15));
         return value;
     }
     CONSTEXPR wd_status_r &set_write_buf_idle1(uint32_t value)
     {
-        write_buf_idle1 = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 15) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 15);
         return *this;
     }
     CONSTEXPR uint32_t get_events() const
     {
-        uint32_t value = static_cast<uint32_t>(events);
+        uint32_t value = static_cast<uint32_t>(((1U << 12) - 1) & (word0 >> 16));
         return value;
     }
     uint32_t get_events() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(events);
+        uint32_t value = static_cast<uint32_t>(((1U << 12) - 1) & (word0 >> 16));
         return value;
     }
     CONSTEXPR wd_status_r &set_events(uint32_t value)
     {
-        events = ((1u << 12) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 12) - 1)) << 16) & word0) | ((((1U << 12) - 1) & static_cast<uint32_t>(value)) << 16);
         return *this;
     }
-#endif //__cplusplus
+#endif
 };
 
-// mac_status_r - MAC_STATUS of core DEBUGCORE
+// mac_status_r - MAC_STATUS
 struct mac_status_r
 {
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
+#ifndef __cplusplus
     union
     {
         struct
@@ -4143,36 +3640,28 @@
         };
         uint32_t word;
     };
-#ifdef __cplusplus
+#else
+  private:
+    uint32_t word0;
+
   public:
-    CONSTEXPR mac_status_r() :
-        block_cfg_valid(static_cast<uint32_t>(0)), trav_en(static_cast<uint32_t>(0)),
-        wait_for_ib(static_cast<uint32_t>(0)), wait_for_acc_buf(static_cast<uint32_t>(0)),
-        wait_for_weights(static_cast<uint32_t>(0)), stall_stripe(static_cast<uint32_t>(0)),
-        dw_sel(static_cast<uint32_t>(0)), wait_for_dw0_ready(static_cast<uint32_t>(0)),
-        wait_for_dw1_ready(static_cast<uint32_t>(0)), acc_buf_sel_ai(static_cast<uint32_t>(0)),
-        wait_for_acc0_ready(static_cast<uint32_t>(0)), wait_for_acc1_ready(static_cast<uint32_t>(0)),
-        acc_buf_sel_aa(static_cast<uint32_t>(0)), acc0_valid(static_cast<uint32_t>(0)),
-        acc1_valid(static_cast<uint32_t>(0)), reserved0(static_cast<uint32_t>(0)), events(static_cast<uint32_t>(0)),
-        reserved1(static_cast<uint32_t>(0))
-    {
-    }
-    CONSTEXPR mac_status_r(uint32_t init) : word(init) {}
+    CONSTEXPR mac_status_r() : word0(0) {}
+    CONSTEXPR mac_status_r(uint32_t init) : word0(init) {}
     CONSTEXPR void operator=(uint32_t value)
     {
-        word = value;
+        word0 = value;
     }
     void operator=(uint32_t value) volatile
     {
-        word = value;
+        word0 = value;
     }
     CONSTEXPR operator uint32_t()
     {
-        return word;
+        return word0;
     }
     operator uint32_t() volatile
     {
-        return word;
+        return word0;
     }
     mac_status_r copy() volatile
     {
@@ -4180,297 +3669,291 @@
     }
     CONSTEXPR uint32_t get_block_cfg_valid() const
     {
-        uint32_t value = static_cast<uint32_t>(block_cfg_valid);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 0));
         return value;
     }
     uint32_t get_block_cfg_valid() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(block_cfg_valid);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 0));
         return value;
     }
     CONSTEXPR mac_status_r &set_block_cfg_valid(uint32_t value)
     {
-        block_cfg_valid = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 0) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 0);
         return *this;
     }
     CONSTEXPR uint32_t get_trav_en() const
     {
-        uint32_t value = static_cast<uint32_t>(trav_en);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 1));
         return value;
     }
     uint32_t get_trav_en() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(trav_en);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 1));
         return value;
     }
     CONSTEXPR mac_status_r &set_trav_en(uint32_t value)
     {
-        trav_en = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 1) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 1);
         return *this;
     }
     CONSTEXPR uint32_t get_wait_for_ib() const
     {
-        uint32_t value = static_cast<uint32_t>(wait_for_ib);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
         return value;
     }
     uint32_t get_wait_for_ib() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(wait_for_ib);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
         return value;
     }
     CONSTEXPR mac_status_r &set_wait_for_ib(uint32_t value)
     {
-        wait_for_ib = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 2) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 2);
         return *this;
     }
     CONSTEXPR uint32_t get_wait_for_acc_buf() const
     {
-        uint32_t value = static_cast<uint32_t>(wait_for_acc_buf);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 3));
         return value;
     }
     uint32_t get_wait_for_acc_buf() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(wait_for_acc_buf);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 3));
         return value;
     }
     CONSTEXPR mac_status_r &set_wait_for_acc_buf(uint32_t value)
     {
-        wait_for_acc_buf = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 3) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 3);
         return *this;
     }
     CONSTEXPR uint32_t get_wait_for_weights() const
     {
-        uint32_t value = static_cast<uint32_t>(wait_for_weights);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 4));
         return value;
     }
     uint32_t get_wait_for_weights() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(wait_for_weights);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 4));
         return value;
     }
     CONSTEXPR mac_status_r &set_wait_for_weights(uint32_t value)
     {
-        wait_for_weights = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 4) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 4);
         return *this;
     }
     CONSTEXPR uint32_t get_stall_stripe() const
     {
-        uint32_t value = static_cast<uint32_t>(stall_stripe);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 5));
         return value;
     }
     uint32_t get_stall_stripe() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(stall_stripe);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 5));
         return value;
     }
     CONSTEXPR mac_status_r &set_stall_stripe(uint32_t value)
     {
-        stall_stripe = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 5) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 5);
         return *this;
     }
     CONSTEXPR uint32_t get_dw_sel() const
     {
-        uint32_t value = static_cast<uint32_t>(dw_sel);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 6));
         return value;
     }
     uint32_t get_dw_sel() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(dw_sel);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 6));
         return value;
     }
     CONSTEXPR mac_status_r &set_dw_sel(uint32_t value)
     {
-        dw_sel = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 6) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 6);
         return *this;
     }
     CONSTEXPR uint32_t get_wait_for_dw0_ready() const
     {
-        uint32_t value = static_cast<uint32_t>(wait_for_dw0_ready);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 7));
         return value;
     }
     uint32_t get_wait_for_dw0_ready() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(wait_for_dw0_ready);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 7));
         return value;
     }
     CONSTEXPR mac_status_r &set_wait_for_dw0_ready(uint32_t value)
     {
-        wait_for_dw0_ready = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 7) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 7);
         return *this;
     }
     CONSTEXPR uint32_t get_wait_for_dw1_ready() const
     {
-        uint32_t value = static_cast<uint32_t>(wait_for_dw1_ready);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 8));
         return value;
     }
     uint32_t get_wait_for_dw1_ready() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(wait_for_dw1_ready);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 8));
         return value;
     }
     CONSTEXPR mac_status_r &set_wait_for_dw1_ready(uint32_t value)
     {
-        wait_for_dw1_ready = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 8) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 8);
         return *this;
     }
     CONSTEXPR uint32_t get_acc_buf_sel_ai() const
     {
-        uint32_t value = static_cast<uint32_t>(acc_buf_sel_ai);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 9));
         return value;
     }
     uint32_t get_acc_buf_sel_ai() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(acc_buf_sel_ai);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 9));
         return value;
     }
     CONSTEXPR mac_status_r &set_acc_buf_sel_ai(uint32_t value)
     {
-        acc_buf_sel_ai = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 9) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 9);
         return *this;
     }
     CONSTEXPR uint32_t get_wait_for_acc0_ready() const
     {
-        uint32_t value = static_cast<uint32_t>(wait_for_acc0_ready);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 10));
         return value;
     }
     uint32_t get_wait_for_acc0_ready() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(wait_for_acc0_ready);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 10));
         return value;
     }
     CONSTEXPR mac_status_r &set_wait_for_acc0_ready(uint32_t value)
     {
-        wait_for_acc0_ready = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 10) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 10);
         return *this;
     }
     CONSTEXPR uint32_t get_wait_for_acc1_ready() const
     {
-        uint32_t value = static_cast<uint32_t>(wait_for_acc1_ready);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 11));
         return value;
     }
     uint32_t get_wait_for_acc1_ready() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(wait_for_acc1_ready);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 11));
         return value;
     }
     CONSTEXPR mac_status_r &set_wait_for_acc1_ready(uint32_t value)
     {
-        wait_for_acc1_ready = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 11) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 11);
         return *this;
     }
     CONSTEXPR uint32_t get_acc_buf_sel_aa() const
     {
-        uint32_t value = static_cast<uint32_t>(acc_buf_sel_aa);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 12));
         return value;
     }
     uint32_t get_acc_buf_sel_aa() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(acc_buf_sel_aa);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 12));
         return value;
     }
     CONSTEXPR mac_status_r &set_acc_buf_sel_aa(uint32_t value)
     {
-        acc_buf_sel_aa = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 12) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 12);
         return *this;
     }
     CONSTEXPR uint32_t get_acc0_valid() const
     {
-        uint32_t value = static_cast<uint32_t>(acc0_valid);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 13));
         return value;
     }
     uint32_t get_acc0_valid() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(acc0_valid);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 13));
         return value;
     }
     CONSTEXPR mac_status_r &set_acc0_valid(uint32_t value)
     {
-        acc0_valid = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 13) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 13);
         return *this;
     }
     CONSTEXPR uint32_t get_acc1_valid() const
     {
-        uint32_t value = static_cast<uint32_t>(acc1_valid);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 14));
         return value;
     }
     uint32_t get_acc1_valid() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(acc1_valid);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 14));
         return value;
     }
     CONSTEXPR mac_status_r &set_acc1_valid(uint32_t value)
     {
-        acc1_valid = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 14) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 14);
         return *this;
     }
     CONSTEXPR uint32_t get_events() const
     {
-        uint32_t value = static_cast<uint32_t>(events);
+        uint32_t value = static_cast<uint32_t>(((1U << 11) - 1) & (word0 >> 16));
         return value;
     }
     uint32_t get_events() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(events);
+        uint32_t value = static_cast<uint32_t>(((1U << 11) - 1) & (word0 >> 16));
         return value;
     }
     CONSTEXPR mac_status_r &set_events(uint32_t value)
     {
-        events = ((1u << 11) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 11) - 1)) << 16) & word0) | ((((1U << 11) - 1) & static_cast<uint32_t>(value)) << 16);
         return *this;
     }
-#endif //__cplusplus
+#endif
 };
 
-// ao_status_r - AO_STATUS of core DEBUGCORE
+// ao_status_r - AO_STATUS
 struct ao_status_r
 {
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
+#ifndef __cplusplus
     union
     {
         struct
         {
-            uint32_t cmd_sbw_valid : 1; // Block command to shared buffer write module is valid.
-            uint32_t cmd_act_valid : 1; // Block command to activation function module is valid.
-            uint32_t cmd_ctl_valid : 1; // Block command to control module is valid.
-            uint32_t cmd_scl_valid : 1; // Block command to scale module is valid.
-            uint32_t cmd_sbr_valid : 1; // Block command to shared buffer read module is valid.
-            uint32_t cmd_ofm_valid : 1; // Block command to ofm parameter module is valid.
-            uint32_t blk_cmd_ready : 1; // Ready to accept block command.
-            uint32_t blk_cmd_valid : 1; // Block command from CC is valid.
+            uint32_t cmd_sbw_valid : 1; // Block command to shared buffer write module is valid
+            uint32_t cmd_act_valid : 1; // Block command to activation function module is valid
+            uint32_t cmd_ctl_valid : 1; // Block command to control module is valid
+            uint32_t cmd_scl_valid : 1; // Block command to scale module is valid
+            uint32_t cmd_sbr_valid : 1; // Block command to shared buffer read module is valid
+            uint32_t cmd_ofm_valid : 1; // Block command to ofm parameter module is valid
+            uint32_t blk_cmd_ready : 1; // Ready to accept block command
+            uint32_t blk_cmd_valid : 1; // Block command from CC is valid
             uint32_t reserved0 : 8;
-            uint32_t events : 8; // Mapped to AO events described in Appendix A.
+            uint32_t events : 8; // Mapped to AO events described in Appendix A
             uint32_t reserved1 : 8;
         };
         uint32_t word;
     };
-#ifdef __cplusplus
+#else
+  private:
+    uint32_t word0;
+
   public:
-    CONSTEXPR ao_status_r() :
-        cmd_sbw_valid(static_cast<uint32_t>(0)), cmd_act_valid(static_cast<uint32_t>(0)),
-        cmd_ctl_valid(static_cast<uint32_t>(0)), cmd_scl_valid(static_cast<uint32_t>(0)),
-        cmd_sbr_valid(static_cast<uint32_t>(0)), cmd_ofm_valid(static_cast<uint32_t>(0)),
-        blk_cmd_ready(static_cast<uint32_t>(0)), blk_cmd_valid(static_cast<uint32_t>(0)),
-        reserved0(static_cast<uint32_t>(0)), events(static_cast<uint32_t>(0)), reserved1(static_cast<uint32_t>(0))
-    {
-    }
-    CONSTEXPR ao_status_r(uint32_t init) : word(init) {}
+    CONSTEXPR ao_status_r() : word0(0) {}
+    CONSTEXPR ao_status_r(uint32_t init) : word0(init) {}
     CONSTEXPR void operator=(uint32_t value)
     {
-        word = value;
+        word0 = value;
     }
     void operator=(uint32_t value) volatile
     {
-        word = value;
+        word0 = value;
     }
     CONSTEXPR operator uint32_t()
     {
-        return word;
+        return word0;
     }
     operator uint32_t() volatile
     {
-        return word;
+        return word0;
     }
     ao_status_r copy() volatile
     {
@@ -4478,1162 +3961,1130 @@
     }
     CONSTEXPR uint32_t get_cmd_sbw_valid() const
     {
-        uint32_t value = static_cast<uint32_t>(cmd_sbw_valid);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 0));
         return value;
     }
     uint32_t get_cmd_sbw_valid() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(cmd_sbw_valid);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 0));
         return value;
     }
     CONSTEXPR ao_status_r &set_cmd_sbw_valid(uint32_t value)
     {
-        cmd_sbw_valid = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 0) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 0);
         return *this;
     }
     CONSTEXPR uint32_t get_cmd_act_valid() const
     {
-        uint32_t value = static_cast<uint32_t>(cmd_act_valid);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 1));
         return value;
     }
     uint32_t get_cmd_act_valid() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(cmd_act_valid);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 1));
         return value;
     }
     CONSTEXPR ao_status_r &set_cmd_act_valid(uint32_t value)
     {
-        cmd_act_valid = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 1) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 1);
         return *this;
     }
     CONSTEXPR uint32_t get_cmd_ctl_valid() const
     {
-        uint32_t value = static_cast<uint32_t>(cmd_ctl_valid);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
         return value;
     }
     uint32_t get_cmd_ctl_valid() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(cmd_ctl_valid);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
         return value;
     }
     CONSTEXPR ao_status_r &set_cmd_ctl_valid(uint32_t value)
     {
-        cmd_ctl_valid = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 2) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 2);
         return *this;
     }
     CONSTEXPR uint32_t get_cmd_scl_valid() const
     {
-        uint32_t value = static_cast<uint32_t>(cmd_scl_valid);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 3));
         return value;
     }
     uint32_t get_cmd_scl_valid() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(cmd_scl_valid);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 3));
         return value;
     }
     CONSTEXPR ao_status_r &set_cmd_scl_valid(uint32_t value)
     {
-        cmd_scl_valid = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 3) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 3);
         return *this;
     }
     CONSTEXPR uint32_t get_cmd_sbr_valid() const
     {
-        uint32_t value = static_cast<uint32_t>(cmd_sbr_valid);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 4));
         return value;
     }
     uint32_t get_cmd_sbr_valid() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(cmd_sbr_valid);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 4));
         return value;
     }
     CONSTEXPR ao_status_r &set_cmd_sbr_valid(uint32_t value)
     {
-        cmd_sbr_valid = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 4) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 4);
         return *this;
     }
     CONSTEXPR uint32_t get_cmd_ofm_valid() const
     {
-        uint32_t value = static_cast<uint32_t>(cmd_ofm_valid);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 5));
         return value;
     }
     uint32_t get_cmd_ofm_valid() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(cmd_ofm_valid);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 5));
         return value;
     }
     CONSTEXPR ao_status_r &set_cmd_ofm_valid(uint32_t value)
     {
-        cmd_ofm_valid = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 5) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 5);
         return *this;
     }
     CONSTEXPR uint32_t get_blk_cmd_ready() const
     {
-        uint32_t value = static_cast<uint32_t>(blk_cmd_ready);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 6));
         return value;
     }
     uint32_t get_blk_cmd_ready() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(blk_cmd_ready);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 6));
         return value;
     }
     CONSTEXPR ao_status_r &set_blk_cmd_ready(uint32_t value)
     {
-        blk_cmd_ready = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 6) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 6);
         return *this;
     }
     CONSTEXPR uint32_t get_blk_cmd_valid() const
     {
-        uint32_t value = static_cast<uint32_t>(blk_cmd_valid);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 7));
         return value;
     }
     uint32_t get_blk_cmd_valid() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(blk_cmd_valid);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 7));
         return value;
     }
     CONSTEXPR ao_status_r &set_blk_cmd_valid(uint32_t value)
     {
-        blk_cmd_valid = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 7) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 7);
         return *this;
     }
     CONSTEXPR uint32_t get_events() const
     {
-        uint32_t value = static_cast<uint32_t>(events);
+        uint32_t value = static_cast<uint32_t>(((1U << 8) - 1) & (word0 >> 16));
         return value;
     }
     uint32_t get_events() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(events);
+        uint32_t value = static_cast<uint32_t>(((1U << 8) - 1) & (word0 >> 16));
         return value;
     }
     CONSTEXPR ao_status_r &set_events(uint32_t value)
     {
-        events = ((1u << 8) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 8) - 1)) << 16) & word0) | ((((1U << 8) - 1) & static_cast<uint32_t>(value)) << 16);
         return *this;
     }
-#endif //__cplusplus
+#endif
 };
 
-// dma_status0_r - DMA_STATUS0 of core DEBUGCORE
+// dma_status0_r - DMA_STATUS0
 struct dma_status0_r
 {
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
+#ifndef __cplusplus
     union
     {
         struct
         {
-            uint32_t CMD_IDLE : 1; // When this bit is high means that the CMD block is not busy in generating addresses
-                                   // for a CMD job.
-            uint32_t IFM_IDLE : 1; // When this bit is high means that there are no ongoing IFM jobs
-            uint32_t WGT_IDLE_C0 : 1; // When this bit is high means that the WGT block is not busy in generating
+            uint32_t cmd_idle : 1; // When this bit is high means that the CMD block is not busy in generating addresses
+                                   // for a CMD job
+            uint32_t ifm_idle : 1; // When this bit is high means that there are no ongoing IFM jobs
+            uint32_t wgt_idle_c0 : 1; // When this bit is high means that the WGT block is not busy in generating
                                       // addresses for a WGT job
-            uint32_t BAS_IDLE_C0 : 1; // When this bit is high means that the BAS block is not busy in generating
+            uint32_t bas_idle_c0 : 1; // When this bit is high means that the BAS block is not busy in generating
                                       // addresses for a BAS job
-            uint32_t M2M_IDLE : 1;    // When this bit is high means that there are no ongoing M2M jobs
-            uint32_t OFM_IDLE : 1;    // When this bit is high means that there are no ongoing OFM jobs
-            uint32_t HALT_REQ : 1;    // CPM has requested to HALT AXI bus before soft reset
-            uint32_t HALT_ACK : 1;    // DMA is in condition to halt the AXI bus since there are no pending transactions
-            uint32_t PAUSE_REQ : 1;   // CC has requested to pause the AXI
-            uint32_t PAUSE_ACK : 1; // DMA is in condition to pause the AXI bus since there are no pending transactions
-            uint32_t IB0_AI_VALID_C0 : 1;       // Data for AI to be read in IFM input buffer 0 - Core 0
-            uint32_t IB0_AI_READY_C0 : 1;       // Data consumed from AI in IFM input buffer 0 - Core 0
-            uint32_t IB1_AI_VALID_C0 : 1;       // Data for AI to be read in IFM input buffer 1 - Core 0
-            uint32_t IB1_AI_READY_C0 : 1;       // Data consumed from AI in IFM input buffer 1 - Core 0
-            uint32_t IB0_AO_VALID_C0 : 1;       // Data for AO to be read in IFM input buffer 0 - Core 0
-            uint32_t IB0_AO_READY_C0 : 1;       // Data consumed from AO in IFM input buffer 0 - Core 0
-            uint32_t IB1_AO_VALID_C0 : 1;       // Data for AO to be read in IFM input buffer 0 - Core 0
-            uint32_t IB1_AO_READY_C0 : 1;       // Data consumed from AO in IFM input buffer 1 - Core 0
-            uint32_t OB0_VALID_C0 : 1;          // Data for DMA ready to be consumed in OFM output buffer 0 -  Core 0
-            uint32_t OB0_READY_C0 : 1;          // Data consumed from DMA in OFM output buffer 0 - Core 0
-            uint32_t OB1_VALID_C0 : 1;          // Data for DMA ready to be consumed in OFM output buffer 1 -  Core 0
-            uint32_t OB1_READY_C0 : 1;          // Data consumed from DMA in OFM output buffer 1 - Core 0
-            uint32_t CMD_VALID : 1;             // New command word for CC to be consumed
-            uint32_t CMD_READY : 1;             // command word consumed by CC
-            uint32_t WD_BITSTREAM_VALID_C0 : 1; // New weight word for WD to be consumed - Core 0
-            uint32_t WD_BITSTREAM_READY_C0 : 1; // Weight word consumed by WD - Core 0
-            uint32_t BS_BITSTREAM_VALID_C0 : 1; // New BaS word for AO to be consumed - Core 0
-            uint32_t BS_BITSTREAM_READY_C0 : 1; // BaS word consumed by AO - Core 0
-            uint32_t AXI0_AR_STALLED : 1; // Read transfer request stalled on arready low AXI0 (due to memory system)
-            uint32_t AXI0_RD_LIMIT_STALL : 1; // Read stalled due to one AXI0 limit counter being reached
-            uint32_t AXI0_AW_STALLED : 1; // Write transfer request stalled on awready low AXI0 (due to memory system)
-            uint32_t AXI0_W_STALLED : 1;  // Write transfer stalled on awready low AXI0 (due to memory system)
+            uint32_t m2m_idle : 1;    // When this bit is high means that there are no ongoing M2M jobs
+            uint32_t ofm_idle : 1;    // When this bit is high means that there are no ongoing OFM jobs
+            uint32_t halt_req : 1;    // CPM has requested to HALT AXI bus before soft reset
+            uint32_t halt_ack : 1;    // DMA is in condition to halt the AXI bus since there are no pending transactions
+            uint32_t pause_req : 1;   // CC has requested to pause the AXI
+            uint32_t pause_ack : 1; // DMA is in condition to pause the AXI bus since there are no pending transactions
+            uint32_t ib0_ai_valid_c0 : 1;       // Data for AI to be read in IFM input buffer 0 - Core 0
+            uint32_t ib0_ai_ready_c0 : 1;       // Data consumed from AI in IFM input buffer 0 - Core 0
+            uint32_t ib1_ai_valid_c0 : 1;       // Data for AI to be read in IFM input buffer 1 - Core 0
+            uint32_t ib1_ai_ready_c0 : 1;       // Data consumed from AI in IFM input buffer 1 - Core 0
+            uint32_t ib0_ao_valid_c0 : 1;       // Data for AO to be read in IFM input buffer 0 - Core 0
+            uint32_t ib0_ao_ready_c0 : 1;       // Data consumed from AO in IFM input buffer 0 - Core 0
+            uint32_t ib1_ao_valid_c0 : 1;       // Data for AO to be read in IFM input buffer 0 - Core 0
+            uint32_t ib1_ao_ready_c0 : 1;       // Data consumed from AO in IFM input buffer 1 - Core 0
+            uint32_t ob0_valid_c0 : 1;          // Data for DMA ready to be consumed in OFM output buffer 0 -  Core 0
+            uint32_t ob0_ready_c0 : 1;          // Data consumed from DMA in OFM output buffer 0 - Core 0
+            uint32_t ob1_valid_c0 : 1;          // Data for DMA ready to be consumed in OFM output buffer 1 -  Core 0
+            uint32_t ob1_ready_c0 : 1;          // Data consumed from DMA in OFM output buffer 1 - Core 0
+            uint32_t cmd_valid : 1;             // New command word for CC to be consumed
+            uint32_t cmd_ready : 1;             // command word consumed by CC
+            uint32_t wd_bitstream_valid_c0 : 1; // New weight word for WD to be consumed - Core 0
+            uint32_t wd_bitstream_ready_c0 : 1; // Weight word consumed by WD - Core 0
+            uint32_t bs_bitstream_valid_c0 : 1; // New BaS word for AO to be consumed - Core 0
+            uint32_t bs_bitstream_ready_c0 : 1; // BaS word consumed by AO - Core 0
+            uint32_t axi0_ar_stalled : 1; // Read transfer request stalled on arready low AXI0 (due to memory system)
+            uint32_t axi0_rd_limit_stall : 1; // Read stalled due to one AXI0 limit counter being reached
+            uint32_t axi0_aw_stalled : 1; // Write transfer request stalled on awready low AXI0 (due to memory system)
+            uint32_t axi0_w_stalled : 1;  // Write transfer stalled on awready low AXI0 (due to memory system)
         };
         uint32_t word;
     };
-#ifdef __cplusplus
+#else
+  private:
+    uint32_t word0;
+
   public:
-    CONSTEXPR dma_status0_r() :
-        CMD_IDLE(static_cast<uint32_t>(0)), IFM_IDLE(static_cast<uint32_t>(0)), WGT_IDLE_C0(static_cast<uint32_t>(0)),
-        BAS_IDLE_C0(static_cast<uint32_t>(0)), M2M_IDLE(static_cast<uint32_t>(0)), OFM_IDLE(static_cast<uint32_t>(0)),
-        HALT_REQ(static_cast<uint32_t>(0)), HALT_ACK(static_cast<uint32_t>(0)), PAUSE_REQ(static_cast<uint32_t>(0)),
-        PAUSE_ACK(static_cast<uint32_t>(0)), IB0_AI_VALID_C0(static_cast<uint32_t>(0)),
-        IB0_AI_READY_C0(static_cast<uint32_t>(0)), IB1_AI_VALID_C0(static_cast<uint32_t>(0)),
-        IB1_AI_READY_C0(static_cast<uint32_t>(0)), IB0_AO_VALID_C0(static_cast<uint32_t>(0)),
-        IB0_AO_READY_C0(static_cast<uint32_t>(0)), IB1_AO_VALID_C0(static_cast<uint32_t>(0)),
-        IB1_AO_READY_C0(static_cast<uint32_t>(0)), OB0_VALID_C0(static_cast<uint32_t>(0)),
-        OB0_READY_C0(static_cast<uint32_t>(0)), OB1_VALID_C0(static_cast<uint32_t>(0)),
-        OB1_READY_C0(static_cast<uint32_t>(0)), CMD_VALID(static_cast<uint32_t>(0)),
-        CMD_READY(static_cast<uint32_t>(0)), WD_BITSTREAM_VALID_C0(static_cast<uint32_t>(0)),
-        WD_BITSTREAM_READY_C0(static_cast<uint32_t>(0)), BS_BITSTREAM_VALID_C0(static_cast<uint32_t>(0)),
-        BS_BITSTREAM_READY_C0(static_cast<uint32_t>(0)), AXI0_AR_STALLED(static_cast<uint32_t>(0)),
-        AXI0_RD_LIMIT_STALL(static_cast<uint32_t>(0)), AXI0_AW_STALLED(static_cast<uint32_t>(0)),
-        AXI0_W_STALLED(static_cast<uint32_t>(0))
-    {
-    }
-    CONSTEXPR dma_status0_r(uint32_t init) : word(init) {}
+    CONSTEXPR dma_status0_r() : word0(0) {}
+    CONSTEXPR dma_status0_r(uint32_t init) : word0(init) {}
     CONSTEXPR void operator=(uint32_t value)
     {
-        word = value;
+        word0 = value;
     }
     void operator=(uint32_t value) volatile
     {
-        word = value;
+        word0 = value;
     }
     CONSTEXPR operator uint32_t()
     {
-        return word;
+        return word0;
     }
     operator uint32_t() volatile
     {
-        return word;
+        return word0;
     }
     dma_status0_r copy() volatile
     {
         return *this;
     }
-    CONSTEXPR uint32_t get_CMD_IDLE() const
+    CONSTEXPR uint32_t get_cmd_idle() const
     {
-        uint32_t value = static_cast<uint32_t>(CMD_IDLE);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 0));
         return value;
     }
-    uint32_t get_CMD_IDLE() const volatile
+    uint32_t get_cmd_idle() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(CMD_IDLE);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 0));
         return value;
     }
-    CONSTEXPR dma_status0_r &set_CMD_IDLE(uint32_t value)
+    CONSTEXPR dma_status0_r &set_cmd_idle(uint32_t value)
     {
-        CMD_IDLE = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 0) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 0);
         return *this;
     }
-    CONSTEXPR uint32_t get_IFM_IDLE() const
+    CONSTEXPR uint32_t get_ifm_idle() const
     {
-        uint32_t value = static_cast<uint32_t>(IFM_IDLE);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 1));
         return value;
     }
-    uint32_t get_IFM_IDLE() const volatile
+    uint32_t get_ifm_idle() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(IFM_IDLE);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 1));
         return value;
     }
-    CONSTEXPR dma_status0_r &set_IFM_IDLE(uint32_t value)
+    CONSTEXPR dma_status0_r &set_ifm_idle(uint32_t value)
     {
-        IFM_IDLE = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 1) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 1);
         return *this;
     }
-    CONSTEXPR uint32_t get_WGT_IDLE_C0() const
+    CONSTEXPR uint32_t get_wgt_idle_c0() const
     {
-        uint32_t value = static_cast<uint32_t>(WGT_IDLE_C0);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
         return value;
     }
-    uint32_t get_WGT_IDLE_C0() const volatile
+    uint32_t get_wgt_idle_c0() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(WGT_IDLE_C0);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
         return value;
     }
-    CONSTEXPR dma_status0_r &set_WGT_IDLE_C0(uint32_t value)
+    CONSTEXPR dma_status0_r &set_wgt_idle_c0(uint32_t value)
     {
-        WGT_IDLE_C0 = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 2) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 2);
         return *this;
     }
-    CONSTEXPR uint32_t get_BAS_IDLE_C0() const
+    CONSTEXPR uint32_t get_bas_idle_c0() const
     {
-        uint32_t value = static_cast<uint32_t>(BAS_IDLE_C0);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 3));
         return value;
     }
-    uint32_t get_BAS_IDLE_C0() const volatile
+    uint32_t get_bas_idle_c0() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(BAS_IDLE_C0);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 3));
         return value;
     }
-    CONSTEXPR dma_status0_r &set_BAS_IDLE_C0(uint32_t value)
+    CONSTEXPR dma_status0_r &set_bas_idle_c0(uint32_t value)
     {
-        BAS_IDLE_C0 = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 3) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 3);
         return *this;
     }
-    CONSTEXPR uint32_t get_M2M_IDLE() const
+    CONSTEXPR uint32_t get_m2m_idle() const
     {
-        uint32_t value = static_cast<uint32_t>(M2M_IDLE);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 4));
         return value;
     }
-    uint32_t get_M2M_IDLE() const volatile
+    uint32_t get_m2m_idle() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(M2M_IDLE);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 4));
         return value;
     }
-    CONSTEXPR dma_status0_r &set_M2M_IDLE(uint32_t value)
+    CONSTEXPR dma_status0_r &set_m2m_idle(uint32_t value)
     {
-        M2M_IDLE = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 4) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 4);
         return *this;
     }
-    CONSTEXPR uint32_t get_OFM_IDLE() const
+    CONSTEXPR uint32_t get_ofm_idle() const
     {
-        uint32_t value = static_cast<uint32_t>(OFM_IDLE);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 5));
         return value;
     }
-    uint32_t get_OFM_IDLE() const volatile
+    uint32_t get_ofm_idle() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(OFM_IDLE);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 5));
         return value;
     }
-    CONSTEXPR dma_status0_r &set_OFM_IDLE(uint32_t value)
+    CONSTEXPR dma_status0_r &set_ofm_idle(uint32_t value)
     {
-        OFM_IDLE = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 5) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 5);
         return *this;
     }
-    CONSTEXPR uint32_t get_HALT_REQ() const
+    CONSTEXPR uint32_t get_halt_req() const
     {
-        uint32_t value = static_cast<uint32_t>(HALT_REQ);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 6));
         return value;
     }
-    uint32_t get_HALT_REQ() const volatile
+    uint32_t get_halt_req() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(HALT_REQ);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 6));
         return value;
     }
-    CONSTEXPR dma_status0_r &set_HALT_REQ(uint32_t value)
+    CONSTEXPR dma_status0_r &set_halt_req(uint32_t value)
     {
-        HALT_REQ = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 6) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 6);
         return *this;
     }
-    CONSTEXPR uint32_t get_HALT_ACK() const
+    CONSTEXPR uint32_t get_halt_ack() const
     {
-        uint32_t value = static_cast<uint32_t>(HALT_ACK);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 7));
         return value;
     }
-    uint32_t get_HALT_ACK() const volatile
+    uint32_t get_halt_ack() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(HALT_ACK);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 7));
         return value;
     }
-    CONSTEXPR dma_status0_r &set_HALT_ACK(uint32_t value)
+    CONSTEXPR dma_status0_r &set_halt_ack(uint32_t value)
     {
-        HALT_ACK = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 7) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 7);
         return *this;
     }
-    CONSTEXPR uint32_t get_PAUSE_REQ() const
+    CONSTEXPR uint32_t get_pause_req() const
     {
-        uint32_t value = static_cast<uint32_t>(PAUSE_REQ);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 8));
         return value;
     }
-    uint32_t get_PAUSE_REQ() const volatile
+    uint32_t get_pause_req() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(PAUSE_REQ);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 8));
         return value;
     }
-    CONSTEXPR dma_status0_r &set_PAUSE_REQ(uint32_t value)
+    CONSTEXPR dma_status0_r &set_pause_req(uint32_t value)
     {
-        PAUSE_REQ = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 8) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 8);
         return *this;
     }
-    CONSTEXPR uint32_t get_PAUSE_ACK() const
+    CONSTEXPR uint32_t get_pause_ack() const
     {
-        uint32_t value = static_cast<uint32_t>(PAUSE_ACK);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 9));
         return value;
     }
-    uint32_t get_PAUSE_ACK() const volatile
+    uint32_t get_pause_ack() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(PAUSE_ACK);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 9));
         return value;
     }
-    CONSTEXPR dma_status0_r &set_PAUSE_ACK(uint32_t value)
+    CONSTEXPR dma_status0_r &set_pause_ack(uint32_t value)
     {
-        PAUSE_ACK = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 9) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 9);
         return *this;
     }
-    CONSTEXPR uint32_t get_IB0_AI_VALID_C0() const
+    CONSTEXPR uint32_t get_ib0_ai_valid_c0() const
     {
-        uint32_t value = static_cast<uint32_t>(IB0_AI_VALID_C0);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 10));
         return value;
     }
-    uint32_t get_IB0_AI_VALID_C0() const volatile
+    uint32_t get_ib0_ai_valid_c0() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(IB0_AI_VALID_C0);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 10));
         return value;
     }
-    CONSTEXPR dma_status0_r &set_IB0_AI_VALID_C0(uint32_t value)
+    CONSTEXPR dma_status0_r &set_ib0_ai_valid_c0(uint32_t value)
     {
-        IB0_AI_VALID_C0 = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 10) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 10);
         return *this;
     }
-    CONSTEXPR uint32_t get_IB0_AI_READY_C0() const
+    CONSTEXPR uint32_t get_ib0_ai_ready_c0() const
     {
-        uint32_t value = static_cast<uint32_t>(IB0_AI_READY_C0);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 11));
         return value;
     }
-    uint32_t get_IB0_AI_READY_C0() const volatile
+    uint32_t get_ib0_ai_ready_c0() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(IB0_AI_READY_C0);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 11));
         return value;
     }
-    CONSTEXPR dma_status0_r &set_IB0_AI_READY_C0(uint32_t value)
+    CONSTEXPR dma_status0_r &set_ib0_ai_ready_c0(uint32_t value)
     {
-        IB0_AI_READY_C0 = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 11) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 11);
         return *this;
     }
-    CONSTEXPR uint32_t get_IB1_AI_VALID_C0() const
+    CONSTEXPR uint32_t get_ib1_ai_valid_c0() const
     {
-        uint32_t value = static_cast<uint32_t>(IB1_AI_VALID_C0);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 12));
         return value;
     }
-    uint32_t get_IB1_AI_VALID_C0() const volatile
+    uint32_t get_ib1_ai_valid_c0() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(IB1_AI_VALID_C0);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 12));
         return value;
     }
-    CONSTEXPR dma_status0_r &set_IB1_AI_VALID_C0(uint32_t value)
+    CONSTEXPR dma_status0_r &set_ib1_ai_valid_c0(uint32_t value)
     {
-        IB1_AI_VALID_C0 = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 12) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 12);
         return *this;
     }
-    CONSTEXPR uint32_t get_IB1_AI_READY_C0() const
+    CONSTEXPR uint32_t get_ib1_ai_ready_c0() const
     {
-        uint32_t value = static_cast<uint32_t>(IB1_AI_READY_C0);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 13));
         return value;
     }
-    uint32_t get_IB1_AI_READY_C0() const volatile
+    uint32_t get_ib1_ai_ready_c0() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(IB1_AI_READY_C0);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 13));
         return value;
     }
-    CONSTEXPR dma_status0_r &set_IB1_AI_READY_C0(uint32_t value)
+    CONSTEXPR dma_status0_r &set_ib1_ai_ready_c0(uint32_t value)
     {
-        IB1_AI_READY_C0 = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 13) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 13);
         return *this;
     }
-    CONSTEXPR uint32_t get_IB0_AO_VALID_C0() const
+    CONSTEXPR uint32_t get_ib0_ao_valid_c0() const
     {
-        uint32_t value = static_cast<uint32_t>(IB0_AO_VALID_C0);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 14));
         return value;
     }
-    uint32_t get_IB0_AO_VALID_C0() const volatile
+    uint32_t get_ib0_ao_valid_c0() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(IB0_AO_VALID_C0);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 14));
         return value;
     }
-    CONSTEXPR dma_status0_r &set_IB0_AO_VALID_C0(uint32_t value)
+    CONSTEXPR dma_status0_r &set_ib0_ao_valid_c0(uint32_t value)
     {
-        IB0_AO_VALID_C0 = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 14) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 14);
         return *this;
     }
-    CONSTEXPR uint32_t get_IB0_AO_READY_C0() const
+    CONSTEXPR uint32_t get_ib0_ao_ready_c0() const
     {
-        uint32_t value = static_cast<uint32_t>(IB0_AO_READY_C0);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 15));
         return value;
     }
-    uint32_t get_IB0_AO_READY_C0() const volatile
+    uint32_t get_ib0_ao_ready_c0() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(IB0_AO_READY_C0);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 15));
         return value;
     }
-    CONSTEXPR dma_status0_r &set_IB0_AO_READY_C0(uint32_t value)
+    CONSTEXPR dma_status0_r &set_ib0_ao_ready_c0(uint32_t value)
     {
-        IB0_AO_READY_C0 = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 15) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 15);
         return *this;
     }
-    CONSTEXPR uint32_t get_IB1_AO_VALID_C0() const
+    CONSTEXPR uint32_t get_ib1_ao_valid_c0() const
     {
-        uint32_t value = static_cast<uint32_t>(IB1_AO_VALID_C0);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 16));
         return value;
     }
-    uint32_t get_IB1_AO_VALID_C0() const volatile
+    uint32_t get_ib1_ao_valid_c0() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(IB1_AO_VALID_C0);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 16));
         return value;
     }
-    CONSTEXPR dma_status0_r &set_IB1_AO_VALID_C0(uint32_t value)
+    CONSTEXPR dma_status0_r &set_ib1_ao_valid_c0(uint32_t value)
     {
-        IB1_AO_VALID_C0 = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 16) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 16);
         return *this;
     }
-    CONSTEXPR uint32_t get_IB1_AO_READY_C0() const
+    CONSTEXPR uint32_t get_ib1_ao_ready_c0() const
     {
-        uint32_t value = static_cast<uint32_t>(IB1_AO_READY_C0);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 17));
         return value;
     }
-    uint32_t get_IB1_AO_READY_C0() const volatile
+    uint32_t get_ib1_ao_ready_c0() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(IB1_AO_READY_C0);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 17));
         return value;
     }
-    CONSTEXPR dma_status0_r &set_IB1_AO_READY_C0(uint32_t value)
+    CONSTEXPR dma_status0_r &set_ib1_ao_ready_c0(uint32_t value)
     {
-        IB1_AO_READY_C0 = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 17) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 17);
         return *this;
     }
-    CONSTEXPR uint32_t get_OB0_VALID_C0() const
+    CONSTEXPR uint32_t get_ob0_valid_c0() const
     {
-        uint32_t value = static_cast<uint32_t>(OB0_VALID_C0);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 18));
         return value;
     }
-    uint32_t get_OB0_VALID_C0() const volatile
+    uint32_t get_ob0_valid_c0() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(OB0_VALID_C0);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 18));
         return value;
     }
-    CONSTEXPR dma_status0_r &set_OB0_VALID_C0(uint32_t value)
+    CONSTEXPR dma_status0_r &set_ob0_valid_c0(uint32_t value)
     {
-        OB0_VALID_C0 = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 18) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 18);
         return *this;
     }
-    CONSTEXPR uint32_t get_OB0_READY_C0() const
+    CONSTEXPR uint32_t get_ob0_ready_c0() const
     {
-        uint32_t value = static_cast<uint32_t>(OB0_READY_C0);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 19));
         return value;
     }
-    uint32_t get_OB0_READY_C0() const volatile
+    uint32_t get_ob0_ready_c0() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(OB0_READY_C0);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 19));
         return value;
     }
-    CONSTEXPR dma_status0_r &set_OB0_READY_C0(uint32_t value)
+    CONSTEXPR dma_status0_r &set_ob0_ready_c0(uint32_t value)
     {
-        OB0_READY_C0 = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 19) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 19);
         return *this;
     }
-    CONSTEXPR uint32_t get_OB1_VALID_C0() const
+    CONSTEXPR uint32_t get_ob1_valid_c0() const
     {
-        uint32_t value = static_cast<uint32_t>(OB1_VALID_C0);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 20));
         return value;
     }
-    uint32_t get_OB1_VALID_C0() const volatile
+    uint32_t get_ob1_valid_c0() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(OB1_VALID_C0);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 20));
         return value;
     }
-    CONSTEXPR dma_status0_r &set_OB1_VALID_C0(uint32_t value)
+    CONSTEXPR dma_status0_r &set_ob1_valid_c0(uint32_t value)
     {
-        OB1_VALID_C0 = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 20) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 20);
         return *this;
     }
-    CONSTEXPR uint32_t get_OB1_READY_C0() const
+    CONSTEXPR uint32_t get_ob1_ready_c0() const
     {
-        uint32_t value = static_cast<uint32_t>(OB1_READY_C0);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 21));
         return value;
     }
-    uint32_t get_OB1_READY_C0() const volatile
+    uint32_t get_ob1_ready_c0() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(OB1_READY_C0);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 21));
         return value;
     }
-    CONSTEXPR dma_status0_r &set_OB1_READY_C0(uint32_t value)
+    CONSTEXPR dma_status0_r &set_ob1_ready_c0(uint32_t value)
     {
-        OB1_READY_C0 = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 21) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 21);
         return *this;
     }
-    CONSTEXPR uint32_t get_CMD_VALID() const
+    CONSTEXPR uint32_t get_cmd_valid() const
     {
-        uint32_t value = static_cast<uint32_t>(CMD_VALID);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 22));
         return value;
     }
-    uint32_t get_CMD_VALID() const volatile
+    uint32_t get_cmd_valid() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(CMD_VALID);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 22));
         return value;
     }
-    CONSTEXPR dma_status0_r &set_CMD_VALID(uint32_t value)
+    CONSTEXPR dma_status0_r &set_cmd_valid(uint32_t value)
     {
-        CMD_VALID = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 22) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 22);
         return *this;
     }
-    CONSTEXPR uint32_t get_CMD_READY() const
+    CONSTEXPR uint32_t get_cmd_ready() const
     {
-        uint32_t value = static_cast<uint32_t>(CMD_READY);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 23));
         return value;
     }
-    uint32_t get_CMD_READY() const volatile
+    uint32_t get_cmd_ready() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(CMD_READY);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 23));
         return value;
     }
-    CONSTEXPR dma_status0_r &set_CMD_READY(uint32_t value)
+    CONSTEXPR dma_status0_r &set_cmd_ready(uint32_t value)
     {
-        CMD_READY = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 23) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 23);
         return *this;
     }
-    CONSTEXPR uint32_t get_WD_BITSTREAM_VALID_C0() const
+    CONSTEXPR uint32_t get_wd_bitstream_valid_c0() const
     {
-        uint32_t value = static_cast<uint32_t>(WD_BITSTREAM_VALID_C0);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 24));
         return value;
     }
-    uint32_t get_WD_BITSTREAM_VALID_C0() const volatile
+    uint32_t get_wd_bitstream_valid_c0() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(WD_BITSTREAM_VALID_C0);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 24));
         return value;
     }
-    CONSTEXPR dma_status0_r &set_WD_BITSTREAM_VALID_C0(uint32_t value)
+    CONSTEXPR dma_status0_r &set_wd_bitstream_valid_c0(uint32_t value)
     {
-        WD_BITSTREAM_VALID_C0 = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 24) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 24);
         return *this;
     }
-    CONSTEXPR uint32_t get_WD_BITSTREAM_READY_C0() const
+    CONSTEXPR uint32_t get_wd_bitstream_ready_c0() const
     {
-        uint32_t value = static_cast<uint32_t>(WD_BITSTREAM_READY_C0);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 25));
         return value;
     }
-    uint32_t get_WD_BITSTREAM_READY_C0() const volatile
+    uint32_t get_wd_bitstream_ready_c0() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(WD_BITSTREAM_READY_C0);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 25));
         return value;
     }
-    CONSTEXPR dma_status0_r &set_WD_BITSTREAM_READY_C0(uint32_t value)
+    CONSTEXPR dma_status0_r &set_wd_bitstream_ready_c0(uint32_t value)
     {
-        WD_BITSTREAM_READY_C0 = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 25) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 25);
         return *this;
     }
-    CONSTEXPR uint32_t get_BS_BITSTREAM_VALID_C0() const
+    CONSTEXPR uint32_t get_bs_bitstream_valid_c0() const
     {
-        uint32_t value = static_cast<uint32_t>(BS_BITSTREAM_VALID_C0);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 26));
         return value;
     }
-    uint32_t get_BS_BITSTREAM_VALID_C0() const volatile
+    uint32_t get_bs_bitstream_valid_c0() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(BS_BITSTREAM_VALID_C0);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 26));
         return value;
     }
-    CONSTEXPR dma_status0_r &set_BS_BITSTREAM_VALID_C0(uint32_t value)
+    CONSTEXPR dma_status0_r &set_bs_bitstream_valid_c0(uint32_t value)
     {
-        BS_BITSTREAM_VALID_C0 = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 26) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 26);
         return *this;
     }
-    CONSTEXPR uint32_t get_BS_BITSTREAM_READY_C0() const
+    CONSTEXPR uint32_t get_bs_bitstream_ready_c0() const
     {
-        uint32_t value = static_cast<uint32_t>(BS_BITSTREAM_READY_C0);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 27));
         return value;
     }
-    uint32_t get_BS_BITSTREAM_READY_C0() const volatile
+    uint32_t get_bs_bitstream_ready_c0() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(BS_BITSTREAM_READY_C0);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 27));
         return value;
     }
-    CONSTEXPR dma_status0_r &set_BS_BITSTREAM_READY_C0(uint32_t value)
+    CONSTEXPR dma_status0_r &set_bs_bitstream_ready_c0(uint32_t value)
     {
-        BS_BITSTREAM_READY_C0 = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 27) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 27);
         return *this;
     }
-    CONSTEXPR uint32_t get_AXI0_AR_STALLED() const
+    CONSTEXPR uint32_t get_axi0_ar_stalled() const
     {
-        uint32_t value = static_cast<uint32_t>(AXI0_AR_STALLED);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 28));
         return value;
     }
-    uint32_t get_AXI0_AR_STALLED() const volatile
+    uint32_t get_axi0_ar_stalled() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(AXI0_AR_STALLED);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 28));
         return value;
     }
-    CONSTEXPR dma_status0_r &set_AXI0_AR_STALLED(uint32_t value)
+    CONSTEXPR dma_status0_r &set_axi0_ar_stalled(uint32_t value)
     {
-        AXI0_AR_STALLED = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 28) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 28);
         return *this;
     }
-    CONSTEXPR uint32_t get_AXI0_RD_LIMIT_STALL() const
+    CONSTEXPR uint32_t get_axi0_rd_limit_stall() const
     {
-        uint32_t value = static_cast<uint32_t>(AXI0_RD_LIMIT_STALL);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 29));
         return value;
     }
-    uint32_t get_AXI0_RD_LIMIT_STALL() const volatile
+    uint32_t get_axi0_rd_limit_stall() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(AXI0_RD_LIMIT_STALL);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 29));
         return value;
     }
-    CONSTEXPR dma_status0_r &set_AXI0_RD_LIMIT_STALL(uint32_t value)
+    CONSTEXPR dma_status0_r &set_axi0_rd_limit_stall(uint32_t value)
     {
-        AXI0_RD_LIMIT_STALL = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 29) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 29);
         return *this;
     }
-    CONSTEXPR uint32_t get_AXI0_AW_STALLED() const
+    CONSTEXPR uint32_t get_axi0_aw_stalled() const
     {
-        uint32_t value = static_cast<uint32_t>(AXI0_AW_STALLED);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 30));
         return value;
     }
-    uint32_t get_AXI0_AW_STALLED() const volatile
+    uint32_t get_axi0_aw_stalled() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(AXI0_AW_STALLED);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 30));
         return value;
     }
-    CONSTEXPR dma_status0_r &set_AXI0_AW_STALLED(uint32_t value)
+    CONSTEXPR dma_status0_r &set_axi0_aw_stalled(uint32_t value)
     {
-        AXI0_AW_STALLED = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 30) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 30);
         return *this;
     }
-    CONSTEXPR uint32_t get_AXI0_W_STALLED() const
+    CONSTEXPR uint32_t get_axi0_w_stalled() const
     {
-        uint32_t value = static_cast<uint32_t>(AXI0_W_STALLED);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 31));
         return value;
     }
-    uint32_t get_AXI0_W_STALLED() const volatile
+    uint32_t get_axi0_w_stalled() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(AXI0_W_STALLED);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 31));
         return value;
     }
-    CONSTEXPR dma_status0_r &set_AXI0_W_STALLED(uint32_t value)
+    CONSTEXPR dma_status0_r &set_axi0_w_stalled(uint32_t value)
     {
-        AXI0_W_STALLED = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 31) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 31);
         return *this;
     }
-#endif //__cplusplus
+#endif
 };
 
-// dma_status1_r - DMA_STATUS1 of core DEBUGCORE
+// dma_status1_r - DMA_STATUS1
 struct dma_status1_r
 {
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
+#ifndef __cplusplus
     union
     {
         struct
         {
-            uint32_t AXI0_WR_LIMIT_STALL : 1; // Write stalled due to one AXI0 limit counter being reached
-            uint32_t AXI1_AR_STALLED : 1; // Read transfer request stalled on arready low AXI1 (due to memory system)
-            uint32_t AXI1_RD_LIMIT_STALL : 1; // Read stalled due to one AXI1 limit counter being reached
-            uint32_t AXI1_WR_STALLED : 1; // Write transfer request stalled on awready low AXI1 (due to memory system)
-            uint32_t AXI1_W_STALLED : 1;  // Write transfer stalled on wready low AXI1 (due to memory system)
-            uint32_t AXI1_WR_LIMIT_STALL : 1; // Write stalled due to one AXI1 limit counter being reached
-            uint32_t WGT_IDLE_C1 : 1;     // When this bit is high means that the WGT block is not busy in generating
+            uint32_t axi0_wr_limit_stall : 1; // Write stalled due to one AXI0 limit counter being reached
+            uint32_t axi1_ar_stalled : 1; // Read transfer request stalled on arready low AXI1 (due to memory system)
+            uint32_t axi1_rd_limit_stall : 1; // Read stalled due to one AXI1 limit counter being reached
+            uint32_t axi1_wr_stalled : 1; // Write transfer request stalled on awready low AXI1 (due to memory system)
+            uint32_t axi1_w_stalled : 1;  // Write transfer stalled on wready low AXI1 (due to memory system)
+            uint32_t axi1_wr_limit_stall : 1; // Write stalled due to one AXI1 limit counter being reached
+            uint32_t wgt_idle_c1 : 1;     // When this bit is high means that the WGT block is not busy in generating
                                           // addresses for a WGT job
-            uint32_t BAS_IDLE_C1 : 1;     // When this bit is high means that the BAS block is not busy in generating
-                                          // addresses for a BAS job.
-            uint32_t IB0_AI_VALID_C1 : 1; // Data for AI to be read in IFM input buffer 0 - Core 1
-            uint32_t IB0_AI_READY_C1 : 1; // Data consumed from AI in IFM input buffer 0 - Core 1
-            uint32_t IB1_AI_VALID_C1 : 1; // Data for AI to be read in IFM input buffer 1 - Core 1
-            uint32_t IB1_AI_READY_C1 : 1; // Data consumed from AI in IFM input buffer 1 - Core 1
-            uint32_t IB0_AO_VALID_C1 : 1; // Data for AO to be read in IFM input buffer 0 - Core 1
-            uint32_t IB0_AO_READY_C1 : 1; // Data consumed from AO in IFM input buffer 0 - Core 1
-            uint32_t IB1_AO_VALID_C1 : 1; // Data for AO to be read in IFM input buffer 0 - Core 1
-            uint32_t IB1_AO_READY_C1 : 1; // Data consumed from AO in IFM input buffer 1 - Core 1
-            uint32_t OB0_VALID_C1 : 1;    // Data for DMA ready to be consumed in OFM output buffer 0 - Core 1
-            uint32_t OB0_READY_C1 : 1;    // Data consumed from DMA in OFM output buffer 0 - Core 1
-            uint32_t OB1_VALID_C1 : 1;    // Data for DMA ready to be consumed in OFM output buffer 1 - Core 1
-            uint32_t OB1_READY_C1 : 1;    // Data consumed from DMA in OFM output buffer 1 - Core 1
-            uint32_t WD_BITSTREAM_VALID_C1 : 1; // New weight word for WD to be consumed - Core 1
-            uint32_t WD_BITSTREAM_READY_C1 : 1; // Weight word consumed by WD - Core 1
-            uint32_t BS_BITSTREAM_VALID_C1 : 1; // New BaS word for AO to be consumed - Core 1
-            uint32_t BS_BITSTREAM_READY_C1 : 1; // BaS word consumed by AO - Core 1
+            uint32_t bas_idle_c1 : 1;     // When this bit is high means that the BAS block is not busy in generating
+                                          // addresses for a BAS job
+            uint32_t ib0_ai_valid_c1 : 1; // Data for AI to be read in IFM input buffer 0 - Core 1
+            uint32_t ib0_ai_ready_c1 : 1; // Data consumed from AI in IFM input buffer 0 - Core 1
+            uint32_t ib1_ai_valid_c1 : 1; // Data for AI to be read in IFM input buffer 1 - Core 1
+            uint32_t ib1_ai_ready_c1 : 1; // Data consumed from AI in IFM input buffer 1 - Core 1
+            uint32_t ib0_ao_valid_c1 : 1; // Data for AO to be read in IFM input buffer 0 - Core 1
+            uint32_t ib0_ao_ready_c1 : 1; // Data consumed from AO in IFM input buffer 0 - Core 1
+            uint32_t ib1_ao_valid_c1 : 1; // Data for AO to be read in IFM input buffer 0 - Core 1
+            uint32_t ib1_ao_ready_c1 : 1; // Data consumed from AO in IFM input buffer 1 - Core 1
+            uint32_t ob0_valid_c1 : 1;    // Data for DMA ready to be consumed in OFM output buffer 0 - Core 1
+            uint32_t ob0_ready_c1 : 1;    // Data consumed from DMA in OFM output buffer 0 - Core 1
+            uint32_t ob1_valid_c1 : 1;    // Data for DMA ready to be consumed in OFM output buffer 1 - Core 1
+            uint32_t ob1_ready_c1 : 1;    // Data consumed from DMA in OFM output buffer 1 - Core 1
+            uint32_t wd_bitstream_valid_c1 : 1; // New weight word for WD to be consumed - Core 1
+            uint32_t wd_bitstream_ready_c1 : 1; // Weight word consumed by WD - Core 1
+            uint32_t bs_bitstream_valid_c1 : 1; // New BaS word for AO to be consumed - Core 1
+            uint32_t bs_bitstream_ready_c1 : 1; // BaS word consumed by AO - Core 1
             uint32_t reserved0 : 8;
         };
         uint32_t word;
     };
-#ifdef __cplusplus
+#else
+  private:
+    uint32_t word0;
+
   public:
-    CONSTEXPR dma_status1_r() :
-        AXI0_WR_LIMIT_STALL(static_cast<uint32_t>(0)), AXI1_AR_STALLED(static_cast<uint32_t>(0)),
-        AXI1_RD_LIMIT_STALL(static_cast<uint32_t>(0)), AXI1_WR_STALLED(static_cast<uint32_t>(0)),
-        AXI1_W_STALLED(static_cast<uint32_t>(0)), AXI1_WR_LIMIT_STALL(static_cast<uint32_t>(0)),
-        WGT_IDLE_C1(static_cast<uint32_t>(0)), BAS_IDLE_C1(static_cast<uint32_t>(0)),
-        IB0_AI_VALID_C1(static_cast<uint32_t>(0)), IB0_AI_READY_C1(static_cast<uint32_t>(0)),
-        IB1_AI_VALID_C1(static_cast<uint32_t>(0)), IB1_AI_READY_C1(static_cast<uint32_t>(0)),
-        IB0_AO_VALID_C1(static_cast<uint32_t>(0)), IB0_AO_READY_C1(static_cast<uint32_t>(0)),
-        IB1_AO_VALID_C1(static_cast<uint32_t>(0)), IB1_AO_READY_C1(static_cast<uint32_t>(0)),
-        OB0_VALID_C1(static_cast<uint32_t>(0)), OB0_READY_C1(static_cast<uint32_t>(0)),
-        OB1_VALID_C1(static_cast<uint32_t>(0)), OB1_READY_C1(static_cast<uint32_t>(0)),
-        WD_BITSTREAM_VALID_C1(static_cast<uint32_t>(0)), WD_BITSTREAM_READY_C1(static_cast<uint32_t>(0)),
-        BS_BITSTREAM_VALID_C1(static_cast<uint32_t>(0)), BS_BITSTREAM_READY_C1(static_cast<uint32_t>(0)),
-        reserved0(static_cast<uint32_t>(0))
-    {
-    }
-    CONSTEXPR dma_status1_r(uint32_t init) : word(init) {}
+    CONSTEXPR dma_status1_r() : word0(0) {}
+    CONSTEXPR dma_status1_r(uint32_t init) : word0(init) {}
     CONSTEXPR void operator=(uint32_t value)
     {
-        word = value;
+        word0 = value;
     }
     void operator=(uint32_t value) volatile
     {
-        word = value;
+        word0 = value;
     }
     CONSTEXPR operator uint32_t()
     {
-        return word;
+        return word0;
     }
     operator uint32_t() volatile
     {
-        return word;
+        return word0;
     }
     dma_status1_r copy() volatile
     {
         return *this;
     }
-    CONSTEXPR uint32_t get_AXI0_WR_LIMIT_STALL() const
+    CONSTEXPR uint32_t get_axi0_wr_limit_stall() const
     {
-        uint32_t value = static_cast<uint32_t>(AXI0_WR_LIMIT_STALL);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 0));
         return value;
     }
-    uint32_t get_AXI0_WR_LIMIT_STALL() const volatile
+    uint32_t get_axi0_wr_limit_stall() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(AXI0_WR_LIMIT_STALL);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 0));
         return value;
     }
-    CONSTEXPR dma_status1_r &set_AXI0_WR_LIMIT_STALL(uint32_t value)
+    CONSTEXPR dma_status1_r &set_axi0_wr_limit_stall(uint32_t value)
     {
-        AXI0_WR_LIMIT_STALL = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 0) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 0);
         return *this;
     }
-    CONSTEXPR uint32_t get_AXI1_AR_STALLED() const
+    CONSTEXPR uint32_t get_axi1_ar_stalled() const
     {
-        uint32_t value = static_cast<uint32_t>(AXI1_AR_STALLED);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 1));
         return value;
     }
-    uint32_t get_AXI1_AR_STALLED() const volatile
+    uint32_t get_axi1_ar_stalled() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(AXI1_AR_STALLED);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 1));
         return value;
     }
-    CONSTEXPR dma_status1_r &set_AXI1_AR_STALLED(uint32_t value)
+    CONSTEXPR dma_status1_r &set_axi1_ar_stalled(uint32_t value)
     {
-        AXI1_AR_STALLED = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 1) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 1);
         return *this;
     }
-    CONSTEXPR uint32_t get_AXI1_RD_LIMIT_STALL() const
+    CONSTEXPR uint32_t get_axi1_rd_limit_stall() const
     {
-        uint32_t value = static_cast<uint32_t>(AXI1_RD_LIMIT_STALL);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
         return value;
     }
-    uint32_t get_AXI1_RD_LIMIT_STALL() const volatile
+    uint32_t get_axi1_rd_limit_stall() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(AXI1_RD_LIMIT_STALL);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
         return value;
     }
-    CONSTEXPR dma_status1_r &set_AXI1_RD_LIMIT_STALL(uint32_t value)
+    CONSTEXPR dma_status1_r &set_axi1_rd_limit_stall(uint32_t value)
     {
-        AXI1_RD_LIMIT_STALL = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 2) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 2);
         return *this;
     }
-    CONSTEXPR uint32_t get_AXI1_WR_STALLED() const
+    CONSTEXPR uint32_t get_axi1_wr_stalled() const
     {
-        uint32_t value = static_cast<uint32_t>(AXI1_WR_STALLED);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 3));
         return value;
     }
-    uint32_t get_AXI1_WR_STALLED() const volatile
+    uint32_t get_axi1_wr_stalled() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(AXI1_WR_STALLED);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 3));
         return value;
     }
-    CONSTEXPR dma_status1_r &set_AXI1_WR_STALLED(uint32_t value)
+    CONSTEXPR dma_status1_r &set_axi1_wr_stalled(uint32_t value)
     {
-        AXI1_WR_STALLED = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 3) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 3);
         return *this;
     }
-    CONSTEXPR uint32_t get_AXI1_W_STALLED() const
+    CONSTEXPR uint32_t get_axi1_w_stalled() const
     {
-        uint32_t value = static_cast<uint32_t>(AXI1_W_STALLED);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 4));
         return value;
     }
-    uint32_t get_AXI1_W_STALLED() const volatile
+    uint32_t get_axi1_w_stalled() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(AXI1_W_STALLED);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 4));
         return value;
     }
-    CONSTEXPR dma_status1_r &set_AXI1_W_STALLED(uint32_t value)
+    CONSTEXPR dma_status1_r &set_axi1_w_stalled(uint32_t value)
     {
-        AXI1_W_STALLED = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 4) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 4);
         return *this;
     }
-    CONSTEXPR uint32_t get_AXI1_WR_LIMIT_STALL() const
+    CONSTEXPR uint32_t get_axi1_wr_limit_stall() const
     {
-        uint32_t value = static_cast<uint32_t>(AXI1_WR_LIMIT_STALL);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 5));
         return value;
     }
-    uint32_t get_AXI1_WR_LIMIT_STALL() const volatile
+    uint32_t get_axi1_wr_limit_stall() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(AXI1_WR_LIMIT_STALL);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 5));
         return value;
     }
-    CONSTEXPR dma_status1_r &set_AXI1_WR_LIMIT_STALL(uint32_t value)
+    CONSTEXPR dma_status1_r &set_axi1_wr_limit_stall(uint32_t value)
     {
-        AXI1_WR_LIMIT_STALL = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 5) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 5);
         return *this;
     }
-    CONSTEXPR uint32_t get_WGT_IDLE_C1() const
+    CONSTEXPR uint32_t get_wgt_idle_c1() const
     {
-        uint32_t value = static_cast<uint32_t>(WGT_IDLE_C1);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 6));
         return value;
     }
-    uint32_t get_WGT_IDLE_C1() const volatile
+    uint32_t get_wgt_idle_c1() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(WGT_IDLE_C1);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 6));
         return value;
     }
-    CONSTEXPR dma_status1_r &set_WGT_IDLE_C1(uint32_t value)
+    CONSTEXPR dma_status1_r &set_wgt_idle_c1(uint32_t value)
     {
-        WGT_IDLE_C1 = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 6) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 6);
         return *this;
     }
-    CONSTEXPR uint32_t get_BAS_IDLE_C1() const
+    CONSTEXPR uint32_t get_bas_idle_c1() const
     {
-        uint32_t value = static_cast<uint32_t>(BAS_IDLE_C1);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 7));
         return value;
     }
-    uint32_t get_BAS_IDLE_C1() const volatile
+    uint32_t get_bas_idle_c1() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(BAS_IDLE_C1);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 7));
         return value;
     }
-    CONSTEXPR dma_status1_r &set_BAS_IDLE_C1(uint32_t value)
+    CONSTEXPR dma_status1_r &set_bas_idle_c1(uint32_t value)
     {
-        BAS_IDLE_C1 = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 7) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 7);
         return *this;
     }
-    CONSTEXPR uint32_t get_IB0_AI_VALID_C1() const
+    CONSTEXPR uint32_t get_ib0_ai_valid_c1() const
     {
-        uint32_t value = static_cast<uint32_t>(IB0_AI_VALID_C1);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 8));
         return value;
     }
-    uint32_t get_IB0_AI_VALID_C1() const volatile
+    uint32_t get_ib0_ai_valid_c1() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(IB0_AI_VALID_C1);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 8));
         return value;
     }
-    CONSTEXPR dma_status1_r &set_IB0_AI_VALID_C1(uint32_t value)
+    CONSTEXPR dma_status1_r &set_ib0_ai_valid_c1(uint32_t value)
     {
-        IB0_AI_VALID_C1 = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 8) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 8);
         return *this;
     }
-    CONSTEXPR uint32_t get_IB0_AI_READY_C1() const
+    CONSTEXPR uint32_t get_ib0_ai_ready_c1() const
     {
-        uint32_t value = static_cast<uint32_t>(IB0_AI_READY_C1);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 9));
         return value;
     }
-    uint32_t get_IB0_AI_READY_C1() const volatile
+    uint32_t get_ib0_ai_ready_c1() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(IB0_AI_READY_C1);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 9));
         return value;
     }
-    CONSTEXPR dma_status1_r &set_IB0_AI_READY_C1(uint32_t value)
+    CONSTEXPR dma_status1_r &set_ib0_ai_ready_c1(uint32_t value)
     {
-        IB0_AI_READY_C1 = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 9) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 9);
         return *this;
     }
-    CONSTEXPR uint32_t get_IB1_AI_VALID_C1() const
+    CONSTEXPR uint32_t get_ib1_ai_valid_c1() const
     {
-        uint32_t value = static_cast<uint32_t>(IB1_AI_VALID_C1);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 10));
         return value;
     }
-    uint32_t get_IB1_AI_VALID_C1() const volatile
+    uint32_t get_ib1_ai_valid_c1() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(IB1_AI_VALID_C1);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 10));
         return value;
     }
-    CONSTEXPR dma_status1_r &set_IB1_AI_VALID_C1(uint32_t value)
+    CONSTEXPR dma_status1_r &set_ib1_ai_valid_c1(uint32_t value)
     {
-        IB1_AI_VALID_C1 = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 10) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 10);
         return *this;
     }
-    CONSTEXPR uint32_t get_IB1_AI_READY_C1() const
+    CONSTEXPR uint32_t get_ib1_ai_ready_c1() const
     {
-        uint32_t value = static_cast<uint32_t>(IB1_AI_READY_C1);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 11));
         return value;
     }
-    uint32_t get_IB1_AI_READY_C1() const volatile
+    uint32_t get_ib1_ai_ready_c1() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(IB1_AI_READY_C1);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 11));
         return value;
     }
-    CONSTEXPR dma_status1_r &set_IB1_AI_READY_C1(uint32_t value)
+    CONSTEXPR dma_status1_r &set_ib1_ai_ready_c1(uint32_t value)
     {
-        IB1_AI_READY_C1 = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 11) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 11);
         return *this;
     }
-    CONSTEXPR uint32_t get_IB0_AO_VALID_C1() const
+    CONSTEXPR uint32_t get_ib0_ao_valid_c1() const
     {
-        uint32_t value = static_cast<uint32_t>(IB0_AO_VALID_C1);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 12));
         return value;
     }
-    uint32_t get_IB0_AO_VALID_C1() const volatile
+    uint32_t get_ib0_ao_valid_c1() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(IB0_AO_VALID_C1);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 12));
         return value;
     }
-    CONSTEXPR dma_status1_r &set_IB0_AO_VALID_C1(uint32_t value)
+    CONSTEXPR dma_status1_r &set_ib0_ao_valid_c1(uint32_t value)
     {
-        IB0_AO_VALID_C1 = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 12) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 12);
         return *this;
     }
-    CONSTEXPR uint32_t get_IB0_AO_READY_C1() const
+    CONSTEXPR uint32_t get_ib0_ao_ready_c1() const
     {
-        uint32_t value = static_cast<uint32_t>(IB0_AO_READY_C1);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 13));
         return value;
     }
-    uint32_t get_IB0_AO_READY_C1() const volatile
+    uint32_t get_ib0_ao_ready_c1() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(IB0_AO_READY_C1);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 13));
         return value;
     }
-    CONSTEXPR dma_status1_r &set_IB0_AO_READY_C1(uint32_t value)
+    CONSTEXPR dma_status1_r &set_ib0_ao_ready_c1(uint32_t value)
     {
-        IB0_AO_READY_C1 = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 13) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 13);
         return *this;
     }
-    CONSTEXPR uint32_t get_IB1_AO_VALID_C1() const
+    CONSTEXPR uint32_t get_ib1_ao_valid_c1() const
     {
-        uint32_t value = static_cast<uint32_t>(IB1_AO_VALID_C1);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 14));
         return value;
     }
-    uint32_t get_IB1_AO_VALID_C1() const volatile
+    uint32_t get_ib1_ao_valid_c1() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(IB1_AO_VALID_C1);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 14));
         return value;
     }
-    CONSTEXPR dma_status1_r &set_IB1_AO_VALID_C1(uint32_t value)
+    CONSTEXPR dma_status1_r &set_ib1_ao_valid_c1(uint32_t value)
     {
-        IB1_AO_VALID_C1 = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 14) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 14);
         return *this;
     }
-    CONSTEXPR uint32_t get_IB1_AO_READY_C1() const
+    CONSTEXPR uint32_t get_ib1_ao_ready_c1() const
     {
-        uint32_t value = static_cast<uint32_t>(IB1_AO_READY_C1);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 15));
         return value;
     }
-    uint32_t get_IB1_AO_READY_C1() const volatile
+    uint32_t get_ib1_ao_ready_c1() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(IB1_AO_READY_C1);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 15));
         return value;
     }
-    CONSTEXPR dma_status1_r &set_IB1_AO_READY_C1(uint32_t value)
+    CONSTEXPR dma_status1_r &set_ib1_ao_ready_c1(uint32_t value)
     {
-        IB1_AO_READY_C1 = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 15) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 15);
         return *this;
     }
-    CONSTEXPR uint32_t get_OB0_VALID_C1() const
+    CONSTEXPR uint32_t get_ob0_valid_c1() const
     {
-        uint32_t value = static_cast<uint32_t>(OB0_VALID_C1);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 16));
         return value;
     }
-    uint32_t get_OB0_VALID_C1() const volatile
+    uint32_t get_ob0_valid_c1() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(OB0_VALID_C1);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 16));
         return value;
     }
-    CONSTEXPR dma_status1_r &set_OB0_VALID_C1(uint32_t value)
+    CONSTEXPR dma_status1_r &set_ob0_valid_c1(uint32_t value)
     {
-        OB0_VALID_C1 = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 16) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 16);
         return *this;
     }
-    CONSTEXPR uint32_t get_OB0_READY_C1() const
+    CONSTEXPR uint32_t get_ob0_ready_c1() const
     {
-        uint32_t value = static_cast<uint32_t>(OB0_READY_C1);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 17));
         return value;
     }
-    uint32_t get_OB0_READY_C1() const volatile
+    uint32_t get_ob0_ready_c1() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(OB0_READY_C1);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 17));
         return value;
     }
-    CONSTEXPR dma_status1_r &set_OB0_READY_C1(uint32_t value)
+    CONSTEXPR dma_status1_r &set_ob0_ready_c1(uint32_t value)
     {
-        OB0_READY_C1 = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 17) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 17);
         return *this;
     }
-    CONSTEXPR uint32_t get_OB1_VALID_C1() const
+    CONSTEXPR uint32_t get_ob1_valid_c1() const
     {
-        uint32_t value = static_cast<uint32_t>(OB1_VALID_C1);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 18));
         return value;
     }
-    uint32_t get_OB1_VALID_C1() const volatile
+    uint32_t get_ob1_valid_c1() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(OB1_VALID_C1);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 18));
         return value;
     }
-    CONSTEXPR dma_status1_r &set_OB1_VALID_C1(uint32_t value)
+    CONSTEXPR dma_status1_r &set_ob1_valid_c1(uint32_t value)
     {
-        OB1_VALID_C1 = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 18) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 18);
         return *this;
     }
-    CONSTEXPR uint32_t get_OB1_READY_C1() const
+    CONSTEXPR uint32_t get_ob1_ready_c1() const
     {
-        uint32_t value = static_cast<uint32_t>(OB1_READY_C1);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 19));
         return value;
     }
-    uint32_t get_OB1_READY_C1() const volatile
+    uint32_t get_ob1_ready_c1() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(OB1_READY_C1);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 19));
         return value;
     }
-    CONSTEXPR dma_status1_r &set_OB1_READY_C1(uint32_t value)
+    CONSTEXPR dma_status1_r &set_ob1_ready_c1(uint32_t value)
     {
-        OB1_READY_C1 = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 19) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 19);
         return *this;
     }
-    CONSTEXPR uint32_t get_WD_BITSTREAM_VALID_C1() const
+    CONSTEXPR uint32_t get_wd_bitstream_valid_c1() const
     {
-        uint32_t value = static_cast<uint32_t>(WD_BITSTREAM_VALID_C1);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 20));
         return value;
     }
-    uint32_t get_WD_BITSTREAM_VALID_C1() const volatile
+    uint32_t get_wd_bitstream_valid_c1() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(WD_BITSTREAM_VALID_C1);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 20));
         return value;
     }
-    CONSTEXPR dma_status1_r &set_WD_BITSTREAM_VALID_C1(uint32_t value)
+    CONSTEXPR dma_status1_r &set_wd_bitstream_valid_c1(uint32_t value)
     {
-        WD_BITSTREAM_VALID_C1 = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 20) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 20);
         return *this;
     }
-    CONSTEXPR uint32_t get_WD_BITSTREAM_READY_C1() const
+    CONSTEXPR uint32_t get_wd_bitstream_ready_c1() const
     {
-        uint32_t value = static_cast<uint32_t>(WD_BITSTREAM_READY_C1);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 21));
         return value;
     }
-    uint32_t get_WD_BITSTREAM_READY_C1() const volatile
+    uint32_t get_wd_bitstream_ready_c1() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(WD_BITSTREAM_READY_C1);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 21));
         return value;
     }
-    CONSTEXPR dma_status1_r &set_WD_BITSTREAM_READY_C1(uint32_t value)
+    CONSTEXPR dma_status1_r &set_wd_bitstream_ready_c1(uint32_t value)
     {
-        WD_BITSTREAM_READY_C1 = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 21) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 21);
         return *this;
     }
-    CONSTEXPR uint32_t get_BS_BITSTREAM_VALID_C1() const
+    CONSTEXPR uint32_t get_bs_bitstream_valid_c1() const
     {
-        uint32_t value = static_cast<uint32_t>(BS_BITSTREAM_VALID_C1);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 22));
         return value;
     }
-    uint32_t get_BS_BITSTREAM_VALID_C1() const volatile
+    uint32_t get_bs_bitstream_valid_c1() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(BS_BITSTREAM_VALID_C1);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 22));
         return value;
     }
-    CONSTEXPR dma_status1_r &set_BS_BITSTREAM_VALID_C1(uint32_t value)
+    CONSTEXPR dma_status1_r &set_bs_bitstream_valid_c1(uint32_t value)
     {
-        BS_BITSTREAM_VALID_C1 = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 22) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 22);
         return *this;
     }
-    CONSTEXPR uint32_t get_BS_BITSTREAM_READY_C1() const
+    CONSTEXPR uint32_t get_bs_bitstream_ready_c1() const
     {
-        uint32_t value = static_cast<uint32_t>(BS_BITSTREAM_READY_C1);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 23));
         return value;
     }
-    uint32_t get_BS_BITSTREAM_READY_C1() const volatile
+    uint32_t get_bs_bitstream_ready_c1() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(BS_BITSTREAM_READY_C1);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 23));
         return value;
     }
-    CONSTEXPR dma_status1_r &set_BS_BITSTREAM_READY_C1(uint32_t value)
+    CONSTEXPR dma_status1_r &set_bs_bitstream_ready_c1(uint32_t value)
     {
-        BS_BITSTREAM_READY_C1 = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 23) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 23);
         return *this;
     }
-#endif //__cplusplus
+#endif
 };
 
 // clkforce_r - Force clocks on for clock gating
 struct clkforce_r
 {
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
+#ifndef __cplusplus
     union
     {
         struct
@@ -5648,30 +5099,28 @@
         };
         uint32_t word;
     };
-#ifdef __cplusplus
+#else
+  private:
+    uint32_t word0;
+
   public:
-    CONSTEXPR clkforce_r() :
-        top_level_clk(static_cast<uint32_t>(0)), cc_clk(static_cast<uint32_t>(0)), dma_clk(static_cast<uint32_t>(0)),
-        mac_clk(static_cast<uint32_t>(0)), ao_clk(static_cast<uint32_t>(0)), wd_clk(static_cast<uint32_t>(0)),
-        reserved0(static_cast<uint32_t>(0))
-    {
-    }
-    CONSTEXPR clkforce_r(uint32_t init) : word(init) {}
+    CONSTEXPR clkforce_r() : word0(0) {}
+    CONSTEXPR clkforce_r(uint32_t init) : word0(init) {}
     CONSTEXPR void operator=(uint32_t value)
     {
-        word = value;
+        word0 = value;
     }
     void operator=(uint32_t value) volatile
     {
-        word = value;
+        word0 = value;
     }
     CONSTEXPR operator uint32_t()
     {
-        return word;
+        return word0;
     }
     operator uint32_t() volatile
     {
-        return word;
+        return word0;
     }
     clkforce_r copy() volatile
     {
@@ -5679,740 +5128,273 @@
     }
     CONSTEXPR uint32_t get_top_level_clk() const
     {
-        uint32_t value = static_cast<uint32_t>(top_level_clk);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 0));
         return value;
     }
     uint32_t get_top_level_clk() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(top_level_clk);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 0));
         return value;
     }
     CONSTEXPR clkforce_r &set_top_level_clk(uint32_t value)
     {
-        top_level_clk = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 0) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 0);
         return *this;
     }
     CONSTEXPR uint32_t get_cc_clk() const
     {
-        uint32_t value = static_cast<uint32_t>(cc_clk);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 1));
         return value;
     }
     uint32_t get_cc_clk() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(cc_clk);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 1));
         return value;
     }
     CONSTEXPR clkforce_r &set_cc_clk(uint32_t value)
     {
-        cc_clk = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 1) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 1);
         return *this;
     }
     CONSTEXPR uint32_t get_dma_clk() const
     {
-        uint32_t value = static_cast<uint32_t>(dma_clk);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
         return value;
     }
     uint32_t get_dma_clk() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(dma_clk);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
         return value;
     }
     CONSTEXPR clkforce_r &set_dma_clk(uint32_t value)
     {
-        dma_clk = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 2) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 2);
         return *this;
     }
     CONSTEXPR uint32_t get_mac_clk() const
     {
-        uint32_t value = static_cast<uint32_t>(mac_clk);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 3));
         return value;
     }
     uint32_t get_mac_clk() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(mac_clk);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 3));
         return value;
     }
     CONSTEXPR clkforce_r &set_mac_clk(uint32_t value)
     {
-        mac_clk = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 3) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 3);
         return *this;
     }
     CONSTEXPR uint32_t get_ao_clk() const
     {
-        uint32_t value = static_cast<uint32_t>(ao_clk);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 4));
         return value;
     }
     uint32_t get_ao_clk() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(ao_clk);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 4));
         return value;
     }
     CONSTEXPR clkforce_r &set_ao_clk(uint32_t value)
     {
-        ao_clk = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 4) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 4);
         return *this;
     }
     CONSTEXPR uint32_t get_wd_clk() const
     {
-        uint32_t value = static_cast<uint32_t>(wd_clk);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 5));
         return value;
     }
     uint32_t get_wd_clk() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(wd_clk);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 5));
         return value;
     }
     CONSTEXPR clkforce_r &set_wd_clk(uint32_t value)
     {
-        wd_clk = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 5) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 5);
         return *this;
     }
-#endif //__cplusplus
+#endif
 };
 
-// pid4_r - Peripheral ID byte 4 (Arm=code 4)
-struct pid4_r
+// debug_address_r - Set debug address for register reads 0x400-0x7FF. The address must be 1KB aligned
+struct debug_address_r
 {
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
+#ifndef __cplusplus
     union
     {
-        uint32_t PID4; // Byte 4 of Peripheral ID (Lower 8 bits valid)
+        struct
+        {
+            uint32_t addr : 32; // Register address
+        };
         uint32_t word;
     };
-#ifdef __cplusplus
+#else
+  private:
+    uint32_t word0;
+
   public:
-    CONSTEXPR pid4_r() : PID4(static_cast<uint32_t>(0x04)) {}
-    CONSTEXPR pid4_r(uint32_t init) : word(init) {}
+    CONSTEXPR debug_address_r() : word0(0) {}
+    CONSTEXPR debug_address_r(uint32_t init) : word0(init) {}
     CONSTEXPR void operator=(uint32_t value)
     {
-        word = value;
+        word0 = value;
     }
     void operator=(uint32_t value) volatile
     {
-        word = value;
+        word0 = value;
     }
     CONSTEXPR operator uint32_t()
     {
-        return word;
+        return word0;
     }
     operator uint32_t() volatile
     {
-        return word;
+        return word0;
     }
-    pid4_r copy() volatile
+    debug_address_r copy() volatile
     {
         return *this;
     }
-    CONSTEXPR uint32_t get_PID4() const
+    CONSTEXPR uint32_t get_addr() const
     {
-        uint32_t value = static_cast<uint32_t>(PID4);
+        uint32_t value = static_cast<uint32_t>(word0);
         return value;
     }
-    uint32_t get_PID4() const volatile
+    uint32_t get_addr() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(PID4);
+        uint32_t value = static_cast<uint32_t>(word0);
         return value;
     }
-    CONSTEXPR pid4_r &set_PID4(uint32_t value)
+    CONSTEXPR debug_address_r &set_addr(uint32_t value)
     {
-        PID4 = static_cast<uint32_t>(value);
+        word0 = static_cast<uint32_t>(value);
         return *this;
     }
-#endif //__cplusplus
+#endif
 };
 
-// pid5_r - Peripheral ID byte 5 (reserved)
-struct pid5_r
+// debug_misc_r - 32-bit read/write register for driver debug use. This does not affect NPU function
+struct debug_misc_r
 {
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
+#ifndef __cplusplus
     union
     {
-        uint32_t PID5; // Byte 5 of Peripheral ID (Lower 8 bits valid)
+        struct
+        {
+            uint32_t misc : 32; // Debug misc
+        };
         uint32_t word;
     };
-#ifdef __cplusplus
+#else
+  private:
+    uint32_t word0;
+
   public:
-    CONSTEXPR pid5_r() : PID5(static_cast<uint32_t>(0x00)) {}
-    CONSTEXPR pid5_r(uint32_t init) : word(init) {}
+    CONSTEXPR debug_misc_r() : word0(0) {}
+    CONSTEXPR debug_misc_r(uint32_t init) : word0(init) {}
     CONSTEXPR void operator=(uint32_t value)
     {
-        word = value;
+        word0 = value;
     }
     void operator=(uint32_t value) volatile
     {
-        word = value;
+        word0 = value;
     }
     CONSTEXPR operator uint32_t()
     {
-        return word;
+        return word0;
     }
     operator uint32_t() volatile
     {
-        return word;
+        return word0;
     }
-    pid5_r copy() volatile
+    debug_misc_r copy() volatile
     {
         return *this;
     }
-    CONSTEXPR uint32_t get_PID5() const
+    CONSTEXPR uint32_t get_misc() const
     {
-        uint32_t value = static_cast<uint32_t>(PID5);
+        uint32_t value = static_cast<uint32_t>(word0);
         return value;
     }
-    uint32_t get_PID5() const volatile
+    uint32_t get_misc() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(PID5);
+        uint32_t value = static_cast<uint32_t>(word0);
         return value;
     }
-    CONSTEXPR pid5_r &set_PID5(uint32_t value)
+    CONSTEXPR debug_misc_r &set_misc(uint32_t value)
     {
-        PID5 = static_cast<uint32_t>(value);
+        word0 = static_cast<uint32_t>(value);
         return *this;
     }
-#endif //__cplusplus
+#endif
 };
 
-// pid6_r - Peripheral ID byte 6 (reserved)
-struct pid6_r
+// debug_block_r - Set from which of four block banks the TSU registers are read. 0 = read from the current bank 256+n =
+// force to read from bank n where n is in the range 0 to 3
+struct debug_block_r
 {
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
+#ifndef __cplusplus
     union
     {
-        uint32_t PID6; // Byte 6 of Peripheral ID (Lower 8 bits valid)
+        struct
+        {
+            uint32_t block : 32; // Debug block
+        };
         uint32_t word;
     };
-#ifdef __cplusplus
+#else
+  private:
+    uint32_t word0;
+
   public:
-    CONSTEXPR pid6_r() : PID6(static_cast<uint32_t>(0x00)) {}
-    CONSTEXPR pid6_r(uint32_t init) : word(init) {}
+    CONSTEXPR debug_block_r() : word0(0) {}
+    CONSTEXPR debug_block_r(uint32_t init) : word0(init) {}
     CONSTEXPR void operator=(uint32_t value)
     {
-        word = value;
+        word0 = value;
     }
     void operator=(uint32_t value) volatile
     {
-        word = value;
+        word0 = value;
     }
     CONSTEXPR operator uint32_t()
     {
-        return word;
+        return word0;
     }
     operator uint32_t() volatile
     {
-        return word;
+        return word0;
     }
-    pid6_r copy() volatile
+    debug_block_r copy() volatile
     {
         return *this;
     }
-    CONSTEXPR uint32_t get_PID6() const
+    CONSTEXPR uint32_t get_block() const
     {
-        uint32_t value = static_cast<uint32_t>(PID6);
+        uint32_t value = static_cast<uint32_t>(word0);
         return value;
     }
-    uint32_t get_PID6() const volatile
+    uint32_t get_block() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(PID6);
+        uint32_t value = static_cast<uint32_t>(word0);
         return value;
     }
-    CONSTEXPR pid6_r &set_PID6(uint32_t value)
+    CONSTEXPR debug_block_r &set_block(uint32_t value)
     {
-        PID6 = static_cast<uint32_t>(value);
+        word0 = static_cast<uint32_t>(value);
         return *this;
     }
-#endif //__cplusplus
-};
-
-// pid7_r - Peripheral ID byte 7 (reserved)
-struct pid7_r
-{
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
-    union
-    {
-        uint32_t PID7; // Byte 7 of Peripheral ID (Lower 8 bits valid)
-        uint32_t word;
-    };
-#ifdef __cplusplus
-  public:
-    CONSTEXPR pid7_r() : PID7(static_cast<uint32_t>(0x00)) {}
-    CONSTEXPR pid7_r(uint32_t init) : word(init) {}
-    CONSTEXPR void operator=(uint32_t value)
-    {
-        word = value;
-    }
-    void operator=(uint32_t value) volatile
-    {
-        word = value;
-    }
-    CONSTEXPR operator uint32_t()
-    {
-        return word;
-    }
-    operator uint32_t() volatile
-    {
-        return word;
-    }
-    pid7_r copy() volatile
-    {
-        return *this;
-    }
-    CONSTEXPR uint32_t get_PID7() const
-    {
-        uint32_t value = static_cast<uint32_t>(PID7);
-        return value;
-    }
-    uint32_t get_PID7() const volatile
-    {
-        uint32_t value = static_cast<uint32_t>(PID7);
-        return value;
-    }
-    CONSTEXPR pid7_r &set_PID7(uint32_t value)
-    {
-        PID7 = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// pid0_r - Peripheral ID byte 0. This is bits[7:0] of the part number.
-struct pid0_r
-{
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
-    union
-    {
-        uint32_t PID0; // Byte 0 of Peripheral ID (Lower 8 bits valid)
-        uint32_t word;
-    };
-#ifdef __cplusplus
-  public:
-    CONSTEXPR pid0_r() : PID0(static_cast<uint32_t>(0x80)) {}
-    CONSTEXPR pid0_r(uint32_t init) : word(init) {}
-    CONSTEXPR void operator=(uint32_t value)
-    {
-        word = value;
-    }
-    void operator=(uint32_t value) volatile
-    {
-        word = value;
-    }
-    CONSTEXPR operator uint32_t()
-    {
-        return word;
-    }
-    operator uint32_t() volatile
-    {
-        return word;
-    }
-    pid0_r copy() volatile
-    {
-        return *this;
-    }
-    CONSTEXPR uint32_t get_PID0() const
-    {
-        uint32_t value = static_cast<uint32_t>(PID0);
-        return value;
-    }
-    uint32_t get_PID0() const volatile
-    {
-        uint32_t value = static_cast<uint32_t>(PID0);
-        return value;
-    }
-    CONSTEXPR pid0_r &set_PID0(uint32_t value)
-    {
-        PID0 = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// pid1_r - Peripheral ID byte 1. This is bits[11:8] of the part number in bits[3:0], and bits[3:0] of the Arm ID in
-// bits[7:4].
-struct pid1_r
-{
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
-    union
-    {
-        uint32_t PID1; // Byte 1 of Peripheral ID (Lower 8 bits valid)
-        uint32_t word;
-    };
-#ifdef __cplusplus
-  public:
-    CONSTEXPR pid1_r() : PID1(static_cast<uint32_t>(0xB5)) {}
-    CONSTEXPR pid1_r(uint32_t init) : word(init) {}
-    CONSTEXPR void operator=(uint32_t value)
-    {
-        word = value;
-    }
-    void operator=(uint32_t value) volatile
-    {
-        word = value;
-    }
-    CONSTEXPR operator uint32_t()
-    {
-        return word;
-    }
-    operator uint32_t() volatile
-    {
-        return word;
-    }
-    pid1_r copy() volatile
-    {
-        return *this;
-    }
-    CONSTEXPR uint32_t get_PID1() const
-    {
-        uint32_t value = static_cast<uint32_t>(PID1);
-        return value;
-    }
-    uint32_t get_PID1() const volatile
-    {
-        uint32_t value = static_cast<uint32_t>(PID1);
-        return value;
-    }
-    CONSTEXPR pid1_r &set_PID1(uint32_t value)
-    {
-        PID1 = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// pid2_r - Peripheral ID byte 2. This is bits[6:4] of the Arm ID in bits[2:0], and bit 3 indicates format B.
-struct pid2_r
-{
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
-    union
-    {
-        uint32_t PID2; // Byte 2 of Peripheral ID (Lower 8 bits valid)
-        uint32_t word;
-    };
-#ifdef __cplusplus
-  public:
-    CONSTEXPR pid2_r() : PID2(static_cast<uint32_t>(0x0B)) {}
-    CONSTEXPR pid2_r(uint32_t init) : word(init) {}
-    CONSTEXPR void operator=(uint32_t value)
-    {
-        word = value;
-    }
-    void operator=(uint32_t value) volatile
-    {
-        word = value;
-    }
-    CONSTEXPR operator uint32_t()
-    {
-        return word;
-    }
-    operator uint32_t() volatile
-    {
-        return word;
-    }
-    pid2_r copy() volatile
-    {
-        return *this;
-    }
-    CONSTEXPR uint32_t get_PID2() const
-    {
-        uint32_t value = static_cast<uint32_t>(PID2);
-        return value;
-    }
-    uint32_t get_PID2() const volatile
-    {
-        uint32_t value = static_cast<uint32_t>(PID2);
-        return value;
-    }
-    CONSTEXPR pid2_r &set_PID2(uint32_t value)
-    {
-        PID2 = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// pid3_r - Peripheral ID byte 3.
-struct pid3_r
-{
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
-    union
-    {
-        uint32_t PID3; // Byte 1 of Peripheral ID (Lower 8 bits valid)
-        uint32_t word;
-    };
-#ifdef __cplusplus
-  public:
-    CONSTEXPR pid3_r() : PID3(static_cast<uint32_t>(0x0)) {}
-    CONSTEXPR pid3_r(uint32_t init) : word(init) {}
-    CONSTEXPR void operator=(uint32_t value)
-    {
-        word = value;
-    }
-    void operator=(uint32_t value) volatile
-    {
-        word = value;
-    }
-    CONSTEXPR operator uint32_t()
-    {
-        return word;
-    }
-    operator uint32_t() volatile
-    {
-        return word;
-    }
-    pid3_r copy() volatile
-    {
-        return *this;
-    }
-    CONSTEXPR uint32_t get_PID3() const
-    {
-        uint32_t value = static_cast<uint32_t>(PID3);
-        return value;
-    }
-    uint32_t get_PID3() const volatile
-    {
-        uint32_t value = static_cast<uint32_t>(PID3);
-        return value;
-    }
-    CONSTEXPR pid3_r &set_PID3(uint32_t value)
-    {
-        PID3 = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// cid0_r - Component ID byte 0.
-struct cid0_r
-{
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
-    union
-    {
-        uint32_t CID0; // Byte 0 of Component ID (Lower 8 bits valid)
-        uint32_t word;
-    };
-#ifdef __cplusplus
-  public:
-    CONSTEXPR cid0_r() : CID0(static_cast<uint32_t>(0x0D)) {}
-    CONSTEXPR cid0_r(uint32_t init) : word(init) {}
-    CONSTEXPR void operator=(uint32_t value)
-    {
-        word = value;
-    }
-    void operator=(uint32_t value) volatile
-    {
-        word = value;
-    }
-    CONSTEXPR operator uint32_t()
-    {
-        return word;
-    }
-    operator uint32_t() volatile
-    {
-        return word;
-    }
-    cid0_r copy() volatile
-    {
-        return *this;
-    }
-    CONSTEXPR uint32_t get_CID0() const
-    {
-        uint32_t value = static_cast<uint32_t>(CID0);
-        return value;
-    }
-    uint32_t get_CID0() const volatile
-    {
-        uint32_t value = static_cast<uint32_t>(CID0);
-        return value;
-    }
-    CONSTEXPR cid0_r &set_CID0(uint32_t value)
-    {
-        CID0 = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// cid1_r - Component ID byte 1.
-struct cid1_r
-{
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
-    union
-    {
-        uint32_t CID1; // Byte 1 of Component ID (Lower 8 bits valid)
-        uint32_t word;
-    };
-#ifdef __cplusplus
-  public:
-    CONSTEXPR cid1_r() : CID1(static_cast<uint32_t>(0xF0)) {}
-    CONSTEXPR cid1_r(uint32_t init) : word(init) {}
-    CONSTEXPR void operator=(uint32_t value)
-    {
-        word = value;
-    }
-    void operator=(uint32_t value) volatile
-    {
-        word = value;
-    }
-    CONSTEXPR operator uint32_t()
-    {
-        return word;
-    }
-    operator uint32_t() volatile
-    {
-        return word;
-    }
-    cid1_r copy() volatile
-    {
-        return *this;
-    }
-    CONSTEXPR uint32_t get_CID1() const
-    {
-        uint32_t value = static_cast<uint32_t>(CID1);
-        return value;
-    }
-    uint32_t get_CID1() const volatile
-    {
-        uint32_t value = static_cast<uint32_t>(CID1);
-        return value;
-    }
-    CONSTEXPR cid1_r &set_CID1(uint32_t value)
-    {
-        CID1 = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// cid2_r - Component ID byte 2.
-struct cid2_r
-{
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
-    union
-    {
-        uint32_t CID2; // Byte 2 of Component ID (Lower 8 bits valid)
-        uint32_t word;
-    };
-#ifdef __cplusplus
-  public:
-    CONSTEXPR cid2_r() : CID2(static_cast<uint32_t>(0x05)) {}
-    CONSTEXPR cid2_r(uint32_t init) : word(init) {}
-    CONSTEXPR void operator=(uint32_t value)
-    {
-        word = value;
-    }
-    void operator=(uint32_t value) volatile
-    {
-        word = value;
-    }
-    CONSTEXPR operator uint32_t()
-    {
-        return word;
-    }
-    operator uint32_t() volatile
-    {
-        return word;
-    }
-    cid2_r copy() volatile
-    {
-        return *this;
-    }
-    CONSTEXPR uint32_t get_CID2() const
-    {
-        uint32_t value = static_cast<uint32_t>(CID2);
-        return value;
-    }
-    uint32_t get_CID2() const volatile
-    {
-        uint32_t value = static_cast<uint32_t>(CID2);
-        return value;
-    }
-    CONSTEXPR cid2_r &set_CID2(uint32_t value)
-    {
-        CID2 = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// cid3_r - Component ID byte 3.
-struct cid3_r
-{
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
-    union
-    {
-        uint32_t CID3; // Byte 3 of Component ID (Lower 8 bits valid)
-        uint32_t word;
-    };
-#ifdef __cplusplus
-  public:
-    CONSTEXPR cid3_r() : CID3(static_cast<uint32_t>(0xB1)) {}
-    CONSTEXPR cid3_r(uint32_t init) : word(init) {}
-    CONSTEXPR void operator=(uint32_t value)
-    {
-        word = value;
-    }
-    void operator=(uint32_t value) volatile
-    {
-        word = value;
-    }
-    CONSTEXPR operator uint32_t()
-    {
-        return word;
-    }
-    operator uint32_t() volatile
-    {
-        return word;
-    }
-    cid3_r copy() volatile
-    {
-        return *this;
-    }
-    CONSTEXPR uint32_t get_CID3() const
-    {
-        uint32_t value = static_cast<uint32_t>(CID3);
-        return value;
-    }
-    uint32_t get_CID3() const volatile
-    {
-        uint32_t value = static_cast<uint32_t>(CID3);
-        return value;
-    }
-    CONSTEXPR cid3_r &set_CID3(uint32_t value)
-    {
-        CID3 = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
+#endif
 };
 
 // pmcr_r - PMU Register control
 struct pmcr_r
 {
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
+#ifndef __cplusplus
     union
     {
         struct
@@ -6427,31 +5409,28 @@
         };
         uint32_t word;
     };
-#ifdef __cplusplus
+#else
+  private:
+    uint32_t word0;
+
   public:
-    CONSTEXPR pmcr_r() :
-        cnt_en(static_cast<uint32_t>(0x0)), event_cnt_rst(static_cast<uint32_t>(0)),
-        cycle_cnt_rst(static_cast<uint32_t>(0)), mask_en(static_cast<uint32_t>(0x0)),
-        reserved0(static_cast<uint32_t>(0)), num_event_cnt(static_cast<uint32_t>(0x04)),
-        reserved1(static_cast<uint32_t>(0))
-    {
-    }
-    CONSTEXPR pmcr_r(uint32_t init) : word(init) {}
+    CONSTEXPR pmcr_r() : word0(8192) {}
+    CONSTEXPR pmcr_r(uint32_t init) : word0(init) {}
     CONSTEXPR void operator=(uint32_t value)
     {
-        word = value;
+        word0 = value;
     }
     void operator=(uint32_t value) volatile
     {
-        word = value;
+        word0 = value;
     }
     CONSTEXPR operator uint32_t()
     {
-        return word;
+        return word0;
     }
     operator uint32_t() volatile
     {
-        return word;
+        return word0;
     }
     pmcr_r copy() volatile
     {
@@ -6459,88 +5438,86 @@
     }
     CONSTEXPR uint32_t get_cnt_en() const
     {
-        uint32_t value = static_cast<uint32_t>(cnt_en);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 0));
         return value;
     }
     uint32_t get_cnt_en() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(cnt_en);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 0));
         return value;
     }
     CONSTEXPR pmcr_r &set_cnt_en(uint32_t value)
     {
-        cnt_en = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 0) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 0);
         return *this;
     }
     CONSTEXPR uint32_t get_event_cnt_rst() const
     {
-        uint32_t value = static_cast<uint32_t>(event_cnt_rst);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 1));
         return value;
     }
     uint32_t get_event_cnt_rst() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(event_cnt_rst);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 1));
         return value;
     }
     CONSTEXPR pmcr_r &set_event_cnt_rst(uint32_t value)
     {
-        event_cnt_rst = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 1) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 1);
         return *this;
     }
     CONSTEXPR uint32_t get_cycle_cnt_rst() const
     {
-        uint32_t value = static_cast<uint32_t>(cycle_cnt_rst);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
         return value;
     }
     uint32_t get_cycle_cnt_rst() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(cycle_cnt_rst);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
         return value;
     }
     CONSTEXPR pmcr_r &set_cycle_cnt_rst(uint32_t value)
     {
-        cycle_cnt_rst = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 2) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 2);
         return *this;
     }
     CONSTEXPR uint32_t get_mask_en() const
     {
-        uint32_t value = static_cast<uint32_t>(mask_en);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 3));
         return value;
     }
     uint32_t get_mask_en() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(mask_en);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 3));
         return value;
     }
     CONSTEXPR pmcr_r &set_mask_en(uint32_t value)
     {
-        mask_en = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 3) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 3);
         return *this;
     }
     CONSTEXPR uint32_t get_num_event_cnt() const
     {
-        uint32_t value = static_cast<uint32_t>(num_event_cnt);
+        uint32_t value = static_cast<uint32_t>(((1U << 5) - 1) & (word0 >> 11));
         return value;
     }
     uint32_t get_num_event_cnt() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(num_event_cnt);
+        uint32_t value = static_cast<uint32_t>(((1U << 5) - 1) & (word0 >> 11));
         return value;
     }
     CONSTEXPR pmcr_r &set_num_event_cnt(uint32_t value)
     {
-        num_event_cnt = ((1u << 5) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 5) - 1)) << 11) & word0) | ((((1U << 5) - 1) & static_cast<uint32_t>(value)) << 11);
         return *this;
     }
-#endif //__cplusplus
+#endif
 };
 
 // pmcntenset_r - Count enable set register
 struct pmcntenset_r
 {
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
+#ifndef __cplusplus
     union
     {
         struct
@@ -6554,30 +5531,28 @@
         };
         uint32_t word;
     };
-#ifdef __cplusplus
+#else
+  private:
+    uint32_t word0;
+
   public:
-    CONSTEXPR pmcntenset_r() :
-        EVENT_CNT_0(static_cast<uint32_t>(0)), EVENT_CNT_1(static_cast<uint32_t>(0)),
-        EVENT_CNT_2(static_cast<uint32_t>(0)), EVENT_CNT_3(static_cast<uint32_t>(0)),
-        reserved0(static_cast<uint32_t>(0)), CYCLE_CNT(static_cast<uint32_t>(0))
-    {
-    }
-    CONSTEXPR pmcntenset_r(uint32_t init) : word(init) {}
+    CONSTEXPR pmcntenset_r() : word0(0) {}
+    CONSTEXPR pmcntenset_r(uint32_t init) : word0(init) {}
     CONSTEXPR void operator=(uint32_t value)
     {
-        word = value;
+        word0 = value;
     }
     void operator=(uint32_t value) volatile
     {
-        word = value;
+        word0 = value;
     }
     CONSTEXPR operator uint32_t()
     {
-        return word;
+        return word0;
     }
     operator uint32_t() volatile
     {
-        return word;
+        return word0;
     }
     pmcntenset_r copy() volatile
     {
@@ -6585,88 +5560,86 @@
     }
     CONSTEXPR uint32_t get_EVENT_CNT_0() const
     {
-        uint32_t value = static_cast<uint32_t>(EVENT_CNT_0);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 0));
         return value;
     }
     uint32_t get_EVENT_CNT_0() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(EVENT_CNT_0);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 0));
         return value;
     }
     CONSTEXPR pmcntenset_r &set_EVENT_CNT_0(uint32_t value)
     {
-        EVENT_CNT_0 = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 0) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 0);
         return *this;
     }
     CONSTEXPR uint32_t get_EVENT_CNT_1() const
     {
-        uint32_t value = static_cast<uint32_t>(EVENT_CNT_1);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 1));
         return value;
     }
     uint32_t get_EVENT_CNT_1() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(EVENT_CNT_1);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 1));
         return value;
     }
     CONSTEXPR pmcntenset_r &set_EVENT_CNT_1(uint32_t value)
     {
-        EVENT_CNT_1 = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 1) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 1);
         return *this;
     }
     CONSTEXPR uint32_t get_EVENT_CNT_2() const
     {
-        uint32_t value = static_cast<uint32_t>(EVENT_CNT_2);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
         return value;
     }
     uint32_t get_EVENT_CNT_2() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(EVENT_CNT_2);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
         return value;
     }
     CONSTEXPR pmcntenset_r &set_EVENT_CNT_2(uint32_t value)
     {
-        EVENT_CNT_2 = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 2) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 2);
         return *this;
     }
     CONSTEXPR uint32_t get_EVENT_CNT_3() const
     {
-        uint32_t value = static_cast<uint32_t>(EVENT_CNT_3);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 3));
         return value;
     }
     uint32_t get_EVENT_CNT_3() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(EVENT_CNT_3);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 3));
         return value;
     }
     CONSTEXPR pmcntenset_r &set_EVENT_CNT_3(uint32_t value)
     {
-        EVENT_CNT_3 = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 3) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 3);
         return *this;
     }
     CONSTEXPR uint32_t get_CYCLE_CNT() const
     {
-        uint32_t value = static_cast<uint32_t>(CYCLE_CNT);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 31));
         return value;
     }
     uint32_t get_CYCLE_CNT() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(CYCLE_CNT);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 31));
         return value;
     }
     CONSTEXPR pmcntenset_r &set_CYCLE_CNT(uint32_t value)
     {
-        CYCLE_CNT = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 31) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 31);
         return *this;
     }
-#endif //__cplusplus
+#endif
 };
 
 // pmcntenclr_r - Count enable clear register
 struct pmcntenclr_r
 {
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
+#ifndef __cplusplus
     union
     {
         struct
@@ -6680,30 +5653,28 @@
         };
         uint32_t word;
     };
-#ifdef __cplusplus
+#else
+  private:
+    uint32_t word0;
+
   public:
-    CONSTEXPR pmcntenclr_r() :
-        EVENT_CNT_0(static_cast<uint32_t>(0)), EVENT_CNT_1(static_cast<uint32_t>(0)),
-        EVENT_CNT_2(static_cast<uint32_t>(0)), EVENT_CNT_3(static_cast<uint32_t>(0)),
-        reserved0(static_cast<uint32_t>(0)), CYCLE_CNT(static_cast<uint32_t>(0))
-    {
-    }
-    CONSTEXPR pmcntenclr_r(uint32_t init) : word(init) {}
+    CONSTEXPR pmcntenclr_r() : word0(0) {}
+    CONSTEXPR pmcntenclr_r(uint32_t init) : word0(init) {}
     CONSTEXPR void operator=(uint32_t value)
     {
-        word = value;
+        word0 = value;
     }
     void operator=(uint32_t value) volatile
     {
-        word = value;
+        word0 = value;
     }
     CONSTEXPR operator uint32_t()
     {
-        return word;
+        return word0;
     }
     operator uint32_t() volatile
     {
-        return word;
+        return word0;
     }
     pmcntenclr_r copy() volatile
     {
@@ -6711,88 +5682,86 @@
     }
     CONSTEXPR uint32_t get_EVENT_CNT_0() const
     {
-        uint32_t value = static_cast<uint32_t>(EVENT_CNT_0);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 0));
         return value;
     }
     uint32_t get_EVENT_CNT_0() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(EVENT_CNT_0);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 0));
         return value;
     }
     CONSTEXPR pmcntenclr_r &set_EVENT_CNT_0(uint32_t value)
     {
-        EVENT_CNT_0 = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 0) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 0);
         return *this;
     }
     CONSTEXPR uint32_t get_EVENT_CNT_1() const
     {
-        uint32_t value = static_cast<uint32_t>(EVENT_CNT_1);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 1));
         return value;
     }
     uint32_t get_EVENT_CNT_1() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(EVENT_CNT_1);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 1));
         return value;
     }
     CONSTEXPR pmcntenclr_r &set_EVENT_CNT_1(uint32_t value)
     {
-        EVENT_CNT_1 = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 1) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 1);
         return *this;
     }
     CONSTEXPR uint32_t get_EVENT_CNT_2() const
     {
-        uint32_t value = static_cast<uint32_t>(EVENT_CNT_2);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
         return value;
     }
     uint32_t get_EVENT_CNT_2() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(EVENT_CNT_2);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
         return value;
     }
     CONSTEXPR pmcntenclr_r &set_EVENT_CNT_2(uint32_t value)
     {
-        EVENT_CNT_2 = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 2) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 2);
         return *this;
     }
     CONSTEXPR uint32_t get_EVENT_CNT_3() const
     {
-        uint32_t value = static_cast<uint32_t>(EVENT_CNT_3);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 3));
         return value;
     }
     uint32_t get_EVENT_CNT_3() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(EVENT_CNT_3);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 3));
         return value;
     }
     CONSTEXPR pmcntenclr_r &set_EVENT_CNT_3(uint32_t value)
     {
-        EVENT_CNT_3 = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 3) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 3);
         return *this;
     }
     CONSTEXPR uint32_t get_CYCLE_CNT() const
     {
-        uint32_t value = static_cast<uint32_t>(CYCLE_CNT);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 31));
         return value;
     }
     uint32_t get_CYCLE_CNT() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(CYCLE_CNT);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 31));
         return value;
     }
     CONSTEXPR pmcntenclr_r &set_CYCLE_CNT(uint32_t value)
     {
-        CYCLE_CNT = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 31) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 31);
         return *this;
     }
-#endif //__cplusplus
+#endif
 };
 
 // pmovsset_r - Overflow flag status set register
 struct pmovsset_r
 {
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
+#ifndef __cplusplus
     union
     {
         struct
@@ -6806,30 +5775,28 @@
         };
         uint32_t word;
     };
-#ifdef __cplusplus
+#else
+  private:
+    uint32_t word0;
+
   public:
-    CONSTEXPR pmovsset_r() :
-        EVENT_CNT_0_OVF(static_cast<uint32_t>(0)), EVENT_CNT_1_OVF(static_cast<uint32_t>(0)),
-        EVENT_CNT_2_OVF(static_cast<uint32_t>(0)), EVENT_CNT_3_OVF(static_cast<uint32_t>(0)),
-        reserved0(static_cast<uint32_t>(0)), CYCLE_CNT_OVF(static_cast<uint32_t>(0))
-    {
-    }
-    CONSTEXPR pmovsset_r(uint32_t init) : word(init) {}
+    CONSTEXPR pmovsset_r() : word0(0) {}
+    CONSTEXPR pmovsset_r(uint32_t init) : word0(init) {}
     CONSTEXPR void operator=(uint32_t value)
     {
-        word = value;
+        word0 = value;
     }
     void operator=(uint32_t value) volatile
     {
-        word = value;
+        word0 = value;
     }
     CONSTEXPR operator uint32_t()
     {
-        return word;
+        return word0;
     }
     operator uint32_t() volatile
     {
-        return word;
+        return word0;
     }
     pmovsset_r copy() volatile
     {
@@ -6837,88 +5804,86 @@
     }
     CONSTEXPR uint32_t get_EVENT_CNT_0_OVF() const
     {
-        uint32_t value = static_cast<uint32_t>(EVENT_CNT_0_OVF);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 0));
         return value;
     }
     uint32_t get_EVENT_CNT_0_OVF() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(EVENT_CNT_0_OVF);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 0));
         return value;
     }
     CONSTEXPR pmovsset_r &set_EVENT_CNT_0_OVF(uint32_t value)
     {
-        EVENT_CNT_0_OVF = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 0) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 0);
         return *this;
     }
     CONSTEXPR uint32_t get_EVENT_CNT_1_OVF() const
     {
-        uint32_t value = static_cast<uint32_t>(EVENT_CNT_1_OVF);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 1));
         return value;
     }
     uint32_t get_EVENT_CNT_1_OVF() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(EVENT_CNT_1_OVF);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 1));
         return value;
     }
     CONSTEXPR pmovsset_r &set_EVENT_CNT_1_OVF(uint32_t value)
     {
-        EVENT_CNT_1_OVF = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 1) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 1);
         return *this;
     }
     CONSTEXPR uint32_t get_EVENT_CNT_2_OVF() const
     {
-        uint32_t value = static_cast<uint32_t>(EVENT_CNT_2_OVF);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
         return value;
     }
     uint32_t get_EVENT_CNT_2_OVF() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(EVENT_CNT_2_OVF);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
         return value;
     }
     CONSTEXPR pmovsset_r &set_EVENT_CNT_2_OVF(uint32_t value)
     {
-        EVENT_CNT_2_OVF = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 2) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 2);
         return *this;
     }
     CONSTEXPR uint32_t get_EVENT_CNT_3_OVF() const
     {
-        uint32_t value = static_cast<uint32_t>(EVENT_CNT_3_OVF);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 3));
         return value;
     }
     uint32_t get_EVENT_CNT_3_OVF() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(EVENT_CNT_3_OVF);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 3));
         return value;
     }
     CONSTEXPR pmovsset_r &set_EVENT_CNT_3_OVF(uint32_t value)
     {
-        EVENT_CNT_3_OVF = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 3) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 3);
         return *this;
     }
     CONSTEXPR uint32_t get_CYCLE_CNT_OVF() const
     {
-        uint32_t value = static_cast<uint32_t>(CYCLE_CNT_OVF);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 31));
         return value;
     }
     uint32_t get_CYCLE_CNT_OVF() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(CYCLE_CNT_OVF);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 31));
         return value;
     }
     CONSTEXPR pmovsset_r &set_CYCLE_CNT_OVF(uint32_t value)
     {
-        CYCLE_CNT_OVF = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 31) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 31);
         return *this;
     }
-#endif //__cplusplus
+#endif
 };
 
 // pmovsclr_r - Overflow flag status clear register
 struct pmovsclr_r
 {
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
+#ifndef __cplusplus
     union
     {
         struct
@@ -6932,30 +5897,28 @@
         };
         uint32_t word;
     };
-#ifdef __cplusplus
+#else
+  private:
+    uint32_t word0;
+
   public:
-    CONSTEXPR pmovsclr_r() :
-        EVENT_CNT_0_OVF(static_cast<uint32_t>(0)), EVENT_CNT_1_OVF(static_cast<uint32_t>(0)),
-        EVENT_CNT_2_OVF(static_cast<uint32_t>(0)), EVENT_CNT_3_OVF(static_cast<uint32_t>(0)),
-        reserved0(static_cast<uint32_t>(0)), CYCLE_CNT_OVF(static_cast<uint32_t>(0))
-    {
-    }
-    CONSTEXPR pmovsclr_r(uint32_t init) : word(init) {}
+    CONSTEXPR pmovsclr_r() : word0(0) {}
+    CONSTEXPR pmovsclr_r(uint32_t init) : word0(init) {}
     CONSTEXPR void operator=(uint32_t value)
     {
-        word = value;
+        word0 = value;
     }
     void operator=(uint32_t value) volatile
     {
-        word = value;
+        word0 = value;
     }
     CONSTEXPR operator uint32_t()
     {
-        return word;
+        return word0;
     }
     operator uint32_t() volatile
     {
-        return word;
+        return word0;
     }
     pmovsclr_r copy() volatile
     {
@@ -6963,88 +5926,86 @@
     }
     CONSTEXPR uint32_t get_EVENT_CNT_0_OVF() const
     {
-        uint32_t value = static_cast<uint32_t>(EVENT_CNT_0_OVF);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 0));
         return value;
     }
     uint32_t get_EVENT_CNT_0_OVF() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(EVENT_CNT_0_OVF);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 0));
         return value;
     }
     CONSTEXPR pmovsclr_r &set_EVENT_CNT_0_OVF(uint32_t value)
     {
-        EVENT_CNT_0_OVF = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 0) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 0);
         return *this;
     }
     CONSTEXPR uint32_t get_EVENT_CNT_1_OVF() const
     {
-        uint32_t value = static_cast<uint32_t>(EVENT_CNT_1_OVF);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 1));
         return value;
     }
     uint32_t get_EVENT_CNT_1_OVF() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(EVENT_CNT_1_OVF);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 1));
         return value;
     }
     CONSTEXPR pmovsclr_r &set_EVENT_CNT_1_OVF(uint32_t value)
     {
-        EVENT_CNT_1_OVF = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 1) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 1);
         return *this;
     }
     CONSTEXPR uint32_t get_EVENT_CNT_2_OVF() const
     {
-        uint32_t value = static_cast<uint32_t>(EVENT_CNT_2_OVF);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
         return value;
     }
     uint32_t get_EVENT_CNT_2_OVF() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(EVENT_CNT_2_OVF);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
         return value;
     }
     CONSTEXPR pmovsclr_r &set_EVENT_CNT_2_OVF(uint32_t value)
     {
-        EVENT_CNT_2_OVF = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 2) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 2);
         return *this;
     }
     CONSTEXPR uint32_t get_EVENT_CNT_3_OVF() const
     {
-        uint32_t value = static_cast<uint32_t>(EVENT_CNT_3_OVF);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 3));
         return value;
     }
     uint32_t get_EVENT_CNT_3_OVF() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(EVENT_CNT_3_OVF);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 3));
         return value;
     }
     CONSTEXPR pmovsclr_r &set_EVENT_CNT_3_OVF(uint32_t value)
     {
-        EVENT_CNT_3_OVF = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 3) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 3);
         return *this;
     }
     CONSTEXPR uint32_t get_CYCLE_CNT_OVF() const
     {
-        uint32_t value = static_cast<uint32_t>(CYCLE_CNT_OVF);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 31));
         return value;
     }
     uint32_t get_CYCLE_CNT_OVF() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(CYCLE_CNT_OVF);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 31));
         return value;
     }
     CONSTEXPR pmovsclr_r &set_CYCLE_CNT_OVF(uint32_t value)
     {
-        CYCLE_CNT_OVF = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 31) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 31);
         return *this;
     }
-#endif //__cplusplus
+#endif
 };
 
 // pmintset_r - Interrupt enable set register
 struct pmintset_r
 {
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
+#ifndef __cplusplus
     union
     {
         struct
@@ -7058,30 +6019,28 @@
         };
         uint32_t word;
     };
-#ifdef __cplusplus
+#else
+  private:
+    uint32_t word0;
+
   public:
-    CONSTEXPR pmintset_r() :
-        EVENT_CNT_0_INT(static_cast<uint32_t>(0)), EVENT_CNT_1_INT(static_cast<uint32_t>(0)),
-        EVENT_CNT_2_INT(static_cast<uint32_t>(0)), EVENT_CNT_3_INT(static_cast<uint32_t>(0)),
-        reserved0(static_cast<uint32_t>(0)), CYCLE_CNT_INT(static_cast<uint32_t>(0))
-    {
-    }
-    CONSTEXPR pmintset_r(uint32_t init) : word(init) {}
+    CONSTEXPR pmintset_r() : word0(0) {}
+    CONSTEXPR pmintset_r(uint32_t init) : word0(init) {}
     CONSTEXPR void operator=(uint32_t value)
     {
-        word = value;
+        word0 = value;
     }
     void operator=(uint32_t value) volatile
     {
-        word = value;
+        word0 = value;
     }
     CONSTEXPR operator uint32_t()
     {
-        return word;
+        return word0;
     }
     operator uint32_t() volatile
     {
-        return word;
+        return word0;
     }
     pmintset_r copy() volatile
     {
@@ -7089,88 +6048,86 @@
     }
     CONSTEXPR uint32_t get_EVENT_CNT_0_INT() const
     {
-        uint32_t value = static_cast<uint32_t>(EVENT_CNT_0_INT);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 0));
         return value;
     }
     uint32_t get_EVENT_CNT_0_INT() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(EVENT_CNT_0_INT);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 0));
         return value;
     }
     CONSTEXPR pmintset_r &set_EVENT_CNT_0_INT(uint32_t value)
     {
-        EVENT_CNT_0_INT = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 0) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 0);
         return *this;
     }
     CONSTEXPR uint32_t get_EVENT_CNT_1_INT() const
     {
-        uint32_t value = static_cast<uint32_t>(EVENT_CNT_1_INT);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 1));
         return value;
     }
     uint32_t get_EVENT_CNT_1_INT() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(EVENT_CNT_1_INT);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 1));
         return value;
     }
     CONSTEXPR pmintset_r &set_EVENT_CNT_1_INT(uint32_t value)
     {
-        EVENT_CNT_1_INT = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 1) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 1);
         return *this;
     }
     CONSTEXPR uint32_t get_EVENT_CNT_2_INT() const
     {
-        uint32_t value = static_cast<uint32_t>(EVENT_CNT_2_INT);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
         return value;
     }
     uint32_t get_EVENT_CNT_2_INT() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(EVENT_CNT_2_INT);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
         return value;
     }
     CONSTEXPR pmintset_r &set_EVENT_CNT_2_INT(uint32_t value)
     {
-        EVENT_CNT_2_INT = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 2) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 2);
         return *this;
     }
     CONSTEXPR uint32_t get_EVENT_CNT_3_INT() const
     {
-        uint32_t value = static_cast<uint32_t>(EVENT_CNT_3_INT);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 3));
         return value;
     }
     uint32_t get_EVENT_CNT_3_INT() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(EVENT_CNT_3_INT);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 3));
         return value;
     }
     CONSTEXPR pmintset_r &set_EVENT_CNT_3_INT(uint32_t value)
     {
-        EVENT_CNT_3_INT = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 3) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 3);
         return *this;
     }
     CONSTEXPR uint32_t get_CYCLE_CNT_INT() const
     {
-        uint32_t value = static_cast<uint32_t>(CYCLE_CNT_INT);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 31));
         return value;
     }
     uint32_t get_CYCLE_CNT_INT() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(CYCLE_CNT_INT);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 31));
         return value;
     }
     CONSTEXPR pmintset_r &set_CYCLE_CNT_INT(uint32_t value)
     {
-        CYCLE_CNT_INT = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 31) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 31);
         return *this;
     }
-#endif //__cplusplus
+#endif
 };
 
 // pmintclr_r - Interrupt enable clear register
 struct pmintclr_r
 {
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
+#ifndef __cplusplus
     union
     {
         struct
@@ -7184,30 +6141,28 @@
         };
         uint32_t word;
     };
-#ifdef __cplusplus
+#else
+  private:
+    uint32_t word0;
+
   public:
-    CONSTEXPR pmintclr_r() :
-        EVENT_CNT_0_INT(static_cast<uint32_t>(0)), EVENT_CNT_1_INT(static_cast<uint32_t>(0)),
-        EVENT_CNT_2_INT(static_cast<uint32_t>(0)), EVENT_CNT_3_INT(static_cast<uint32_t>(0)),
-        reserved0(static_cast<uint32_t>(0)), CYCLE_CNT_INT(static_cast<uint32_t>(0))
-    {
-    }
-    CONSTEXPR pmintclr_r(uint32_t init) : word(init) {}
+    CONSTEXPR pmintclr_r() : word0(0) {}
+    CONSTEXPR pmintclr_r(uint32_t init) : word0(init) {}
     CONSTEXPR void operator=(uint32_t value)
     {
-        word = value;
+        word0 = value;
     }
     void operator=(uint32_t value) volatile
     {
-        word = value;
+        word0 = value;
     }
     CONSTEXPR operator uint32_t()
     {
-        return word;
+        return word0;
     }
     operator uint32_t() volatile
     {
-        return word;
+        return word0;
     }
     pmintclr_r copy() volatile
     {
@@ -7215,198 +6170,137 @@
     }
     CONSTEXPR uint32_t get_EVENT_CNT_0_INT() const
     {
-        uint32_t value = static_cast<uint32_t>(EVENT_CNT_0_INT);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 0));
         return value;
     }
     uint32_t get_EVENT_CNT_0_INT() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(EVENT_CNT_0_INT);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 0));
         return value;
     }
     CONSTEXPR pmintclr_r &set_EVENT_CNT_0_INT(uint32_t value)
     {
-        EVENT_CNT_0_INT = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 0) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 0);
         return *this;
     }
     CONSTEXPR uint32_t get_EVENT_CNT_1_INT() const
     {
-        uint32_t value = static_cast<uint32_t>(EVENT_CNT_1_INT);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 1));
         return value;
     }
     uint32_t get_EVENT_CNT_1_INT() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(EVENT_CNT_1_INT);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 1));
         return value;
     }
     CONSTEXPR pmintclr_r &set_EVENT_CNT_1_INT(uint32_t value)
     {
-        EVENT_CNT_1_INT = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 1) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 1);
         return *this;
     }
     CONSTEXPR uint32_t get_EVENT_CNT_2_INT() const
     {
-        uint32_t value = static_cast<uint32_t>(EVENT_CNT_2_INT);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
         return value;
     }
     uint32_t get_EVENT_CNT_2_INT() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(EVENT_CNT_2_INT);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
         return value;
     }
     CONSTEXPR pmintclr_r &set_EVENT_CNT_2_INT(uint32_t value)
     {
-        EVENT_CNT_2_INT = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 2) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 2);
         return *this;
     }
     CONSTEXPR uint32_t get_EVENT_CNT_3_INT() const
     {
-        uint32_t value = static_cast<uint32_t>(EVENT_CNT_3_INT);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 3));
         return value;
     }
     uint32_t get_EVENT_CNT_3_INT() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(EVENT_CNT_3_INT);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 3));
         return value;
     }
     CONSTEXPR pmintclr_r &set_EVENT_CNT_3_INT(uint32_t value)
     {
-        EVENT_CNT_3_INT = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 3) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 3);
         return *this;
     }
     CONSTEXPR uint32_t get_CYCLE_CNT_INT() const
     {
-        uint32_t value = static_cast<uint32_t>(CYCLE_CNT_INT);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 31));
         return value;
     }
     uint32_t get_CYCLE_CNT_INT() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(CYCLE_CNT_INT);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 31));
         return value;
     }
     CONSTEXPR pmintclr_r &set_CYCLE_CNT_INT(uint32_t value)
     {
-        CYCLE_CNT_INT = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 31) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 31);
         return *this;
     }
-#endif //__cplusplus
+#endif
 };
 
-// pmccntr_lo_r - Performance monitor cycle count low register
-struct pmccntr_lo_r
+// pmccntr_r - Performance monitor cycle count register
+struct pmccntr_r
 {
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
-    union
-    {
-        uint32_t CYCLE_CNT_LO; // Cycle count low
-        uint32_t word;
-    };
-#ifdef __cplusplus
-  public:
-    CONSTEXPR pmccntr_lo_r() : CYCLE_CNT_LO(static_cast<uint32_t>(0x00000000)) {}
-    CONSTEXPR pmccntr_lo_r(uint32_t init) : word(init) {}
-    CONSTEXPR void operator=(uint32_t value)
-    {
-        word = value;
-    }
-    void operator=(uint32_t value) volatile
-    {
-        word = value;
-    }
-    CONSTEXPR operator uint32_t()
-    {
-        return word;
-    }
-    operator uint32_t() volatile
-    {
-        return word;
-    }
-    pmccntr_lo_r copy() volatile
-    {
-        return *this;
-    }
-    CONSTEXPR uint32_t get_CYCLE_CNT_LO() const
-    {
-        uint32_t value = static_cast<uint32_t>(CYCLE_CNT_LO);
-        return value;
-    }
-    uint32_t get_CYCLE_CNT_LO() const volatile
-    {
-        uint32_t value = static_cast<uint32_t>(CYCLE_CNT_LO);
-        return value;
-    }
-    CONSTEXPR pmccntr_lo_r &set_CYCLE_CNT_LO(uint32_t value)
-    {
-        CYCLE_CNT_LO = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// pmccntr_hi_r - Performance monitor cycle count high register
-struct pmccntr_hi_r
-{
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
+#ifndef __cplusplus
     union
     {
         struct
         {
-            uint32_t CYCLE_CNT_HI : 16; // Cycle count high
+            uint32_t CYCLE_CNT_LO : 32; // Cycle count - LSB
+            uint32_t CYCLE_CNT_HI : 16; // Cycle count - MSB
             uint32_t reserved0 : 16;
         };
-        uint32_t word;
+        uint32_t word[2];
     };
-#ifdef __cplusplus
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
   public:
-    CONSTEXPR pmccntr_hi_r() : CYCLE_CNT_HI(static_cast<uint32_t>(0x0000)), reserved0(static_cast<uint32_t>(0)) {}
-    CONSTEXPR pmccntr_hi_r(uint32_t init) : word(init) {}
-    CONSTEXPR void operator=(uint32_t value)
+    CONSTEXPR pmccntr_r() : word0(0), word1(0) {}
+    CONSTEXPR pmccntr_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
     {
-        word = value;
     }
-    void operator=(uint32_t value) volatile
+    CONSTEXPR void operator=(uint64_t value)
     {
-        word = value;
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
     }
-    CONSTEXPR operator uint32_t()
+    void operator=(uint64_t value) volatile
     {
-        return word;
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
     }
-    operator uint32_t() volatile
+    CONSTEXPR operator uint64_t()
     {
-        return word;
+        return (static_cast<uint64_t>(word1) << 32) | word0;
     }
-    pmccntr_hi_r copy() volatile
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    pmccntr_r copy() volatile
     {
         return *this;
     }
-    CONSTEXPR uint32_t get_CYCLE_CNT_HI() const
-    {
-        uint32_t value = static_cast<uint32_t>(CYCLE_CNT_HI);
-        return value;
-    }
-    uint32_t get_CYCLE_CNT_HI() const volatile
-    {
-        uint32_t value = static_cast<uint32_t>(CYCLE_CNT_HI);
-        return value;
-    }
-    CONSTEXPR pmccntr_hi_r &set_CYCLE_CNT_HI(uint32_t value)
-    {
-        CYCLE_CNT_HI = ((1u << 16) - 1) & static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
+#endif
 };
 
 // pmccntr_cfg_r - Set start/stop event on the cycle counter
 struct pmccntr_cfg_r
 {
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
+#ifndef __cplusplus
     union
     {
         struct
@@ -7418,171 +6312,1881 @@
         };
         uint32_t word;
     };
-#ifdef __cplusplus
+#else
+  private:
+    uint32_t word0;
+
   public:
-    CONSTEXPR pmccntr_cfg_r() :
-        CYCLE_CNT_CFG_START(static_cast<uint32_t>(0x00)), reserved0(static_cast<uint32_t>(0)),
-        CYCLE_CNT_CFG_STOP(static_cast<uint32_t>(0x00)), reserved1(static_cast<uint32_t>(0))
-    {
-    }
-    CONSTEXPR pmccntr_cfg_r(uint32_t init) : word(init) {}
+    CONSTEXPR pmccntr_cfg_r() : word0(0) {}
+    CONSTEXPR pmccntr_cfg_r(uint32_t init) : word0(init) {}
     CONSTEXPR void operator=(uint32_t value)
     {
-        word = value;
+        word0 = value;
     }
     void operator=(uint32_t value) volatile
     {
-        word = value;
+        word0 = value;
     }
     CONSTEXPR operator uint32_t()
     {
-        return word;
+        return word0;
     }
     operator uint32_t() volatile
     {
-        return word;
+        return word0;
     }
     pmccntr_cfg_r copy() volatile
     {
         return *this;
     }
-    CONSTEXPR uint32_t get_CYCLE_CNT_CFG_START() const
+    CONSTEXPR NPU_NAMESPACE::pmu_event get_CYCLE_CNT_CFG_START() const
     {
-        uint32_t value = static_cast<uint32_t>(CYCLE_CNT_CFG_START);
+        NPU_NAMESPACE::pmu_event value = static_cast<NPU_NAMESPACE::pmu_event>(((1U << 10) - 1) & (word0 >> 0));
         return value;
     }
-    uint32_t get_CYCLE_CNT_CFG_START() const volatile
+    NPU_NAMESPACE::pmu_event get_CYCLE_CNT_CFG_START() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(CYCLE_CNT_CFG_START);
+        NPU_NAMESPACE::pmu_event value = static_cast<NPU_NAMESPACE::pmu_event>(((1U << 10) - 1) & (word0 >> 0));
         return value;
     }
-    CONSTEXPR pmccntr_cfg_r &set_CYCLE_CNT_CFG_START(uint32_t value)
+    CONSTEXPR pmccntr_cfg_r &set_CYCLE_CNT_CFG_START(NPU_NAMESPACE::pmu_event value)
     {
-        CYCLE_CNT_CFG_START = ((1u << 10) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 10) - 1)) << 0) & word0) | ((((1U << 10) - 1) & static_cast<uint32_t>(value)) << 0);
         return *this;
     }
-    CONSTEXPR uint32_t get_CYCLE_CNT_CFG_STOP() const
+    CONSTEXPR NPU_NAMESPACE::pmu_event get_CYCLE_CNT_CFG_STOP() const
     {
-        uint32_t value = static_cast<uint32_t>(CYCLE_CNT_CFG_STOP);
+        NPU_NAMESPACE::pmu_event value = static_cast<NPU_NAMESPACE::pmu_event>(((1U << 10) - 1) & (word0 >> 16));
         return value;
     }
-    uint32_t get_CYCLE_CNT_CFG_STOP() const volatile
+    NPU_NAMESPACE::pmu_event get_CYCLE_CNT_CFG_STOP() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(CYCLE_CNT_CFG_STOP);
+        NPU_NAMESPACE::pmu_event value = static_cast<NPU_NAMESPACE::pmu_event>(((1U << 10) - 1) & (word0 >> 16));
         return value;
     }
-    CONSTEXPR pmccntr_cfg_r &set_CYCLE_CNT_CFG_STOP(uint32_t value)
+    CONSTEXPR pmccntr_cfg_r &set_CYCLE_CNT_CFG_STOP(NPU_NAMESPACE::pmu_event value)
     {
-        CYCLE_CNT_CFG_STOP = ((1u << 10) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 10) - 1)) << 16) & word0) | ((((1U << 10) - 1) & static_cast<uint32_t>(value)) << 16);
         return *this;
     }
-#endif //__cplusplus
+#endif
 };
 
 // pmcaxi_chan_r - Set which AXI channel to monitor for latency measurements in PMU
 struct pmcaxi_chan_r
 {
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
+#ifndef __cplusplus
     union
     {
         struct
         {
-            uint32_t CH_SEL : 4; // Channel number to monitor for latency measurements (Read: 0=Cmd 1=IFM 2=Weights
-                                 // 3=Scale+Bias 4=Mem2Mem; Write: 8=OFM 9=Mem2Mem)
+            uint32_t CH_SEL : 4; // Channel select for latency measurements
             uint32_t reserved0 : 4;
-            uint32_t AXI_CNT_SEL : 2;  // AXI counter to monitor for latency measurements (0=AXI0 counter0, 1=AXI0
-                                       // counter1, 2=AXI1 counter 2, 3=AXI counter3)
-            uint32_t BW_CH_SEL_EN : 1; // Bandwidth channel selector enable: {0=AXI bw events measured for all channels,
-                                       // 1=AXI bw events measured for channel specified by CH_SEL
+            uint32_t AXI_CNT_SEL : 2;  // AXI counter to monitor for latency measurements
+            uint32_t BW_CH_SEL_EN : 1; // Bandwidth channel selector
             uint32_t reserved1 : 21;
         };
         uint32_t word;
     };
-#ifdef __cplusplus
+#else
+  private:
+    uint32_t word0;
+
   public:
-    CONSTEXPR pmcaxi_chan_r() :
-        CH_SEL(static_cast<uint32_t>(0x0)), reserved0(static_cast<uint32_t>(0)),
-        AXI_CNT_SEL(static_cast<uint32_t>(0x000000)), BW_CH_SEL_EN(static_cast<uint32_t>(0x000000)),
-        reserved1(static_cast<uint32_t>(0))
-    {
-    }
-    CONSTEXPR pmcaxi_chan_r(uint32_t init) : word(init) {}
+    CONSTEXPR pmcaxi_chan_r() : word0(0) {}
+    CONSTEXPR pmcaxi_chan_r(uint32_t init) : word0(init) {}
     CONSTEXPR void operator=(uint32_t value)
     {
-        word = value;
+        word0 = value;
     }
     void operator=(uint32_t value) volatile
     {
-        word = value;
+        word0 = value;
     }
     CONSTEXPR operator uint32_t()
     {
-        return word;
+        return word0;
     }
     operator uint32_t() volatile
     {
-        return word;
+        return word0;
     }
     pmcaxi_chan_r copy() volatile
     {
         return *this;
     }
-    CONSTEXPR uint32_t get_CH_SEL() const
+    CONSTEXPR NPU_NAMESPACE::pmu_axi_channel get_CH_SEL() const
     {
-        uint32_t value = static_cast<uint32_t>(CH_SEL);
+        NPU_NAMESPACE::pmu_axi_channel value =
+            static_cast<NPU_NAMESPACE::pmu_axi_channel>(((1U << 4) - 1) & (word0 >> 0));
         return value;
     }
-    uint32_t get_CH_SEL() const volatile
+    NPU_NAMESPACE::pmu_axi_channel get_CH_SEL() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(CH_SEL);
+        NPU_NAMESPACE::pmu_axi_channel value =
+            static_cast<NPU_NAMESPACE::pmu_axi_channel>(((1U << 4) - 1) & (word0 >> 0));
         return value;
     }
-    CONSTEXPR pmcaxi_chan_r &set_CH_SEL(uint32_t value)
+    CONSTEXPR pmcaxi_chan_r &set_CH_SEL(NPU_NAMESPACE::pmu_axi_channel value)
     {
-        CH_SEL = ((1u << 4) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 4) - 1)) << 0) & word0) | ((((1U << 4) - 1) & static_cast<uint32_t>(value)) << 0);
         return *this;
     }
     CONSTEXPR uint32_t get_AXI_CNT_SEL() const
     {
-        uint32_t value = static_cast<uint32_t>(AXI_CNT_SEL);
+        uint32_t value = static_cast<uint32_t>(((1U << 2) - 1) & (word0 >> 8));
         return value;
     }
     uint32_t get_AXI_CNT_SEL() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(AXI_CNT_SEL);
+        uint32_t value = static_cast<uint32_t>(((1U << 2) - 1) & (word0 >> 8));
         return value;
     }
     CONSTEXPR pmcaxi_chan_r &set_AXI_CNT_SEL(uint32_t value)
     {
-        AXI_CNT_SEL = ((1u << 2) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 2) - 1)) << 8) & word0) | ((((1U << 2) - 1) & static_cast<uint32_t>(value)) << 8);
         return *this;
     }
     CONSTEXPR uint32_t get_BW_CH_SEL_EN() const
     {
-        uint32_t value = static_cast<uint32_t>(BW_CH_SEL_EN);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 10));
         return value;
     }
     uint32_t get_BW_CH_SEL_EN() const volatile
     {
-        uint32_t value = static_cast<uint32_t>(BW_CH_SEL_EN);
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 10));
         return value;
     }
     CONSTEXPR pmcaxi_chan_r &set_BW_CH_SEL_EN(uint32_t value)
     {
-        BW_CH_SEL_EN = ((1u << 1) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 1) - 1)) << 10) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 10);
         return *this;
     }
-#endif //__cplusplus
+#endif
 };
 
-// pmevtyper0_r - Performance monitor event type register 0
-struct pmevtyper0_r
+// kernel_x_r - Kernel X offset of in kernel decomposition
+struct kernel_x_r
 {
-#ifdef __cplusplus
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
   private:
-#endif //__cplusplus
+    uint32_t word0;
+
+  public:
+    CONSTEXPR kernel_x_r() : word0(0) {}
+    CONSTEXPR kernel_x_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    kernel_x_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR kernel_x_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// kernel_y_r - Kernel Y offset of in kernel decomposition
+struct kernel_y_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR kernel_y_r() : word0(0) {}
+    CONSTEXPR kernel_y_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    kernel_y_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR kernel_y_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// kernel_w_m1_r - Kernel (width-1) of current block
+struct kernel_w_m1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR kernel_w_m1_r() : word0(0) {}
+    CONSTEXPR kernel_w_m1_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    kernel_w_m1_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR kernel_w_m1_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// kernel_h_m1_r - Kernel (height-1) of current block
+struct kernel_h_m1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR kernel_h_m1_r() : word0(0) {}
+    CONSTEXPR kernel_h_m1_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    kernel_h_m1_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR kernel_h_m1_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ofm_cblk_width_m1_r - OFM current block (width-1)
+struct ofm_cblk_width_m1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ofm_cblk_width_m1_r() : word0(0) {}
+    CONSTEXPR ofm_cblk_width_m1_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ofm_cblk_width_m1_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ofm_cblk_width_m1_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ofm_cblk_height_m1_r - OFM current block (height-1)
+struct ofm_cblk_height_m1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ofm_cblk_height_m1_r() : word0(0) {}
+    CONSTEXPR ofm_cblk_height_m1_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ofm_cblk_height_m1_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ofm_cblk_height_m1_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ofm_cblk_depth_m1_r - OFM current block (depth-1)
+struct ofm_cblk_depth_m1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ofm_cblk_depth_m1_r() : word0(0) {}
+    CONSTEXPR ofm_cblk_depth_m1_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ofm_cblk_depth_m1_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ofm_cblk_depth_m1_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ifm_cblk_depth_m1_r - IFM current block (depth-1)
+struct ifm_cblk_depth_m1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ifm_cblk_depth_m1_r() : word0(0) {}
+    CONSTEXPR ifm_cblk_depth_m1_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ifm_cblk_depth_m1_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ifm_cblk_depth_m1_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ofm_x_r - Block X coordinate in OFM
+struct ofm_x_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ofm_x_r() : word0(0) {}
+    CONSTEXPR ofm_x_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ofm_x_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ofm_x_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ofm_y_r - Block Y coordinate in OFM
+struct ofm_y_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ofm_y_r() : word0(0) {}
+    CONSTEXPR ofm_y_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ofm_y_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ofm_y_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ofm_z_r - Block Z (channel) coordinate in OFM
+struct ofm_z_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ofm_z_r() : word0(0) {}
+    CONSTEXPR ofm_z_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ofm_z_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ofm_z_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ifm_z_r - Block Z (channel) coordinate in IFM
+struct ifm_z_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ifm_z_r() : word0(0) {}
+    CONSTEXPR ifm_z_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ifm_z_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ifm_z_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// pad_top_r - Block top pad
+struct pad_top_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR pad_top_r() : word0(0) {}
+    CONSTEXPR pad_top_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    pad_top_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR pad_top_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// pad_left_r - Block left pad
+struct pad_left_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR pad_left_r() : word0(0) {}
+    CONSTEXPR pad_left_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    pad_left_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR pad_left_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ifm_cblk_width_r - IFM current block derived width
+struct ifm_cblk_width_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ifm_cblk_width_r() : word0(0) {}
+    CONSTEXPR ifm_cblk_width_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ifm_cblk_width_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ifm_cblk_width_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ifm_cblk_height_r - IFM current block derived height
+struct ifm_cblk_height_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ifm_cblk_height_r() : word0(0) {}
+    CONSTEXPR ifm_cblk_height_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ifm_cblk_height_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ifm_cblk_height_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// dma_ifm_src_r - DMA IFM channel source position on AXI
+struct dma_ifm_src_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t offset : 32; // Offset
+            uint32_t reserved0 : 32;
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR dma_ifm_src_r() : word0(0), word1(0) {}
+    CONSTEXPR dma_ifm_src_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    dma_ifm_src_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// dma_ifm_dst_r - DMA IFM channel destination position in SHRAM
+struct dma_ifm_dst_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR dma_ifm_dst_r() : word0(0) {}
+    CONSTEXPR dma_ifm_dst_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    dma_ifm_dst_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR dma_ifm_dst_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// dma_ofm_src_r - DMA OFM channel source position in SHRAM
+struct dma_ofm_src_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR dma_ofm_src_r() : word0(0) {}
+    CONSTEXPR dma_ofm_src_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    dma_ofm_src_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR dma_ofm_src_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// dma_ofm_dst_r - DMA OFM channel destination position on AXI
+struct dma_ofm_dst_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t offset : 32; // Offset
+            uint32_t reserved0 : 32;
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR dma_ofm_dst_r() : word0(0), word1(0) {}
+    CONSTEXPR dma_ofm_dst_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    dma_ofm_dst_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// dma_weight_src_r - DMA weight channel source position on AXI
+struct dma_weight_src_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t offset : 32; // Offset
+            uint32_t reserved0 : 32;
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR dma_weight_src_r() : word0(0), word1(0) {}
+    CONSTEXPR dma_weight_src_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    dma_weight_src_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// dma_cmd_src_r - DMA command channel source position on AXI
+struct dma_cmd_src_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t offset : 32; // Offset
+            uint32_t reserved0 : 32;
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR dma_cmd_src_r() : word0(0), word1(0) {}
+    CONSTEXPR dma_cmd_src_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    dma_cmd_src_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// dma_cmd_size_r - DMA command channel number of bytes buffered
+struct dma_cmd_size_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR dma_cmd_size_r() : word0(0) {}
+    CONSTEXPR dma_cmd_size_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    dma_cmd_size_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR dma_cmd_size_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// dma_m2m_src_r - DMA memory to memory source position on AXI
+struct dma_m2m_src_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t offset : 32; // Offset
+            uint32_t reserved0 : 32;
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR dma_m2m_src_r() : word0(0), word1(0) {}
+    CONSTEXPR dma_m2m_src_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    dma_m2m_src_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// dma_m2m_dst_r - DMA memory to memory destination position on AXI
+struct dma_m2m_dst_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t offset : 32; // Offset
+            uint32_t reserved0 : 32;
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR dma_m2m_dst_r() : word0(0), word1(0) {}
+    CONSTEXPR dma_m2m_dst_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    dma_m2m_dst_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// current_qread_r - QREAD position being issued (rather than completed)
+struct current_qread_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR current_qread_r() : word0(0) {}
+    CONSTEXPR current_qread_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    current_qread_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR current_qread_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// dma_scale_src_r - DMA scale and bias channel source position on AXI
+struct dma_scale_src_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t offset : 32; // Offset
+            uint32_t reserved0 : 32;
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR dma_scale_src_r() : word0(0), word1(0) {}
+    CONSTEXPR dma_scale_src_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    dma_scale_src_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// current_block_r - 0-3. Current block bank being executed by the TSU or last one executed if TSU is stopped
+struct current_block_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR current_block_r() : word0(0) {}
+    CONSTEXPR current_block_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    current_block_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR current_block_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// current_op_r - Current NPU OP command being executed by the TSU
+struct current_op_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR current_op_r() : word0(0) {}
+    CONSTEXPR current_op_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    current_op_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR current_op_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// current_cmd_r - Current 32-bit command being parsed by the command stream parser
+struct current_cmd_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR current_cmd_r() : word0(0) {}
+    CONSTEXPR current_cmd_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    current_cmd_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR current_cmd_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// pmevcntr_r - Performance monitor event 0 count register
+struct pmevcntr_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t count : 32; // Count word
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR pmevcntr_r() : word0(0) {}
+    CONSTEXPR pmevcntr_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    pmevcntr_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_count() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_count() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR pmevcntr_r &set_count(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// pmevtyper_r - Performance monitor event type register 0
+struct pmevtyper_r
+{
+#ifndef __cplusplus
     union
     {
         struct
@@ -7592,547 +8196,5577 @@
         };
         uint32_t word;
     };
-#ifdef __cplusplus
+#else
+  private:
+    uint32_t word0;
+
   public:
-    CONSTEXPR pmevtyper0_r() :
-        EV_TYPE(static_cast<uint32_t>(::pmu_event_type::NO_EVENT)), reserved0(static_cast<uint32_t>(0))
-    {
-    }
-    CONSTEXPR pmevtyper0_r(uint32_t init) : word(init) {}
+    CONSTEXPR pmevtyper_r() : word0(0) {}
+    CONSTEXPR pmevtyper_r(uint32_t init) : word0(init) {}
     CONSTEXPR void operator=(uint32_t value)
     {
-        word = value;
+        word0 = value;
     }
     void operator=(uint32_t value) volatile
     {
-        word = value;
+        word0 = value;
     }
     CONSTEXPR operator uint32_t()
     {
-        return word;
+        return word0;
     }
     operator uint32_t() volatile
     {
-        return word;
+        return word0;
     }
-    pmevtyper0_r copy() volatile
+    pmevtyper_r copy() volatile
     {
         return *this;
     }
-    CONSTEXPR ::pmu_event_type get_EV_TYPE() const
+    CONSTEXPR NPU_NAMESPACE::pmu_event get_EV_TYPE() const
     {
-        ::pmu_event_type value = static_cast<::pmu_event_type>(EV_TYPE);
+        NPU_NAMESPACE::pmu_event value = static_cast<NPU_NAMESPACE::pmu_event>(((1U << 10) - 1) & (word0 >> 0));
         return value;
     }
-    ::pmu_event_type get_EV_TYPE() const volatile
+    NPU_NAMESPACE::pmu_event get_EV_TYPE() const volatile
     {
-        ::pmu_event_type value = static_cast<::pmu_event_type>(EV_TYPE);
+        NPU_NAMESPACE::pmu_event value = static_cast<NPU_NAMESPACE::pmu_event>(((1U << 10) - 1) & (word0 >> 0));
         return value;
     }
-    CONSTEXPR pmevtyper0_r &set_EV_TYPE(::pmu_event_type value)
+    CONSTEXPR pmevtyper_r &set_EV_TYPE(NPU_NAMESPACE::pmu_event value)
     {
-        EV_TYPE = ((1u << 10) - 1) & static_cast<uint32_t>(value);
+        word0 = (((~((1U << 10) - 1)) << 0) & word0) | ((((1U << 10) - 1) & static_cast<uint32_t>(value)) << 0);
         return *this;
     }
-#endif //__cplusplus
+#endif
 };
 
-// pmevtyper1_r - Performance monitor event type register 1
-struct pmevtyper1_r
+// shared_buffer_r - Shared buffer debug access. Only valid in STOPPED state
+struct shared_buffer_r
 {
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
+#ifndef __cplusplus
     union
     {
         struct
         {
-            uint32_t EV_TYPE : 10; // Event Type
-            uint32_t reserved0 : 22;
+            uint32_t mem_word : 32; // Memory word
         };
         uint32_t word;
     };
-#ifdef __cplusplus
+#else
+  private:
+    uint32_t word0;
+
   public:
-    CONSTEXPR pmevtyper1_r() :
-        EV_TYPE(static_cast<uint32_t>(::pmu_event_type::NO_EVENT)), reserved0(static_cast<uint32_t>(0))
-    {
-    }
-    CONSTEXPR pmevtyper1_r(uint32_t init) : word(init) {}
+    CONSTEXPR shared_buffer_r() : word0(0) {}
+    CONSTEXPR shared_buffer_r(uint32_t init) : word0(init) {}
     CONSTEXPR void operator=(uint32_t value)
     {
-        word = value;
+        word0 = value;
     }
     void operator=(uint32_t value) volatile
     {
-        word = value;
+        word0 = value;
     }
     CONSTEXPR operator uint32_t()
     {
-        return word;
+        return word0;
     }
     operator uint32_t() volatile
     {
-        return word;
+        return word0;
     }
-    pmevtyper1_r copy() volatile
+    shared_buffer_r copy() volatile
     {
         return *this;
     }
-    CONSTEXPR ::pmu_event_type get_EV_TYPE() const
+    CONSTEXPR uint32_t get_mem_word() const
     {
-        ::pmu_event_type value = static_cast<::pmu_event_type>(EV_TYPE);
+        uint32_t value = static_cast<uint32_t>(word0);
         return value;
     }
-    ::pmu_event_type get_EV_TYPE() const volatile
+    uint32_t get_mem_word() const volatile
     {
-        ::pmu_event_type value = static_cast<::pmu_event_type>(EV_TYPE);
+        uint32_t value = static_cast<uint32_t>(word0);
         return value;
     }
-    CONSTEXPR pmevtyper1_r &set_EV_TYPE(::pmu_event_type value)
+    CONSTEXPR shared_buffer_r &set_mem_word(uint32_t value)
     {
-        EV_TYPE = ((1u << 10) - 1) & static_cast<uint32_t>(value);
+        word0 = static_cast<uint32_t>(value);
         return *this;
     }
-#endif //__cplusplus
+#endif
 };
 
-// pmevtyper2_r - Performance monitor event type register 2
-struct pmevtyper2_r
+// ifm_pad_top_r - None
+struct ifm_pad_top_r
 {
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
+#ifndef __cplusplus
     union
     {
         struct
         {
-            uint32_t EV_TYPE : 10; // Event Type
-            uint32_t reserved0 : 22;
+            uint32_t value : 32; // 32-bit register value
         };
         uint32_t word;
     };
-#ifdef __cplusplus
+#else
+  private:
+    uint32_t word0;
+
   public:
-    CONSTEXPR pmevtyper2_r() :
-        EV_TYPE(static_cast<uint32_t>(::pmu_event_type::NO_EVENT)), reserved0(static_cast<uint32_t>(0))
-    {
-    }
-    CONSTEXPR pmevtyper2_r(uint32_t init) : word(init) {}
+    CONSTEXPR ifm_pad_top_r() : word0(0) {}
+    CONSTEXPR ifm_pad_top_r(uint32_t init) : word0(init) {}
     CONSTEXPR void operator=(uint32_t value)
     {
-        word = value;
+        word0 = value;
     }
     void operator=(uint32_t value) volatile
     {
-        word = value;
+        word0 = value;
     }
     CONSTEXPR operator uint32_t()
     {
-        return word;
+        return word0;
     }
     operator uint32_t() volatile
     {
-        return word;
+        return word0;
     }
-    pmevtyper2_r copy() volatile
+    ifm_pad_top_r copy() volatile
     {
         return *this;
     }
-    CONSTEXPR ::pmu_event_type get_EV_TYPE() const
+    CONSTEXPR uint32_t get_value() const
     {
-        ::pmu_event_type value = static_cast<::pmu_event_type>(EV_TYPE);
+        uint32_t value = static_cast<uint32_t>(word0);
         return value;
     }
-    ::pmu_event_type get_EV_TYPE() const volatile
+    uint32_t get_value() const volatile
     {
-        ::pmu_event_type value = static_cast<::pmu_event_type>(EV_TYPE);
+        uint32_t value = static_cast<uint32_t>(word0);
         return value;
     }
-    CONSTEXPR pmevtyper2_r &set_EV_TYPE(::pmu_event_type value)
+    CONSTEXPR ifm_pad_top_r &set_value(uint32_t value)
     {
-        EV_TYPE = ((1u << 10) - 1) & static_cast<uint32_t>(value);
+        word0 = static_cast<uint32_t>(value);
         return *this;
     }
-#endif //__cplusplus
+#endif
 };
 
-// pmevtyper3_r - Performance monitor event type register 3
-struct pmevtyper3_r
+// ifm_pad_left_r - None
+struct ifm_pad_left_r
 {
-#ifdef __cplusplus
-  private:
-#endif //__cplusplus
+#ifndef __cplusplus
     union
     {
         struct
         {
-            uint32_t EV_TYPE : 10; // Event Type
-            uint32_t reserved0 : 22;
+            uint32_t value : 32; // 32-bit register value
         };
         uint32_t word;
     };
-#ifdef __cplusplus
+#else
+  private:
+    uint32_t word0;
+
   public:
-    CONSTEXPR pmevtyper3_r() :
-        EV_TYPE(static_cast<uint32_t>(::pmu_event_type::NO_EVENT)), reserved0(static_cast<uint32_t>(0))
-    {
-    }
-    CONSTEXPR pmevtyper3_r(uint32_t init) : word(init) {}
+    CONSTEXPR ifm_pad_left_r() : word0(0) {}
+    CONSTEXPR ifm_pad_left_r(uint32_t init) : word0(init) {}
     CONSTEXPR void operator=(uint32_t value)
     {
-        word = value;
+        word0 = value;
     }
     void operator=(uint32_t value) volatile
     {
-        word = value;
+        word0 = value;
     }
     CONSTEXPR operator uint32_t()
     {
-        return word;
+        return word0;
     }
     operator uint32_t() volatile
     {
-        return word;
+        return word0;
     }
-    pmevtyper3_r copy() volatile
+    ifm_pad_left_r copy() volatile
     {
         return *this;
     }
-    CONSTEXPR ::pmu_event_type get_EV_TYPE() const
+    CONSTEXPR uint32_t get_value() const
     {
-        ::pmu_event_type value = static_cast<::pmu_event_type>(EV_TYPE);
+        uint32_t value = static_cast<uint32_t>(word0);
         return value;
     }
-    ::pmu_event_type get_EV_TYPE() const volatile
+    uint32_t get_value() const volatile
     {
-        ::pmu_event_type value = static_cast<::pmu_event_type>(EV_TYPE);
+        uint32_t value = static_cast<uint32_t>(word0);
         return value;
     }
-    CONSTEXPR pmevtyper3_r &set_EV_TYPE(::pmu_event_type value)
+    CONSTEXPR ifm_pad_left_r &set_value(uint32_t value)
     {
-        EV_TYPE = ((1u << 10) - 1) & static_cast<uint32_t>(value);
+        word0 = static_cast<uint32_t>(value);
         return *this;
     }
-#endif //__cplusplus
+#endif
+};
+
+// ifm_pad_right_r - None
+struct ifm_pad_right_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ifm_pad_right_r() : word0(0) {}
+    CONSTEXPR ifm_pad_right_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ifm_pad_right_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ifm_pad_right_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ifm_pad_bottom_r - None
+struct ifm_pad_bottom_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ifm_pad_bottom_r() : word0(0) {}
+    CONSTEXPR ifm_pad_bottom_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ifm_pad_bottom_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ifm_pad_bottom_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ifm_depth_m1_r - None
+struct ifm_depth_m1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ifm_depth_m1_r() : word0(0) {}
+    CONSTEXPR ifm_depth_m1_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ifm_depth_m1_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ifm_depth_m1_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ifm_precision_r - None
+struct ifm_precision_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ifm_precision_r() : word0(0) {}
+    CONSTEXPR ifm_precision_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ifm_precision_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ifm_precision_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ifm_upscale_r - None
+struct ifm_upscale_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ifm_upscale_r() : word0(0) {}
+    CONSTEXPR ifm_upscale_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ifm_upscale_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ifm_upscale_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ifm_zero_point_r - None
+struct ifm_zero_point_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ifm_zero_point_r() : word0(0) {}
+    CONSTEXPR ifm_zero_point_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ifm_zero_point_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ifm_zero_point_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ifm_width0_m1_r - None
+struct ifm_width0_m1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ifm_width0_m1_r() : word0(0) {}
+    CONSTEXPR ifm_width0_m1_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ifm_width0_m1_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ifm_width0_m1_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ifm_height0_m1_r - None
+struct ifm_height0_m1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ifm_height0_m1_r() : word0(0) {}
+    CONSTEXPR ifm_height0_m1_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ifm_height0_m1_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ifm_height0_m1_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ifm_height1_m1_r - None
+struct ifm_height1_m1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ifm_height1_m1_r() : word0(0) {}
+    CONSTEXPR ifm_height1_m1_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ifm_height1_m1_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ifm_height1_m1_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ifm_ib_end_r - None
+struct ifm_ib_end_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ifm_ib_end_r() : word0(0) {}
+    CONSTEXPR ifm_ib_end_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ifm_ib_end_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ifm_ib_end_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ifm_region_r - None
+struct ifm_region_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ifm_region_r() : word0(0) {}
+    CONSTEXPR ifm_region_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ifm_region_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ifm_region_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ofm_width_m1_r - None
+struct ofm_width_m1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ofm_width_m1_r() : word0(0) {}
+    CONSTEXPR ofm_width_m1_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ofm_width_m1_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ofm_width_m1_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ofm_height_m1_r - None
+struct ofm_height_m1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ofm_height_m1_r() : word0(0) {}
+    CONSTEXPR ofm_height_m1_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ofm_height_m1_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ofm_height_m1_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ofm_depth_m1_r - None
+struct ofm_depth_m1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ofm_depth_m1_r() : word0(0) {}
+    CONSTEXPR ofm_depth_m1_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ofm_depth_m1_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ofm_depth_m1_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ofm_precision_r - None
+struct ofm_precision_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ofm_precision_r() : word0(0) {}
+    CONSTEXPR ofm_precision_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ofm_precision_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ofm_precision_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ofm_blk_width_m1_r - None
+struct ofm_blk_width_m1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ofm_blk_width_m1_r() : word0(0) {}
+    CONSTEXPR ofm_blk_width_m1_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ofm_blk_width_m1_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ofm_blk_width_m1_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ofm_blk_height_m1_r - None
+struct ofm_blk_height_m1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ofm_blk_height_m1_r() : word0(0) {}
+    CONSTEXPR ofm_blk_height_m1_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ofm_blk_height_m1_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ofm_blk_height_m1_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ofm_blk_depth_m1_r - None
+struct ofm_blk_depth_m1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ofm_blk_depth_m1_r() : word0(0) {}
+    CONSTEXPR ofm_blk_depth_m1_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ofm_blk_depth_m1_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ofm_blk_depth_m1_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ofm_zero_point_r - None
+struct ofm_zero_point_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ofm_zero_point_r() : word0(0) {}
+    CONSTEXPR ofm_zero_point_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ofm_zero_point_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ofm_zero_point_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ofm_width0_m1_r - None
+struct ofm_width0_m1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ofm_width0_m1_r() : word0(0) {}
+    CONSTEXPR ofm_width0_m1_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ofm_width0_m1_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ofm_width0_m1_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ofm_height0_m1_r - None
+struct ofm_height0_m1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ofm_height0_m1_r() : word0(0) {}
+    CONSTEXPR ofm_height0_m1_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ofm_height0_m1_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ofm_height0_m1_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ofm_height1_m1_r - None
+struct ofm_height1_m1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ofm_height1_m1_r() : word0(0) {}
+    CONSTEXPR ofm_height1_m1_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ofm_height1_m1_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ofm_height1_m1_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ofm_region_r - None
+struct ofm_region_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ofm_region_r() : word0(0) {}
+    CONSTEXPR ofm_region_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ofm_region_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ofm_region_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// kernel_width_m1_r - None
+struct kernel_width_m1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR kernel_width_m1_r() : word0(0) {}
+    CONSTEXPR kernel_width_m1_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    kernel_width_m1_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR kernel_width_m1_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// kernel_height_m1_r - None
+struct kernel_height_m1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR kernel_height_m1_r() : word0(0) {}
+    CONSTEXPR kernel_height_m1_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    kernel_height_m1_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR kernel_height_m1_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// kernel_stride_r - None
+struct kernel_stride_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR kernel_stride_r() : word0(0) {}
+    CONSTEXPR kernel_stride_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    kernel_stride_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR kernel_stride_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// acc_format_r - None
+struct acc_format_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR acc_format_r() : word0(0) {}
+    CONSTEXPR acc_format_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    acc_format_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR acc_format_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// activation_r - None
+struct activation_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR activation_r() : word0(0) {}
+    CONSTEXPR activation_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    activation_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR activation_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// activation_min_r - None
+struct activation_min_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR activation_min_r() : word0(0) {}
+    CONSTEXPR activation_min_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    activation_min_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR activation_min_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// activation_max_r - None
+struct activation_max_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR activation_max_r() : word0(0) {}
+    CONSTEXPR activation_max_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    activation_max_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR activation_max_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// weight_region_r - None
+struct weight_region_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR weight_region_r() : word0(0) {}
+    CONSTEXPR weight_region_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    weight_region_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR weight_region_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// scale_region_r - None
+struct scale_region_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR scale_region_r() : word0(0) {}
+    CONSTEXPR scale_region_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    scale_region_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR scale_region_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ab_start_r - None
+struct ab_start_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ab_start_r() : word0(0) {}
+    CONSTEXPR ab_start_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ab_start_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ab_start_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// blockdep_r - None
+struct blockdep_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR blockdep_r() : word0(0) {}
+    CONSTEXPR blockdep_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    blockdep_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR blockdep_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// dma0_src_region_r - None
+struct dma0_src_region_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR dma0_src_region_r() : word0(0) {}
+    CONSTEXPR dma0_src_region_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    dma0_src_region_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR dma0_src_region_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// dma0_dst_region_r - None
+struct dma0_dst_region_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR dma0_dst_region_r() : word0(0) {}
+    CONSTEXPR dma0_dst_region_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    dma0_dst_region_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR dma0_dst_region_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// dma0_size0_r - None
+struct dma0_size0_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR dma0_size0_r() : word0(0) {}
+    CONSTEXPR dma0_size0_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    dma0_size0_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR dma0_size0_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// dma0_size1_r - None
+struct dma0_size1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR dma0_size1_r() : word0(0) {}
+    CONSTEXPR dma0_size1_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    dma0_size1_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR dma0_size1_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ifm2_broadcast_r - None
+struct ifm2_broadcast_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ifm2_broadcast_r() : word0(0) {}
+    CONSTEXPR ifm2_broadcast_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ifm2_broadcast_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ifm2_broadcast_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ifm2_scalar_r - None
+struct ifm2_scalar_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ifm2_scalar_r() : word0(0) {}
+    CONSTEXPR ifm2_scalar_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ifm2_scalar_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ifm2_scalar_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ifm2_precision_r - None
+struct ifm2_precision_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ifm2_precision_r() : word0(0) {}
+    CONSTEXPR ifm2_precision_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ifm2_precision_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ifm2_precision_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ifm2_zero_point_r - None
+struct ifm2_zero_point_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ifm2_zero_point_r() : word0(0) {}
+    CONSTEXPR ifm2_zero_point_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ifm2_zero_point_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ifm2_zero_point_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ifm2_width0_m1_r - None
+struct ifm2_width0_m1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ifm2_width0_m1_r() : word0(0) {}
+    CONSTEXPR ifm2_width0_m1_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ifm2_width0_m1_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ifm2_width0_m1_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ifm2_height0_m1_r - None
+struct ifm2_height0_m1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ifm2_height0_m1_r() : word0(0) {}
+    CONSTEXPR ifm2_height0_m1_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ifm2_height0_m1_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ifm2_height0_m1_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ifm2_height1_m1_r - None
+struct ifm2_height1_m1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ifm2_height1_m1_r() : word0(0) {}
+    CONSTEXPR ifm2_height1_m1_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ifm2_height1_m1_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ifm2_height1_m1_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ifm2_ib_start_r - None
+struct ifm2_ib_start_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ifm2_ib_start_r() : word0(0) {}
+    CONSTEXPR ifm2_ib_start_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ifm2_ib_start_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ifm2_ib_start_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ifm2_region_r - None
+struct ifm2_region_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ifm2_region_r() : word0(0) {}
+    CONSTEXPR ifm2_region_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ifm2_region_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ifm2_region_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ifm_base0_r - None
+struct ifm_base0_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value_LO : 32; // 64-bit register value - LSB
+            uint32_t value_HI : 32; // 64-bit register value - MSB
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR ifm_base0_r() : word0(0), word1(0) {}
+    CONSTEXPR ifm_base0_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    ifm_base0_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// ifm_base1_r - None
+struct ifm_base1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value_LO : 32; // 64-bit register value - LSB
+            uint32_t value_HI : 32; // 64-bit register value - MSB
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR ifm_base1_r() : word0(0), word1(0) {}
+    CONSTEXPR ifm_base1_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    ifm_base1_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// ifm_base2_r - None
+struct ifm_base2_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value_LO : 32; // 64-bit register value - LSB
+            uint32_t value_HI : 32; // 64-bit register value - MSB
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR ifm_base2_r() : word0(0), word1(0) {}
+    CONSTEXPR ifm_base2_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    ifm_base2_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// ifm_base3_r - None
+struct ifm_base3_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value_LO : 32; // 64-bit register value - LSB
+            uint32_t value_HI : 32; // 64-bit register value - MSB
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR ifm_base3_r() : word0(0), word1(0) {}
+    CONSTEXPR ifm_base3_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    ifm_base3_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// ifm_stride_x_r - None
+struct ifm_stride_x_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value_LO : 32; // 64-bit register value - LSB
+            uint32_t value_HI : 32; // 64-bit register value - MSB
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR ifm_stride_x_r() : word0(0), word1(0) {}
+    CONSTEXPR ifm_stride_x_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    ifm_stride_x_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// ifm_stride_y_r - None
+struct ifm_stride_y_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value_LO : 32; // 64-bit register value - LSB
+            uint32_t value_HI : 32; // 64-bit register value - MSB
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR ifm_stride_y_r() : word0(0), word1(0) {}
+    CONSTEXPR ifm_stride_y_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    ifm_stride_y_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// ifm_stride_c_r - None
+struct ifm_stride_c_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value_LO : 32; // 64-bit register value - LSB
+            uint32_t value_HI : 32; // 64-bit register value - MSB
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR ifm_stride_c_r() : word0(0), word1(0) {}
+    CONSTEXPR ifm_stride_c_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    ifm_stride_c_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// ofm_base0_r - None
+struct ofm_base0_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value_LO : 32; // 64-bit register value - LSB
+            uint32_t value_HI : 32; // 64-bit register value - MSB
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR ofm_base0_r() : word0(0), word1(0) {}
+    CONSTEXPR ofm_base0_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    ofm_base0_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// ofm_base1_r - None
+struct ofm_base1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value_LO : 32; // 64-bit register value - LSB
+            uint32_t value_HI : 32; // 64-bit register value - MSB
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR ofm_base1_r() : word0(0), word1(0) {}
+    CONSTEXPR ofm_base1_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    ofm_base1_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// ofm_base2_r - None
+struct ofm_base2_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value_LO : 32; // 64-bit register value - LSB
+            uint32_t value_HI : 32; // 64-bit register value - MSB
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR ofm_base2_r() : word0(0), word1(0) {}
+    CONSTEXPR ofm_base2_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    ofm_base2_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// ofm_base3_r - None
+struct ofm_base3_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value_LO : 32; // 64-bit register value - LSB
+            uint32_t value_HI : 32; // 64-bit register value - MSB
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR ofm_base3_r() : word0(0), word1(0) {}
+    CONSTEXPR ofm_base3_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    ofm_base3_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// ofm_stride_x_r - None
+struct ofm_stride_x_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value_LO : 32; // 64-bit register value - LSB
+            uint32_t value_HI : 32; // 64-bit register value - MSB
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR ofm_stride_x_r() : word0(0), word1(0) {}
+    CONSTEXPR ofm_stride_x_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    ofm_stride_x_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// ofm_stride_y_r - None
+struct ofm_stride_y_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value_LO : 32; // 64-bit register value - LSB
+            uint32_t value_HI : 32; // 64-bit register value - MSB
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR ofm_stride_y_r() : word0(0), word1(0) {}
+    CONSTEXPR ofm_stride_y_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    ofm_stride_y_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// ofm_stride_c_r - None
+struct ofm_stride_c_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value_LO : 32; // 64-bit register value - LSB
+            uint32_t value_HI : 32; // 64-bit register value - MSB
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR ofm_stride_c_r() : word0(0), word1(0) {}
+    CONSTEXPR ofm_stride_c_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    ofm_stride_c_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// weight_base_r - None
+struct weight_base_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value_LO : 32; // 64-bit register value - LSB
+            uint32_t value_HI : 32; // 64-bit register value - MSB
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR weight_base_r() : word0(0), word1(0) {}
+    CONSTEXPR weight_base_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    weight_base_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// weight_length_r - None
+struct weight_length_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR weight_length_r() : word0(0) {}
+    CONSTEXPR weight_length_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    weight_length_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR weight_length_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// scale_base_r - None
+struct scale_base_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value_LO : 32; // 64-bit register value - LSB
+            uint32_t value_HI : 32; // 64-bit register value - MSB
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR scale_base_r() : word0(0), word1(0) {}
+    CONSTEXPR scale_base_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    scale_base_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// scale_length_r - None
+struct scale_length_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR scale_length_r() : word0(0) {}
+    CONSTEXPR scale_length_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    scale_length_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR scale_length_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ofm_scale_r - None
+struct ofm_scale_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ofm_scale_r() : word0(0) {}
+    CONSTEXPR ofm_scale_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ofm_scale_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ofm_scale_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ofm_scale_shift_r - None
+struct ofm_scale_shift_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ofm_scale_shift_r() : word0(0) {}
+    CONSTEXPR ofm_scale_shift_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ofm_scale_shift_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ofm_scale_shift_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// opa_scale_r - None
+struct opa_scale_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR opa_scale_r() : word0(0) {}
+    CONSTEXPR opa_scale_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    opa_scale_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR opa_scale_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// opa_scale_shift_r - None
+struct opa_scale_shift_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR opa_scale_shift_r() : word0(0) {}
+    CONSTEXPR opa_scale_shift_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    opa_scale_shift_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR opa_scale_shift_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// opb_scale_r - None
+struct opb_scale_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR opb_scale_r() : word0(0) {}
+    CONSTEXPR opb_scale_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    opb_scale_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR opb_scale_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// dma0_src_r - None
+struct dma0_src_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value_LO : 32; // 64-bit register value - LSB
+            uint32_t value_HI : 32; // 64-bit register value - MSB
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR dma0_src_r() : word0(0), word1(0) {}
+    CONSTEXPR dma0_src_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    dma0_src_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// dma0_dst_r - None
+struct dma0_dst_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value_LO : 32; // 64-bit register value - LSB
+            uint32_t value_HI : 32; // 64-bit register value - MSB
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR dma0_dst_r() : word0(0), word1(0) {}
+    CONSTEXPR dma0_dst_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    dma0_dst_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// dma0_len_r - None
+struct dma0_len_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value_LO : 32; // 64-bit register value - LSB
+            uint32_t value_HI : 32; // 64-bit register value - MSB
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR dma0_len_r() : word0(0), word1(0) {}
+    CONSTEXPR dma0_len_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    dma0_len_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// ifm2_base0_r - None
+struct ifm2_base0_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value_LO : 32; // 64-bit register value - LSB
+            uint32_t value_HI : 32; // 64-bit register value - MSB
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR ifm2_base0_r() : word0(0), word1(0) {}
+    CONSTEXPR ifm2_base0_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    ifm2_base0_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// ifm2_base1_r - None
+struct ifm2_base1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value_LO : 32; // 64-bit register value - LSB
+            uint32_t value_HI : 32; // 64-bit register value - MSB
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR ifm2_base1_r() : word0(0), word1(0) {}
+    CONSTEXPR ifm2_base1_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    ifm2_base1_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// ifm2_base2_r - None
+struct ifm2_base2_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value_LO : 32; // 64-bit register value - LSB
+            uint32_t value_HI : 32; // 64-bit register value - MSB
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR ifm2_base2_r() : word0(0), word1(0) {}
+    CONSTEXPR ifm2_base2_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    ifm2_base2_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// ifm2_base3_r - None
+struct ifm2_base3_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value_LO : 32; // 64-bit register value - LSB
+            uint32_t value_HI : 32; // 64-bit register value - MSB
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR ifm2_base3_r() : word0(0), word1(0) {}
+    CONSTEXPR ifm2_base3_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    ifm2_base3_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// ifm2_stride_x_r - None
+struct ifm2_stride_x_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value_LO : 32; // 64-bit register value - LSB
+            uint32_t value_HI : 32; // 64-bit register value - MSB
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR ifm2_stride_x_r() : word0(0), word1(0) {}
+    CONSTEXPR ifm2_stride_x_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    ifm2_stride_x_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// ifm2_stride_y_r - None
+struct ifm2_stride_y_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value_LO : 32; // 64-bit register value - LSB
+            uint32_t value_HI : 32; // 64-bit register value - MSB
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR ifm2_stride_y_r() : word0(0), word1(0) {}
+    CONSTEXPR ifm2_stride_y_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    ifm2_stride_y_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// ifm2_stride_c_r - None
+struct ifm2_stride_c_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value_LO : 32; // 64-bit register value - LSB
+            uint32_t value_HI : 32; // 64-bit register value - MSB
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR ifm2_stride_c_r() : word0(0), word1(0) {}
+    CONSTEXPR ifm2_stride_c_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    ifm2_stride_c_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// revision_r - Internal FPGA build revision: first 32-bits of the Ultan Git hash used for the build
+struct revision_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR revision_r() : word0(0) {}
+    CONSTEXPR revision_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    revision_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR revision_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// pid4_r - Peripheral ID byte 4 (Arm=code 4)
+struct pid4_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t PID4 : 32; // Byte 4 of Peripheral ID (Lower 8 bits valid)
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR pid4_r() : word0(4) {}
+    CONSTEXPR pid4_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    pid4_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_PID4() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_PID4() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR pid4_r &set_PID4(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// pid5_r - Peripheral ID byte 5 (reserved)
+struct pid5_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t PID5 : 32; // Byte 5 of Peripheral ID (Lower 8 bits valid)
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR pid5_r() : word0(0) {}
+    CONSTEXPR pid5_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    pid5_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_PID5() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_PID5() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR pid5_r &set_PID5(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// pid6_r - Peripheral ID byte 6 (reserved)
+struct pid6_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t PID6 : 32; // Byte 6 of Peripheral ID (Lower 8 bits valid)
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR pid6_r() : word0(0) {}
+    CONSTEXPR pid6_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    pid6_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_PID6() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_PID6() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR pid6_r &set_PID6(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// pid7_r - Peripheral ID byte 7 (reserved)
+struct pid7_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t PID7 : 32; // Byte 7 of Peripheral ID (Lower 8 bits valid)
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR pid7_r() : word0(0) {}
+    CONSTEXPR pid7_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    pid7_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_PID7() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_PID7() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR pid7_r &set_PID7(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// pid0_r - Peripheral ID byte 0. This is bits[7:0] of the part number
+struct pid0_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t PID0 : 32; // Byte 0 of Peripheral ID (Lower 8 bits valid)
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR pid0_r() : word0(128) {}
+    CONSTEXPR pid0_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    pid0_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_PID0() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_PID0() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR pid0_r &set_PID0(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// pid1_r - Peripheral ID byte 1. This is bits[11:8] of the part number in bits[3:0], and bits[3:0] of the Arm ID in
+// bits[7:4]
+struct pid1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t PID1 : 32; // Byte 1 of Peripheral ID (Lower 8 bits valid)
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR pid1_r() : word0(181) {}
+    CONSTEXPR pid1_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    pid1_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_PID1() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_PID1() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR pid1_r &set_PID1(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// pid2_r - Peripheral ID byte 2. This is bits[6:4] of the Arm ID in bits[2:0], and bit 3 indicates format B
+struct pid2_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t PID2 : 32; // Byte 2 of Peripheral ID (Lower 8 bits valid)
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR pid2_r() : word0(11) {}
+    CONSTEXPR pid2_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    pid2_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_PID2() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_PID2() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR pid2_r &set_PID2(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// pid3_r - Peripheral ID byte 3
+struct pid3_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t PID3 : 32; // Byte 1 of Peripheral ID (Lower 8 bits valid)
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR pid3_r() : word0(0) {}
+    CONSTEXPR pid3_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    pid3_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_PID3() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_PID3() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR pid3_r &set_PID3(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// cid0_r - Component ID byte 0
+struct cid0_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t CID0 : 32; // Byte 0 of Component ID (Lower 8 bits valid)
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR cid0_r() : word0(13) {}
+    CONSTEXPR cid0_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    cid0_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_CID0() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_CID0() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR cid0_r &set_CID0(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// cid1_r - Component ID byte 1
+struct cid1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t CID1 : 32; // Byte 1 of Component ID (Lower 8 bits valid)
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR cid1_r() : word0(240) {}
+    CONSTEXPR cid1_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    cid1_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_CID1() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_CID1() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR cid1_r &set_CID1(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// cid2_r - Component ID byte 2
+struct cid2_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t CID2 : 32; // Byte 2 of Component ID (Lower 8 bits valid)
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR cid2_r() : word0(5) {}
+    CONSTEXPR cid2_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    cid2_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_CID2() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_CID2() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR cid2_r &set_CID2(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// cid3_r - Component ID byte 3
+struct cid3_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t CID3 : 32; // Byte 3 of Component ID (Lower 8 bits valid)
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR cid3_r() : word0(177) {}
+    CONSTEXPR cid3_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    cid3_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_CID3() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_CID3() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR cid3_r &set_CID3(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
 };
 
 struct NPU_REG
 {
-    STRUCT id_r ID;           // 0x0
-    STRUCT status_r STATUS;   // 0x4
-    STRUCT cmd_r CMD;         // 0x8
-    STRUCT reset_r RESET;     // 0xc
-    STRUCT qbase0_r QBASE0;   // 0x10
-    STRUCT qbase1_r QBASE1;   // 0x14
-    STRUCT qread_r QREAD;     // 0x18
-    STRUCT qconfig_r QCONFIG; // 0x1c
-    STRUCT qsize_r QSIZE;     // 0x20
-    STRUCT prot_r PROT;       // 0x24
-    STRUCT config_r CONFIG;   // 0x28
-    STRUCT lock_r LOCK;       // 0x2c
+    STRUCT id_r ID;           // 0x0000
+    STRUCT status_r STATUS;   // 0x0004
+    STRUCT cmd_r CMD;         // 0x0008
+    STRUCT reset_r RESET;     // 0x000C
+    STRUCT qbase_r QBASE;     // 0x0010
+    STRUCT qread_r QREAD;     // 0x0018
+    STRUCT qconfig_r QCONFIG; // 0x001C
+    STRUCT qsize_r QSIZE;     // 0x0020
+    STRUCT prot_r PROT;       // 0x0024
+    STRUCT config_r CONFIG;   // 0x0028
+    STRUCT lock_r LOCK;       // 0x002C
     uint32_t unused0[3];
-    STRUCT regioncfg_r REGIONCFG;   // 0x3c
-    STRUCT axi_limit0_r AXI_LIMIT0; // 0x40
-    STRUCT axi_limit1_r AXI_LIMIT1; // 0x44
-    STRUCT axi_limit2_r AXI_LIMIT2; // 0x48
-    STRUCT axi_limit3_r AXI_LIMIT3; // 0x4c
+    STRUCT regioncfg_r REGIONCFG;   // 0x003C
+    STRUCT axi_limit0_r AXI_LIMIT0; // 0x0040
+    STRUCT axi_limit1_r AXI_LIMIT1; // 0x0044
+    STRUCT axi_limit2_r AXI_LIMIT2; // 0x0048
+    STRUCT axi_limit3_r AXI_LIMIT3; // 0x004C
     uint32_t unused1[12];
-    STRUCT basep0_r BASEP0;   // 0x80
-    STRUCT basep1_r BASEP1;   // 0x84
-    STRUCT basep2_r BASEP2;   // 0x88
-    STRUCT basep3_r BASEP3;   // 0x8c
-    STRUCT basep4_r BASEP4;   // 0x90
-    STRUCT basep5_r BASEP5;   // 0x94
-    STRUCT basep6_r BASEP6;   // 0x98
-    STRUCT basep7_r BASEP7;   // 0x9c
-    STRUCT basep8_r BASEP8;   // 0xa0
-    STRUCT basep9_r BASEP9;   // 0xa4
-    STRUCT basep10_r BASEP10; // 0xa8
-    STRUCT basep11_r BASEP11; // 0xac
-    STRUCT basep12_r BASEP12; // 0xb0
-    STRUCT basep13_r BASEP13; // 0xb4
-    STRUCT basep14_r BASEP14; // 0xb8
-    STRUCT basep15_r BASEP15; // 0xbc
+    STRUCT basep_r BASEP[8]; // 0x0080
     uint32_t unused2[16];
-    STRUCT wd_status_r WD_STATUS;   // 0x100
-    STRUCT mac_status_r MAC_STATUS; // 0x104
-    STRUCT ao_status_r AO_STATUS;   // 0x108
+    STRUCT wd_status_r WD_STATUS;   // 0x0100
+    STRUCT mac_status_r MAC_STATUS; // 0x0104
+    STRUCT ao_status_r AO_STATUS;   // 0x0108
     uint32_t unused3[1];
-    STRUCT dma_status0_r DMA_STATUS0; // 0x110
-    STRUCT dma_status1_r DMA_STATUS1; // 0x114
+    STRUCT dma_status0_r DMA_STATUS0; // 0x0110
+    STRUCT dma_status1_r DMA_STATUS1; // 0x0114
     uint32_t unused4[10];
-    STRUCT clkforce_r CLKFORCE; // 0x140
-    uint32_t DEBUG_ADDRESS;     // 0x144
-    uint32_t DEBUG_MISC;        // 0x148
-    uint32_t DEBUGCORE;         // 0x14c
-    uint32_t DEBUG_BLOCK;       // 0x150
-    uint32_t unused5[11];
-    STRUCT pmcr_r PMCR;             // 0x180
-    STRUCT pmcntenset_r PMCNTENSET; // 0x184
-    STRUCT pmcntenclr_r PMCNTENCLR; // 0x188
-    STRUCT pmovsset_r PMOVSSET;     // 0x18c
-    STRUCT pmovsclr_r PMOVSCLR;     // 0x190
-    STRUCT pmintset_r PMINTSET;     // 0x194
-    STRUCT pmintclr_r PMINTCLR;     // 0x198
-    uint32_t unused6[1];
-    STRUCT pmccntr_lo_r PMCCNTR_LO;   // 0x1a0
-    STRUCT pmccntr_hi_r PMCCNTR_HI;   // 0x1a4
-    STRUCT pmccntr_cfg_r PMCCNTR_CFG; // 0x1a8
-    STRUCT pmcaxi_chan_r PMCAXI_CHAN; // 0x1ac
-    uint32_t unused7[20];
-    uint32_t KERNEL_X;           // 0x200
-    uint32_t KERNEL_Y;           // 0x204
-    uint32_t KERNEL_W_M1;        // 0x208
-    uint32_t KERNEL_H_M1;        // 0x20c
-    uint32_t OFM_CBLK_WIDTH_M1;  // 0x210
-    uint32_t OFM_CBLK_HEIGHT_M1; // 0x214
-    uint32_t OFM_CBLK_DEPTH_M1;  // 0x218
-    uint32_t IFM_CBLK_DEPTH_M1;  // 0x21c
-    uint32_t OFM_X;              // 0x220
-    uint32_t OFM_Y;              // 0x224
-    uint32_t OFM_Z;              // 0x228
-    uint32_t IFM_Z;              // 0x22c
-    uint32_t PAD_TOP;            // 0x230
-    uint32_t PAD_LEFT;           // 0x234
-    uint32_t IFM_CBLK_WIDTH;     // 0x238
-    uint32_t IFM_CBLK_HEIGHT;    // 0x23c
-    uint32_t DMA_IFM_SRC;        // 0x240
-    uint32_t DMA_IFM_SRC_HI;     // 0x244
-    uint32_t DMA_IFM_DST;        // 0x248
-    uint32_t DMA_OFM_SRC;        // 0x24c
-    uint32_t DMA_OFM_DST;        // 0x250
-    uint32_t DMA_OFM_DST_HI;     // 0x254
-    uint32_t DMA_WEIGHT_SRC;     // 0x258
-    uint32_t DMA_WEIGHT_SRC_HI;  // 0x25c
-    uint32_t DMA_CMD_SRC;        // 0x260
-    uint32_t DMA_CMD_SRC_HI;     // 0x264
-    uint32_t DMA_CMD_SIZE;       // 0x268
-    uint32_t DMA_M2M_SRC;        // 0x26c
-    uint32_t DMA_M2M_SRC_HI;     // 0x270
-    uint32_t DMA_M2M_DST;        // 0x274
-    uint32_t DMA_M2M_DST_HI;     // 0x278
-    uint32_t CURRENT_QREAD;      // 0x27c
-    uint32_t DMA_SCALE_SRC;      // 0x280
-    uint32_t DMA_SCALE_SRC_HI;   // 0x284
-    uint32_t unused8[11];
-    uint32_t CURRENT_BLOCK; // 0x2b4
-    uint32_t CURRENT_OP;    // 0x2b8
-    uint32_t CURRENT_CMD;   // 0x2bc
-    uint32_t unused9[16];
-    uint32_t PMEVCNTR[4]; // 0x300
-    uint32_t unused10[28];
-    STRUCT pmevtyper0_r PMEVTYPER[4]; // 0x380
+    STRUCT clkforce_r CLKFORCE;           // 0x0140
+    STRUCT debug_address_r DEBUG_ADDRESS; // 0x0144
+    STRUCT debug_misc_r DEBUG_MISC;       // 0x0148
+    uint32_t unused5[1];
+    STRUCT debug_block_r DEBUG_BLOCK; // 0x0150
+    uint32_t unused6[11];
+    STRUCT pmcr_r PMCR;             // 0x0180
+    STRUCT pmcntenset_r PMCNTENSET; // 0x0184
+    STRUCT pmcntenclr_r PMCNTENCLR; // 0x0188
+    STRUCT pmovsset_r PMOVSSET;     // 0x018C
+    STRUCT pmovsclr_r PMOVSCLR;     // 0x0190
+    STRUCT pmintset_r PMINTSET;     // 0x0194
+    STRUCT pmintclr_r PMINTCLR;     // 0x0198
+    uint32_t unused7[1];
+    STRUCT pmccntr_r PMCCNTR;         // 0x01A0
+    STRUCT pmccntr_cfg_r PMCCNTR_CFG; // 0x01A8
+    STRUCT pmcaxi_chan_r PMCAXI_CHAN; // 0x01AC
+    uint32_t unused8[20];
+    STRUCT kernel_x_r KERNEL_X;                     // 0x0200
+    STRUCT kernel_y_r KERNEL_Y;                     // 0x0204
+    STRUCT kernel_w_m1_r KERNEL_W_M1;               // 0x0208
+    STRUCT kernel_h_m1_r KERNEL_H_M1;               // 0x020C
+    STRUCT ofm_cblk_width_m1_r OFM_CBLK_WIDTH_M1;   // 0x0210
+    STRUCT ofm_cblk_height_m1_r OFM_CBLK_HEIGHT_M1; // 0x0214
+    STRUCT ofm_cblk_depth_m1_r OFM_CBLK_DEPTH_M1;   // 0x0218
+    STRUCT ifm_cblk_depth_m1_r IFM_CBLK_DEPTH_M1;   // 0x021C
+    STRUCT ofm_x_r OFM_X;                           // 0x0220
+    STRUCT ofm_y_r OFM_Y;                           // 0x0224
+    STRUCT ofm_z_r OFM_Z;                           // 0x0228
+    STRUCT ifm_z_r IFM_Z;                           // 0x022C
+    STRUCT pad_top_r PAD_TOP;                       // 0x0230
+    STRUCT pad_left_r PAD_LEFT;                     // 0x0234
+    STRUCT ifm_cblk_width_r IFM_CBLK_WIDTH;         // 0x0238
+    STRUCT ifm_cblk_height_r IFM_CBLK_HEIGHT;       // 0x023C
+    STRUCT dma_ifm_src_r DMA_IFM_SRC;               // 0x0240
+    STRUCT dma_ifm_dst_r DMA_IFM_DST;               // 0x0248
+    STRUCT dma_ofm_src_r DMA_OFM_SRC;               // 0x024C
+    STRUCT dma_ofm_dst_r DMA_OFM_DST;               // 0x0250
+    STRUCT dma_weight_src_r DMA_WEIGHT_SRC;         // 0x0258
+    STRUCT dma_cmd_src_r DMA_CMD_SRC;               // 0x0260
+    STRUCT dma_cmd_size_r DMA_CMD_SIZE;             // 0x0268
+    STRUCT dma_m2m_src_r DMA_M2M_SRC;               // 0x026C
+    STRUCT dma_m2m_dst_r DMA_M2M_DST;               // 0x0274
+    STRUCT current_qread_r CURRENT_QREAD;           // 0x027C
+    STRUCT dma_scale_src_r DMA_SCALE_SRC;           // 0x0280
+    uint32_t unused9[11];
+    STRUCT current_block_r CURRENT_BLOCK; // 0x02B4
+    STRUCT current_op_r CURRENT_OP;       // 0x02B8
+    STRUCT current_cmd_r CURRENT_CMD;     // 0x02BC
+    uint32_t unused10[16];
+    STRUCT pmevcntr_r PMEVCNTR[4]; // 0x0300
     uint32_t unused11[28];
-    uint32_t SHARED_BUFFER[256]; // 0x400
-    uint32_t IFM_PAD_TOP;        // 0x800
-    uint32_t IFM_PAD_LEFT;       // 0x804
-    uint32_t IFM_PAD_RIGHT;      // 0x808
-    uint32_t IFM_PAD_BOTTOM;     // 0x80c
-    uint32_t IFM_DEPTH_M1;       // 0x810
-    uint32_t IFM_PRECISION;      // 0x814
-    uint32_t unused12[1];
-    uint32_t IFM_UPSCALE; // 0x81c
+    STRUCT pmevtyper_r PMEVTYPER[4]; // 0x0380
+    uint32_t unused12[28];
+    STRUCT shared_buffer_r SHARED_BUFFER[256]; // 0x0400
+    STRUCT ifm_pad_top_r IFM_PAD_TOP;          // 0x0800
+    STRUCT ifm_pad_left_r IFM_PAD_LEFT;        // 0x0804
+    STRUCT ifm_pad_right_r IFM_PAD_RIGHT;      // 0x0808
+    STRUCT ifm_pad_bottom_r IFM_PAD_BOTTOM;    // 0x080C
+    STRUCT ifm_depth_m1_r IFM_DEPTH_M1;        // 0x0810
+    STRUCT ifm_precision_r IFM_PRECISION;      // 0x0814
     uint32_t unused13[1];
-    uint32_t IFM_ZERO_POINT; // 0x824
-    uint32_t IFM_WIDTH0_M1;  // 0x828
-    uint32_t IFM_HEIGHT0_M1; // 0x82c
-    uint32_t IFM_HEIGHT1_M1; // 0x830
-    uint32_t IFM_IB_END;     // 0x834
+    STRUCT ifm_upscale_r IFM_UPSCALE; // 0x081C
     uint32_t unused14[1];
-    uint32_t IFM_REGION; // 0x83c
+    STRUCT ifm_zero_point_r IFM_ZERO_POINT; // 0x0824
+    STRUCT ifm_width0_m1_r IFM_WIDTH0_M1;   // 0x0828
+    STRUCT ifm_height0_m1_r IFM_HEIGHT0_M1; // 0x082C
+    STRUCT ifm_height1_m1_r IFM_HEIGHT1_M1; // 0x0830
+    STRUCT ifm_ib_end_r IFM_IB_END;         // 0x0834
     uint32_t unused15[1];
-    uint32_t OFM_WIDTH_M1;      // 0x844
-    uint32_t OFM_HEIGHT_M1;     // 0x848
-    uint32_t OFM_DEPTH_M1;      // 0x84c
-    uint32_t OFM_PRECISION;     // 0x850
-    uint32_t OFM_BLK_WIDTH_M1;  // 0x854
-    uint32_t OFM_BLK_HEIGHT_M1; // 0x858
-    uint32_t OFM_BLK_DEPTH_M1;  // 0x85c
-    uint32_t OFM_ZERO_POINT;    // 0x860
+    STRUCT ifm_region_r IFM_REGION; // 0x083C
     uint32_t unused16[1];
-    uint32_t OFM_WIDTH0_M1;  // 0x868
-    uint32_t OFM_HEIGHT0_M1; // 0x86c
-    uint32_t OFM_HEIGHT1_M1; // 0x870
-    uint32_t unused17[2];
-    uint32_t OFM_REGION;       // 0x87c
-    uint32_t KERNEL_WIDTH_M1;  // 0x880
-    uint32_t KERNEL_HEIGHT_M1; // 0x884
-    uint32_t KERNEL_STRIDE;    // 0x888
-    uint32_t PARALLEL_MODE;    // 0x88c
-    uint32_t ACC_FORMAT;       // 0x890
-    uint32_t ACTIVATION;       // 0x894
-    uint32_t ACTIVATION_MIN;   // 0x898
-    uint32_t ACTIVATION_MAX;   // 0x89c
-    uint32_t WEIGHT_REGION;    // 0x8a0
-    uint32_t SCALE_REGION;     // 0x8a4
-    uint32_t unused18[3];
-    uint32_t AB_START; // 0x8b4
+    STRUCT ofm_width_m1_r OFM_WIDTH_M1;           // 0x0844
+    STRUCT ofm_height_m1_r OFM_HEIGHT_M1;         // 0x0848
+    STRUCT ofm_depth_m1_r OFM_DEPTH_M1;           // 0x084C
+    STRUCT ofm_precision_r OFM_PRECISION;         // 0x0850
+    STRUCT ofm_blk_width_m1_r OFM_BLK_WIDTH_M1;   // 0x0854
+    STRUCT ofm_blk_height_m1_r OFM_BLK_HEIGHT_M1; // 0x0858
+    STRUCT ofm_blk_depth_m1_r OFM_BLK_DEPTH_M1;   // 0x085C
+    STRUCT ofm_zero_point_r OFM_ZERO_POINT;       // 0x0860
+    uint32_t unused17[1];
+    STRUCT ofm_width0_m1_r OFM_WIDTH0_M1;   // 0x0868
+    STRUCT ofm_height0_m1_r OFM_HEIGHT0_M1; // 0x086C
+    STRUCT ofm_height1_m1_r OFM_HEIGHT1_M1; // 0x0870
+    uint32_t unused18[2];
+    STRUCT ofm_region_r OFM_REGION;             // 0x087C
+    STRUCT kernel_width_m1_r KERNEL_WIDTH_M1;   // 0x0880
+    STRUCT kernel_height_m1_r KERNEL_HEIGHT_M1; // 0x0884
+    STRUCT kernel_stride_r KERNEL_STRIDE;       // 0x0888
     uint32_t unused19[1];
-    uint32_t BLOCKDEP;        // 0x8bc
-    uint32_t DMA0_SRC_REGION; // 0x8c0
-    uint32_t DMA0_DST_REGION; // 0x8c4
-    uint32_t DMA0_SIZE0;      // 0x8c8
-    uint32_t DMA0_SIZE1;      // 0x8cc
-    uint32_t unused20[12];
-    uint32_t IFM2_BROADCAST; // 0x900
-    uint32_t IFM2_SCALAR;    // 0x904
-    uint32_t unused21[3];
-    uint32_t IFM2_PRECISION; // 0x914
-    uint32_t unused22[3];
-    uint32_t IFM2_ZERO_POINT; // 0x924
-    uint32_t IFM2_WIDTH0_M1;  // 0x928
-    uint32_t IFM2_HEIGHT0_M1; // 0x92c
-    uint32_t IFM2_HEIGHT1_M1; // 0x930
-    uint32_t IFM2_IB_START;   // 0x934
-    uint32_t unused23[1];
-    uint32_t IFM2_REGION; // 0x93c
-    uint32_t unused24[48];
-    uint32_t IFM_BASE0;       // 0xa00
-    uint32_t IFM_BASE0_HI;    // 0xa04
-    uint32_t IFM_BASE1;       // 0xa08
-    uint32_t IFM_BASE1_HI;    // 0xa0c
-    uint32_t IFM_BASE2;       // 0xa10
-    uint32_t IFM_BASE2_HI;    // 0xa14
-    uint32_t IFM_BASE3;       // 0xa18
-    uint32_t IFM_BASE3_HI;    // 0xa1c
-    uint32_t IFM_STRIDE_X;    // 0xa20
-    uint32_t IFM_STRIDE_X_HI; // 0xa24
-    uint32_t IFM_STRIDE_Y;    // 0xa28
-    uint32_t IFM_STRIDE_Y_HI; // 0xa2c
-    uint32_t IFM_STRIDE_C;    // 0xa30
-    uint32_t IFM_STRIDE_C_HI; // 0xa34
-    uint32_t unused25[2];
-    uint32_t OFM_BASE0;       // 0xa40
-    uint32_t OFM_BASE0_HI;    // 0xa44
-    uint32_t OFM_BASE1;       // 0xa48
-    uint32_t OFM_BASE1_HI;    // 0xa4c
-    uint32_t OFM_BASE2;       // 0xa50
-    uint32_t OFM_BASE2_HI;    // 0xa54
-    uint32_t OFM_BASE3;       // 0xa58
-    uint32_t OFM_BASE3_HI;    // 0xa5c
-    uint32_t OFM_STRIDE_X;    // 0xa60
-    uint32_t OFM_STRIDE_X_HI; // 0xa64
-    uint32_t OFM_STRIDE_Y;    // 0xa68
-    uint32_t OFM_STRIDE_Y_HI; // 0xa6c
-    uint32_t OFM_STRIDE_C;    // 0xa70
-    uint32_t OFM_STRIDE_C_HI; // 0xa74
-    uint32_t unused26[2];
-    uint32_t WEIGHT_BASE;    // 0xa80
-    uint32_t WEIGHT_BASE_HI; // 0xa84
-    uint32_t WEIGHT_LENGTH;  // 0xa88
-    uint32_t unused27[1];
-    uint32_t SCALE_BASE;    // 0xa90
-    uint32_t SCALE_BASE_HI; // 0xa94
-    uint32_t SCALE_LENGTH;  // 0xa98
-    uint32_t unused28[1];
-    uint32_t OFM_SCALE;       // 0xaa0
-    uint32_t OFM_SCALE_SHIFT; // 0xaa4
-    uint32_t OPA_SCALE;       // 0xaa8
-    uint32_t OPA_SCALE_SHIFT; // 0xaac
-    uint32_t OPB_SCALE;       // 0xab0
-    uint32_t unused29[3];
-    uint32_t DMA0_SRC;      // 0xac0
-    uint32_t DMA0_SRC_HI;   // 0xac4
-    uint32_t DMA0_DST;      // 0xac8
-    uint32_t DMA0_DST_HI;   // 0xacc
-    uint32_t DMA0_LEN;      // 0xad0
-    uint32_t DMA0_LEN_HI;   // 0xad4
-    uint32_t DMA0_SKIP0;    // 0xad8
-    uint32_t DMA0_SKIP0_HI; // 0xadc
-    uint32_t DMA0_SKIP1;    // 0xae0
-    uint32_t DMA0_SKIP1_HI; // 0xae4
-    uint32_t unused30[6];
-    uint32_t IFM2_BASE0;       // 0xb00
-    uint32_t IFM2_BASE0_HI;    // 0xb04
-    uint32_t IFM2_BASE1;       // 0xb08
-    uint32_t IFM2_BASE1_HI;    // 0xb0c
-    uint32_t IFM2_BASE2;       // 0xb10
-    uint32_t IFM2_BASE2_HI;    // 0xb14
-    uint32_t IFM2_BASE3;       // 0xb18
-    uint32_t IFM2_BASE3_HI;    // 0xb1c
-    uint32_t IFM2_STRIDE_X;    // 0xb20
-    uint32_t IFM2_STRIDE_X_HI; // 0xb24
-    uint32_t IFM2_STRIDE_Y;    // 0xb28
-    uint32_t IFM2_STRIDE_Y_HI; // 0xb2c
-    uint32_t IFM2_STRIDE_C;    // 0xb30
-    uint32_t IFM2_STRIDE_C_HI; // 0xb34
-    uint32_t unused31[2];
-    uint32_t WEIGHT1_BASE;    // 0xb40
-    uint32_t WEIGHT1_BASE_HI; // 0xb44
-    uint32_t WEIGHT1_LENGTH;  // 0xb48
-    uint32_t unused32[1];
-    uint32_t SCALE1_BASE;    // 0xb50
-    uint32_t SCALE1_BASE_HI; // 0xb54
-    uint32_t SCALE1_LENGTH;  // 0xb58
-    uint32_t unused33[281];
-    uint32_t REVISION; // 0xfc0
-    uint32_t unused34[3];
-    STRUCT pid4_r PID4; // 0xfd0
-    STRUCT pid5_r PID5; // 0xfd4
-    STRUCT pid6_r PID6; // 0xfd8
-    STRUCT pid7_r PID7; // 0xfdc
-    STRUCT pid0_r PID0; // 0xfe0
-    STRUCT pid1_r PID1; // 0xfe4
-    STRUCT pid2_r PID2; // 0xfe8
-    STRUCT pid3_r PID3; // 0xfec
-    STRUCT cid0_r CID0; // 0xff0
-    STRUCT cid1_r CID1; // 0xff4
-    STRUCT cid2_r CID2; // 0xff8
-    STRUCT cid3_r CID3; // 0xffc
+    STRUCT acc_format_r ACC_FORMAT;         // 0x0890
+    STRUCT activation_r ACTIVATION;         // 0x0894
+    STRUCT activation_min_r ACTIVATION_MIN; // 0x0898
+    STRUCT activation_max_r ACTIVATION_MAX; // 0x089C
+    STRUCT weight_region_r WEIGHT_REGION;   // 0x08A0
+    STRUCT scale_region_r SCALE_REGION;     // 0x08A4
+    uint32_t unused20[3];
+    STRUCT ab_start_r AB_START; // 0x08B4
+    uint32_t unused21[1];
+    STRUCT blockdep_r BLOCKDEP;               // 0x08BC
+    STRUCT dma0_src_region_r DMA0_SRC_REGION; // 0x08C0
+    STRUCT dma0_dst_region_r DMA0_DST_REGION; // 0x08C4
+    STRUCT dma0_size0_r DMA0_SIZE0;           // 0x08C8
+    STRUCT dma0_size1_r DMA0_SIZE1;           // 0x08CC
+    uint32_t unused22[12];
+    STRUCT ifm2_broadcast_r IFM2_BROADCAST; // 0x0900
+    STRUCT ifm2_scalar_r IFM2_SCALAR;       // 0x0904
+    uint32_t unused23[3];
+    STRUCT ifm2_precision_r IFM2_PRECISION; // 0x0914
+    uint32_t unused24[3];
+    STRUCT ifm2_zero_point_r IFM2_ZERO_POINT; // 0x0924
+    STRUCT ifm2_width0_m1_r IFM2_WIDTH0_M1;   // 0x0928
+    STRUCT ifm2_height0_m1_r IFM2_HEIGHT0_M1; // 0x092C
+    STRUCT ifm2_height1_m1_r IFM2_HEIGHT1_M1; // 0x0930
+    STRUCT ifm2_ib_start_r IFM2_IB_START;     // 0x0934
+    uint32_t unused25[1];
+    STRUCT ifm2_region_r IFM2_REGION; // 0x093C
+    uint32_t unused26[48];
+    STRUCT ifm_base0_r IFM_BASE0;       // 0x0A00
+    STRUCT ifm_base1_r IFM_BASE1;       // 0x0A08
+    STRUCT ifm_base2_r IFM_BASE2;       // 0x0A10
+    STRUCT ifm_base3_r IFM_BASE3;       // 0x0A18
+    STRUCT ifm_stride_x_r IFM_STRIDE_X; // 0x0A20
+    STRUCT ifm_stride_y_r IFM_STRIDE_Y; // 0x0A28
+    STRUCT ifm_stride_c_r IFM_STRIDE_C; // 0x0A30
+    uint32_t unused27[2];
+    STRUCT ofm_base0_r OFM_BASE0;       // 0x0A40
+    STRUCT ofm_base1_r OFM_BASE1;       // 0x0A48
+    STRUCT ofm_base2_r OFM_BASE2;       // 0x0A50
+    STRUCT ofm_base3_r OFM_BASE3;       // 0x0A58
+    STRUCT ofm_stride_x_r OFM_STRIDE_X; // 0x0A60
+    STRUCT ofm_stride_y_r OFM_STRIDE_Y; // 0x0A68
+    STRUCT ofm_stride_c_r OFM_STRIDE_C; // 0x0A70
+    uint32_t unused28[2];
+    STRUCT weight_base_r WEIGHT_BASE;     // 0x0A80
+    STRUCT weight_length_r WEIGHT_LENGTH; // 0x0A88
+    uint32_t unused29[1];
+    STRUCT scale_base_r SCALE_BASE;     // 0x0A90
+    STRUCT scale_length_r SCALE_LENGTH; // 0x0A98
+    uint32_t unused30[1];
+    STRUCT ofm_scale_r OFM_SCALE;             // 0x0AA0
+    STRUCT ofm_scale_shift_r OFM_SCALE_SHIFT; // 0x0AA4
+    STRUCT opa_scale_r OPA_SCALE;             // 0x0AA8
+    STRUCT opa_scale_shift_r OPA_SCALE_SHIFT; // 0x0AAC
+    STRUCT opb_scale_r OPB_SCALE;             // 0x0AB0
+    uint32_t unused31[3];
+    STRUCT dma0_src_r DMA0_SRC; // 0x0AC0
+    STRUCT dma0_dst_r DMA0_DST; // 0x0AC8
+    STRUCT dma0_len_r DMA0_LEN; // 0x0AD0
+    uint32_t unused32[10];
+    STRUCT ifm2_base0_r IFM2_BASE0;       // 0x0B00
+    STRUCT ifm2_base1_r IFM2_BASE1;       // 0x0B08
+    STRUCT ifm2_base2_r IFM2_BASE2;       // 0x0B10
+    STRUCT ifm2_base3_r IFM2_BASE3;       // 0x0B18
+    STRUCT ifm2_stride_x_r IFM2_STRIDE_X; // 0x0B20
+    STRUCT ifm2_stride_y_r IFM2_STRIDE_Y; // 0x0B28
+    STRUCT ifm2_stride_c_r IFM2_STRIDE_C; // 0x0B30
+    uint32_t unused33[18];
+    uint32_t USER_DEFINED[16]; // 0x0B80
+    uint32_t unused34[256];
+    STRUCT revision_r REVISION; // 0x0FC0
+    uint32_t unused35[3];
+    STRUCT pid4_r PID4; // 0x0FD0
+    STRUCT pid5_r PID5; // 0x0FD4
+    STRUCT pid6_r PID6; // 0x0FD8
+    STRUCT pid7_r PID7; // 0x0FDC
+    STRUCT pid0_r PID0; // 0x0FE0
+    STRUCT pid1_r PID1; // 0x0FE4
+    STRUCT pid2_r PID2; // 0x0FE8
+    STRUCT pid3_r PID3; // 0x0FEC
+    STRUCT cid0_r CID0; // 0x0FF0
+    STRUCT cid1_r CID1; // 0x0FF4
+    STRUCT cid2_r CID2; // 0x0FF8
+    STRUCT cid3_r CID3; // 0x0FFC
+
 #ifdef __cplusplus
+    enum class access_type_t : uint8_t
+    {
+        RW,
+        RO,
+        WO
+    };
     NPU_REG()
     {
         reset();
     }
     void reset()
     {
-        ID                 = 268845313;
-        STATUS             = 8;
-        CMD                = 12;
-        RESET              = 0;
-        QBASE0             = 0;
-        QBASE1             = 0;
-        QREAD              = 0;
-        QCONFIG            = 0;
-        QSIZE              = 0;
-        PROT               = 0;
-        CONFIG             = 0;
-        LOCK               = 0;
-        REGIONCFG          = 0;
-        AXI_LIMIT0         = 0;
-        AXI_LIMIT1         = 0;
-        AXI_LIMIT2         = 0;
-        AXI_LIMIT3         = 0;
-        BASEP0             = 0;
-        BASEP1             = 0;
-        BASEP2             = 0;
-        BASEP3             = 0;
-        BASEP4             = 0;
-        BASEP5             = 0;
-        BASEP6             = 0;
-        BASEP7             = 0;
-        BASEP8             = 0;
-        BASEP9             = 0;
-        BASEP10            = 0;
-        BASEP11            = 0;
-        BASEP12            = 0;
-        BASEP13            = 0;
-        BASEP14            = 0;
-        BASEP15            = 0;
-        REVISION           = 0;
-        PID4               = 4;
-        PID5               = 0;
-        PID6               = 0;
-        PID7               = 0;
-        PID0               = 128;
-        PID1               = 181;
-        PID2               = 11;
-        PID3               = 0;
-        CID0               = 13;
-        CID1               = 240;
-        CID2               = 5;
-        CID3               = 177;
+        ID         = 269500929;
+        STATUS     = 8;
+        CMD        = 12;
+        RESET      = 0;
+        QBASE      = 0;
+        QREAD      = 0;
+        QCONFIG    = 0;
+        QSIZE      = 0;
+        PROT       = 0;
+        CONFIG     = 0;
+        LOCK       = 0;
+        REGIONCFG  = 0;
+        AXI_LIMIT0 = 0;
+        AXI_LIMIT1 = 0;
+        AXI_LIMIT2 = 0;
+        AXI_LIMIT3 = 0;
+        for (size_t i = 0; i < (sizeof(BASEP) / sizeof(BASEP[0])); ++i)
+            BASEP[i] = 0;
         WD_STATUS          = 0;
         MAC_STATUS         = 0;
         AO_STATUS          = 0;
@@ -8141,8 +13775,17 @@
         CLKFORCE           = 0;
         DEBUG_ADDRESS      = 0;
         DEBUG_MISC         = 0;
-        DEBUGCORE          = 0;
         DEBUG_BLOCK        = 0;
+        PMCR               = 8192;
+        PMCNTENSET         = 0;
+        PMCNTENCLR         = 0;
+        PMOVSSET           = 0;
+        PMOVSCLR           = 0;
+        PMINTSET           = 0;
+        PMINTCLR           = 0;
+        PMCCNTR            = 0;
+        PMCCNTR_CFG        = 0;
+        PMCAXI_CHAN        = 0;
         KERNEL_X           = 0;
         KERNEL_Y           = 0;
         KERNEL_W_M1        = 0;
@@ -8160,172 +13803,127 @@
         IFM_CBLK_WIDTH     = 0;
         IFM_CBLK_HEIGHT    = 0;
         DMA_IFM_SRC        = 0;
-        DMA_IFM_SRC_HI     = 0;
         DMA_IFM_DST        = 0;
         DMA_OFM_SRC        = 0;
         DMA_OFM_DST        = 0;
-        DMA_OFM_DST_HI     = 0;
         DMA_WEIGHT_SRC     = 0;
-        DMA_WEIGHT_SRC_HI  = 0;
         DMA_CMD_SRC        = 0;
-        DMA_CMD_SRC_HI     = 0;
         DMA_CMD_SIZE       = 0;
         DMA_M2M_SRC        = 0;
-        DMA_M2M_SRC_HI     = 0;
         DMA_M2M_DST        = 0;
-        DMA_M2M_DST_HI     = 0;
         CURRENT_QREAD      = 0;
         DMA_SCALE_SRC      = 0;
-        DMA_SCALE_SRC_HI   = 0;
         CURRENT_BLOCK      = 0;
         CURRENT_OP         = 0;
         CURRENT_CMD        = 0;
-        IFM_PAD_TOP        = 0;
-        IFM_PAD_LEFT       = 0;
-        IFM_PAD_RIGHT      = 0;
-        IFM_PAD_BOTTOM     = 0;
-        IFM_DEPTH_M1       = 0;
-        IFM_PRECISION      = 0;
-        IFM_UPSCALE        = 0;
-        IFM_ZERO_POINT     = 0;
-        IFM_WIDTH0_M1      = 0;
-        IFM_HEIGHT0_M1     = 0;
-        IFM_HEIGHT1_M1     = 0;
-        IFM_IB_END         = 0;
-        IFM_REGION         = 0;
-        OFM_WIDTH_M1       = 0;
-        OFM_HEIGHT_M1      = 0;
-        OFM_DEPTH_M1       = 0;
-        OFM_PRECISION      = 0;
-        OFM_BLK_WIDTH_M1   = 0;
-        OFM_BLK_HEIGHT_M1  = 0;
-        OFM_BLK_DEPTH_M1   = 0;
-        OFM_ZERO_POINT     = 0;
-        OFM_WIDTH0_M1      = 0;
-        OFM_HEIGHT0_M1     = 0;
-        OFM_HEIGHT1_M1     = 0;
-        OFM_REGION         = 0;
-        KERNEL_WIDTH_M1    = 0;
-        KERNEL_HEIGHT_M1   = 0;
-        KERNEL_STRIDE      = 0;
-        PARALLEL_MODE      = 0;
-        ACC_FORMAT         = 0;
-        ACTIVATION         = 0;
-        ACTIVATION_MIN     = 0;
-        ACTIVATION_MAX     = 0;
-        WEIGHT_REGION      = 0;
-        SCALE_REGION       = 0;
-        AB_START           = 0;
-        BLOCKDEP           = 0;
-        DMA0_SRC_REGION    = 0;
-        DMA0_DST_REGION    = 0;
-        DMA0_SIZE0         = 0;
-        DMA0_SIZE1         = 0;
-        IFM2_BROADCAST     = 0;
-        IFM2_SCALAR        = 0;
-        IFM2_PRECISION     = 0;
-        IFM2_ZERO_POINT    = 0;
-        IFM2_WIDTH0_M1     = 0;
-        IFM2_HEIGHT0_M1    = 0;
-        IFM2_HEIGHT1_M1    = 0;
-        IFM2_IB_START      = 0;
-        IFM2_REGION        = 0;
-        IFM_BASE0          = 0;
-        IFM_BASE0_HI       = 0;
-        IFM_BASE1          = 0;
-        IFM_BASE1_HI       = 0;
-        IFM_BASE2          = 0;
-        IFM_BASE2_HI       = 0;
-        IFM_BASE3          = 0;
-        IFM_BASE3_HI       = 0;
-        IFM_STRIDE_X       = 0;
-        IFM_STRIDE_X_HI    = 0;
-        IFM_STRIDE_Y       = 0;
-        IFM_STRIDE_Y_HI    = 0;
-        IFM_STRIDE_C       = 0;
-        IFM_STRIDE_C_HI    = 0;
-        OFM_BASE0          = 0;
-        OFM_BASE0_HI       = 0;
-        OFM_BASE1          = 0;
-        OFM_BASE1_HI       = 0;
-        OFM_BASE2          = 0;
-        OFM_BASE2_HI       = 0;
-        OFM_BASE3          = 0;
-        OFM_BASE3_HI       = 0;
-        OFM_STRIDE_X       = 0;
-        OFM_STRIDE_X_HI    = 0;
-        OFM_STRIDE_Y       = 0;
-        OFM_STRIDE_Y_HI    = 0;
-        OFM_STRIDE_C       = 0;
-        OFM_STRIDE_C_HI    = 0;
-        WEIGHT_BASE        = 0;
-        WEIGHT_BASE_HI     = 0;
-        WEIGHT_LENGTH      = 0;
-        SCALE_BASE         = 0;
-        SCALE_BASE_HI      = 0;
-        SCALE_LENGTH       = 0;
-        OFM_SCALE          = 0;
-        OFM_SCALE_SHIFT    = 0;
-        OPA_SCALE          = 0;
-        OPA_SCALE_SHIFT    = 0;
-        OPB_SCALE          = 0;
-        DMA0_SRC           = 0;
-        DMA0_SRC_HI        = 0;
-        DMA0_DST           = 0;
-        DMA0_DST_HI        = 0;
-        DMA0_LEN           = 0;
-        DMA0_LEN_HI        = 0;
-        DMA0_SKIP0         = 0;
-        DMA0_SKIP0_HI      = 0;
-        DMA0_SKIP1         = 0;
-        DMA0_SKIP1_HI      = 0;
-        IFM2_BASE0         = 0;
-        IFM2_BASE0_HI      = 0;
-        IFM2_BASE1         = 0;
-        IFM2_BASE1_HI      = 0;
-        IFM2_BASE2         = 0;
-        IFM2_BASE2_HI      = 0;
-        IFM2_BASE3         = 0;
-        IFM2_BASE3_HI      = 0;
-        IFM2_STRIDE_X      = 0;
-        IFM2_STRIDE_X_HI   = 0;
-        IFM2_STRIDE_Y      = 0;
-        IFM2_STRIDE_Y_HI   = 0;
-        IFM2_STRIDE_C      = 0;
-        IFM2_STRIDE_C_HI   = 0;
-        WEIGHT1_BASE       = 0;
-        WEIGHT1_BASE_HI    = 0;
-        WEIGHT1_LENGTH     = 0;
-        SCALE1_BASE        = 0;
-        SCALE1_BASE_HI     = 0;
-        SCALE1_LENGTH      = 0;
-        PMCR               = 8192;
-        PMCNTENSET         = 0;
-        PMCNTENCLR         = 0;
-        PMOVSSET           = 0;
-        PMOVSCLR           = 0;
-        PMINTSET           = 0;
-        PMINTCLR           = 0;
-        PMCCNTR_LO         = 0;
-        PMCCNTR_HI         = 0;
-        PMCCNTR_CFG        = 0;
-        PMCAXI_CHAN        = 0;
         for (size_t i = 0; i < (sizeof(PMEVCNTR) / sizeof(PMEVCNTR[0])); ++i)
             PMEVCNTR[i] = 0;
         for (size_t i = 0; i < (sizeof(PMEVTYPER) / sizeof(PMEVTYPER[0])); ++i)
             PMEVTYPER[i] = 0;
         for (size_t i = 0; i < (sizeof(SHARED_BUFFER) / sizeof(SHARED_BUFFER[0])); ++i)
             SHARED_BUFFER[i] = 0;
+        IFM_PAD_TOP       = 0;
+        IFM_PAD_LEFT      = 0;
+        IFM_PAD_RIGHT     = 0;
+        IFM_PAD_BOTTOM    = 0;
+        IFM_DEPTH_M1      = 0;
+        IFM_PRECISION     = 0;
+        IFM_UPSCALE       = 0;
+        IFM_ZERO_POINT    = 0;
+        IFM_WIDTH0_M1     = 0;
+        IFM_HEIGHT0_M1    = 0;
+        IFM_HEIGHT1_M1    = 0;
+        IFM_IB_END        = 0;
+        IFM_REGION        = 0;
+        OFM_WIDTH_M1      = 0;
+        OFM_HEIGHT_M1     = 0;
+        OFM_DEPTH_M1      = 0;
+        OFM_PRECISION     = 0;
+        OFM_BLK_WIDTH_M1  = 0;
+        OFM_BLK_HEIGHT_M1 = 0;
+        OFM_BLK_DEPTH_M1  = 0;
+        OFM_ZERO_POINT    = 0;
+        OFM_WIDTH0_M1     = 0;
+        OFM_HEIGHT0_M1    = 0;
+        OFM_HEIGHT1_M1    = 0;
+        OFM_REGION        = 0;
+        KERNEL_WIDTH_M1   = 0;
+        KERNEL_HEIGHT_M1  = 0;
+        KERNEL_STRIDE     = 0;
+        ACC_FORMAT        = 0;
+        ACTIVATION        = 0;
+        ACTIVATION_MIN    = 0;
+        ACTIVATION_MAX    = 0;
+        WEIGHT_REGION     = 0;
+        SCALE_REGION      = 0;
+        AB_START          = 0;
+        BLOCKDEP          = 0;
+        DMA0_SRC_REGION   = 0;
+        DMA0_DST_REGION   = 0;
+        DMA0_SIZE0        = 0;
+        DMA0_SIZE1        = 0;
+        IFM2_BROADCAST    = 0;
+        IFM2_SCALAR       = 0;
+        IFM2_PRECISION    = 0;
+        IFM2_ZERO_POINT   = 0;
+        IFM2_WIDTH0_M1    = 0;
+        IFM2_HEIGHT0_M1   = 0;
+        IFM2_HEIGHT1_M1   = 0;
+        IFM2_IB_START     = 0;
+        IFM2_REGION       = 0;
+        IFM_BASE0         = 0;
+        IFM_BASE1         = 0;
+        IFM_BASE2         = 0;
+        IFM_BASE3         = 0;
+        IFM_STRIDE_X      = 0;
+        IFM_STRIDE_Y      = 0;
+        IFM_STRIDE_C      = 0;
+        OFM_BASE0         = 0;
+        OFM_BASE1         = 0;
+        OFM_BASE2         = 0;
+        OFM_BASE3         = 0;
+        OFM_STRIDE_X      = 0;
+        OFM_STRIDE_Y      = 0;
+        OFM_STRIDE_C      = 0;
+        WEIGHT_BASE       = 0;
+        WEIGHT_LENGTH     = 0;
+        SCALE_BASE        = 0;
+        SCALE_LENGTH      = 0;
+        OFM_SCALE         = 0;
+        OFM_SCALE_SHIFT   = 0;
+        OPA_SCALE         = 0;
+        OPA_SCALE_SHIFT   = 0;
+        OPB_SCALE         = 0;
+        DMA0_SRC          = 0;
+        DMA0_DST          = 0;
+        DMA0_LEN          = 0;
+        IFM2_BASE0        = 0;
+        IFM2_BASE1        = 0;
+        IFM2_BASE2        = 0;
+        IFM2_BASE3        = 0;
+        IFM2_STRIDE_X     = 0;
+        IFM2_STRIDE_Y     = 0;
+        IFM2_STRIDE_C     = 0;
+        for (size_t i = 0; i < (sizeof(USER_DEFINED) / sizeof(USER_DEFINED[0])); ++i)
+            USER_DEFINED[i] = 0;
+        REVISION = 0;
+        PID4     = 4;
+        PID5     = 0;
+        PID6     = 0;
+        PID7     = 0;
+        PID0     = 128;
+        PID1     = 181;
+        PID2     = 11;
+        PID3     = 0;
+        CID0     = 13;
+        CID1     = 240;
+        CID2     = 5;
+        CID3     = 177;
     }
     uint32_t &operator[](const int addr_offset)
     {
         return reinterpret_cast<uint32_t *>(this)[addr_offset / 4];
     }
-    enum class access_type_t : bool
-    {
-        RO,
-        RW
-    };
     access_type_t get_access_type(uint32_t offset)
     {
         switch (offset)
@@ -8340,8 +13938,6 @@
             return access_type_t::RW;
         case 16:
             return access_type_t::RW;
-        case 20:
-            return access_type_t::RW;
         case 24:
             return access_type_t::RO;
         case 28:
@@ -8366,62 +13962,20 @@
             return access_type_t::RW;
         case 128:
             return access_type_t::RW;
-        case 132:
-            return access_type_t::RW;
         case 136:
             return access_type_t::RW;
-        case 140:
-            return access_type_t::RW;
         case 144:
             return access_type_t::RW;
-        case 148:
-            return access_type_t::RW;
         case 152:
             return access_type_t::RW;
-        case 156:
-            return access_type_t::RW;
         case 160:
             return access_type_t::RW;
-        case 164:
-            return access_type_t::RW;
         case 168:
             return access_type_t::RW;
-        case 172:
-            return access_type_t::RW;
         case 176:
             return access_type_t::RW;
-        case 180:
-            return access_type_t::RW;
         case 184:
             return access_type_t::RW;
-        case 188:
-            return access_type_t::RW;
-        case 4032:
-            return access_type_t::RO;
-        case 4048:
-            return access_type_t::RO;
-        case 4052:
-            return access_type_t::RO;
-        case 4056:
-            return access_type_t::RO;
-        case 4060:
-            return access_type_t::RO;
-        case 4064:
-            return access_type_t::RO;
-        case 4068:
-            return access_type_t::RO;
-        case 4072:
-            return access_type_t::RO;
-        case 4076:
-            return access_type_t::RO;
-        case 4080:
-            return access_type_t::RO;
-        case 4084:
-            return access_type_t::RO;
-        case 4088:
-            return access_type_t::RO;
-        case 4092:
-            return access_type_t::RO;
         case 256:
             return access_type_t::RO;
         case 260:
@@ -8438,10 +13992,28 @@
             return access_type_t::RW;
         case 328:
             return access_type_t::RW;
-        case 332:
-            return access_type_t::RW;
         case 336:
             return access_type_t::RW;
+        case 384:
+            return access_type_t::RW;
+        case 388:
+            return access_type_t::RW;
+        case 392:
+            return access_type_t::RW;
+        case 396:
+            return access_type_t::RW;
+        case 400:
+            return access_type_t::RW;
+        case 404:
+            return access_type_t::RW;
+        case 408:
+            return access_type_t::RW;
+        case 416:
+            return access_type_t::RW;
+        case 424:
+            return access_type_t::RW;
+        case 428:
+            return access_type_t::RW;
         case 512:
             return access_type_t::RO;
         case 516:
@@ -8476,306 +14048,32 @@
             return access_type_t::RO;
         case 576:
             return access_type_t::RO;
-        case 580:
-            return access_type_t::RO;
         case 584:
             return access_type_t::RO;
         case 588:
             return access_type_t::RO;
         case 592:
             return access_type_t::RO;
-        case 596:
-            return access_type_t::RO;
         case 600:
             return access_type_t::RO;
-        case 604:
-            return access_type_t::RO;
         case 608:
             return access_type_t::RO;
-        case 612:
-            return access_type_t::RO;
         case 616:
             return access_type_t::RO;
         case 620:
             return access_type_t::RO;
-        case 624:
-            return access_type_t::RO;
         case 628:
             return access_type_t::RO;
-        case 632:
-            return access_type_t::RO;
         case 636:
             return access_type_t::RO;
         case 640:
             return access_type_t::RO;
-        case 644:
-            return access_type_t::RO;
         case 692:
             return access_type_t::RO;
         case 696:
             return access_type_t::RO;
         case 700:
             return access_type_t::RO;
-        case 2048:
-            return access_type_t::RW;
-        case 2052:
-            return access_type_t::RW;
-        case 2056:
-            return access_type_t::RW;
-        case 2060:
-            return access_type_t::RW;
-        case 2064:
-            return access_type_t::RW;
-        case 2068:
-            return access_type_t::RW;
-        case 2076:
-            return access_type_t::RW;
-        case 2084:
-            return access_type_t::RW;
-        case 2088:
-            return access_type_t::RW;
-        case 2092:
-            return access_type_t::RW;
-        case 2096:
-            return access_type_t::RW;
-        case 2100:
-            return access_type_t::RW;
-        case 2108:
-            return access_type_t::RW;
-        case 2116:
-            return access_type_t::RW;
-        case 2120:
-            return access_type_t::RW;
-        case 2124:
-            return access_type_t::RW;
-        case 2128:
-            return access_type_t::RW;
-        case 2132:
-            return access_type_t::RW;
-        case 2136:
-            return access_type_t::RW;
-        case 2140:
-            return access_type_t::RW;
-        case 2144:
-            return access_type_t::RW;
-        case 2152:
-            return access_type_t::RW;
-        case 2156:
-            return access_type_t::RW;
-        case 2160:
-            return access_type_t::RW;
-        case 2172:
-            return access_type_t::RW;
-        case 2176:
-            return access_type_t::RW;
-        case 2180:
-            return access_type_t::RW;
-        case 2184:
-            return access_type_t::RW;
-        case 2188:
-            return access_type_t::RW;
-        case 2192:
-            return access_type_t::RW;
-        case 2196:
-            return access_type_t::RW;
-        case 2200:
-            return access_type_t::RW;
-        case 2204:
-            return access_type_t::RW;
-        case 2208:
-            return access_type_t::RW;
-        case 2212:
-            return access_type_t::RW;
-        case 2228:
-            return access_type_t::RW;
-        case 2236:
-            return access_type_t::RW;
-        case 2240:
-            return access_type_t::RW;
-        case 2244:
-            return access_type_t::RW;
-        case 2248:
-            return access_type_t::RW;
-        case 2252:
-            return access_type_t::RW;
-        case 2304:
-            return access_type_t::RW;
-        case 2308:
-            return access_type_t::RW;
-        case 2324:
-            return access_type_t::RW;
-        case 2340:
-            return access_type_t::RW;
-        case 2344:
-            return access_type_t::RW;
-        case 2348:
-            return access_type_t::RW;
-        case 2352:
-            return access_type_t::RW;
-        case 2356:
-            return access_type_t::RW;
-        case 2364:
-            return access_type_t::RW;
-        case 2560:
-            return access_type_t::RW;
-        case 2564:
-            return access_type_t::RW;
-        case 2568:
-            return access_type_t::RW;
-        case 2572:
-            return access_type_t::RW;
-        case 2576:
-            return access_type_t::RW;
-        case 2580:
-            return access_type_t::RW;
-        case 2584:
-            return access_type_t::RW;
-        case 2588:
-            return access_type_t::RW;
-        case 2592:
-            return access_type_t::RW;
-        case 2596:
-            return access_type_t::RW;
-        case 2600:
-            return access_type_t::RW;
-        case 2604:
-            return access_type_t::RW;
-        case 2608:
-            return access_type_t::RW;
-        case 2612:
-            return access_type_t::RW;
-        case 2624:
-            return access_type_t::RW;
-        case 2628:
-            return access_type_t::RW;
-        case 2632:
-            return access_type_t::RW;
-        case 2636:
-            return access_type_t::RW;
-        case 2640:
-            return access_type_t::RW;
-        case 2644:
-            return access_type_t::RW;
-        case 2648:
-            return access_type_t::RW;
-        case 2652:
-            return access_type_t::RW;
-        case 2656:
-            return access_type_t::RW;
-        case 2660:
-            return access_type_t::RW;
-        case 2664:
-            return access_type_t::RW;
-        case 2668:
-            return access_type_t::RW;
-        case 2672:
-            return access_type_t::RW;
-        case 2676:
-            return access_type_t::RW;
-        case 2688:
-            return access_type_t::RW;
-        case 2692:
-            return access_type_t::RW;
-        case 2696:
-            return access_type_t::RW;
-        case 2704:
-            return access_type_t::RW;
-        case 2708:
-            return access_type_t::RW;
-        case 2712:
-            return access_type_t::RW;
-        case 2720:
-            return access_type_t::RW;
-        case 2724:
-            return access_type_t::RW;
-        case 2728:
-            return access_type_t::RW;
-        case 2732:
-            return access_type_t::RW;
-        case 2736:
-            return access_type_t::RW;
-        case 2752:
-            return access_type_t::RW;
-        case 2756:
-            return access_type_t::RW;
-        case 2760:
-            return access_type_t::RW;
-        case 2764:
-            return access_type_t::RW;
-        case 2768:
-            return access_type_t::RW;
-        case 2772:
-            return access_type_t::RW;
-        case 2776:
-            return access_type_t::RW;
-        case 2780:
-            return access_type_t::RW;
-        case 2784:
-            return access_type_t::RW;
-        case 2788:
-            return access_type_t::RW;
-        case 2816:
-            return access_type_t::RW;
-        case 2820:
-            return access_type_t::RW;
-        case 2824:
-            return access_type_t::RW;
-        case 2828:
-            return access_type_t::RW;
-        case 2832:
-            return access_type_t::RW;
-        case 2836:
-            return access_type_t::RW;
-        case 2840:
-            return access_type_t::RW;
-        case 2844:
-            return access_type_t::RW;
-        case 2848:
-            return access_type_t::RW;
-        case 2852:
-            return access_type_t::RW;
-        case 2856:
-            return access_type_t::RW;
-        case 2860:
-            return access_type_t::RW;
-        case 2864:
-            return access_type_t::RW;
-        case 2868:
-            return access_type_t::RW;
-        case 2880:
-            return access_type_t::RW;
-        case 2884:
-            return access_type_t::RW;
-        case 2888:
-            return access_type_t::RW;
-        case 2896:
-            return access_type_t::RW;
-        case 2900:
-            return access_type_t::RW;
-        case 2904:
-            return access_type_t::RW;
-        case 384:
-            return access_type_t::RW;
-        case 388:
-            return access_type_t::RW;
-        case 392:
-            return access_type_t::RW;
-        case 396:
-            return access_type_t::RW;
-        case 400:
-            return access_type_t::RW;
-        case 404:
-            return access_type_t::RW;
-        case 408:
-            return access_type_t::RW;
-        case 416:
-            return access_type_t::RW;
-        case 420:
-            return access_type_t::RW;
-        case 424:
-            return access_type_t::RW;
-        case 428:
-            return access_type_t::RW;
         case 768:
             return access_type_t::RW;
         case 772:
@@ -9304,4492 +14602,8946 @@
             return access_type_t::RW;
         case 2044:
             return access_type_t::RW;
+        case 2048:
+            return access_type_t::RW;
+        case 2052:
+            return access_type_t::RW;
+        case 2056:
+            return access_type_t::RW;
+        case 2060:
+            return access_type_t::RW;
+        case 2064:
+            return access_type_t::RW;
+        case 2068:
+            return access_type_t::RW;
+        case 2076:
+            return access_type_t::RW;
+        case 2084:
+            return access_type_t::RW;
+        case 2088:
+            return access_type_t::RW;
+        case 2092:
+            return access_type_t::RW;
+        case 2096:
+            return access_type_t::RW;
+        case 2100:
+            return access_type_t::RW;
+        case 2108:
+            return access_type_t::RW;
+        case 2116:
+            return access_type_t::RW;
+        case 2120:
+            return access_type_t::RW;
+        case 2124:
+            return access_type_t::RW;
+        case 2128:
+            return access_type_t::RW;
+        case 2132:
+            return access_type_t::RW;
+        case 2136:
+            return access_type_t::RW;
+        case 2140:
+            return access_type_t::RW;
+        case 2144:
+            return access_type_t::RW;
+        case 2152:
+            return access_type_t::RW;
+        case 2156:
+            return access_type_t::RW;
+        case 2160:
+            return access_type_t::RW;
+        case 2172:
+            return access_type_t::RW;
+        case 2176:
+            return access_type_t::RW;
+        case 2180:
+            return access_type_t::RW;
+        case 2184:
+            return access_type_t::RW;
+        case 2192:
+            return access_type_t::RW;
+        case 2196:
+            return access_type_t::RW;
+        case 2200:
+            return access_type_t::RW;
+        case 2204:
+            return access_type_t::RW;
+        case 2208:
+            return access_type_t::RW;
+        case 2212:
+            return access_type_t::RW;
+        case 2228:
+            return access_type_t::RW;
+        case 2236:
+            return access_type_t::RW;
+        case 2240:
+            return access_type_t::RW;
+        case 2244:
+            return access_type_t::RW;
+        case 2248:
+            return access_type_t::RW;
+        case 2252:
+            return access_type_t::RW;
+        case 2304:
+            return access_type_t::RW;
+        case 2308:
+            return access_type_t::RW;
+        case 2324:
+            return access_type_t::RW;
+        case 2340:
+            return access_type_t::RW;
+        case 2344:
+            return access_type_t::RW;
+        case 2348:
+            return access_type_t::RW;
+        case 2352:
+            return access_type_t::RW;
+        case 2356:
+            return access_type_t::RW;
+        case 2364:
+            return access_type_t::RW;
+        case 2560:
+            return access_type_t::RW;
+        case 2568:
+            return access_type_t::RW;
+        case 2576:
+            return access_type_t::RW;
+        case 2584:
+            return access_type_t::RW;
+        case 2592:
+            return access_type_t::RW;
+        case 2600:
+            return access_type_t::RW;
+        case 2608:
+            return access_type_t::RW;
+        case 2624:
+            return access_type_t::RW;
+        case 2632:
+            return access_type_t::RW;
+        case 2640:
+            return access_type_t::RW;
+        case 2648:
+            return access_type_t::RW;
+        case 2656:
+            return access_type_t::RW;
+        case 2664:
+            return access_type_t::RW;
+        case 2672:
+            return access_type_t::RW;
+        case 2688:
+            return access_type_t::RW;
+        case 2696:
+            return access_type_t::RW;
+        case 2704:
+            return access_type_t::RW;
+        case 2712:
+            return access_type_t::RW;
+        case 2720:
+            return access_type_t::RW;
+        case 2724:
+            return access_type_t::RW;
+        case 2728:
+            return access_type_t::RW;
+        case 2732:
+            return access_type_t::RW;
+        case 2736:
+            return access_type_t::RW;
+        case 2752:
+            return access_type_t::RW;
+        case 2760:
+            return access_type_t::RW;
+        case 2768:
+            return access_type_t::RW;
+        case 2816:
+            return access_type_t::RW;
+        case 2824:
+            return access_type_t::RW;
+        case 2832:
+            return access_type_t::RW;
+        case 2840:
+            return access_type_t::RW;
+        case 2848:
+            return access_type_t::RW;
+        case 2856:
+            return access_type_t::RW;
+        case 2864:
+            return access_type_t::RW;
+        case 2944:
+            return access_type_t::RW;
+        case 2952:
+            return access_type_t::RW;
+        case 2960:
+            return access_type_t::RW;
+        case 2968:
+            return access_type_t::RW;
+        case 2976:
+            return access_type_t::RW;
+        case 2984:
+            return access_type_t::RW;
+        case 2992:
+            return access_type_t::RW;
+        case 3000:
+            return access_type_t::RW;
+        case 4032:
+            return access_type_t::RO;
+        case 4048:
+            return access_type_t::RO;
+        case 4052:
+            return access_type_t::RO;
+        case 4056:
+            return access_type_t::RO;
+        case 4060:
+            return access_type_t::RO;
+        case 4064:
+            return access_type_t::RO;
+        case 4068:
+            return access_type_t::RO;
+        case 4072:
+            return access_type_t::RO;
+        case 4076:
+            return access_type_t::RO;
+        case 4080:
+            return access_type_t::RO;
+        case 4084:
+            return access_type_t::RO;
+        case 4088:
+            return access_type_t::RO;
+        case 4092:
+            return access_type_t::RO;
         default:
-            throw std::runtime_error("invalid register address");
+            return access_type_t::RO;
         }
     }
-#endif //__cplusplus
+#endif
 };
 
-// Data structure for commands without payload
-struct command_no_payload_t
+#ifdef __cplusplus
+struct isa
 {
-    uint32_t cmd_code : 10;
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t param : 16;
-#ifdef __cplusplus
-    CONSTEXPR bool valid() const
+#ifdef NPU_DISASSEMBLE
+    static int disassemble(const uint32_t *in,
+                           std::string &op,
+                           std::vector<std::pair<std::string, std::string>> &fields)
     {
-        return must_be_zero0 == 0;
+        switch (*in & 0xffff)
+        {
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_STOP):
+        {
+            const npu_op_stop_t &v = *reinterpret_cast<const npu_op_stop_t *>(in);
+            op                     = "NPU_OP_STOP";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_IRQ):
+        {
+            const npu_op_irq_t &v = *reinterpret_cast<const npu_op_irq_t *>(in);
+            op                    = "NPU_OP_IRQ";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_CONV):
+        {
+            const npu_op_conv_t &v = *reinterpret_cast<const npu_op_conv_t *>(in);
+            op                     = "NPU_OP_CONV";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_DEPTHWISE):
+        {
+            const npu_op_depthwise_t &v = *reinterpret_cast<const npu_op_depthwise_t *>(in);
+            op                          = "NPU_OP_DEPTHWISE";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_POOL):
+        {
+            const npu_op_pool_t &v = *reinterpret_cast<const npu_op_pool_t *>(in);
+            op                     = "NPU_OP_POOL";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_ELEMENTWISE):
+        {
+            const npu_op_elementwise_t &v = *reinterpret_cast<const npu_op_elementwise_t *>(in);
+            op                            = "NPU_OP_ELEMENTWISE";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_DMA_START):
+        {
+            const npu_op_dma_start_t &v = *reinterpret_cast<const npu_op_dma_start_t *>(in);
+            op                          = "NPU_OP_DMA_START";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_DMA_WAIT):
+        {
+            const npu_op_dma_wait_t &v = *reinterpret_cast<const npu_op_dma_wait_t *>(in);
+            op                         = "NPU_OP_DMA_WAIT";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_KERNEL_WAIT):
+        {
+            const npu_op_kernel_wait_t &v = *reinterpret_cast<const npu_op_kernel_wait_t *>(in);
+            op                            = "NPU_OP_KERNEL_WAIT";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_PMU_MASK):
+        {
+            const npu_op_pmu_mask_t &v = *reinterpret_cast<const npu_op_pmu_mask_t *>(in);
+            op                         = "NPU_OP_PMU_MASK";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_PAD_TOP):
+        {
+            const npu_set_ifm_pad_top_t &v = *reinterpret_cast<const npu_set_ifm_pad_top_t *>(in);
+            op                             = "NPU_SET_IFM_PAD_TOP";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_PAD_LEFT):
+        {
+            const npu_set_ifm_pad_left_t &v = *reinterpret_cast<const npu_set_ifm_pad_left_t *>(in);
+            op                              = "NPU_SET_IFM_PAD_LEFT";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_PAD_RIGHT):
+        {
+            const npu_set_ifm_pad_right_t &v = *reinterpret_cast<const npu_set_ifm_pad_right_t *>(in);
+            op                               = "NPU_SET_IFM_PAD_RIGHT";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_PAD_BOTTOM):
+        {
+            const npu_set_ifm_pad_bottom_t &v = *reinterpret_cast<const npu_set_ifm_pad_bottom_t *>(in);
+            op                                = "NPU_SET_IFM_PAD_BOTTOM";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_DEPTH_M1):
+        {
+            const npu_set_ifm_depth_m1_t &v = *reinterpret_cast<const npu_set_ifm_depth_m1_t *>(in);
+            op                              = "NPU_SET_IFM_DEPTH_M1";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_PRECISION):
+        {
+            const npu_set_ifm_precision_t &v = *reinterpret_cast<const npu_set_ifm_precision_t *>(in);
+            op                               = "NPU_SET_IFM_PRECISION";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_UPSCALE):
+        {
+            const npu_set_ifm_upscale_t &v = *reinterpret_cast<const npu_set_ifm_upscale_t *>(in);
+            op                             = "NPU_SET_IFM_UPSCALE";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_ZERO_POINT):
+        {
+            const npu_set_ifm_zero_point_t &v = *reinterpret_cast<const npu_set_ifm_zero_point_t *>(in);
+            op                                = "NPU_SET_IFM_ZERO_POINT";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_WIDTH0_M1):
+        {
+            const npu_set_ifm_width0_m1_t &v = *reinterpret_cast<const npu_set_ifm_width0_m1_t *>(in);
+            op                               = "NPU_SET_IFM_WIDTH0_M1";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_HEIGHT0_M1):
+        {
+            const npu_set_ifm_height0_m1_t &v = *reinterpret_cast<const npu_set_ifm_height0_m1_t *>(in);
+            op                                = "NPU_SET_IFM_HEIGHT0_M1";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_HEIGHT1_M1):
+        {
+            const npu_set_ifm_height1_m1_t &v = *reinterpret_cast<const npu_set_ifm_height1_m1_t *>(in);
+            op                                = "NPU_SET_IFM_HEIGHT1_M1";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_IB_END):
+        {
+            const npu_set_ifm_ib_end_t &v = *reinterpret_cast<const npu_set_ifm_ib_end_t *>(in);
+            op                            = "NPU_SET_IFM_IB_END";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_REGION):
+        {
+            const npu_set_ifm_region_t &v = *reinterpret_cast<const npu_set_ifm_region_t *>(in);
+            op                            = "NPU_SET_IFM_REGION";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_WIDTH_M1):
+        {
+            const npu_set_ofm_width_m1_t &v = *reinterpret_cast<const npu_set_ofm_width_m1_t *>(in);
+            op                              = "NPU_SET_OFM_WIDTH_M1";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_HEIGHT_M1):
+        {
+            const npu_set_ofm_height_m1_t &v = *reinterpret_cast<const npu_set_ofm_height_m1_t *>(in);
+            op                               = "NPU_SET_OFM_HEIGHT_M1";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_DEPTH_M1):
+        {
+            const npu_set_ofm_depth_m1_t &v = *reinterpret_cast<const npu_set_ofm_depth_m1_t *>(in);
+            op                              = "NPU_SET_OFM_DEPTH_M1";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_PRECISION):
+        {
+            const npu_set_ofm_precision_t &v = *reinterpret_cast<const npu_set_ofm_precision_t *>(in);
+            op                               = "NPU_SET_OFM_PRECISION";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_BLK_WIDTH_M1):
+        {
+            const npu_set_ofm_blk_width_m1_t &v = *reinterpret_cast<const npu_set_ofm_blk_width_m1_t *>(in);
+            op                                  = "NPU_SET_OFM_BLK_WIDTH_M1";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_BLK_HEIGHT_M1):
+        {
+            const npu_set_ofm_blk_height_m1_t &v = *reinterpret_cast<const npu_set_ofm_blk_height_m1_t *>(in);
+            op                                   = "NPU_SET_OFM_BLK_HEIGHT_M1";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_BLK_DEPTH_M1):
+        {
+            const npu_set_ofm_blk_depth_m1_t &v = *reinterpret_cast<const npu_set_ofm_blk_depth_m1_t *>(in);
+            op                                  = "NPU_SET_OFM_BLK_DEPTH_M1";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_ZERO_POINT):
+        {
+            const npu_set_ofm_zero_point_t &v = *reinterpret_cast<const npu_set_ofm_zero_point_t *>(in);
+            op                                = "NPU_SET_OFM_ZERO_POINT";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_WIDTH0_M1):
+        {
+            const npu_set_ofm_width0_m1_t &v = *reinterpret_cast<const npu_set_ofm_width0_m1_t *>(in);
+            op                               = "NPU_SET_OFM_WIDTH0_M1";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_HEIGHT0_M1):
+        {
+            const npu_set_ofm_height0_m1_t &v = *reinterpret_cast<const npu_set_ofm_height0_m1_t *>(in);
+            op                                = "NPU_SET_OFM_HEIGHT0_M1";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_HEIGHT1_M1):
+        {
+            const npu_set_ofm_height1_m1_t &v = *reinterpret_cast<const npu_set_ofm_height1_m1_t *>(in);
+            op                                = "NPU_SET_OFM_HEIGHT1_M1";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_REGION):
+        {
+            const npu_set_ofm_region_t &v = *reinterpret_cast<const npu_set_ofm_region_t *>(in);
+            op                            = "NPU_SET_OFM_REGION";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_KERNEL_WIDTH_M1):
+        {
+            const npu_set_kernel_width_m1_t &v = *reinterpret_cast<const npu_set_kernel_width_m1_t *>(in);
+            op                                 = "NPU_SET_KERNEL_WIDTH_M1";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_KERNEL_HEIGHT_M1):
+        {
+            const npu_set_kernel_height_m1_t &v = *reinterpret_cast<const npu_set_kernel_height_m1_t *>(in);
+            op                                  = "NPU_SET_KERNEL_HEIGHT_M1";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_KERNEL_STRIDE):
+        {
+            const npu_set_kernel_stride_t &v = *reinterpret_cast<const npu_set_kernel_stride_t *>(in);
+            op                               = "NPU_SET_KERNEL_STRIDE";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_ACC_FORMAT):
+        {
+            const npu_set_acc_format_t &v = *reinterpret_cast<const npu_set_acc_format_t *>(in);
+            op                            = "NPU_SET_ACC_FORMAT";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_ACTIVATION):
+        {
+            const npu_set_activation_t &v = *reinterpret_cast<const npu_set_activation_t *>(in);
+            op                            = "NPU_SET_ACTIVATION";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_ACTIVATION_MIN):
+        {
+            const npu_set_activation_min_t &v = *reinterpret_cast<const npu_set_activation_min_t *>(in);
+            op                                = "NPU_SET_ACTIVATION_MIN";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_ACTIVATION_MAX):
+        {
+            const npu_set_activation_max_t &v = *reinterpret_cast<const npu_set_activation_max_t *>(in);
+            op                                = "NPU_SET_ACTIVATION_MAX";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_WEIGHT_REGION):
+        {
+            const npu_set_weight_region_t &v = *reinterpret_cast<const npu_set_weight_region_t *>(in);
+            op                               = "NPU_SET_WEIGHT_REGION";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_SCALE_REGION):
+        {
+            const npu_set_scale_region_t &v = *reinterpret_cast<const npu_set_scale_region_t *>(in);
+            op                              = "NPU_SET_SCALE_REGION";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_AB_START):
+        {
+            const npu_set_ab_start_t &v = *reinterpret_cast<const npu_set_ab_start_t *>(in);
+            op                          = "NPU_SET_AB_START";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_BLOCKDEP):
+        {
+            const npu_set_blockdep_t &v = *reinterpret_cast<const npu_set_blockdep_t *>(in);
+            op                          = "NPU_SET_BLOCKDEP";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_DMA0_SRC_REGION):
+        {
+            const npu_set_dma0_src_region_t &v = *reinterpret_cast<const npu_set_dma0_src_region_t *>(in);
+            op                                 = "NPU_SET_DMA0_SRC_REGION";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_DMA0_DST_REGION):
+        {
+            const npu_set_dma0_dst_region_t &v = *reinterpret_cast<const npu_set_dma0_dst_region_t *>(in);
+            op                                 = "NPU_SET_DMA0_DST_REGION";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_DMA0_SIZE0):
+        {
+            const npu_set_dma0_size0_t &v = *reinterpret_cast<const npu_set_dma0_size0_t *>(in);
+            op                            = "NPU_SET_DMA0_SIZE0";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_DMA0_SIZE1):
+        {
+            const npu_set_dma0_size1_t &v = *reinterpret_cast<const npu_set_dma0_size1_t *>(in);
+            op                            = "NPU_SET_DMA0_SIZE1";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_BROADCAST):
+        {
+            const npu_set_ifm2_broadcast_t &v = *reinterpret_cast<const npu_set_ifm2_broadcast_t *>(in);
+            op                                = "NPU_SET_IFM2_BROADCAST";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_SCALAR):
+        {
+            const npu_set_ifm2_scalar_t &v = *reinterpret_cast<const npu_set_ifm2_scalar_t *>(in);
+            op                             = "NPU_SET_IFM2_SCALAR";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_PRECISION):
+        {
+            const npu_set_ifm2_precision_t &v = *reinterpret_cast<const npu_set_ifm2_precision_t *>(in);
+            op                                = "NPU_SET_IFM2_PRECISION";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_ZERO_POINT):
+        {
+            const npu_set_ifm2_zero_point_t &v = *reinterpret_cast<const npu_set_ifm2_zero_point_t *>(in);
+            op                                 = "NPU_SET_IFM2_ZERO_POINT";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_WIDTH0_M1):
+        {
+            const npu_set_ifm2_width0_m1_t &v = *reinterpret_cast<const npu_set_ifm2_width0_m1_t *>(in);
+            op                                = "NPU_SET_IFM2_WIDTH0_M1";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_HEIGHT0_M1):
+        {
+            const npu_set_ifm2_height0_m1_t &v = *reinterpret_cast<const npu_set_ifm2_height0_m1_t *>(in);
+            op                                 = "NPU_SET_IFM2_HEIGHT0_M1";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_HEIGHT1_M1):
+        {
+            const npu_set_ifm2_height1_m1_t &v = *reinterpret_cast<const npu_set_ifm2_height1_m1_t *>(in);
+            op                                 = "NPU_SET_IFM2_HEIGHT1_M1";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_IB_START):
+        {
+            const npu_set_ifm2_ib_start_t &v = *reinterpret_cast<const npu_set_ifm2_ib_start_t *>(in);
+            op                               = "NPU_SET_IFM2_IB_START";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_REGION):
+        {
+            const npu_set_ifm2_region_t &v = *reinterpret_cast<const npu_set_ifm2_region_t *>(in);
+            op                             = "NPU_SET_IFM2_REGION";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_BASE0):
+        {
+            const npu_set_ifm_base0_t &v = *reinterpret_cast<const npu_set_ifm_base0_t *>(in);
+            op                           = "NPU_SET_IFM_BASE0";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_BASE1):
+        {
+            const npu_set_ifm_base1_t &v = *reinterpret_cast<const npu_set_ifm_base1_t *>(in);
+            op                           = "NPU_SET_IFM_BASE1";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_BASE2):
+        {
+            const npu_set_ifm_base2_t &v = *reinterpret_cast<const npu_set_ifm_base2_t *>(in);
+            op                           = "NPU_SET_IFM_BASE2";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_BASE3):
+        {
+            const npu_set_ifm_base3_t &v = *reinterpret_cast<const npu_set_ifm_base3_t *>(in);
+            op                           = "NPU_SET_IFM_BASE3";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_STRIDE_X):
+        {
+            const npu_set_ifm_stride_x_t &v = *reinterpret_cast<const npu_set_ifm_stride_x_t *>(in);
+            op                              = "NPU_SET_IFM_STRIDE_X";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_STRIDE_Y):
+        {
+            const npu_set_ifm_stride_y_t &v = *reinterpret_cast<const npu_set_ifm_stride_y_t *>(in);
+            op                              = "NPU_SET_IFM_STRIDE_Y";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_STRIDE_C):
+        {
+            const npu_set_ifm_stride_c_t &v = *reinterpret_cast<const npu_set_ifm_stride_c_t *>(in);
+            op                              = "NPU_SET_IFM_STRIDE_C";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_BASE0):
+        {
+            const npu_set_ofm_base0_t &v = *reinterpret_cast<const npu_set_ofm_base0_t *>(in);
+            op                           = "NPU_SET_OFM_BASE0";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_BASE1):
+        {
+            const npu_set_ofm_base1_t &v = *reinterpret_cast<const npu_set_ofm_base1_t *>(in);
+            op                           = "NPU_SET_OFM_BASE1";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_BASE2):
+        {
+            const npu_set_ofm_base2_t &v = *reinterpret_cast<const npu_set_ofm_base2_t *>(in);
+            op                           = "NPU_SET_OFM_BASE2";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_BASE3):
+        {
+            const npu_set_ofm_base3_t &v = *reinterpret_cast<const npu_set_ofm_base3_t *>(in);
+            op                           = "NPU_SET_OFM_BASE3";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_STRIDE_X):
+        {
+            const npu_set_ofm_stride_x_t &v = *reinterpret_cast<const npu_set_ofm_stride_x_t *>(in);
+            op                              = "NPU_SET_OFM_STRIDE_X";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_STRIDE_Y):
+        {
+            const npu_set_ofm_stride_y_t &v = *reinterpret_cast<const npu_set_ofm_stride_y_t *>(in);
+            op                              = "NPU_SET_OFM_STRIDE_Y";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_STRIDE_C):
+        {
+            const npu_set_ofm_stride_c_t &v = *reinterpret_cast<const npu_set_ofm_stride_c_t *>(in);
+            op                              = "NPU_SET_OFM_STRIDE_C";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_WEIGHT_BASE):
+        {
+            const npu_set_weight_base_t &v = *reinterpret_cast<const npu_set_weight_base_t *>(in);
+            op                             = "NPU_SET_WEIGHT_BASE";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_WEIGHT_LENGTH):
+        {
+            const npu_set_weight_length_t &v = *reinterpret_cast<const npu_set_weight_length_t *>(in);
+            op                               = "NPU_SET_WEIGHT_LENGTH";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_SCALE_BASE):
+        {
+            const npu_set_scale_base_t &v = *reinterpret_cast<const npu_set_scale_base_t *>(in);
+            op                            = "NPU_SET_SCALE_BASE";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_SCALE_LENGTH):
+        {
+            const npu_set_scale_length_t &v = *reinterpret_cast<const npu_set_scale_length_t *>(in);
+            op                              = "NPU_SET_SCALE_LENGTH";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_SCALE):
+        {
+            const npu_set_ofm_scale_t &v = *reinterpret_cast<const npu_set_ofm_scale_t *>(in);
+            op                           = "NPU_SET_OFM_SCALE";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OPA_SCALE):
+        {
+            const npu_set_opa_scale_t &v = *reinterpret_cast<const npu_set_opa_scale_t *>(in);
+            op                           = "NPU_SET_OPA_SCALE";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OPB_SCALE):
+        {
+            const npu_set_opb_scale_t &v = *reinterpret_cast<const npu_set_opb_scale_t *>(in);
+            op                           = "NPU_SET_OPB_SCALE";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_DMA0_SRC):
+        {
+            const npu_set_dma0_src_t &v = *reinterpret_cast<const npu_set_dma0_src_t *>(in);
+            op                          = "NPU_SET_DMA0_SRC";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_DMA0_DST):
+        {
+            const npu_set_dma0_dst_t &v = *reinterpret_cast<const npu_set_dma0_dst_t *>(in);
+            op                          = "NPU_SET_DMA0_DST";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_DMA0_LEN):
+        {
+            const npu_set_dma0_len_t &v = *reinterpret_cast<const npu_set_dma0_len_t *>(in);
+            op                          = "NPU_SET_DMA0_LEN";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_BASE0):
+        {
+            const npu_set_ifm2_base0_t &v = *reinterpret_cast<const npu_set_ifm2_base0_t *>(in);
+            op                            = "NPU_SET_IFM2_BASE0";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_BASE1):
+        {
+            const npu_set_ifm2_base1_t &v = *reinterpret_cast<const npu_set_ifm2_base1_t *>(in);
+            op                            = "NPU_SET_IFM2_BASE1";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_BASE2):
+        {
+            const npu_set_ifm2_base2_t &v = *reinterpret_cast<const npu_set_ifm2_base2_t *>(in);
+            op                            = "NPU_SET_IFM2_BASE2";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_BASE3):
+        {
+            const npu_set_ifm2_base3_t &v = *reinterpret_cast<const npu_set_ifm2_base3_t *>(in);
+            op                            = "NPU_SET_IFM2_BASE3";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_STRIDE_X):
+        {
+            const npu_set_ifm2_stride_x_t &v = *reinterpret_cast<const npu_set_ifm2_stride_x_t *>(in);
+            op                               = "NPU_SET_IFM2_STRIDE_X";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_STRIDE_Y):
+        {
+            const npu_set_ifm2_stride_y_t &v = *reinterpret_cast<const npu_set_ifm2_stride_y_t *>(in);
+            op                               = "NPU_SET_IFM2_STRIDE_Y";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_STRIDE_C):
+        {
+            const npu_set_ifm2_stride_c_t &v = *reinterpret_cast<const npu_set_ifm2_stride_c_t *>(in);
+            op                               = "NPU_SET_IFM2_STRIDE_C";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_USER_DEFINED0):
+        {
+            const npu_set_user_defined0_t &v = *reinterpret_cast<const npu_set_user_defined0_t *>(in);
+            op                               = "NPU_SET_USER_DEFINED0";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_USER_DEFINED1):
+        {
+            const npu_set_user_defined1_t &v = *reinterpret_cast<const npu_set_user_defined1_t *>(in);
+            op                               = "NPU_SET_USER_DEFINED1";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_USER_DEFINED2):
+        {
+            const npu_set_user_defined2_t &v = *reinterpret_cast<const npu_set_user_defined2_t *>(in);
+            op                               = "NPU_SET_USER_DEFINED2";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_USER_DEFINED3):
+        {
+            const npu_set_user_defined3_t &v = *reinterpret_cast<const npu_set_user_defined3_t *>(in);
+            op                               = "NPU_SET_USER_DEFINED3";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_USER_DEFINED4):
+        {
+            const npu_set_user_defined4_t &v = *reinterpret_cast<const npu_set_user_defined4_t *>(in);
+            op                               = "NPU_SET_USER_DEFINED4";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_USER_DEFINED5):
+        {
+            const npu_set_user_defined5_t &v = *reinterpret_cast<const npu_set_user_defined5_t *>(in);
+            op                               = "NPU_SET_USER_DEFINED5";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_USER_DEFINED6):
+        {
+            const npu_set_user_defined6_t &v = *reinterpret_cast<const npu_set_user_defined6_t *>(in);
+            op                               = "NPU_SET_USER_DEFINED6";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_USER_DEFINED7):
+        {
+            const npu_set_user_defined7_t &v = *reinterpret_cast<const npu_set_user_defined7_t *>(in);
+            op                               = "NPU_SET_USER_DEFINED7";
+            v.disassemble(fields);
+            break;
+        }
+        }
+        return (*in & (3 << 14)) != 0 ? 2 : 1;
     }
-    CONSTEXPR void init()
+#endif
+#endif
+    // Signal the end of command stream
+    struct npu_op_stop_t
     {
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t mask : 16;   //  Encoding for 16-bit mask value
+#ifdef __cplusplus
+      public:
+        npu_op_stop_t(uint32_t _mask) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_STOP)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            mask(static_cast<uint16_t>(_mask) & ((1U << 16) - 1))
+        {
+        }
+        CONSTEXPR npu_op_stop_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_STOP)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), mask(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_STOP) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_STOP);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_op_stop_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_op_stop_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_mask() const
+        {
+            return static_cast<uint32_t>(mask);
+        }
+        CONSTEXPR npu_op_stop_t &set_mask(uint32_t value)
+        {
+            mask = static_cast<uint16_t>(value) & ((1U << 16) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("mask", std::to_string(mask)));
+        }
+#endif
+#endif
+    };
+    // Raises an IRQ to the host
+    struct npu_op_irq_t
     {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR command_no_payload_t &set_cmd_code(::cmd0 value)
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t mask : 16;   //  Encoding for 16-bit mask value
+#ifdef __cplusplus
+      public:
+        npu_op_irq_t(uint32_t _mask) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_IRQ)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            mask(static_cast<uint16_t>(_mask) & ((1U << 16) - 1))
+        {
+        }
+        CONSTEXPR npu_op_irq_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_IRQ)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), mask(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_IRQ) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_IRQ);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_op_irq_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_op_irq_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_mask() const
+        {
+            return static_cast<uint32_t>(mask);
+        }
+        CONSTEXPR npu_op_irq_t &set_mask(uint32_t value)
+        {
+            mask = static_cast<uint16_t>(value) & ((1U << 16) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("mask", std::to_string(mask)));
+        }
+#endif
+#endif
+    };
+    // 2D convolution
+    struct npu_op_conv_t
     {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_param() const
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t reserved1 : 16;
+#ifdef __cplusplus
+      public:
+        CONSTEXPR npu_op_conv_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_CONV)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), reserved1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_CONV) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_CONV);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_op_conv_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_op_conv_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const {}
+#endif
+#endif
+    };
+    // Depth-wise 2D convolution
+    struct npu_op_depthwise_t
     {
-        return static_cast<uint32_t>(param);
-    }
-    CONSTEXPR command_no_payload_t &set_param(uint32_t value)
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t reserved1 : 16;
+#ifdef __cplusplus
+      public:
+        CONSTEXPR npu_op_depthwise_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_DEPTHWISE)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), reserved1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_DEPTHWISE) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_DEPTHWISE);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_op_depthwise_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_op_depthwise_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const {}
+#endif
+#endif
+    };
+    // Pooling
+    struct npu_op_pool_t
     {
-        param = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Data structure for commands with payload
-struct command_with_payload_t
-{
-    uint32_t cmd_code : 10;
-    uint32_t must_be_zero : 4; // 0
-    uint32_t payload_size : 2; // Min:1 Max:2
-    uint32_t param : 16;
-    uint32_t data : 32;
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;      //  control
+        uint32_t pooling_mode : 3; //  Pooling mode
+        uint32_t reserved1 : 13;
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
+      public:
+        npu_op_pool_t(NPU_NAMESPACE::pooling_mode _pooling_mode) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_POOL)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            pooling_mode(static_cast<uint8_t>(_pooling_mode) & ((1U << 3) - 1)), reserved1(0)
+        {
+        }
+        CONSTEXPR npu_op_pool_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_POOL)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), pooling_mode(0), reserved1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_POOL) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_POOL);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_op_pool_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_op_pool_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::pooling_mode get_pooling_mode() const
+        {
+            return static_cast<NPU_NAMESPACE::pooling_mode>(pooling_mode);
+        }
+        CONSTEXPR npu_op_pool_t &set_pooling_mode(NPU_NAMESPACE::pooling_mode value)
+        {
+            pooling_mode = static_cast<uint8_t>(value) & ((1U << 3) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "pooling_mode",
+                (pooling_mode < (sizeof(pooling_mode_str) / sizeof(pooling_mode_str[0])) ?
+                     pooling_mode_str[pooling_mode] :
+                     "****")));
+        }
+#endif
+#endif
+    };
+    // Elementwise operation
+    struct npu_op_elementwise_t
     {
-        return must_be_zero == 0 && payload_size >= 1 && payload_size <= 2;
-    }
-    CONSTEXPR void init()
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;          //  control
+        uint32_t elementwise_mode : 6; //  Elementwise mode
+        uint32_t reserved1 : 10;
+#ifdef __cplusplus
+      public:
+        npu_op_elementwise_t(NPU_NAMESPACE::elementwise_mode _elementwise_mode) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_ELEMENTWISE)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            elementwise_mode(static_cast<uint8_t>(_elementwise_mode) & ((1U << 6) - 1)), reserved1(0)
+        {
+        }
+        CONSTEXPR npu_op_elementwise_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_ELEMENTWISE)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), elementwise_mode(0), reserved1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_ELEMENTWISE) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_ELEMENTWISE);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_op_elementwise_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_op_elementwise_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::elementwise_mode get_elementwise_mode() const
+        {
+            return static_cast<NPU_NAMESPACE::elementwise_mode>(elementwise_mode);
+        }
+        CONSTEXPR npu_op_elementwise_t &set_elementwise_mode(NPU_NAMESPACE::elementwise_mode value)
+        {
+            elementwise_mode = static_cast<uint8_t>(value) & ((1U << 6) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "elementwise_mode",
+                (elementwise_mode < (sizeof(elementwise_mode_str) / sizeof(elementwise_mode_str[0])) ?
+                     elementwise_mode_str[elementwise_mode] :
+                     "****")));
+        }
+#endif
+#endif
+    };
+    // Queue new DMA for the given channel
+    struct npu_op_dma_start_t
     {
-        must_be_zero = 0;
-        payload_size = 1;
-    }
-    CONSTEXPR ::cmd1 get_cmd_code() const
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t reserved1 : 16;
+#ifdef __cplusplus
+      public:
+        CONSTEXPR npu_op_dma_start_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_DMA_START)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), reserved1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_DMA_START) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_DMA_START);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_op_dma_start_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_op_dma_start_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const {}
+#endif
+#endif
+    };
+    // Wait for the DMA channel to have k or fewer active descriptors outstanding
+    struct npu_op_dma_wait_t
     {
-        return static_cast<::cmd1>(cmd_code);
-    }
-    CONSTEXPR command_with_payload_t &set_cmd_code(::cmd1 value)
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t k : 4;       //  Number of outstanding descriptors
+        uint32_t reserved1 : 12;
+#ifdef __cplusplus
+      public:
+        npu_op_dma_wait_t(uint32_t _k) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_DMA_WAIT)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            k(static_cast<uint8_t>(_k) & ((1U << 4) - 1)), reserved1(0)
+        {
+        }
+        CONSTEXPR npu_op_dma_wait_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_DMA_WAIT)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), k(0), reserved1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_DMA_WAIT) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_DMA_WAIT);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_op_dma_wait_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_op_dma_wait_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_k() const
+        {
+            return static_cast<uint32_t>(k);
+        }
+        CONSTEXPR npu_op_dma_wait_t &set_k(uint32_t value)
+        {
+            k = static_cast<uint8_t>(value) & ((1U << 4) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("k", std::to_string(k)));
+        }
+#endif
+#endif
+    };
+    // Wait for n or fewer kernel operations to be remaining
+    struct npu_op_kernel_wait_t
     {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_data() const
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t n : 2;       //  Number of kernel operations in range 0-3
+        uint32_t reserved1 : 14;
+#ifdef __cplusplus
+      public:
+        npu_op_kernel_wait_t(uint32_t _n) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_KERNEL_WAIT)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            n(static_cast<uint8_t>(_n) & ((1U << 2) - 1)), reserved1(0)
+        {
+        }
+        CONSTEXPR npu_op_kernel_wait_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_KERNEL_WAIT)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), n(0), reserved1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_KERNEL_WAIT) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_KERNEL_WAIT);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_op_kernel_wait_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_op_kernel_wait_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_n() const
+        {
+            return static_cast<uint32_t>(n);
+        }
+        CONSTEXPR npu_op_kernel_wait_t &set_n(uint32_t value)
+        {
+            n = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("n", std::to_string(n)));
+        }
+#endif
+#endif
+    };
+    // Enable or disable PMU counting (debug feature only)
+    struct npu_op_pmu_mask_t
     {
-        return static_cast<uint32_t>(data);
-    }
-    CONSTEXPR command_with_payload_t &set_data(uint32_t value)
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t enable : 1;  //  Enable or disable PMU mask
+        uint32_t reserved1 : 15;
+#ifdef __cplusplus
+      public:
+        npu_op_pmu_mask_t(uint32_t _enable) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_PMU_MASK)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            enable(static_cast<uint8_t>(_enable) & ((1U << 1) - 1)), reserved1(0)
+        {
+        }
+        CONSTEXPR npu_op_pmu_mask_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_PMU_MASK)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), enable(0), reserved1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_PMU_MASK) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_PMU_MASK);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_op_pmu_mask_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_op_pmu_mask_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_enable() const
+        {
+            return static_cast<uint32_t>(enable);
+        }
+        CONSTEXPR npu_op_pmu_mask_t &set_enable(uint32_t value)
+        {
+            enable = static_cast<uint8_t>(value) & ((1U << 1) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("enable", std::to_string(enable)));
+        }
+#endif
+#endif
+    };
+    // IFM top pad
+    struct npu_set_ifm_pad_top_t
     {
-        data = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_param() const
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t pad : 7;     //  IFM top pad
+        uint32_t reserved1 : 9;
+#ifdef __cplusplus
+      public:
+        npu_set_ifm_pad_top_t(uint32_t _pad) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_PAD_TOP)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            pad(static_cast<uint8_t>(_pad) & ((1U << 7) - 1)), reserved1(0)
+        {
+        }
+        CONSTEXPR npu_set_ifm_pad_top_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_PAD_TOP)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), pad(0), reserved1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_PAD_TOP) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_PAD_TOP);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ifm_pad_top_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ifm_pad_top_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_pad() const
+        {
+            return static_cast<uint32_t>(pad);
+        }
+        CONSTEXPR npu_set_ifm_pad_top_t &set_pad(uint32_t value)
+        {
+            pad = static_cast<uint8_t>(value) & ((1U << 7) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("pad", std::to_string(pad)));
+        }
+#endif
+#endif
+    };
+    // IFM left pad
+    struct npu_set_ifm_pad_left_t
     {
-        return static_cast<uint32_t>(param);
-    }
-    CONSTEXPR command_with_payload_t &set_param(uint32_t value)
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t pad : 7;     //  IFM left pad
+        uint32_t reserved1 : 9;
+#ifdef __cplusplus
+      public:
+        npu_set_ifm_pad_left_t(uint32_t _pad) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_PAD_LEFT)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            pad(static_cast<uint8_t>(_pad) & ((1U << 7) - 1)), reserved1(0)
+        {
+        }
+        CONSTEXPR npu_set_ifm_pad_left_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_PAD_LEFT)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), pad(0), reserved1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_PAD_LEFT) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_PAD_LEFT);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ifm_pad_left_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ifm_pad_left_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_pad() const
+        {
+            return static_cast<uint32_t>(pad);
+        }
+        CONSTEXPR npu_set_ifm_pad_left_t &set_pad(uint32_t value)
+        {
+            pad = static_cast<uint8_t>(value) & ((1U << 7) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("pad", std::to_string(pad)));
+        }
+#endif
+#endif
+    };
+    // IFM right pad
+    struct npu_set_ifm_pad_right_t
     {
-        param = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_payload_size() const
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t pad : 8;     //  IFM right pad. Max value is 128
+        uint32_t reserved1 : 8;
+#ifdef __cplusplus
+      public:
+        npu_set_ifm_pad_right_t(uint32_t _pad) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_PAD_RIGHT)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            pad(static_cast<uint8_t>(_pad) & ((1U << 8) - 1)), reserved1(0)
+        {
+        }
+        CONSTEXPR npu_set_ifm_pad_right_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_PAD_RIGHT)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), pad(0), reserved1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_PAD_RIGHT) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_PAD_RIGHT);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ifm_pad_right_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ifm_pad_right_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_pad() const
+        {
+            return static_cast<uint32_t>(pad);
+        }
+        CONSTEXPR npu_set_ifm_pad_right_t &set_pad(uint32_t value)
+        {
+            pad = static_cast<uint8_t>(value) & ((1U << 8) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("pad", std::to_string(pad)));
+        }
+#endif
+#endif
+    };
+    // IFM bottom pad
+    struct npu_set_ifm_pad_bottom_t
     {
-        return static_cast<uint32_t>(payload_size);
-    }
-    CONSTEXPR command_with_payload_t &set_payload_size(uint32_t value)
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t pad : 8;     //  IFM bottom pad. Max value is 128
+        uint32_t reserved1 : 8;
+#ifdef __cplusplus
+      public:
+        npu_set_ifm_pad_bottom_t(uint32_t _pad) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_PAD_BOTTOM)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            pad(static_cast<uint8_t>(_pad) & ((1U << 8) - 1)), reserved1(0)
+        {
+        }
+        CONSTEXPR npu_set_ifm_pad_bottom_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_PAD_BOTTOM)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), pad(0), reserved1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_PAD_BOTTOM) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_PAD_BOTTOM);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ifm_pad_bottom_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ifm_pad_bottom_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_pad() const
+        {
+            return static_cast<uint32_t>(pad);
+        }
+        CONSTEXPR npu_set_ifm_pad_bottom_t &set_pad(uint32_t value)
+        {
+            pad = static_cast<uint8_t>(value) & ((1U << 8) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("pad", std::to_string(pad)));
+        }
+#endif
+#endif
+    };
+    // Number of input channels for convolution
+    struct npu_set_ifm_depth_m1_t
     {
-        payload_size = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Move to stopped state once all commands to this point are done. Raise IRQ to the host and logically OR the mask into
-// the status register upper 16 bits (see the status register)
-struct npu_op_stop_t
-{
-    uint32_t cmd_code : 10;     // NPU_OP_STOP
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t mask : 16;
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;   //  control
+        uint32_t depth_m1 : 16; //  Number of input channels for convolution
+#ifdef __cplusplus
+      public:
+        npu_set_ifm_depth_m1_t(uint32_t _depth_m1) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_DEPTH_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            depth_m1(static_cast<uint16_t>(_depth_m1) & ((1U << 16) - 1))
+        {
+        }
+        CONSTEXPR npu_set_ifm_depth_m1_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_DEPTH_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), depth_m1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_DEPTH_M1) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_DEPTH_M1);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ifm_depth_m1_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ifm_depth_m1_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_depth_m1() const
+        {
+            return static_cast<uint32_t>(depth_m1);
+        }
+        CONSTEXPR npu_set_ifm_depth_m1_t &set_depth_m1(uint32_t value)
+        {
+            depth_m1 = static_cast<uint16_t>(value) & ((1U << 16) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("depth_m1", std::to_string(depth_m1)));
+        }
+#endif
+#endif
+    };
+    // IFM Precision
+    struct npu_set_ifm_precision_t
     {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_OP_STOP) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;         //  control
+        uint32_t activation_type : 1; //  IFM type
+        uint32_t reserved1 : 1;
+        uint32_t activation_precision : 2; //  IFM precision
+        uint32_t reserved2 : 2;
+        uint32_t activation_format : 2; //  IFM format
+        uint32_t scale_mode : 2;        //  IFM scale mode
+        uint32_t reserved3 : 4;
+        uint32_t round_mode : 2; //  IFM round mode
+#ifdef __cplusplus
+      public:
+        npu_set_ifm_precision_t(NPU_NAMESPACE::activation_type _activation_type,
+                                NPU_NAMESPACE::activation_precision _activation_precision,
+                                NPU_NAMESPACE::activation_format _activation_format,
+                                NPU_NAMESPACE::ifm_scale_mode _scale_mode,
+                                NPU_NAMESPACE::round_mode _round_mode) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_PRECISION)),
+            reserved0(0), control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            activation_type(static_cast<uint8_t>(_activation_type) & ((1U << 1) - 1)), reserved1(0),
+            activation_precision(static_cast<uint8_t>(_activation_precision) & ((1U << 2) - 1)), reserved2(0),
+            activation_format(static_cast<uint8_t>(_activation_format) & ((1U << 2) - 1)),
+            scale_mode(static_cast<uint8_t>(_scale_mode) & ((1U << 2) - 1)), reserved3(0),
+            round_mode(static_cast<uint8_t>(_round_mode) & ((1U << 2) - 1))
+        {
+        }
+        CONSTEXPR npu_set_ifm_precision_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_PRECISION)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), activation_type(0), reserved1(0),
+            activation_precision(0), reserved2(0), activation_format(0), scale_mode(0), reserved3(0), round_mode(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_PRECISION) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_PRECISION);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ifm_precision_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ifm_precision_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::activation_type get_activation_type() const
+        {
+            return static_cast<NPU_NAMESPACE::activation_type>(activation_type);
+        }
+        CONSTEXPR npu_set_ifm_precision_t &set_activation_type(NPU_NAMESPACE::activation_type value)
+        {
+            activation_type = static_cast<uint8_t>(value) & ((1U << 1) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::activation_precision get_activation_precision() const
+        {
+            return static_cast<NPU_NAMESPACE::activation_precision>(activation_precision);
+        }
+        CONSTEXPR npu_set_ifm_precision_t &set_activation_precision(NPU_NAMESPACE::activation_precision value)
+        {
+            activation_precision = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::activation_format get_activation_format() const
+        {
+            return static_cast<NPU_NAMESPACE::activation_format>(activation_format);
+        }
+        CONSTEXPR npu_set_ifm_precision_t &set_activation_format(NPU_NAMESPACE::activation_format value)
+        {
+            activation_format = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::ifm_scale_mode get_scale_mode() const
+        {
+            return static_cast<NPU_NAMESPACE::ifm_scale_mode>(scale_mode);
+        }
+        CONSTEXPR npu_set_ifm_precision_t &set_scale_mode(NPU_NAMESPACE::ifm_scale_mode value)
+        {
+            scale_mode = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::round_mode get_round_mode() const
+        {
+            return static_cast<NPU_NAMESPACE::round_mode>(round_mode);
+        }
+        CONSTEXPR npu_set_ifm_precision_t &set_round_mode(NPU_NAMESPACE::round_mode value)
+        {
+            round_mode = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "activation_type",
+                (activation_type < (sizeof(activation_type_str) / sizeof(activation_type_str[0])) ?
+                     activation_type_str[activation_type] :
+                     "****")));
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "activation_precision",
+                (activation_precision < (sizeof(activation_precision_str) / sizeof(activation_precision_str[0])) ?
+                     activation_precision_str[activation_precision] :
+                     "****")));
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "activation_format",
+                (activation_format < (sizeof(activation_format_str) / sizeof(activation_format_str[0])) ?
+                     activation_format_str[activation_format] :
+                     "****")));
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "scale_mode",
+                (scale_mode < (sizeof(ifm_scale_mode_str) / sizeof(ifm_scale_mode_str[0])) ?
+                     ifm_scale_mode_str[scale_mode] :
+                     "****")));
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "round_mode",
+                (round_mode < (sizeof(round_mode_str) / sizeof(round_mode_str[0])) ? round_mode_str[round_mode] :
+                                                                                     "****")));
+        }
+#endif
+#endif
+    };
+    // IFM upscale mode
+    struct npu_set_ifm_upscale_t
     {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_OP_STOP);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t mode : 2;    //  IFM upscale mode
+        uint32_t reserved1 : 14;
+#ifdef __cplusplus
+      public:
+        npu_set_ifm_upscale_t(NPU_NAMESPACE::ifm_upscale_mode _mode) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_UPSCALE)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            mode(static_cast<uint8_t>(_mode) & ((1U << 2) - 1)), reserved1(0)
+        {
+        }
+        CONSTEXPR npu_set_ifm_upscale_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_UPSCALE)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), mode(0), reserved1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_UPSCALE) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_UPSCALE);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ifm_upscale_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ifm_upscale_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::ifm_upscale_mode get_mode() const
+        {
+            return static_cast<NPU_NAMESPACE::ifm_upscale_mode>(mode);
+        }
+        CONSTEXPR npu_set_ifm_upscale_t &set_mode(NPU_NAMESPACE::ifm_upscale_mode value)
+        {
+            mode = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "mode",
+                (mode < (sizeof(ifm_upscale_mode_str) / sizeof(ifm_upscale_mode_str[0])) ? ifm_upscale_mode_str[mode] :
+                                                                                           "****")));
+        }
+#endif
+#endif
+    };
+    // IFM zero point
+    struct npu_set_ifm_zero_point_t
     {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_op_stop_t &set_cmd_code(::cmd0 value)
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;     //  control
+        uint32_t zero_point : 16; //  Zero point offset
+#ifdef __cplusplus
+      public:
+        npu_set_ifm_zero_point_t(uint32_t _zero_point) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_ZERO_POINT)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            zero_point(static_cast<uint16_t>(_zero_point) & ((1U << 16) - 1))
+        {
+        }
+        CONSTEXPR npu_set_ifm_zero_point_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_ZERO_POINT)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), zero_point(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_ZERO_POINT) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_ZERO_POINT);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ifm_zero_point_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ifm_zero_point_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_zero_point() const
+        {
+            return static_cast<uint32_t>(zero_point);
+        }
+        CONSTEXPR npu_set_ifm_zero_point_t &set_zero_point(uint32_t value)
+        {
+            zero_point = static_cast<uint16_t>(value) & ((1U << 16) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("zero_point", std::to_string(zero_point)));
+        }
+#endif
+#endif
+    };
+    // IFM Tile 0 and tile 2 width
+    struct npu_set_ifm_width0_m1_t
     {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_mask() const
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;   //  control
+        uint32_t width_m1 : 16; //  IFM Tile 0 and tile 2 width
+#ifdef __cplusplus
+      public:
+        npu_set_ifm_width0_m1_t(uint32_t _width_m1) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_WIDTH0_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            width_m1(static_cast<uint16_t>(_width_m1) & ((1U << 16) - 1))
+        {
+        }
+        CONSTEXPR npu_set_ifm_width0_m1_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_WIDTH0_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), width_m1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_WIDTH0_M1) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_WIDTH0_M1);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ifm_width0_m1_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ifm_width0_m1_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_width_m1() const
+        {
+            return static_cast<uint32_t>(width_m1);
+        }
+        CONSTEXPR npu_set_ifm_width0_m1_t &set_width_m1(uint32_t value)
+        {
+            width_m1 = static_cast<uint16_t>(value) & ((1U << 16) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("width_m1", std::to_string(width_m1)));
+        }
+#endif
+#endif
+    };
+    // IFM Tile 0 height
+    struct npu_set_ifm_height0_m1_t
     {
-        return static_cast<uint32_t>(mask);
-    }
-    CONSTEXPR npu_op_stop_t &set_mask(uint32_t value)
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;    //  control
+        uint32_t height_m1 : 16; //  IFM Tile 0 height
+#ifdef __cplusplus
+      public:
+        npu_set_ifm_height0_m1_t(uint32_t _height_m1) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_HEIGHT0_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            height_m1(static_cast<uint16_t>(_height_m1) & ((1U << 16) - 1))
+        {
+        }
+        CONSTEXPR npu_set_ifm_height0_m1_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_HEIGHT0_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), height_m1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_HEIGHT0_M1) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_HEIGHT0_M1);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ifm_height0_m1_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ifm_height0_m1_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_height_m1() const
+        {
+            return static_cast<uint32_t>(height_m1);
+        }
+        CONSTEXPR npu_set_ifm_height0_m1_t &set_height_m1(uint32_t value)
+        {
+            height_m1 = static_cast<uint16_t>(value) & ((1U << 16) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("height_m1", std::to_string(height_m1)));
+        }
+#endif
+#endif
+    };
+    // IFM Tile 1 height
+    struct npu_set_ifm_height1_m1_t
     {
-        mask = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Raise IRQ to the host and logically OR the mask into the status register upper 16 bits (see the status register)
-struct npu_op_irq_t
-{
-    uint32_t cmd_code : 10;     // NPU_OP_IRQ
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t mask : 16;
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;    //  control
+        uint32_t height_m1 : 16; //  IFM Tile 1 height
+#ifdef __cplusplus
+      public:
+        npu_set_ifm_height1_m1_t(uint32_t _height_m1) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_HEIGHT1_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            height_m1(static_cast<uint16_t>(_height_m1) & ((1U << 16) - 1))
+        {
+        }
+        CONSTEXPR npu_set_ifm_height1_m1_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_HEIGHT1_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), height_m1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_HEIGHT1_M1) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_HEIGHT1_M1);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ifm_height1_m1_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ifm_height1_m1_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_height_m1() const
+        {
+            return static_cast<uint32_t>(height_m1);
+        }
+        CONSTEXPR npu_set_ifm_height1_m1_t &set_height_m1(uint32_t value)
+        {
+            height_m1 = static_cast<uint16_t>(value) & ((1U << 16) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("height_m1", std::to_string(height_m1)));
+        }
+#endif
+#endif
+    };
+    // End of IB0,IB1 buffers
+    struct npu_set_ifm_ib_end_t
     {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_OP_IRQ) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t ib_end : 6;  //  End of IB0,IB1 buffers in the SHRAM in KB units. Multiple of 2
+        uint32_t reserved1 : 10;
+#ifdef __cplusplus
+      public:
+        npu_set_ifm_ib_end_t(uint32_t _ib_end) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_IB_END)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            ib_end(static_cast<uint8_t>(_ib_end) & ((1U << 6) - 1)), reserved1(0)
+        {
+        }
+        CONSTEXPR npu_set_ifm_ib_end_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_IB_END)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), ib_end(0), reserved1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_IB_END) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_IB_END);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ifm_ib_end_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ifm_ib_end_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_ib_end() const
+        {
+            return static_cast<uint32_t>(ib_end);
+        }
+        CONSTEXPR npu_set_ifm_ib_end_t &set_ib_end(uint32_t value)
+        {
+            ib_end = static_cast<uint8_t>(value) & ((1U << 6) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("ib_end", std::to_string(ib_end)));
+        }
+#endif
+#endif
+    };
+    // Index n for IFM access
+    struct npu_set_ifm_region_t
     {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_OP_IRQ);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t region : 3;  //  Region number n
+        uint32_t reserved1 : 12;
+        uint32_t custom_dma_cs : 1; //  Custom DMA select
+#ifdef __cplusplus
+      public:
+        npu_set_ifm_region_t(uint32_t _region, NPU_NAMESPACE::custom_dma_cs _custom_dma_cs) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_REGION)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            region(static_cast<uint8_t>(_region) & ((1U << 3) - 1)), reserved1(0),
+            custom_dma_cs(static_cast<uint8_t>(_custom_dma_cs) & ((1U << 1) - 1))
+        {
+        }
+        CONSTEXPR npu_set_ifm_region_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_REGION)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), region(0), reserved1(0), custom_dma_cs(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_REGION) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_REGION);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ifm_region_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ifm_region_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_region() const
+        {
+            return static_cast<uint32_t>(region);
+        }
+        CONSTEXPR npu_set_ifm_region_t &set_region(uint32_t value)
+        {
+            region = static_cast<uint8_t>(value) & ((1U << 3) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::custom_dma_cs get_custom_dma_cs() const
+        {
+            return static_cast<NPU_NAMESPACE::custom_dma_cs>(custom_dma_cs);
+        }
+        CONSTEXPR npu_set_ifm_region_t &set_custom_dma_cs(NPU_NAMESPACE::custom_dma_cs value)
+        {
+            custom_dma_cs = static_cast<uint8_t>(value) & ((1U << 1) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("region", std::to_string(region)));
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "custom_dma_cs",
+                (custom_dma_cs < (sizeof(custom_dma_cs_str) / sizeof(custom_dma_cs_str[0])) ?
+                     custom_dma_cs_str[custom_dma_cs] :
+                     "****")));
+        }
+#endif
+#endif
+    };
+    // Output feature map width
+    struct npu_set_ofm_width_m1_t
     {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_op_irq_t &set_cmd_code(::cmd0 value)
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;   //  control
+        uint32_t width_m1 : 16; //  Output feature map width
+#ifdef __cplusplus
+      public:
+        npu_set_ofm_width_m1_t(uint32_t _width_m1) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_WIDTH_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            width_m1(static_cast<uint16_t>(_width_m1) & ((1U << 16) - 1))
+        {
+        }
+        CONSTEXPR npu_set_ofm_width_m1_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_WIDTH_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), width_m1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_WIDTH_M1) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_WIDTH_M1);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ofm_width_m1_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ofm_width_m1_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_width_m1() const
+        {
+            return static_cast<uint32_t>(width_m1);
+        }
+        CONSTEXPR npu_set_ofm_width_m1_t &set_width_m1(uint32_t value)
+        {
+            width_m1 = static_cast<uint16_t>(value) & ((1U << 16) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("width_m1", std::to_string(width_m1)));
+        }
+#endif
+#endif
+    };
+    // Output feature map height
+    struct npu_set_ofm_height_m1_t
     {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_mask() const
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;    //  control
+        uint32_t height_m1 : 16; //  Output feature map height
+#ifdef __cplusplus
+      public:
+        npu_set_ofm_height_m1_t(uint32_t _height_m1) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_HEIGHT_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            height_m1(static_cast<uint16_t>(_height_m1) & ((1U << 16) - 1))
+        {
+        }
+        CONSTEXPR npu_set_ofm_height_m1_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_HEIGHT_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), height_m1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_HEIGHT_M1) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_HEIGHT_M1);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ofm_height_m1_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ofm_height_m1_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_height_m1() const
+        {
+            return static_cast<uint32_t>(height_m1);
+        }
+        CONSTEXPR npu_set_ofm_height_m1_t &set_height_m1(uint32_t value)
+        {
+            height_m1 = static_cast<uint16_t>(value) & ((1U << 16) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("height_m1", std::to_string(height_m1)));
+        }
+#endif
+#endif
+    };
+    // Output feature map depth
+    struct npu_set_ofm_depth_m1_t
     {
-        return static_cast<uint32_t>(mask);
-    }
-    CONSTEXPR npu_op_irq_t &set_mask(uint32_t value)
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;   //  control
+        uint32_t depth_m1 : 16; //  Output feature map depth
+#ifdef __cplusplus
+      public:
+        npu_set_ofm_depth_m1_t(uint32_t _depth_m1) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_DEPTH_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            depth_m1(static_cast<uint16_t>(_depth_m1) & ((1U << 16) - 1))
+        {
+        }
+        CONSTEXPR npu_set_ofm_depth_m1_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_DEPTH_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), depth_m1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_DEPTH_M1) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_DEPTH_M1);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ofm_depth_m1_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ofm_depth_m1_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_depth_m1() const
+        {
+            return static_cast<uint32_t>(depth_m1);
+        }
+        CONSTEXPR npu_set_ofm_depth_m1_t &set_depth_m1(uint32_t value)
+        {
+            depth_m1 = static_cast<uint16_t>(value) & ((1U << 16) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("depth_m1", std::to_string(depth_m1)));
+        }
+#endif
+#endif
+    };
+    // OFM Precision
+    struct npu_set_ofm_precision_t
     {
-        mask = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Start stripe with full convolution or deconvolution
-struct npu_op_conv_t
-{
-    uint32_t cmd_code : 10;     // NPU_OP_CONV
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t reserved0 : 16;
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;              //  control
+        uint32_t activation_type : 1;      //  OFM type
+        uint32_t activation_precision : 2; //  OFM precision
+        uint32_t reserved1 : 3;
+        uint32_t activation_format : 2; //  OFM format
+        uint32_t scale_mode : 1;        //  OFM scale mode
+        uint32_t reserved2 : 5;
+        uint32_t round_mode : 2; //  OFM round mode
+#ifdef __cplusplus
+      public:
+        npu_set_ofm_precision_t(NPU_NAMESPACE::activation_type _activation_type,
+                                NPU_NAMESPACE::activation_precision _activation_precision,
+                                NPU_NAMESPACE::activation_format _activation_format,
+                                NPU_NAMESPACE::ofm_scale_mode _scale_mode,
+                                NPU_NAMESPACE::round_mode _round_mode) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_PRECISION)),
+            reserved0(0), control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            activation_type(static_cast<uint8_t>(_activation_type) & ((1U << 1) - 1)),
+            activation_precision(static_cast<uint8_t>(_activation_precision) & ((1U << 2) - 1)), reserved1(0),
+            activation_format(static_cast<uint8_t>(_activation_format) & ((1U << 2) - 1)),
+            scale_mode(static_cast<uint8_t>(_scale_mode) & ((1U << 1) - 1)), reserved2(0),
+            round_mode(static_cast<uint8_t>(_round_mode) & ((1U << 2) - 1))
+        {
+        }
+        CONSTEXPR npu_set_ofm_precision_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_PRECISION)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), activation_type(0),
+            activation_precision(0), reserved1(0), activation_format(0), scale_mode(0), reserved2(0), round_mode(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_PRECISION) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_PRECISION);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ofm_precision_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ofm_precision_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::activation_type get_activation_type() const
+        {
+            return static_cast<NPU_NAMESPACE::activation_type>(activation_type);
+        }
+        CONSTEXPR npu_set_ofm_precision_t &set_activation_type(NPU_NAMESPACE::activation_type value)
+        {
+            activation_type = static_cast<uint8_t>(value) & ((1U << 1) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::activation_precision get_activation_precision() const
+        {
+            return static_cast<NPU_NAMESPACE::activation_precision>(activation_precision);
+        }
+        CONSTEXPR npu_set_ofm_precision_t &set_activation_precision(NPU_NAMESPACE::activation_precision value)
+        {
+            activation_precision = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::activation_format get_activation_format() const
+        {
+            return static_cast<NPU_NAMESPACE::activation_format>(activation_format);
+        }
+        CONSTEXPR npu_set_ofm_precision_t &set_activation_format(NPU_NAMESPACE::activation_format value)
+        {
+            activation_format = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::ofm_scale_mode get_scale_mode() const
+        {
+            return static_cast<NPU_NAMESPACE::ofm_scale_mode>(scale_mode);
+        }
+        CONSTEXPR npu_set_ofm_precision_t &set_scale_mode(NPU_NAMESPACE::ofm_scale_mode value)
+        {
+            scale_mode = static_cast<uint8_t>(value) & ((1U << 1) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::round_mode get_round_mode() const
+        {
+            return static_cast<NPU_NAMESPACE::round_mode>(round_mode);
+        }
+        CONSTEXPR npu_set_ofm_precision_t &set_round_mode(NPU_NAMESPACE::round_mode value)
+        {
+            round_mode = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "activation_type",
+                (activation_type < (sizeof(activation_type_str) / sizeof(activation_type_str[0])) ?
+                     activation_type_str[activation_type] :
+                     "****")));
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "activation_precision",
+                (activation_precision < (sizeof(activation_precision_str) / sizeof(activation_precision_str[0])) ?
+                     activation_precision_str[activation_precision] :
+                     "****")));
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "activation_format",
+                (activation_format < (sizeof(activation_format_str) / sizeof(activation_format_str[0])) ?
+                     activation_format_str[activation_format] :
+                     "****")));
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "scale_mode",
+                (scale_mode < (sizeof(ofm_scale_mode_str) / sizeof(ofm_scale_mode_str[0])) ?
+                     ofm_scale_mode_str[scale_mode] :
+                     "****")));
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "round_mode",
+                (round_mode < (sizeof(round_mode_str) / sizeof(round_mode_str[0])) ? round_mode_str[round_mode] :
+                                                                                     "****")));
+        }
+#endif
+#endif
+    };
+    // OFM block width
+    struct npu_set_ofm_blk_width_m1_t
     {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_OP_CONV) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;  //  control
+        uint32_t width_m1 : 6; //  OFM block width
+        uint32_t reserved1 : 10;
+#ifdef __cplusplus
+      public:
+        npu_set_ofm_blk_width_m1_t(uint32_t _width_m1) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_BLK_WIDTH_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            width_m1(static_cast<uint8_t>(_width_m1) & ((1U << 6) - 1)), reserved1(0)
+        {
+        }
+        CONSTEXPR npu_set_ofm_blk_width_m1_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_BLK_WIDTH_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), width_m1(0), reserved1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_BLK_WIDTH_M1) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_BLK_WIDTH_M1);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ofm_blk_width_m1_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ofm_blk_width_m1_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_width_m1() const
+        {
+            return static_cast<uint32_t>(width_m1);
+        }
+        CONSTEXPR npu_set_ofm_blk_width_m1_t &set_width_m1(uint32_t value)
+        {
+            width_m1 = static_cast<uint8_t>(value) & ((1U << 6) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("width_m1", std::to_string(width_m1)));
+        }
+#endif
+#endif
+    };
+    // OFM block height
+    struct npu_set_ofm_blk_height_m1_t
     {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_OP_CONV);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
-    {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_op_conv_t &set_cmd_code(::cmd0 value)
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;   //  control
+        uint32_t height_m1 : 5; //  OFM block height
+        uint32_t reserved1 : 11;
+#ifdef __cplusplus
+      public:
+        npu_set_ofm_blk_height_m1_t(uint32_t _height_m1) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_BLK_HEIGHT_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            height_m1(static_cast<uint8_t>(_height_m1) & ((1U << 5) - 1)), reserved1(0)
+        {
+        }
+        CONSTEXPR npu_set_ofm_blk_height_m1_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_BLK_HEIGHT_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), height_m1(0), reserved1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_BLK_HEIGHT_M1) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_BLK_HEIGHT_M1);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ofm_blk_height_m1_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ofm_blk_height_m1_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_height_m1() const
+        {
+            return static_cast<uint32_t>(height_m1);
+        }
+        CONSTEXPR npu_set_ofm_blk_height_m1_t &set_height_m1(uint32_t value)
+        {
+            height_m1 = static_cast<uint8_t>(value) & ((1U << 5) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("height_m1", std::to_string(height_m1)));
+        }
+#endif
+#endif
+    };
+    // OFM block depth
+    struct npu_set_ofm_blk_depth_m1_t
     {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Start stripe width depth-wise convolution or deconvolution operation
-struct npu_op_depthwise_t
-{
-    uint32_t cmd_code : 10;     // NPU_OP_DEPTHWISE
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t reserved0 : 16;
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;  //  control
+        uint32_t depth_m1 : 7; //  OFM block depth
+        uint32_t reserved1 : 9;
+#ifdef __cplusplus
+      public:
+        npu_set_ofm_blk_depth_m1_t(uint32_t _depth_m1) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_BLK_DEPTH_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            depth_m1(static_cast<uint8_t>(_depth_m1) & ((1U << 7) - 1)), reserved1(0)
+        {
+        }
+        CONSTEXPR npu_set_ofm_blk_depth_m1_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_BLK_DEPTH_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), depth_m1(0), reserved1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_BLK_DEPTH_M1) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_BLK_DEPTH_M1);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ofm_blk_depth_m1_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ofm_blk_depth_m1_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_depth_m1() const
+        {
+            return static_cast<uint32_t>(depth_m1);
+        }
+        CONSTEXPR npu_set_ofm_blk_depth_m1_t &set_depth_m1(uint32_t value)
+        {
+            depth_m1 = static_cast<uint8_t>(value) & ((1U << 7) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("depth_m1", std::to_string(depth_m1)));
+        }
+#endif
+#endif
+    };
+    // OFM zero point
+    struct npu_set_ofm_zero_point_t
     {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_OP_DEPTHWISE) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;     //  control
+        uint32_t zero_point : 16; //  Zero point offset
+#ifdef __cplusplus
+      public:
+        npu_set_ofm_zero_point_t(uint32_t _zero_point) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_ZERO_POINT)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            zero_point(static_cast<uint16_t>(_zero_point) & ((1U << 16) - 1))
+        {
+        }
+        CONSTEXPR npu_set_ofm_zero_point_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_ZERO_POINT)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), zero_point(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_ZERO_POINT) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_ZERO_POINT);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ofm_zero_point_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ofm_zero_point_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_zero_point() const
+        {
+            return static_cast<uint32_t>(zero_point);
+        }
+        CONSTEXPR npu_set_ofm_zero_point_t &set_zero_point(uint32_t value)
+        {
+            zero_point = static_cast<uint16_t>(value) & ((1U << 16) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("zero_point", std::to_string(zero_point)));
+        }
+#endif
+#endif
+    };
+    // OFM Tile 0 and tile 2 width
+    struct npu_set_ofm_width0_m1_t
     {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_OP_DEPTHWISE);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;   //  control
+        uint32_t width_m1 : 16; //  OFM Tile 0 and tile 2 width
+#ifdef __cplusplus
+      public:
+        npu_set_ofm_width0_m1_t(uint32_t _width_m1) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_WIDTH0_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            width_m1(static_cast<uint16_t>(_width_m1) & ((1U << 16) - 1))
+        {
+        }
+        CONSTEXPR npu_set_ofm_width0_m1_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_WIDTH0_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), width_m1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_WIDTH0_M1) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_WIDTH0_M1);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ofm_width0_m1_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ofm_width0_m1_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_width_m1() const
+        {
+            return static_cast<uint32_t>(width_m1);
+        }
+        CONSTEXPR npu_set_ofm_width0_m1_t &set_width_m1(uint32_t value)
+        {
+            width_m1 = static_cast<uint16_t>(value) & ((1U << 16) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("width_m1", std::to_string(width_m1)));
+        }
+#endif
+#endif
+    };
+    // OFM Tile 0 height
+    struct npu_set_ofm_height0_m1_t
     {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_op_depthwise_t &set_cmd_code(::cmd0 value)
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;    //  control
+        uint32_t height_m1 : 16; //  OFM Tile 0 height
+#ifdef __cplusplus
+      public:
+        npu_set_ofm_height0_m1_t(uint32_t _height_m1) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_HEIGHT0_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            height_m1(static_cast<uint16_t>(_height_m1) & ((1U << 16) - 1))
+        {
+        }
+        CONSTEXPR npu_set_ofm_height0_m1_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_HEIGHT0_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), height_m1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_HEIGHT0_M1) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_HEIGHT0_M1);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ofm_height0_m1_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ofm_height0_m1_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_height_m1() const
+        {
+            return static_cast<uint32_t>(height_m1);
+        }
+        CONSTEXPR npu_set_ofm_height0_m1_t &set_height_m1(uint32_t value)
+        {
+            height_m1 = static_cast<uint16_t>(value) & ((1U << 16) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("height_m1", std::to_string(height_m1)));
+        }
+#endif
+#endif
+    };
+    // OFM Tile 1 height
+    struct npu_set_ofm_height1_m1_t
     {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Start stripe with pooling operation
-struct npu_op_pool_t
-{
-    uint32_t cmd_code : 10;     // NPU_OP_POOL
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t mode : 16;
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;    //  control
+        uint32_t height_m1 : 16; //  OFM Tile 1 height
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
+      public:
+        npu_set_ofm_height1_m1_t(uint32_t _height_m1) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_HEIGHT1_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            height_m1(static_cast<uint16_t>(_height_m1) & ((1U << 16) - 1))
+        {
+        }
+        CONSTEXPR npu_set_ofm_height1_m1_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_HEIGHT1_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), height_m1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_HEIGHT1_M1) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_HEIGHT1_M1);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ofm_height1_m1_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ofm_height1_m1_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_height_m1() const
+        {
+            return static_cast<uint32_t>(height_m1);
+        }
+        CONSTEXPR npu_set_ofm_height1_m1_t &set_height_m1(uint32_t value)
+        {
+            height_m1 = static_cast<uint16_t>(value) & ((1U << 16) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("height_m1", std::to_string(height_m1)));
+        }
+#endif
+#endif
+    };
+    // Index n for OFM access
+    struct npu_set_ofm_region_t
     {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_OP_POOL) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t region : 3;  //  Index n for OFM access
+        uint32_t reserved1 : 12;
+        uint32_t custom_dma_cs : 1; //  Custom DMA select
+#ifdef __cplusplus
+      public:
+        npu_set_ofm_region_t(uint32_t _region, NPU_NAMESPACE::custom_dma_cs _custom_dma_cs) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_REGION)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            region(static_cast<uint8_t>(_region) & ((1U << 3) - 1)), reserved1(0),
+            custom_dma_cs(static_cast<uint8_t>(_custom_dma_cs) & ((1U << 1) - 1))
+        {
+        }
+        CONSTEXPR npu_set_ofm_region_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_REGION)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), region(0), reserved1(0), custom_dma_cs(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_REGION) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_REGION);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ofm_region_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ofm_region_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_region() const
+        {
+            return static_cast<uint32_t>(region);
+        }
+        CONSTEXPR npu_set_ofm_region_t &set_region(uint32_t value)
+        {
+            region = static_cast<uint8_t>(value) & ((1U << 3) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::custom_dma_cs get_custom_dma_cs() const
+        {
+            return static_cast<NPU_NAMESPACE::custom_dma_cs>(custom_dma_cs);
+        }
+        CONSTEXPR npu_set_ofm_region_t &set_custom_dma_cs(NPU_NAMESPACE::custom_dma_cs value)
+        {
+            custom_dma_cs = static_cast<uint8_t>(value) & ((1U << 1) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("region", std::to_string(region)));
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "custom_dma_cs",
+                (custom_dma_cs < (sizeof(custom_dma_cs_str) / sizeof(custom_dma_cs_str[0])) ?
+                     custom_dma_cs_str[custom_dma_cs] :
+                     "****")));
+        }
+#endif
+#endif
+    };
+    // Kernel width
+    struct npu_set_kernel_width_m1_t
     {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_OP_POOL);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;   //  control
+        uint32_t width_m1 : 16; //  Kernel width
+#ifdef __cplusplus
+      public:
+        npu_set_kernel_width_m1_t(uint32_t _width_m1) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_KERNEL_WIDTH_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            width_m1(static_cast<uint16_t>(_width_m1) & ((1U << 16) - 1))
+        {
+        }
+        CONSTEXPR npu_set_kernel_width_m1_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_KERNEL_WIDTH_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), width_m1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_KERNEL_WIDTH_M1) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_KERNEL_WIDTH_M1);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_kernel_width_m1_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_kernel_width_m1_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_width_m1() const
+        {
+            return static_cast<uint32_t>(width_m1);
+        }
+        CONSTEXPR npu_set_kernel_width_m1_t &set_width_m1(uint32_t value)
+        {
+            width_m1 = static_cast<uint16_t>(value) & ((1U << 16) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("width_m1", std::to_string(width_m1)));
+        }
+#endif
+#endif
+    };
+    // Kernel height
+    struct npu_set_kernel_height_m1_t
     {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_op_pool_t &set_cmd_code(::cmd0 value)
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;    //  control
+        uint32_t height_m1 : 16; //  Kernel height
+#ifdef __cplusplus
+      public:
+        npu_set_kernel_height_m1_t(uint32_t _height_m1) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_KERNEL_HEIGHT_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            height_m1(static_cast<uint16_t>(_height_m1) & ((1U << 16) - 1))
+        {
+        }
+        CONSTEXPR npu_set_kernel_height_m1_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_KERNEL_HEIGHT_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), height_m1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_KERNEL_HEIGHT_M1) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_KERNEL_HEIGHT_M1);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_kernel_height_m1_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_kernel_height_m1_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_height_m1() const
+        {
+            return static_cast<uint32_t>(height_m1);
+        }
+        CONSTEXPR npu_set_kernel_height_m1_t &set_height_m1(uint32_t value)
+        {
+            height_m1 = static_cast<uint16_t>(value) & ((1U << 16) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("height_m1", std::to_string(height_m1)));
+        }
+#endif
+#endif
+    };
+    // Kernel stride
+    struct npu_set_kernel_stride_t
     {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR ::pooling_mode get_mode() const
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;       //  control
+        uint32_t stride_x_lsb : 1;  //  Stride x LSB. (kernel_x_stride - 1)[0]
+        uint32_t stride_y_lsb : 1;  //  Stride y LSB. (kernel_y_stride - 1)[0]
+        uint32_t weight_order : 1;  //  Weight ordering mode
+        uint32_t dilation_x : 1;    //  Kernel x dilation
+        uint32_t dilation_y : 1;    //  Kernel y dilation
+        uint32_t decomposition : 1; //  Kernel decomposition
+        uint32_t stride_x_msb : 1;  //  Stride x MSB. (kernel_x_stride - 1) >> 1
+        uint32_t reserved1 : 2;
+        uint32_t stride_y_msb : 1; //  Stride y MSB. (kernel_y_stride - 1) >> 1
+        uint32_t reserved2 : 6;
+#ifdef __cplusplus
+      public:
+        npu_set_kernel_stride_t(uint32_t _stride_x_lsb,
+                                uint32_t _stride_y_lsb,
+                                NPU_NAMESPACE::weight_order _weight_order,
+                                NPU_NAMESPACE::kernel_dilation _dilation_x,
+                                NPU_NAMESPACE::kernel_dilation _dilation_y,
+                                NPU_NAMESPACE::kernel_decomposition _decomposition,
+                                uint32_t _stride_x_msb,
+                                uint32_t _stride_y_msb) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_KERNEL_STRIDE)),
+            reserved0(0), control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            stride_x_lsb(static_cast<uint8_t>(_stride_x_lsb) & ((1U << 1) - 1)),
+            stride_y_lsb(static_cast<uint8_t>(_stride_y_lsb) & ((1U << 1) - 1)),
+            weight_order(static_cast<uint8_t>(_weight_order) & ((1U << 1) - 1)),
+            dilation_x(static_cast<uint8_t>(_dilation_x) & ((1U << 1) - 1)),
+            dilation_y(static_cast<uint8_t>(_dilation_y) & ((1U << 1) - 1)),
+            decomposition(static_cast<uint8_t>(_decomposition) & ((1U << 1) - 1)),
+            stride_x_msb(static_cast<uint8_t>(_stride_x_msb) & ((1U << 1) - 1)), reserved1(0),
+            stride_y_msb(static_cast<uint8_t>(_stride_y_msb) & ((1U << 1) - 1)), reserved2(0)
+        {
+        }
+        CONSTEXPR npu_set_kernel_stride_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_KERNEL_STRIDE)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), stride_x_lsb(0), stride_y_lsb(0),
+            weight_order(0), dilation_x(0), dilation_y(0), decomposition(0), stride_x_msb(0), reserved1(0),
+            stride_y_msb(0), reserved2(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_KERNEL_STRIDE) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_KERNEL_STRIDE);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_kernel_stride_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_kernel_stride_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_stride_x_lsb() const
+        {
+            return static_cast<uint32_t>(stride_x_lsb);
+        }
+        CONSTEXPR npu_set_kernel_stride_t &set_stride_x_lsb(uint32_t value)
+        {
+            stride_x_lsb = static_cast<uint8_t>(value) & ((1U << 1) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_stride_y_lsb() const
+        {
+            return static_cast<uint32_t>(stride_y_lsb);
+        }
+        CONSTEXPR npu_set_kernel_stride_t &set_stride_y_lsb(uint32_t value)
+        {
+            stride_y_lsb = static_cast<uint8_t>(value) & ((1U << 1) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::weight_order get_weight_order() const
+        {
+            return static_cast<NPU_NAMESPACE::weight_order>(weight_order);
+        }
+        CONSTEXPR npu_set_kernel_stride_t &set_weight_order(NPU_NAMESPACE::weight_order value)
+        {
+            weight_order = static_cast<uint8_t>(value) & ((1U << 1) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::kernel_dilation get_dilation_x() const
+        {
+            return static_cast<NPU_NAMESPACE::kernel_dilation>(dilation_x);
+        }
+        CONSTEXPR npu_set_kernel_stride_t &set_dilation_x(NPU_NAMESPACE::kernel_dilation value)
+        {
+            dilation_x = static_cast<uint8_t>(value) & ((1U << 1) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::kernel_dilation get_dilation_y() const
+        {
+            return static_cast<NPU_NAMESPACE::kernel_dilation>(dilation_y);
+        }
+        CONSTEXPR npu_set_kernel_stride_t &set_dilation_y(NPU_NAMESPACE::kernel_dilation value)
+        {
+            dilation_y = static_cast<uint8_t>(value) & ((1U << 1) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::kernel_decomposition get_decomposition() const
+        {
+            return static_cast<NPU_NAMESPACE::kernel_decomposition>(decomposition);
+        }
+        CONSTEXPR npu_set_kernel_stride_t &set_decomposition(NPU_NAMESPACE::kernel_decomposition value)
+        {
+            decomposition = static_cast<uint8_t>(value) & ((1U << 1) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_stride_x_msb() const
+        {
+            return static_cast<uint32_t>(stride_x_msb);
+        }
+        CONSTEXPR npu_set_kernel_stride_t &set_stride_x_msb(uint32_t value)
+        {
+            stride_x_msb = static_cast<uint8_t>(value) & ((1U << 1) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_stride_y_msb() const
+        {
+            return static_cast<uint32_t>(stride_y_msb);
+        }
+        CONSTEXPR npu_set_kernel_stride_t &set_stride_y_msb(uint32_t value)
+        {
+            stride_y_msb = static_cast<uint8_t>(value) & ((1U << 1) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("stride_x_lsb", std::to_string(stride_x_lsb)));
+            fields.push_back(std::make_pair<std::string, std::string>("stride_y_lsb", std::to_string(stride_y_lsb)));
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "weight_order",
+                (weight_order < (sizeof(weight_order_str) / sizeof(weight_order_str[0])) ?
+                     weight_order_str[weight_order] :
+                     "****")));
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "dilation_x",
+                (dilation_x < (sizeof(kernel_dilation_str) / sizeof(kernel_dilation_str[0])) ?
+                     kernel_dilation_str[dilation_x] :
+                     "****")));
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "dilation_y",
+                (dilation_y < (sizeof(kernel_dilation_str) / sizeof(kernel_dilation_str[0])) ?
+                     kernel_dilation_str[dilation_y] :
+                     "****")));
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "decomposition",
+                (decomposition < (sizeof(kernel_decomposition_str) / sizeof(kernel_decomposition_str[0])) ?
+                     kernel_decomposition_str[decomposition] :
+                     "****")));
+            fields.push_back(std::make_pair<std::string, std::string>("stride_x_msb", std::to_string(stride_x_msb)));
+            fields.push_back(std::make_pair<std::string, std::string>("stride_y_msb", std::to_string(stride_y_msb)));
+        }
+#endif
+#endif
+    };
+    // Accumulator format
+    struct npu_set_acc_format_t
     {
-        return static_cast<::pooling_mode>(mode);
-    }
-    CONSTEXPR npu_op_pool_t &set_mode(::pooling_mode value)
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;    //  control
+        uint32_t acc_format : 2; //  Accumulator format
+        uint32_t reserved1 : 14;
+#ifdef __cplusplus
+      public:
+        npu_set_acc_format_t(NPU_NAMESPACE::acc_format _acc_format) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_ACC_FORMAT)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            acc_format(static_cast<uint8_t>(_acc_format) & ((1U << 2) - 1)), reserved1(0)
+        {
+        }
+        CONSTEXPR npu_set_acc_format_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_ACC_FORMAT)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), acc_format(0), reserved1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_ACC_FORMAT) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_ACC_FORMAT);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_acc_format_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_acc_format_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::acc_format get_acc_format() const
+        {
+            return static_cast<NPU_NAMESPACE::acc_format>(acc_format);
+        }
+        CONSTEXPR npu_set_acc_format_t &set_acc_format(NPU_NAMESPACE::acc_format value)
+        {
+            acc_format = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "acc_format",
+                (acc_format < (sizeof(acc_format_str) / sizeof(acc_format_str[0])) ? acc_format_str[acc_format] :
+                                                                                     "****")));
+        }
+#endif
+#endif
+    };
+    // Activation function and clip range
+    struct npu_set_activation_t
     {
-        mode = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Start stripe with pointwise operation
-struct npu_op_elementwise_t
-{
-    uint32_t cmd_code : 10;     // NPU_OP_ELEMENTWISE
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t mode : 16;
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;             //  control
+        uint32_t activation_function : 5; //  Activation function (before table lookup)
+        uint32_t reserved1 : 7;
+        uint32_t activation_clip_range : 3; //  Activation clip range. This must be set to 0 if table lookup is not used
+        uint32_t reserved2 : 1;
+#ifdef __cplusplus
+      public:
+        npu_set_activation_t(NPU_NAMESPACE::activation_function _activation_function,
+                             NPU_NAMESPACE::activation_clip_range _activation_clip_range) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_ACTIVATION)),
+            reserved0(0), control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            activation_function(static_cast<uint8_t>(_activation_function) & ((1U << 5) - 1)), reserved1(0),
+            activation_clip_range(static_cast<uint8_t>(_activation_clip_range) & ((1U << 3) - 1)), reserved2(0)
+        {
+        }
+        CONSTEXPR npu_set_activation_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_ACTIVATION)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), activation_function(0), reserved1(0),
+            activation_clip_range(0), reserved2(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_ACTIVATION) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_ACTIVATION);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_activation_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_activation_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::activation_function get_activation_function() const
+        {
+            return static_cast<NPU_NAMESPACE::activation_function>(activation_function);
+        }
+        CONSTEXPR npu_set_activation_t &set_activation_function(NPU_NAMESPACE::activation_function value)
+        {
+            activation_function = static_cast<uint8_t>(value) & ((1U << 5) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::activation_clip_range get_activation_clip_range() const
+        {
+            return static_cast<NPU_NAMESPACE::activation_clip_range>(activation_clip_range);
+        }
+        CONSTEXPR npu_set_activation_t &set_activation_clip_range(NPU_NAMESPACE::activation_clip_range value)
+        {
+            activation_clip_range = static_cast<uint8_t>(value) & ((1U << 3) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "activation_function",
+                (activation_function < (sizeof(activation_function_str) / sizeof(activation_function_str[0])) ?
+                     activation_function_str[activation_function] :
+                     "****")));
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "activation_clip_range",
+                (activation_clip_range < (sizeof(activation_clip_range_str) / sizeof(activation_clip_range_str[0])) ?
+                     activation_clip_range_str[activation_clip_range] :
+                     "****")));
+        }
+#endif
+#endif
+    };
+    // Lower bound clip
+    struct npu_set_activation_min_t
     {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_OP_ELEMENTWISE) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;        //  control
+        uint32_t clip_boundary : 16; //  Clip boundary for OFM activations
+#ifdef __cplusplus
+      public:
+        npu_set_activation_min_t(uint32_t _clip_boundary) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_ACTIVATION_MIN)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            clip_boundary(static_cast<uint16_t>(_clip_boundary) & ((1U << 16) - 1))
+        {
+        }
+        CONSTEXPR npu_set_activation_min_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_ACTIVATION_MIN)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), clip_boundary(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_ACTIVATION_MIN) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_ACTIVATION_MIN);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_activation_min_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_activation_min_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_clip_boundary() const
+        {
+            return static_cast<uint32_t>(clip_boundary);
+        }
+        CONSTEXPR npu_set_activation_min_t &set_clip_boundary(uint32_t value)
+        {
+            clip_boundary = static_cast<uint16_t>(value) & ((1U << 16) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("clip_boundary", std::to_string(clip_boundary)));
+        }
+#endif
+#endif
+    };
+    // Upper bound clip
+    struct npu_set_activation_max_t
     {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_OP_ELEMENTWISE);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;        //  control
+        uint32_t clip_boundary : 16; //  Clip boundary for OFM activations
+#ifdef __cplusplus
+      public:
+        npu_set_activation_max_t(uint32_t _clip_boundary) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_ACTIVATION_MAX)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            clip_boundary(static_cast<uint16_t>(_clip_boundary) & ((1U << 16) - 1))
+        {
+        }
+        CONSTEXPR npu_set_activation_max_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_ACTIVATION_MAX)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), clip_boundary(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_ACTIVATION_MAX) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_ACTIVATION_MAX);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_activation_max_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_activation_max_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_clip_boundary() const
+        {
+            return static_cast<uint32_t>(clip_boundary);
+        }
+        CONSTEXPR npu_set_activation_max_t &set_clip_boundary(uint32_t value)
+        {
+            clip_boundary = static_cast<uint16_t>(value) & ((1U << 16) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("clip_boundary", std::to_string(clip_boundary)));
+        }
+#endif
+#endif
+    };
+    // Index n for weight stream access
+    struct npu_set_weight_region_t
     {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_op_elementwise_t &set_cmd_code(::cmd0 value)
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t region : 3;  //  Index n for weight stream access
+        uint32_t reserved1 : 12;
+        uint32_t custom_dma_cs : 1; //  Custom DMA select
+#ifdef __cplusplus
+      public:
+        npu_set_weight_region_t(uint32_t _region, NPU_NAMESPACE::custom_dma_cs _custom_dma_cs) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_WEIGHT_REGION)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            region(static_cast<uint8_t>(_region) & ((1U << 3) - 1)), reserved1(0),
+            custom_dma_cs(static_cast<uint8_t>(_custom_dma_cs) & ((1U << 1) - 1))
+        {
+        }
+        CONSTEXPR npu_set_weight_region_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_WEIGHT_REGION)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), region(0), reserved1(0), custom_dma_cs(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_WEIGHT_REGION) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_WEIGHT_REGION);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_weight_region_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_weight_region_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_region() const
+        {
+            return static_cast<uint32_t>(region);
+        }
+        CONSTEXPR npu_set_weight_region_t &set_region(uint32_t value)
+        {
+            region = static_cast<uint8_t>(value) & ((1U << 3) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::custom_dma_cs get_custom_dma_cs() const
+        {
+            return static_cast<NPU_NAMESPACE::custom_dma_cs>(custom_dma_cs);
+        }
+        CONSTEXPR npu_set_weight_region_t &set_custom_dma_cs(NPU_NAMESPACE::custom_dma_cs value)
+        {
+            custom_dma_cs = static_cast<uint8_t>(value) & ((1U << 1) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("region", std::to_string(region)));
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "custom_dma_cs",
+                (custom_dma_cs < (sizeof(custom_dma_cs_str) / sizeof(custom_dma_cs_str[0])) ?
+                     custom_dma_cs_str[custom_dma_cs] :
+                     "****")));
+        }
+#endif
+#endif
+    };
+    // Index n for scale stream access
+    struct npu_set_scale_region_t
     {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR ::elementwise_mode get_mode() const
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t region : 3;  //  Index n for scale stream access
+        uint32_t reserved1 : 12;
+        uint32_t custom_dma_cs : 1; //  Custom DMA select
+#ifdef __cplusplus
+      public:
+        npu_set_scale_region_t(uint32_t _region, NPU_NAMESPACE::custom_dma_cs _custom_dma_cs) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_SCALE_REGION)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            region(static_cast<uint8_t>(_region) & ((1U << 3) - 1)), reserved1(0),
+            custom_dma_cs(static_cast<uint8_t>(_custom_dma_cs) & ((1U << 1) - 1))
+        {
+        }
+        CONSTEXPR npu_set_scale_region_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_SCALE_REGION)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), region(0), reserved1(0), custom_dma_cs(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_SCALE_REGION) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_SCALE_REGION);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_scale_region_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_scale_region_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_region() const
+        {
+            return static_cast<uint32_t>(region);
+        }
+        CONSTEXPR npu_set_scale_region_t &set_region(uint32_t value)
+        {
+            region = static_cast<uint8_t>(value) & ((1U << 3) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::custom_dma_cs get_custom_dma_cs() const
+        {
+            return static_cast<NPU_NAMESPACE::custom_dma_cs>(custom_dma_cs);
+        }
+        CONSTEXPR npu_set_scale_region_t &set_custom_dma_cs(NPU_NAMESPACE::custom_dma_cs value)
+        {
+            custom_dma_cs = static_cast<uint8_t>(value) & ((1U << 1) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("region", std::to_string(region)));
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "custom_dma_cs",
+                (custom_dma_cs < (sizeof(custom_dma_cs_str) / sizeof(custom_dma_cs_str[0])) ?
+                     custom_dma_cs_str[custom_dma_cs] :
+                     "****")));
+        }
+#endif
+#endif
+    };
+    // Start of ACC0,ACC1 buffers
+    struct npu_set_ab_start_t
     {
-        return static_cast<::elementwise_mode>(mode);
-    }
-    CONSTEXPR npu_op_elementwise_t &set_mode(::elementwise_mode value)
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;  //  control
+        uint32_t ab_start : 6; //  Start of ACC0,ACC1 buffers in the SHRAM in KB units. Multiple of 2
+        uint32_t reserved1 : 10;
+#ifdef __cplusplus
+      public:
+        npu_set_ab_start_t(uint32_t _ab_start) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_AB_START)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            ab_start(static_cast<uint8_t>(_ab_start) & ((1U << 6) - 1)), reserved1(0)
+        {
+        }
+        CONSTEXPR npu_set_ab_start_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_AB_START)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), ab_start(0), reserved1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_AB_START) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_AB_START);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ab_start_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ab_start_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_ab_start() const
+        {
+            return static_cast<uint32_t>(ab_start);
+        }
+        CONSTEXPR npu_set_ab_start_t &set_ab_start(uint32_t value)
+        {
+            ab_start = static_cast<uint8_t>(value) & ((1U << 6) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("ab_start", std::to_string(ab_start)));
+        }
+#endif
+#endif
+    };
+    // Block number of blocks dependency
+    struct npu_set_blockdep_t
     {
-        mode = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Queue new DMA for the given channel with the given mode. Mode bit 0 specifies the source address type 0=external,
-// 1=internal Mode bit 1 specifies the destination address type 0=external, 1=internal In Ethos-U55 there is only one
-// user channel so channel=0. If the channel is fully in use then the command blocks until a new DMA can start
-struct npu_op_dma_start_t
-{
-    uint32_t cmd_code : 10;     // NPU_OP_DMA_START
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t channel_mode : 16;
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;  //  control
+        uint32_t blockdep : 2; //  Block number of blocks dependency between kernel operations
+        uint32_t reserved1 : 14;
+#ifdef __cplusplus
+      public:
+        npu_set_blockdep_t(uint32_t _blockdep) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_BLOCKDEP)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            blockdep(static_cast<uint8_t>(_blockdep) & ((1U << 2) - 1)), reserved1(0)
+        {
+        }
+        CONSTEXPR npu_set_blockdep_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_BLOCKDEP)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), blockdep(0), reserved1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_BLOCKDEP) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_BLOCKDEP);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_blockdep_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_blockdep_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_blockdep() const
+        {
+            return static_cast<uint32_t>(blockdep);
+        }
+        CONSTEXPR npu_set_blockdep_t &set_blockdep(uint32_t value)
+        {
+            blockdep = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("blockdep", std::to_string(blockdep)));
+        }
+#endif
+#endif
+    };
+    // DMA0 source region
+    struct npu_set_dma0_src_region_t
     {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_OP_DMA_START) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_OP_DMA_START);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR uint32_t get_channel_mode() const
-    {
-        return static_cast<uint32_t>(channel_mode);
-    }
-    CONSTEXPR npu_op_dma_start_t &set_channel_mode(uint32_t value)
-    {
-        channel_mode = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
-    {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_op_dma_start_t &set_cmd_code(::cmd0 value)
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t region : 3;  //  Region number
+        uint32_t reserved1 : 5;
+        uint32_t region_mode : 1; //  Region mode
+        uint32_t stride_mode : 2; //  Stride mode
+        uint32_t reserved2 : 4;
+        uint32_t custom_dma_cs : 1; //  Custom DMA select
+#ifdef __cplusplus
+      public:
+        npu_set_dma0_src_region_t(uint32_t _region,
+                                  NPU_NAMESPACE::dma_region_mode _region_mode,
+                                  NPU_NAMESPACE::dma_stride_mode _stride_mode,
+                                  NPU_NAMESPACE::custom_dma_cs _custom_dma_cs) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_DMA0_SRC_REGION)),
+            reserved0(0), control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            region(static_cast<uint8_t>(_region) & ((1U << 3) - 1)), reserved1(0),
+            region_mode(static_cast<uint8_t>(_region_mode) & ((1U << 1) - 1)),
+            stride_mode(static_cast<uint8_t>(_stride_mode) & ((1U << 2) - 1)), reserved2(0),
+            custom_dma_cs(static_cast<uint8_t>(_custom_dma_cs) & ((1U << 1) - 1))
+        {
+        }
+        CONSTEXPR npu_set_dma0_src_region_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_DMA0_SRC_REGION)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), region(0), reserved1(0), region_mode(0),
+            stride_mode(0), reserved2(0), custom_dma_cs(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_DMA0_SRC_REGION) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_DMA0_SRC_REGION);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_dma0_src_region_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_dma0_src_region_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_region() const
+        {
+            return static_cast<uint32_t>(region);
+        }
+        CONSTEXPR npu_set_dma0_src_region_t &set_region(uint32_t value)
+        {
+            region = static_cast<uint8_t>(value) & ((1U << 3) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::dma_region_mode get_region_mode() const
+        {
+            return static_cast<NPU_NAMESPACE::dma_region_mode>(region_mode);
+        }
+        CONSTEXPR npu_set_dma0_src_region_t &set_region_mode(NPU_NAMESPACE::dma_region_mode value)
+        {
+            region_mode = static_cast<uint8_t>(value) & ((1U << 1) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::dma_stride_mode get_stride_mode() const
+        {
+            return static_cast<NPU_NAMESPACE::dma_stride_mode>(stride_mode);
+        }
+        CONSTEXPR npu_set_dma0_src_region_t &set_stride_mode(NPU_NAMESPACE::dma_stride_mode value)
+        {
+            stride_mode = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::custom_dma_cs get_custom_dma_cs() const
+        {
+            return static_cast<NPU_NAMESPACE::custom_dma_cs>(custom_dma_cs);
+        }
+        CONSTEXPR npu_set_dma0_src_region_t &set_custom_dma_cs(NPU_NAMESPACE::custom_dma_cs value)
+        {
+            custom_dma_cs = static_cast<uint8_t>(value) & ((1U << 1) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("region", std::to_string(region)));
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "region_mode",
+                (region_mode < (sizeof(dma_region_mode_str) / sizeof(dma_region_mode_str[0])) ?
+                     dma_region_mode_str[region_mode] :
+                     "****")));
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "stride_mode",
+                (stride_mode < (sizeof(dma_stride_mode_str) / sizeof(dma_stride_mode_str[0])) ?
+                     dma_stride_mode_str[stride_mode] :
+                     "****")));
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "custom_dma_cs",
+                (custom_dma_cs < (sizeof(custom_dma_cs_str) / sizeof(custom_dma_cs_str[0])) ?
+                     custom_dma_cs_str[custom_dma_cs] :
+                     "****")));
+        }
+#endif
+#endif
+    };
+    // DMA0 destination region
+    struct npu_set_dma0_dst_region_t
     {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Wait for the DMA channel to have k or fewer active descriptors outstanding. In Ethos-U55 there is only one user
-// channel so channel=0. In Ethos-U55 there is only one descriptor per channel so k=0 and the command waits for the
-// single DMA to be complete.
-struct npu_op_dma_wait_t
-{
-    uint32_t cmd_code : 10;     // NPU_OP_DMA_WAIT
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t reserved0 : 16;
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t region : 3; //  Region number if region_mode is region_mode_external. Else core mask to write to (bit k
+                             //  set for core k=0,1)
+        uint32_t reserved1 : 5;
+        uint32_t region_mode : 1; //  Region mode
+        uint32_t stride_mode : 2; //  Stride mode
+        uint32_t reserved2 : 4;
+        uint32_t custom_dma_cs : 1; //  Custom DMA select
+#ifdef __cplusplus
+      public:
+        npu_set_dma0_dst_region_t(uint32_t _region,
+                                  NPU_NAMESPACE::dma_region_mode _region_mode,
+                                  NPU_NAMESPACE::dma_stride_mode _stride_mode,
+                                  NPU_NAMESPACE::custom_dma_cs _custom_dma_cs) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_DMA0_DST_REGION)),
+            reserved0(0), control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            region(static_cast<uint8_t>(_region) & ((1U << 3) - 1)), reserved1(0),
+            region_mode(static_cast<uint8_t>(_region_mode) & ((1U << 1) - 1)),
+            stride_mode(static_cast<uint8_t>(_stride_mode) & ((1U << 2) - 1)), reserved2(0),
+            custom_dma_cs(static_cast<uint8_t>(_custom_dma_cs) & ((1U << 1) - 1))
+        {
+        }
+        CONSTEXPR npu_set_dma0_dst_region_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_DMA0_DST_REGION)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), region(0), reserved1(0), region_mode(0),
+            stride_mode(0), reserved2(0), custom_dma_cs(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_DMA0_DST_REGION) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_DMA0_DST_REGION);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_dma0_dst_region_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_dma0_dst_region_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_region() const
+        {
+            return static_cast<uint32_t>(region);
+        }
+        CONSTEXPR npu_set_dma0_dst_region_t &set_region(uint32_t value)
+        {
+            region = static_cast<uint8_t>(value) & ((1U << 3) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::dma_region_mode get_region_mode() const
+        {
+            return static_cast<NPU_NAMESPACE::dma_region_mode>(region_mode);
+        }
+        CONSTEXPR npu_set_dma0_dst_region_t &set_region_mode(NPU_NAMESPACE::dma_region_mode value)
+        {
+            region_mode = static_cast<uint8_t>(value) & ((1U << 1) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::dma_stride_mode get_stride_mode() const
+        {
+            return static_cast<NPU_NAMESPACE::dma_stride_mode>(stride_mode);
+        }
+        CONSTEXPR npu_set_dma0_dst_region_t &set_stride_mode(NPU_NAMESPACE::dma_stride_mode value)
+        {
+            stride_mode = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::custom_dma_cs get_custom_dma_cs() const
+        {
+            return static_cast<NPU_NAMESPACE::custom_dma_cs>(custom_dma_cs);
+        }
+        CONSTEXPR npu_set_dma0_dst_region_t &set_custom_dma_cs(NPU_NAMESPACE::custom_dma_cs value)
+        {
+            custom_dma_cs = static_cast<uint8_t>(value) & ((1U << 1) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("region", std::to_string(region)));
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "region_mode",
+                (region_mode < (sizeof(dma_region_mode_str) / sizeof(dma_region_mode_str[0])) ?
+                     dma_region_mode_str[region_mode] :
+                     "****")));
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "stride_mode",
+                (stride_mode < (sizeof(dma_stride_mode_str) / sizeof(dma_stride_mode_str[0])) ?
+                     dma_stride_mode_str[stride_mode] :
+                     "****")));
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "custom_dma_cs",
+                (custom_dma_cs < (sizeof(custom_dma_cs_str) / sizeof(custom_dma_cs_str[0])) ?
+                     custom_dma_cs_str[custom_dma_cs] :
+                     "****")));
+        }
+#endif
+#endif
+    };
+    // Size of second dimension for 2D/3D transfers
+    struct npu_set_dma0_size0_t
     {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_OP_DMA_WAIT) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t size : 16;   //  Size of second dimension for 2D/3D transfers
+#ifdef __cplusplus
+      public:
+        npu_set_dma0_size0_t(uint32_t _size) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_DMA0_SIZE0)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            size(static_cast<uint16_t>(_size) & ((1U << 16) - 1))
+        {
+        }
+        CONSTEXPR npu_set_dma0_size0_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_DMA0_SIZE0)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), size(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_DMA0_SIZE0) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_DMA0_SIZE0);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_dma0_size0_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_dma0_size0_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_size() const
+        {
+            return static_cast<uint32_t>(size);
+        }
+        CONSTEXPR npu_set_dma0_size0_t &set_size(uint32_t value)
+        {
+            size = static_cast<uint16_t>(value) & ((1U << 16) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("size", std::to_string(size)));
+        }
+#endif
+#endif
+    };
+    // Size of third dimension for 3D transfers
+    struct npu_set_dma0_size1_t
     {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_OP_DMA_WAIT);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t size : 16;   //  Size of third dimension for 3D transfers
+#ifdef __cplusplus
+      public:
+        npu_set_dma0_size1_t(uint32_t _size) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_DMA0_SIZE1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            size(static_cast<uint16_t>(_size) & ((1U << 16) - 1))
+        {
+        }
+        CONSTEXPR npu_set_dma0_size1_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_DMA0_SIZE1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), size(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_DMA0_SIZE1) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_DMA0_SIZE1);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_dma0_size1_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_dma0_size1_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_size() const
+        {
+            return static_cast<uint32_t>(size);
+        }
+        CONSTEXPR npu_set_dma0_size1_t &set_size(uint32_t value)
+        {
+            size = static_cast<uint16_t>(value) & ((1U << 16) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("size", std::to_string(size)));
+        }
+#endif
+#endif
+    };
+    // IFM2 broadcast configuration
+    struct npu_set_ifm2_broadcast_t
     {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_op_dma_wait_t &set_cmd_code(::cmd0 value)
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t
+            broadcast_h : 1; //  Broadcast H dimension (if set then any accesses to IFM2 sets y=0 and IFM2 height=1)
+        uint32_t broadcast_w : 1; //  Broadcast W dimension (if set then any accesses to IFM2 sets x=0 and IFM2 width=1)
+        uint32_t broadcast_c : 1; //  Broadcast C dimension (if set then any accesses to IFM2 sets c=0 and IFM2 depth=1)
+        uint32_t reserved1 : 3;
+        uint32_t operand_order : 1;      //  Operand order
+        uint32_t broadcast_constant : 1; //  Broadcast constant given by NPU_SET_IFM2_SCALAR and so ignore BH, BW and BC
+        uint32_t reserved2 : 8;
+#ifdef __cplusplus
+      public:
+        npu_set_ifm2_broadcast_t(NPU_NAMESPACE::broadcast_mode _broadcast_h,
+                                 NPU_NAMESPACE::broadcast_mode _broadcast_w,
+                                 NPU_NAMESPACE::broadcast_mode _broadcast_c,
+                                 NPU_NAMESPACE::ifm2_operand_order _operand_order,
+                                 NPU_NAMESPACE::broadcast_mode _broadcast_constant) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_BROADCAST)),
+            reserved0(0), control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            broadcast_h(static_cast<uint8_t>(_broadcast_h) & ((1U << 1) - 1)),
+            broadcast_w(static_cast<uint8_t>(_broadcast_w) & ((1U << 1) - 1)),
+            broadcast_c(static_cast<uint8_t>(_broadcast_c) & ((1U << 1) - 1)), reserved1(0),
+            operand_order(static_cast<uint8_t>(_operand_order) & ((1U << 1) - 1)),
+            broadcast_constant(static_cast<uint8_t>(_broadcast_constant) & ((1U << 1) - 1)), reserved2(0)
+        {
+        }
+        CONSTEXPR npu_set_ifm2_broadcast_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_BROADCAST)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), broadcast_h(0), broadcast_w(0),
+            broadcast_c(0), reserved1(0), operand_order(0), broadcast_constant(0), reserved2(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_BROADCAST) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_BROADCAST);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ifm2_broadcast_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ifm2_broadcast_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::broadcast_mode get_broadcast_h() const
+        {
+            return static_cast<NPU_NAMESPACE::broadcast_mode>(broadcast_h);
+        }
+        CONSTEXPR npu_set_ifm2_broadcast_t &set_broadcast_h(NPU_NAMESPACE::broadcast_mode value)
+        {
+            broadcast_h = static_cast<uint8_t>(value) & ((1U << 1) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::broadcast_mode get_broadcast_w() const
+        {
+            return static_cast<NPU_NAMESPACE::broadcast_mode>(broadcast_w);
+        }
+        CONSTEXPR npu_set_ifm2_broadcast_t &set_broadcast_w(NPU_NAMESPACE::broadcast_mode value)
+        {
+            broadcast_w = static_cast<uint8_t>(value) & ((1U << 1) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::broadcast_mode get_broadcast_c() const
+        {
+            return static_cast<NPU_NAMESPACE::broadcast_mode>(broadcast_c);
+        }
+        CONSTEXPR npu_set_ifm2_broadcast_t &set_broadcast_c(NPU_NAMESPACE::broadcast_mode value)
+        {
+            broadcast_c = static_cast<uint8_t>(value) & ((1U << 1) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::ifm2_operand_order get_operand_order() const
+        {
+            return static_cast<NPU_NAMESPACE::ifm2_operand_order>(operand_order);
+        }
+        CONSTEXPR npu_set_ifm2_broadcast_t &set_operand_order(NPU_NAMESPACE::ifm2_operand_order value)
+        {
+            operand_order = static_cast<uint8_t>(value) & ((1U << 1) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::broadcast_mode get_broadcast_constant() const
+        {
+            return static_cast<NPU_NAMESPACE::broadcast_mode>(broadcast_constant);
+        }
+        CONSTEXPR npu_set_ifm2_broadcast_t &set_broadcast_constant(NPU_NAMESPACE::broadcast_mode value)
+        {
+            broadcast_constant = static_cast<uint8_t>(value) & ((1U << 1) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "broadcast_h",
+                (broadcast_h < (sizeof(broadcast_mode_str) / sizeof(broadcast_mode_str[0])) ?
+                     broadcast_mode_str[broadcast_h] :
+                     "****")));
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "broadcast_w",
+                (broadcast_w < (sizeof(broadcast_mode_str) / sizeof(broadcast_mode_str[0])) ?
+                     broadcast_mode_str[broadcast_w] :
+                     "****")));
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "broadcast_c",
+                (broadcast_c < (sizeof(broadcast_mode_str) / sizeof(broadcast_mode_str[0])) ?
+                     broadcast_mode_str[broadcast_c] :
+                     "****")));
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "operand_order",
+                (operand_order < (sizeof(ifm2_operand_order_str) / sizeof(ifm2_operand_order_str[0])) ?
+                     ifm2_operand_order_str[operand_order] :
+                     "****")));
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "broadcast_constant",
+                (broadcast_constant < (sizeof(broadcast_mode_str) / sizeof(broadcast_mode_str[0])) ?
+                     broadcast_mode_str[broadcast_constant] :
+                     "****")));
+        }
+#endif
+#endif
+    };
+    // IFM2 scalar value
+    struct npu_set_ifm2_scalar_t
     {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Wait for n or fewer kernel operations to be remaining (not complete) before starting the next command. A kernel
-// operation is Conv, Depthwise, Pool, VectorProd Elementwise. This command is typically placed before an
-// NPU_OP_DMA_START command to prevent the DMA from starting until a previous kernel operation reading the memory has
-// completed.
-struct npu_op_kernel_wait_t
-{
-    uint32_t cmd_code : 10;     // NPU_OP_KERNEL_WAIT
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t param : 16;
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t scalar : 16; //  int16 or uint16 depending on ifm2_precision.type
+#ifdef __cplusplus
+      public:
+        npu_set_ifm2_scalar_t(uint32_t _scalar) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_SCALAR)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            scalar(static_cast<uint16_t>(_scalar) & ((1U << 16) - 1))
+        {
+        }
+        CONSTEXPR npu_set_ifm2_scalar_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_SCALAR)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), scalar(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_SCALAR) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_SCALAR);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ifm2_scalar_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ifm2_scalar_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_scalar() const
+        {
+            return static_cast<uint32_t>(scalar);
+        }
+        CONSTEXPR npu_set_ifm2_scalar_t &set_scalar(uint32_t value)
+        {
+            scalar = static_cast<uint16_t>(value) & ((1U << 16) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("scalar", std::to_string(scalar)));
+        }
+#endif
+#endif
+    };
+    // IFM2 Precision
+    struct npu_set_ifm2_precision_t
     {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_OP_KERNEL_WAIT) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;         //  control
+        uint32_t activation_type : 1; //  IFM type - MUST MATCH IFM
+        uint32_t reserved1 : 1;
+        uint32_t activation_precision : 2; //  IFM precision - MUST MATCH IFM
+        uint32_t reserved2 : 2;
+        uint32_t activation_format : 2; //  IFM format
+        uint32_t reserved3 : 8;
+#ifdef __cplusplus
+      public:
+        npu_set_ifm2_precision_t(NPU_NAMESPACE::activation_type _activation_type,
+                                 NPU_NAMESPACE::activation_precision _activation_precision,
+                                 NPU_NAMESPACE::activation_format _activation_format) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_PRECISION)),
+            reserved0(0), control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            activation_type(static_cast<uint8_t>(_activation_type) & ((1U << 1) - 1)), reserved1(0),
+            activation_precision(static_cast<uint8_t>(_activation_precision) & ((1U << 2) - 1)), reserved2(0),
+            activation_format(static_cast<uint8_t>(_activation_format) & ((1U << 2) - 1)), reserved3(0)
+        {
+        }
+        CONSTEXPR npu_set_ifm2_precision_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_PRECISION)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), activation_type(0), reserved1(0),
+            activation_precision(0), reserved2(0), activation_format(0), reserved3(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_PRECISION) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_PRECISION);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ifm2_precision_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ifm2_precision_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::activation_type get_activation_type() const
+        {
+            return static_cast<NPU_NAMESPACE::activation_type>(activation_type);
+        }
+        CONSTEXPR npu_set_ifm2_precision_t &set_activation_type(NPU_NAMESPACE::activation_type value)
+        {
+            activation_type = static_cast<uint8_t>(value) & ((1U << 1) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::activation_precision get_activation_precision() const
+        {
+            return static_cast<NPU_NAMESPACE::activation_precision>(activation_precision);
+        }
+        CONSTEXPR npu_set_ifm2_precision_t &set_activation_precision(NPU_NAMESPACE::activation_precision value)
+        {
+            activation_precision = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::activation_format get_activation_format() const
+        {
+            return static_cast<NPU_NAMESPACE::activation_format>(activation_format);
+        }
+        CONSTEXPR npu_set_ifm2_precision_t &set_activation_format(NPU_NAMESPACE::activation_format value)
+        {
+            activation_format = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "activation_type",
+                (activation_type < (sizeof(activation_type_str) / sizeof(activation_type_str[0])) ?
+                     activation_type_str[activation_type] :
+                     "****")));
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "activation_precision",
+                (activation_precision < (sizeof(activation_precision_str) / sizeof(activation_precision_str[0])) ?
+                     activation_precision_str[activation_precision] :
+                     "****")));
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "activation_format",
+                (activation_format < (sizeof(activation_format_str) / sizeof(activation_format_str[0])) ?
+                     activation_format_str[activation_format] :
+                     "****")));
+        }
+#endif
+#endif
+    };
+    // IFM2 zero point
+    struct npu_set_ifm2_zero_point_t
     {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_OP_KERNEL_WAIT);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;     //  control
+        uint32_t zero_point : 16; //  Zero point offset
+#ifdef __cplusplus
+      public:
+        npu_set_ifm2_zero_point_t(uint32_t _zero_point) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_ZERO_POINT)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            zero_point(static_cast<uint16_t>(_zero_point) & ((1U << 16) - 1))
+        {
+        }
+        CONSTEXPR npu_set_ifm2_zero_point_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_ZERO_POINT)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), zero_point(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_ZERO_POINT) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_ZERO_POINT);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ifm2_zero_point_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ifm2_zero_point_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_zero_point() const
+        {
+            return static_cast<uint32_t>(zero_point);
+        }
+        CONSTEXPR npu_set_ifm2_zero_point_t &set_zero_point(uint32_t value)
+        {
+            zero_point = static_cast<uint16_t>(value) & ((1U << 16) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("zero_point", std::to_string(zero_point)));
+        }
+#endif
+#endif
+    };
+    // IFM2 Tile 0 and tile 2 width
+    struct npu_set_ifm2_width0_m1_t
     {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_op_kernel_wait_t &set_cmd_code(::cmd0 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_param() const
-    {
-        return static_cast<uint32_t>(param);
-    }
-    CONSTEXPR npu_op_kernel_wait_t &set_param(uint32_t value)
-    {
-        param = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Enable or disable PMU counting (debug feature only).
-struct npu_op_pmu_mask_t
-{
-    uint32_t cmd_code : 10;     // NPU_OP_PMU_MASK
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t param : 16;
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_OP_PMU_MASK) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_OP_PMU_MASK);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
-    {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_op_pmu_mask_t &set_cmd_code(::cmd0 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_param() const
-    {
-        return static_cast<uint32_t>(param);
-    }
-    CONSTEXPR npu_op_pmu_mask_t &set_param(uint32_t value)
-    {
-        param = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// IFM top pad
-struct npu_set_ifm_pad_top_t
-{
-    uint32_t cmd_code : 10;     // NPU_SET_IFM_PAD_TOP
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t param : 16;
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;   //  control
+        uint32_t width_m1 : 16; //  IFM2 Tile 0 and tile 2 width
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_SET_IFM_PAD_TOP) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_SET_IFM_PAD_TOP);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
-    {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_set_ifm_pad_top_t &set_cmd_code(::cmd0 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_param() const
-    {
-        return static_cast<uint32_t>(param);
-    }
-    CONSTEXPR npu_set_ifm_pad_top_t &set_param(uint32_t value)
+      public:
+        npu_set_ifm2_width0_m1_t(uint32_t _width_m1) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_WIDTH0_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            width_m1(static_cast<uint16_t>(_width_m1) & ((1U << 16) - 1))
+        {
+        }
+        CONSTEXPR npu_set_ifm2_width0_m1_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_WIDTH0_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), width_m1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_WIDTH0_M1) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_WIDTH0_M1);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ifm2_width0_m1_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ifm2_width0_m1_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_width_m1() const
+        {
+            return static_cast<uint32_t>(width_m1);
+        }
+        CONSTEXPR npu_set_ifm2_width0_m1_t &set_width_m1(uint32_t value)
+        {
+            width_m1 = static_cast<uint16_t>(value) & ((1U << 16) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("width_m1", std::to_string(width_m1)));
+        }
+#endif
+#endif
+    };
+    // IFM2 Tile 0 height
+    struct npu_set_ifm2_height0_m1_t
     {
-        param = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// IFM left pad
-struct npu_set_ifm_pad_left_t
-{
-    uint32_t cmd_code : 10;     // NPU_SET_IFM_PAD_LEFT
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t param : 16;
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_SET_IFM_PAD_LEFT) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_SET_IFM_PAD_LEFT);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
-    {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_set_ifm_pad_left_t &set_cmd_code(::cmd0 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_param() const
-    {
-        return static_cast<uint32_t>(param);
-    }
-    CONSTEXPR npu_set_ifm_pad_left_t &set_param(uint32_t value)
-    {
-        param = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// IFM right pad
-struct npu_set_ifm_pad_right_t
-{
-    uint32_t cmd_code : 10;     // NPU_SET_IFM_PAD_RIGHT
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t param : 16;
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;    //  control
+        uint32_t height_m1 : 16; //  IFM2 Tile 0 height
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_SET_IFM_PAD_RIGHT) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_SET_IFM_PAD_RIGHT);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
-    {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_set_ifm_pad_right_t &set_cmd_code(::cmd0 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_param() const
-    {
-        return static_cast<uint32_t>(param);
-    }
-    CONSTEXPR npu_set_ifm_pad_right_t &set_param(uint32_t value)
+      public:
+        npu_set_ifm2_height0_m1_t(uint32_t _height_m1) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_HEIGHT0_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            height_m1(static_cast<uint16_t>(_height_m1) & ((1U << 16) - 1))
+        {
+        }
+        CONSTEXPR npu_set_ifm2_height0_m1_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_HEIGHT0_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), height_m1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_HEIGHT0_M1) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_HEIGHT0_M1);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ifm2_height0_m1_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ifm2_height0_m1_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_height_m1() const
+        {
+            return static_cast<uint32_t>(height_m1);
+        }
+        CONSTEXPR npu_set_ifm2_height0_m1_t &set_height_m1(uint32_t value)
+        {
+            height_m1 = static_cast<uint16_t>(value) & ((1U << 16) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("height_m1", std::to_string(height_m1)));
+        }
+#endif
+#endif
+    };
+    // IFM2 Tile 1 height
+    struct npu_set_ifm2_height1_m1_t
     {
-        param = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// IFM bottom pad
-struct npu_set_ifm_pad_bottom_t
-{
-    uint32_t cmd_code : 10;     // NPU_SET_IFM_PAD_BOTTOM
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t param : 16;
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_SET_IFM_PAD_BOTTOM) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_SET_IFM_PAD_BOTTOM);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
-    {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_set_ifm_pad_bottom_t &set_cmd_code(::cmd0 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_param() const
-    {
-        return static_cast<uint32_t>(param);
-    }
-    CONSTEXPR npu_set_ifm_pad_bottom_t &set_param(uint32_t value)
-    {
-        param = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Number of input channels - 1
-struct npu_set_ifm_depth_m1_t
-{
-    uint32_t cmd_code : 10;     // NPU_SET_IFM_DEPTH_M1
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t param : 16;
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;    //  control
+        uint32_t height_m1 : 16; //  IFM2 Tile 1 height
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_SET_IFM_DEPTH_M1) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_SET_IFM_DEPTH_M1);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
-    {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_set_ifm_depth_m1_t &set_cmd_code(::cmd0 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_param() const
-    {
-        return static_cast<uint32_t>(param);
-    }
-    CONSTEXPR npu_set_ifm_depth_m1_t &set_param(uint32_t value)
+      public:
+        npu_set_ifm2_height1_m1_t(uint32_t _height_m1) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_HEIGHT1_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            height_m1(static_cast<uint16_t>(_height_m1) & ((1U << 16) - 1))
+        {
+        }
+        CONSTEXPR npu_set_ifm2_height1_m1_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_HEIGHT1_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), height_m1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_HEIGHT1_M1) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_HEIGHT1_M1);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ifm2_height1_m1_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ifm2_height1_m1_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_height_m1() const
+        {
+            return static_cast<uint32_t>(height_m1);
+        }
+        CONSTEXPR npu_set_ifm2_height1_m1_t &set_height_m1(uint32_t value)
+        {
+            height_m1 = static_cast<uint16_t>(value) & ((1U << 16) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("height_m1", std::to_string(height_m1)));
+        }
+#endif
+#endif
+    };
+    // Start of IB0,IB1 buffers for IFM2
+    struct npu_set_ifm2_ib_start_t
     {
-        param = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Set IFM precision
-struct npu_set_ifm_precision_t
-{
-    uint32_t cmd_code : 10;     // NPU_SET_IFM_PRECISION
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t precision : 4;
-    uint32_t reserved0 : 2;
-    uint32_t format : 2;
-    uint32_t scale_mode : 2;
-    uint32_t reserved1 : 4;
-    uint32_t round_mode : 2;
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_SET_IFM_PRECISION) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_SET_IFM_PRECISION);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
-    {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_set_ifm_precision_t &set_cmd_code(::cmd0 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR ::data_format get_format() const
-    {
-        return static_cast<::data_format>(format);
-    }
-    CONSTEXPR npu_set_ifm_precision_t &set_format(::data_format value)
-    {
-        format = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR ::ifm_precision get_precision() const
-    {
-        return static_cast<::ifm_precision>(precision);
-    }
-    CONSTEXPR npu_set_ifm_precision_t &set_precision(::ifm_precision value)
-    {
-        precision = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR ::rounding get_round_mode() const
-    {
-        return static_cast<::rounding>(round_mode);
-    }
-    CONSTEXPR npu_set_ifm_precision_t &set_round_mode(::rounding value)
-    {
-        round_mode = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR ::ifm_scale_mode get_scale_mode() const
-    {
-        return static_cast<::ifm_scale_mode>(scale_mode);
-    }
-    CONSTEXPR npu_set_ifm_precision_t &set_scale_mode(::ifm_scale_mode value)
-    {
-        scale_mode = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// b[1:0] = upscale mode (0=none, 1=2x2 nearest, 2=2x2 transpose)
-struct npu_set_ifm_upscale_t
-{
-    uint32_t cmd_code : 10;     // NPU_SET_IFM_UPSCALE
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t mode : 2;
-    uint32_t reserved0 : 14;
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;  //  control
+        uint32_t ib_start : 6; //  Start of IB0,IB1 buffers for IFM2 in the SHRAM in KB units. Multiple of 2
+        uint32_t reserved1 : 10;
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_SET_IFM_UPSCALE) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_SET_IFM_UPSCALE);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
-    {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_set_ifm_upscale_t &set_cmd_code(::cmd0 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR ::resampling_mode get_mode() const
-    {
-        return static_cast<::resampling_mode>(mode);
-    }
-    CONSTEXPR npu_set_ifm_upscale_t &set_mode(::resampling_mode value)
+      public:
+        npu_set_ifm2_ib_start_t(uint32_t _ib_start) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_IB_START)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            ib_start(static_cast<uint8_t>(_ib_start) & ((1U << 6) - 1)), reserved1(0)
+        {
+        }
+        CONSTEXPR npu_set_ifm2_ib_start_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_IB_START)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), ib_start(0), reserved1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_IB_START) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_IB_START);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ifm2_ib_start_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ifm2_ib_start_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_ib_start() const
+        {
+            return static_cast<uint32_t>(ib_start);
+        }
+        CONSTEXPR npu_set_ifm2_ib_start_t &set_ib_start(uint32_t value)
+        {
+            ib_start = static_cast<uint8_t>(value) & ((1U << 6) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("ib_start", std::to_string(ib_start)));
+        }
+#endif
+#endif
+    };
+    // Index n for IFM2 access
+    struct npu_set_ifm2_region_t
     {
-        mode = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Zero point offset (so value that 0 is encoded as)
-struct npu_set_ifm_zero_point_t
-{
-    uint32_t cmd_code : 10;     // NPU_SET_IFM_ZERO_POINT
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t param : 16;
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_SET_IFM_ZERO_POINT) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_SET_IFM_ZERO_POINT);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
-    {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_set_ifm_zero_point_t &set_cmd_code(::cmd0 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_param() const
-    {
-        return static_cast<uint32_t>(param);
-    }
-    CONSTEXPR npu_set_ifm_zero_point_t &set_param(uint32_t value)
-    {
-        param = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// IFM Tile 0 and tile 2 (width-1)
-struct npu_set_ifm_width0_m1_t
-{
-    uint32_t cmd_code : 10;     // NPU_SET_IFM_WIDTH0_M1
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t param : 16;
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t region : 3;  //  Index n for IFM2 access
+        uint32_t reserved1 : 13;
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_SET_IFM_WIDTH0_M1) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_SET_IFM_WIDTH0_M1);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
-    {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_set_ifm_width0_m1_t &set_cmd_code(::cmd0 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_param() const
-    {
-        return static_cast<uint32_t>(param);
-    }
-    CONSTEXPR npu_set_ifm_width0_m1_t &set_param(uint32_t value)
+      public:
+        npu_set_ifm2_region_t(uint32_t _region) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_REGION)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            region(static_cast<uint8_t>(_region) & ((1U << 3) - 1)), reserved1(0)
+        {
+        }
+        CONSTEXPR npu_set_ifm2_region_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_REGION)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), region(0), reserved1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_REGION) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_REGION);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ifm2_region_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ifm2_region_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_region() const
+        {
+            return static_cast<uint32_t>(region);
+        }
+        CONSTEXPR npu_set_ifm2_region_t &set_region(uint32_t value)
+        {
+            region = static_cast<uint8_t>(value) & ((1U << 3) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("region", std::to_string(region)));
+        }
+#endif
+#endif
+    };
+    // IFM Tile 0 address
+    struct npu_set_ifm_base0_t
     {
-        param = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// IFM Tile 0 (height-1)
-struct npu_set_ifm_height0_m1_t
-{
-    uint32_t cmd_code : 10;     // NPU_SET_IFM_HEIGHT0_M1
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t param : 16;
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_SET_IFM_HEIGHT0_M1) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_SET_IFM_HEIGHT0_M1);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
-    {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_set_ifm_height0_m1_t &set_cmd_code(::cmd0 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_param() const
-    {
-        return static_cast<uint32_t>(param);
-    }
-    CONSTEXPR npu_set_ifm_height0_m1_t &set_param(uint32_t value)
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t reserved1 : 16;
+        uint32_t addr : 32; //  address offset
+#ifdef __cplusplus
+      public:
+        npu_set_ifm_base0_t(uint32_t _addr) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_BASE0)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0),
+            addr(static_cast<uint32_t>(_addr))
+        {
+        }
+        CONSTEXPR npu_set_ifm_base0_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_BASE0)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0), addr(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_BASE0) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_BASE0);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd1_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd1_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ifm_base0_t &set_opcode(NPU_NAMESPACE::cmd1_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ifm_base0_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_addr() const
+        {
+            return static_cast<uint32_t>(addr);
+        }
+        CONSTEXPR npu_set_ifm_base0_t &set_addr(uint32_t value)
+        {
+            addr = static_cast<uint32_t>(value);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            std::stringstream saddr;
+            saddr << std::hex << "0x" << get_addr();
+            fields.push_back(std::make_pair<std::string, std::string>("addr", saddr.str()));
+        }
+#endif
+#endif
+    };
+    // IFM Tile 1 address
+    struct npu_set_ifm_base1_t
     {
-        param = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// IFM Tile 1 (height-1)
-struct npu_set_ifm_height1_m1_t
-{
-    uint32_t cmd_code : 10;     // NPU_SET_IFM_HEIGHT1_M1
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t param : 16;
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_SET_IFM_HEIGHT1_M1) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_SET_IFM_HEIGHT1_M1);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
-    {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_set_ifm_height1_m1_t &set_cmd_code(::cmd0 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_param() const
-    {
-        return static_cast<uint32_t>(param);
-    }
-    CONSTEXPR npu_set_ifm_height1_m1_t &set_param(uint32_t value)
-    {
-        param = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// End of IB0,IB1 buffers in the SHRAM in KB units. Multiple of 2.
-struct npu_set_ifm_ib_end_t
-{
-    uint32_t cmd_code : 10;     // NPU_SET_IFM_IB_END
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t param : 16;
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t reserved1 : 16;
+        uint32_t addr : 32; //  address offset
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_SET_IFM_IB_END) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_SET_IFM_IB_END);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
-    {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_set_ifm_ib_end_t &set_cmd_code(::cmd0 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_param() const
-    {
-        return static_cast<uint32_t>(param);
-    }
-    CONSTEXPR npu_set_ifm_ib_end_t &set_param(uint32_t value)
+      public:
+        npu_set_ifm_base1_t(uint32_t _addr) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_BASE1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0),
+            addr(static_cast<uint32_t>(_addr))
+        {
+        }
+        CONSTEXPR npu_set_ifm_base1_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_BASE1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0), addr(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_BASE1) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_BASE1);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd1_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd1_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ifm_base1_t &set_opcode(NPU_NAMESPACE::cmd1_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ifm_base1_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_addr() const
+        {
+            return static_cast<uint32_t>(addr);
+        }
+        CONSTEXPR npu_set_ifm_base1_t &set_addr(uint32_t value)
+        {
+            addr = static_cast<uint32_t>(value);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            std::stringstream saddr;
+            saddr << std::hex << "0x" << get_addr();
+            fields.push_back(std::make_pair<std::string, std::string>("addr", saddr.str()));
+        }
+#endif
+#endif
+    };
+    // IFM Tile 2 address
+    struct npu_set_ifm_base2_t
     {
-        param = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Index n for IFM access: BasePointer[n] is added to all IFM offsets
-struct npu_set_ifm_region_t
-{
-    uint32_t cmd_code : 10;     // NPU_SET_IFM_REGION
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t param : 16;
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_SET_IFM_REGION) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_SET_IFM_REGION);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
-    {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_set_ifm_region_t &set_cmd_code(::cmd0 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_param() const
-    {
-        return static_cast<uint32_t>(param);
-    }
-    CONSTEXPR npu_set_ifm_region_t &set_param(uint32_t value)
-    {
-        param = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Output feature map width -1 (for the stripe to process)
-struct npu_set_ofm_width_m1_t
-{
-    uint32_t cmd_code : 10;     // NPU_SET_OFM_WIDTH_M1
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t param : 16;
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t reserved1 : 16;
+        uint32_t addr : 32; //  address offset
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_SET_OFM_WIDTH_M1) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_SET_OFM_WIDTH_M1);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
-    {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_set_ofm_width_m1_t &set_cmd_code(::cmd0 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_param() const
-    {
-        return static_cast<uint32_t>(param);
-    }
-    CONSTEXPR npu_set_ofm_width_m1_t &set_param(uint32_t value)
+      public:
+        npu_set_ifm_base2_t(uint32_t _addr) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_BASE2)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0),
+            addr(static_cast<uint32_t>(_addr))
+        {
+        }
+        CONSTEXPR npu_set_ifm_base2_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_BASE2)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0), addr(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_BASE2) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_BASE2);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd1_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd1_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ifm_base2_t &set_opcode(NPU_NAMESPACE::cmd1_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ifm_base2_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_addr() const
+        {
+            return static_cast<uint32_t>(addr);
+        }
+        CONSTEXPR npu_set_ifm_base2_t &set_addr(uint32_t value)
+        {
+            addr = static_cast<uint32_t>(value);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            std::stringstream saddr;
+            saddr << std::hex << "0x" << get_addr();
+            fields.push_back(std::make_pair<std::string, std::string>("addr", saddr.str()));
+        }
+#endif
+#endif
+    };
+    // IFM Tile 3 address
+    struct npu_set_ifm_base3_t
     {
-        param = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Output feature map height -1 (for the stripe to process)
-struct npu_set_ofm_height_m1_t
-{
-    uint32_t cmd_code : 10;     // NPU_SET_OFM_HEIGHT_M1
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t param : 16;
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_SET_OFM_HEIGHT_M1) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_SET_OFM_HEIGHT_M1);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
-    {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_set_ofm_height_m1_t &set_cmd_code(::cmd0 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_param() const
-    {
-        return static_cast<uint32_t>(param);
-    }
-    CONSTEXPR npu_set_ofm_height_m1_t &set_param(uint32_t value)
-    {
-        param = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Output feature map depth -1 (for the stripe to process)
-struct npu_set_ofm_depth_m1_t
-{
-    uint32_t cmd_code : 10;     // NPU_SET_OFM_DEPTH_M1
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t param : 16;
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t reserved1 : 16;
+        uint32_t addr : 32; //  address offset
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_SET_OFM_DEPTH_M1) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_SET_OFM_DEPTH_M1);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
-    {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_set_ofm_depth_m1_t &set_cmd_code(::cmd0 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_param() const
-    {
-        return static_cast<uint32_t>(param);
-    }
-    CONSTEXPR npu_set_ofm_depth_m1_t &set_param(uint32_t value)
+      public:
+        npu_set_ifm_base3_t(uint32_t _addr) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_BASE3)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0),
+            addr(static_cast<uint32_t>(_addr))
+        {
+        }
+        CONSTEXPR npu_set_ifm_base3_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_BASE3)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0), addr(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_BASE3) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_BASE3);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd1_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd1_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ifm_base3_t &set_opcode(NPU_NAMESPACE::cmd1_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ifm_base3_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_addr() const
+        {
+            return static_cast<uint32_t>(addr);
+        }
+        CONSTEXPR npu_set_ifm_base3_t &set_addr(uint32_t value)
+        {
+            addr = static_cast<uint32_t>(value);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            std::stringstream saddr;
+            saddr << std::hex << "0x" << get_addr();
+            fields.push_back(std::make_pair<std::string, std::string>("addr", saddr.str()));
+        }
+#endif
+#endif
+    };
+    // IFM byte stride between horizontal values
+    struct npu_set_ifm_stride_x_t
     {
-        param = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Set OFM precision
-struct npu_set_ofm_precision_t
-{
-    uint32_t cmd_code : 10;     // NPU_SET_OFM_PRECISION
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t precision : 3;
-    uint32_t reserved0 : 3;
-    uint32_t format : 2;
-    uint32_t scaling : 1; // 0=Per channel scale/bias 1=Global scale (SET_OFM_SCALE), no bias
-    uint32_t reserved1 : 5;
-    uint32_t rounding : 2; // 0=TFL rounding 1=truncate towards zero 2=natural rounding
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_SET_OFM_PRECISION) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_SET_OFM_PRECISION);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
-    {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_set_ofm_precision_t &set_cmd_code(::cmd0 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR ::data_format get_format() const
-    {
-        return static_cast<::data_format>(format);
-    }
-    CONSTEXPR npu_set_ofm_precision_t &set_format(::data_format value)
-    {
-        format = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR ::ofm_precision get_precision() const
-    {
-        return static_cast<::ofm_precision>(precision);
-    }
-    CONSTEXPR npu_set_ofm_precision_t &set_precision(::ofm_precision value)
-    {
-        precision = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR ::rounding get_rounding() const
-    {
-        return static_cast<::rounding>(rounding);
-    }
-    CONSTEXPR npu_set_ofm_precision_t &set_rounding(::rounding value)
-    {
-        rounding = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_scaling() const
-    {
-        return static_cast<uint32_t>(scaling);
-    }
-    CONSTEXPR npu_set_ofm_precision_t &set_scaling(uint32_t value)
-    {
-        scaling = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// TSU block width - 1 (provided sufficient data remaining)
-struct npu_set_ofm_blk_width_m1_t
-{
-    uint32_t cmd_code : 10;     // NPU_SET_OFM_BLK_WIDTH_M1
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t param : 16;
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t reserved1 : 16;
+        uint32_t addr : 32; //  address offset
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_SET_OFM_BLK_WIDTH_M1) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_SET_OFM_BLK_WIDTH_M1);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
-    {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_set_ofm_blk_width_m1_t &set_cmd_code(::cmd0 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_param() const
-    {
-        return static_cast<uint32_t>(param);
-    }
-    CONSTEXPR npu_set_ofm_blk_width_m1_t &set_param(uint32_t value)
+      public:
+        npu_set_ifm_stride_x_t(uint32_t _addr) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_STRIDE_X)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0),
+            addr(static_cast<uint32_t>(_addr))
+        {
+        }
+        CONSTEXPR npu_set_ifm_stride_x_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_STRIDE_X)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0), addr(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_STRIDE_X) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_STRIDE_X);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd1_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd1_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ifm_stride_x_t &set_opcode(NPU_NAMESPACE::cmd1_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ifm_stride_x_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_addr() const
+        {
+            return static_cast<uint32_t>(addr);
+        }
+        CONSTEXPR npu_set_ifm_stride_x_t &set_addr(uint32_t value)
+        {
+            addr = static_cast<uint32_t>(value);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            std::stringstream saddr;
+            saddr << std::hex << "0x" << get_addr();
+            fields.push_back(std::make_pair<std::string, std::string>("addr", saddr.str()));
+        }
+#endif
+#endif
+    };
+    // IFM byte stride between vertical values
+    struct npu_set_ifm_stride_y_t
     {
-        param = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// TSU block height -1 (provided sufficient data remaining)
-struct npu_set_ofm_blk_height_m1_t
-{
-    uint32_t cmd_code : 10;     // NPU_SET_OFM_BLK_HEIGHT_M1
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t param : 16;
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_SET_OFM_BLK_HEIGHT_M1) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_SET_OFM_BLK_HEIGHT_M1);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
-    {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_set_ofm_blk_height_m1_t &set_cmd_code(::cmd0 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_param() const
-    {
-        return static_cast<uint32_t>(param);
-    }
-    CONSTEXPR npu_set_ofm_blk_height_m1_t &set_param(uint32_t value)
-    {
-        param = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// TSU block depth -1 (provided sufficient data remaining)
-struct npu_set_ofm_blk_depth_m1_t
-{
-    uint32_t cmd_code : 10;     // NPU_SET_OFM_BLK_DEPTH_M1
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t param : 16;
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t reserved1 : 16;
+        uint32_t addr : 32; //  address offset
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_SET_OFM_BLK_DEPTH_M1) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_SET_OFM_BLK_DEPTH_M1);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
-    {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_set_ofm_blk_depth_m1_t &set_cmd_code(::cmd0 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_param() const
-    {
-        return static_cast<uint32_t>(param);
-    }
-    CONSTEXPR npu_set_ofm_blk_depth_m1_t &set_param(uint32_t value)
+      public:
+        npu_set_ifm_stride_y_t(uint32_t _addr) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_STRIDE_Y)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0),
+            addr(static_cast<uint32_t>(_addr))
+        {
+        }
+        CONSTEXPR npu_set_ifm_stride_y_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_STRIDE_Y)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0), addr(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_STRIDE_Y) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_STRIDE_Y);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd1_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd1_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ifm_stride_y_t &set_opcode(NPU_NAMESPACE::cmd1_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ifm_stride_y_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_addr() const
+        {
+            return static_cast<uint32_t>(addr);
+        }
+        CONSTEXPR npu_set_ifm_stride_y_t &set_addr(uint32_t value)
+        {
+            addr = static_cast<uint32_t>(value);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            std::stringstream saddr;
+            saddr << std::hex << "0x" << get_addr();
+            fields.push_back(std::make_pair<std::string, std::string>("addr", saddr.str()));
+        }
+#endif
+#endif
+    };
+    // IFM byte stride between channel blocks (of 16 bytes each block)
+    struct npu_set_ifm_stride_c_t
     {
-        param = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Zero point offset (so value that 0 is encoded as)
-struct npu_set_ofm_zero_point_t
-{
-    uint32_t cmd_code : 10;     // NPU_SET_OFM_ZERO_POINT
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t param : 16;
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_SET_OFM_ZERO_POINT) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_SET_OFM_ZERO_POINT);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
-    {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_set_ofm_zero_point_t &set_cmd_code(::cmd0 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_param() const
-    {
-        return static_cast<uint32_t>(param);
-    }
-    CONSTEXPR npu_set_ofm_zero_point_t &set_param(uint32_t value)
-    {
-        param = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// OFM Tile 0 and tile 2 (width-1)
-struct npu_set_ofm_width0_m1_t
-{
-    uint32_t cmd_code : 10;     // NPU_SET_OFM_WIDTH0_M1
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t param : 16;
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t reserved1 : 16;
+        uint32_t addr : 32; //  address offset
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_SET_OFM_WIDTH0_M1) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_SET_OFM_WIDTH0_M1);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
-    {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_set_ofm_width0_m1_t &set_cmd_code(::cmd0 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_param() const
-    {
-        return static_cast<uint32_t>(param);
-    }
-    CONSTEXPR npu_set_ofm_width0_m1_t &set_param(uint32_t value)
+      public:
+        npu_set_ifm_stride_c_t(uint32_t _addr) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_STRIDE_C)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0),
+            addr(static_cast<uint32_t>(_addr))
+        {
+        }
+        CONSTEXPR npu_set_ifm_stride_c_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_STRIDE_C)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0), addr(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_STRIDE_C) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_STRIDE_C);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd1_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd1_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ifm_stride_c_t &set_opcode(NPU_NAMESPACE::cmd1_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ifm_stride_c_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_addr() const
+        {
+            return static_cast<uint32_t>(addr);
+        }
+        CONSTEXPR npu_set_ifm_stride_c_t &set_addr(uint32_t value)
+        {
+            addr = static_cast<uint32_t>(value);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            std::stringstream saddr;
+            saddr << std::hex << "0x" << get_addr();
+            fields.push_back(std::make_pair<std::string, std::string>("addr", saddr.str()));
+        }
+#endif
+#endif
+    };
+    // OFM Tile 0 address
+    struct npu_set_ofm_base0_t
     {
-        param = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// OFM Tile 0 (height-1)
-struct npu_set_ofm_height0_m1_t
-{
-    uint32_t cmd_code : 10;     // NPU_SET_OFM_HEIGHT0_M1
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t param : 16;
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_SET_OFM_HEIGHT0_M1) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_SET_OFM_HEIGHT0_M1);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
-    {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_set_ofm_height0_m1_t &set_cmd_code(::cmd0 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_param() const
-    {
-        return static_cast<uint32_t>(param);
-    }
-    CONSTEXPR npu_set_ofm_height0_m1_t &set_param(uint32_t value)
-    {
-        param = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// OFM Tile 1 (height-1)
-struct npu_set_ofm_height1_m1_t
-{
-    uint32_t cmd_code : 10;     // NPU_SET_OFM_HEIGHT1_M1
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t param : 16;
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t reserved1 : 16;
+        uint32_t addr : 32; //  address offset
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_SET_OFM_HEIGHT1_M1) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_SET_OFM_HEIGHT1_M1);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
-    {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_set_ofm_height1_m1_t &set_cmd_code(::cmd0 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_param() const
-    {
-        return static_cast<uint32_t>(param);
-    }
-    CONSTEXPR npu_set_ofm_height1_m1_t &set_param(uint32_t value)
+      public:
+        npu_set_ofm_base0_t(uint32_t _addr) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_BASE0)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0),
+            addr(static_cast<uint32_t>(_addr))
+        {
+        }
+        CONSTEXPR npu_set_ofm_base0_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_BASE0)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0), addr(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_BASE0) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_BASE0);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd1_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd1_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ofm_base0_t &set_opcode(NPU_NAMESPACE::cmd1_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ofm_base0_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_addr() const
+        {
+            return static_cast<uint32_t>(addr);
+        }
+        CONSTEXPR npu_set_ofm_base0_t &set_addr(uint32_t value)
+        {
+            addr = static_cast<uint32_t>(value);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            std::stringstream saddr;
+            saddr << std::hex << "0x" << get_addr();
+            fields.push_back(std::make_pair<std::string, std::string>("addr", saddr.str()));
+        }
+#endif
+#endif
+    };
+    // OFM Tile 1 address
+    struct npu_set_ofm_base1_t
     {
-        param = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Index n for OFM access: BasePointer[n] is added to all OFM offsets
-struct npu_set_ofm_region_t
-{
-    uint32_t cmd_code : 10;     // NPU_SET_OFM_REGION
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t param : 16;
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_SET_OFM_REGION) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_SET_OFM_REGION);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
-    {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_set_ofm_region_t &set_cmd_code(::cmd0 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_param() const
-    {
-        return static_cast<uint32_t>(param);
-    }
-    CONSTEXPR npu_set_ofm_region_t &set_param(uint32_t value)
-    {
-        param = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Set kernel width - 1
-struct npu_set_kernel_width_m1_t
-{
-    uint32_t cmd_code : 10;     // NPU_SET_KERNEL_WIDTH_M1
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t param : 16;
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t reserved1 : 16;
+        uint32_t addr : 32; //  address offset
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_SET_KERNEL_WIDTH_M1) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_SET_KERNEL_WIDTH_M1);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
-    {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_set_kernel_width_m1_t &set_cmd_code(::cmd0 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_param() const
-    {
-        return static_cast<uint32_t>(param);
-    }
-    CONSTEXPR npu_set_kernel_width_m1_t &set_param(uint32_t value)
+      public:
+        npu_set_ofm_base1_t(uint32_t _addr) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_BASE1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0),
+            addr(static_cast<uint32_t>(_addr))
+        {
+        }
+        CONSTEXPR npu_set_ofm_base1_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_BASE1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0), addr(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_BASE1) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_BASE1);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd1_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd1_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ofm_base1_t &set_opcode(NPU_NAMESPACE::cmd1_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ofm_base1_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_addr() const
+        {
+            return static_cast<uint32_t>(addr);
+        }
+        CONSTEXPR npu_set_ofm_base1_t &set_addr(uint32_t value)
+        {
+            addr = static_cast<uint32_t>(value);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            std::stringstream saddr;
+            saddr << std::hex << "0x" << get_addr();
+            fields.push_back(std::make_pair<std::string, std::string>("addr", saddr.str()));
+        }
+#endif
+#endif
+    };
+    // OFM Tile 2 address
+    struct npu_set_ofm_base2_t
     {
-        param = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Set kernel height - 1
-struct npu_set_kernel_height_m1_t
-{
-    uint32_t cmd_code : 10;     // NPU_SET_KERNEL_HEIGHT_M1
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t param : 16;
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_SET_KERNEL_HEIGHT_M1) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_SET_KERNEL_HEIGHT_M1);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
-    {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_set_kernel_height_m1_t &set_cmd_code(::cmd0 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_param() const
-    {
-        return static_cast<uint32_t>(param);
-    }
-    CONSTEXPR npu_set_kernel_height_m1_t &set_param(uint32_t value)
-    {
-        param = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Kernel stride b0=(X stride-1)&1, b1=(Y stride-1)&1, b2=weight order (0=depth, 1=kernel) b3 = kernel_x_dilation - 1
-// (0=no x dilation, 1=x dilation of x2) b4 = kernel_y_dilation -1 (0=no y dilation, 1=y dilation of x2) b5 = kernel
-// decomposition size (0 for kernel_split_size=8, 1 for kernel_split_size=4) b[8:6] = (X stride-1)>>1 b[11:9] = (Y
-// stride-1)>>1
-struct npu_set_kernel_stride_t
-{
-    uint32_t cmd_code : 10;     // NPU_SET_KERNEL_STRIDE
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t param : 16;
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t reserved1 : 16;
+        uint32_t addr : 32; //  address offset
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_SET_KERNEL_STRIDE) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_SET_KERNEL_STRIDE);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
-    {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_set_kernel_stride_t &set_cmd_code(::cmd0 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_param() const
-    {
-        return static_cast<uint32_t>(param);
-    }
-    CONSTEXPR npu_set_kernel_stride_t &set_param(uint32_t value)
+      public:
+        npu_set_ofm_base2_t(uint32_t _addr) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_BASE2)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0),
+            addr(static_cast<uint32_t>(_addr))
+        {
+        }
+        CONSTEXPR npu_set_ofm_base2_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_BASE2)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0), addr(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_BASE2) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_BASE2);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd1_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd1_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ofm_base2_t &set_opcode(NPU_NAMESPACE::cmd1_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ofm_base2_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_addr() const
+        {
+            return static_cast<uint32_t>(addr);
+        }
+        CONSTEXPR npu_set_ofm_base2_t &set_addr(uint32_t value)
+        {
+            addr = static_cast<uint32_t>(value);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            std::stringstream saddr;
+            saddr << std::hex << "0x" << get_addr();
+            fields.push_back(std::make_pair<std::string, std::string>("addr", saddr.str()));
+        }
+#endif
+#endif
+    };
+    // OFM Tile 3 address
+    struct npu_set_ofm_base3_t
     {
-        param = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// 0=1-core, 1=2-core depth (this command is Ethos-U65 only and UNPREDICTABLE for Ethos-U55)
-struct npu_set_parallel_mode_t
-{
-    uint32_t cmd_code : 10;     // NPU_SET_PARALLEL_MODE
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t param : 16;
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_SET_PARALLEL_MODE) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_SET_PARALLEL_MODE);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
-    {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_set_parallel_mode_t &set_cmd_code(::cmd0 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_param() const
-    {
-        return static_cast<uint32_t>(param);
-    }
-    CONSTEXPR npu_set_parallel_mode_t &set_param(uint32_t value)
-    {
-        param = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Set accumulator format
-struct npu_set_acc_format_t
-{
-    uint32_t cmd_code : 10;     // NPU_SET_ACC_FORMAT
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t param : 16;
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t reserved1 : 16;
+        uint32_t addr : 32; //  address offset
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_SET_ACC_FORMAT) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_SET_ACC_FORMAT);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
-    {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_set_acc_format_t &set_cmd_code(::cmd0 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR ::acc_format get_param() const
-    {
-        return static_cast<::acc_format>(param);
-    }
-    CONSTEXPR npu_set_acc_format_t &set_param(::acc_format value)
+      public:
+        npu_set_ofm_base3_t(uint32_t _addr) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_BASE3)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0),
+            addr(static_cast<uint32_t>(_addr))
+        {
+        }
+        CONSTEXPR npu_set_ofm_base3_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_BASE3)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0), addr(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_BASE3) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_BASE3);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd1_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd1_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ofm_base3_t &set_opcode(NPU_NAMESPACE::cmd1_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ofm_base3_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_addr() const
+        {
+            return static_cast<uint32_t>(addr);
+        }
+        CONSTEXPR npu_set_ofm_base3_t &set_addr(uint32_t value)
+        {
+            addr = static_cast<uint32_t>(value);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            std::stringstream saddr;
+            saddr << std::hex << "0x" << get_addr();
+            fields.push_back(std::make_pair<std::string, std::string>("addr", saddr.str()));
+        }
+#endif
+#endif
+    };
+    // OFM byte stride between horizontal values
+    struct npu_set_ofm_stride_x_t
     {
-        param = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Set activation
-struct npu_set_activation_t
-{
-    uint32_t cmd_code : 10;     // NPU_SET_ACTIVATION
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t type : 12;
-    uint32_t act_clip_range : 4;
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_SET_ACTIVATION) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_SET_ACTIVATION);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::clip_range get_act_clip_range() const
-    {
-        return static_cast<::clip_range>(act_clip_range);
-    }
-    CONSTEXPR npu_set_activation_t &set_act_clip_range(::clip_range value)
-    {
-        act_clip_range = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
-    {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_set_activation_t &set_cmd_code(::cmd0 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR ::activation get_type() const
-    {
-        return static_cast<::activation>(type);
-    }
-    CONSTEXPR npu_set_activation_t &set_type(::activation value)
-    {
-        type = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Lower bound clip for OFM activations – range is the OFM type range
-struct npu_set_activation_min_t
-{
-    uint32_t cmd_code : 10;     // NPU_SET_ACTIVATION_MIN
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t param : 16;
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t reserved1 : 16;
+        uint32_t addr : 32; //  address offset
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_SET_ACTIVATION_MIN) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_SET_ACTIVATION_MIN);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
-    {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_set_activation_min_t &set_cmd_code(::cmd0 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_param() const
-    {
-        return static_cast<uint32_t>(param);
-    }
-    CONSTEXPR npu_set_activation_min_t &set_param(uint32_t value)
+      public:
+        npu_set_ofm_stride_x_t(uint32_t _addr) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_STRIDE_X)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0),
+            addr(static_cast<uint32_t>(_addr))
+        {
+        }
+        CONSTEXPR npu_set_ofm_stride_x_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_STRIDE_X)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0), addr(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_STRIDE_X) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_STRIDE_X);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd1_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd1_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ofm_stride_x_t &set_opcode(NPU_NAMESPACE::cmd1_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ofm_stride_x_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_addr() const
+        {
+            return static_cast<uint32_t>(addr);
+        }
+        CONSTEXPR npu_set_ofm_stride_x_t &set_addr(uint32_t value)
+        {
+            addr = static_cast<uint32_t>(value);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            std::stringstream saddr;
+            saddr << std::hex << "0x" << get_addr();
+            fields.push_back(std::make_pair<std::string, std::string>("addr", saddr.str()));
+        }
+#endif
+#endif
+    };
+    // OFM byte stride between vertical values
+    struct npu_set_ofm_stride_y_t
     {
-        param = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Upper bound clip for OFM activations – range is the OFM type range
-struct npu_set_activation_max_t
-{
-    uint32_t cmd_code : 10;     // NPU_SET_ACTIVATION_MAX
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t param : 16;
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_SET_ACTIVATION_MAX) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_SET_ACTIVATION_MAX);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
-    {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_set_activation_max_t &set_cmd_code(::cmd0 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_param() const
-    {
-        return static_cast<uint32_t>(param);
-    }
-    CONSTEXPR npu_set_activation_max_t &set_param(uint32_t value)
-    {
-        param = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Index n for weight access: BasePointer[n] is added to all Weight stream offsets
-struct npu_set_weight_region_t
-{
-    uint32_t cmd_code : 10;     // NPU_SET_WEIGHT_REGION
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t param : 16;
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t reserved1 : 16;
+        uint32_t addr : 32; //  address offset
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
+      public:
+        npu_set_ofm_stride_y_t(uint32_t _addr) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_STRIDE_Y)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0),
+            addr(static_cast<uint32_t>(_addr))
+        {
+        }
+        CONSTEXPR npu_set_ofm_stride_y_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_STRIDE_Y)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0), addr(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_STRIDE_Y) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_STRIDE_Y);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd1_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd1_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ofm_stride_y_t &set_opcode(NPU_NAMESPACE::cmd1_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ofm_stride_y_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_addr() const
+        {
+            return static_cast<uint32_t>(addr);
+        }
+        CONSTEXPR npu_set_ofm_stride_y_t &set_addr(uint32_t value)
+        {
+            addr = static_cast<uint32_t>(value);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            std::stringstream saddr;
+            saddr << std::hex << "0x" << get_addr();
+            fields.push_back(std::make_pair<std::string, std::string>("addr", saddr.str()));
+        }
+#endif
+#endif
+    };
+    // OFM byte stride between channel blocks (of 16 bytes each block)
+    struct npu_set_ofm_stride_c_t
     {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_SET_WEIGHT_REGION) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_SET_WEIGHT_REGION);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
-    {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_set_weight_region_t &set_cmd_code(::cmd0 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_param() const
-    {
-        return static_cast<uint32_t>(param);
-    }
-    CONSTEXPR npu_set_weight_region_t &set_param(uint32_t value)
-    {
-        param = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Index n for weight access: BasePointer[n] is added to all scale stream offsets
-struct npu_set_scale_region_t
-{
-    uint32_t cmd_code : 10;     // NPU_SET_SCALE_REGION
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t param : 16;
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_SET_SCALE_REGION) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_SET_SCALE_REGION);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
-    {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_set_scale_region_t &set_cmd_code(::cmd0 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_param() const
-    {
-        return static_cast<uint32_t>(param);
-    }
-    CONSTEXPR npu_set_scale_region_t &set_param(uint32_t value)
-    {
-        param = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Start of ACC0,ACC1 buffers in the SHRAM in KB units. Multiple of 4.)
-struct npu_set_ab_start_t
-{
-    uint32_t cmd_code : 10;     // NPU_SET_AB_START
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t param : 16;
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t reserved1 : 16;
+        uint32_t addr : 32; //  address offset
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_SET_AB_START) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_SET_AB_START);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
-    {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_set_ab_start_t &set_cmd_code(::cmd0 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_param() const
-    {
-        return static_cast<uint32_t>(param);
-    }
-    CONSTEXPR npu_set_ab_start_t &set_param(uint32_t value)
+      public:
+        npu_set_ofm_stride_c_t(uint32_t _addr) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_STRIDE_C)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0),
+            addr(static_cast<uint32_t>(_addr))
+        {
+        }
+        CONSTEXPR npu_set_ofm_stride_c_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_STRIDE_C)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0), addr(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_STRIDE_C) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_STRIDE_C);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd1_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd1_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ofm_stride_c_t &set_opcode(NPU_NAMESPACE::cmd1_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ofm_stride_c_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_addr() const
+        {
+            return static_cast<uint32_t>(addr);
+        }
+        CONSTEXPR npu_set_ofm_stride_c_t &set_addr(uint32_t value)
+        {
+            addr = static_cast<uint32_t>(value);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            std::stringstream saddr;
+            saddr << std::hex << "0x" << get_addr();
+            fields.push_back(std::make_pair<std::string, std::string>("addr", saddr.str()));
+        }
+#endif
+#endif
+    };
+    // Weight stream byte offset in WEIGHT_REGION
+    struct npu_set_weight_base_t
     {
-        param = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Set block number of blocks dependency between kernel operations
-struct npu_set_blockdep_t
-{
-    uint32_t cmd_code : 10;     // NPU_SET_BLOCKDEP
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t param : 16;
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_SET_BLOCKDEP) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_SET_BLOCKDEP);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
-    {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_set_blockdep_t &set_cmd_code(::cmd0 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_param() const
-    {
-        return static_cast<uint32_t>(param);
-    }
-    CONSTEXPR npu_set_blockdep_t &set_param(uint32_t value)
-    {
-        param = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// DMA0 SRC region bitmap
-struct npu_set_dma0_src_region_t
-{
-    uint32_t cmd_code : 10;     // NPU_SET_DMA0_SRC_REGION
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t region : 8;        // If Bit[8]=0, Bit[7:0]=Region number in the range [0, 8) of SRC offset. If Bit[8]=1,
-                                // Bit[7:0]=Core number (0 or 1) to read.
-    uint32_t internal : 1;      // Must be 0 (external)
-    uint32_t stride_mode : 2;   // stride mode 0/1/2=1D/2D/3D
-    uint32_t reserved0 : 5;
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t reserved1 : 16;
+        uint32_t addr : 32; //  address offset
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_SET_DMA0_SRC_REGION) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_SET_DMA0_SRC_REGION);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
-    {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_set_dma0_src_region_t &set_cmd_code(::cmd0 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_internal() const
-    {
-        return static_cast<uint32_t>(internal);
-    }
-    CONSTEXPR npu_set_dma0_src_region_t &set_internal(uint32_t value)
-    {
-        internal = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_region() const
-    {
-        return static_cast<uint32_t>(region);
-    }
-    CONSTEXPR npu_set_dma0_src_region_t &set_region(uint32_t value)
-    {
-        region = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR ::stride_mode get_stride_mode() const
-    {
-        return static_cast<::stride_mode>(stride_mode);
-    }
-    CONSTEXPR npu_set_dma0_src_region_t &set_stride_mode(::stride_mode value)
+      public:
+        npu_set_weight_base_t(uint32_t _addr) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_WEIGHT_BASE)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0),
+            addr(static_cast<uint32_t>(_addr))
+        {
+        }
+        CONSTEXPR npu_set_weight_base_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_WEIGHT_BASE)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0), addr(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_WEIGHT_BASE) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_WEIGHT_BASE);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd1_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd1_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_weight_base_t &set_opcode(NPU_NAMESPACE::cmd1_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_weight_base_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_addr() const
+        {
+            return static_cast<uint32_t>(addr);
+        }
+        CONSTEXPR npu_set_weight_base_t &set_addr(uint32_t value)
+        {
+            addr = static_cast<uint32_t>(value);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            std::stringstream saddr;
+            saddr << std::hex << "0x" << get_addr();
+            fields.push_back(std::make_pair<std::string, std::string>("addr", saddr.str()));
+        }
+#endif
+#endif
+    };
+    // Weight stream byte length
+    struct npu_set_weight_length_t
     {
-        stride_mode = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// DMA0 DST region bitmap
-struct npu_set_dma0_dst_region_t
-{
-    uint32_t cmd_code : 10;     // NPU_SET_DMA0_DST_REGION
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t region : 8;        // If Bit[8]=0, Bit[7:0]=Region number in the range [0, 8) of DST offset. If Bit[8]=1,
-                                // Bit[7:0]=Core mask to write to (bit k set for core k=0,1).
-    uint32_t internal : 1;      // Select external/internal=0/1
-    uint32_t stride_mode : 2;   // stride mode 0/1/2=1D/2D/3D
-    uint32_t reserved0 : 5;
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_SET_DMA0_DST_REGION) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_SET_DMA0_DST_REGION);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
-    {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_set_dma0_dst_region_t &set_cmd_code(::cmd0 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_internal() const
-    {
-        return static_cast<uint32_t>(internal);
-    }
-    CONSTEXPR npu_set_dma0_dst_region_t &set_internal(uint32_t value)
-    {
-        internal = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_region() const
-    {
-        return static_cast<uint32_t>(region);
-    }
-    CONSTEXPR npu_set_dma0_dst_region_t &set_region(uint32_t value)
-    {
-        region = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR ::stride_mode get_stride_mode() const
-    {
-        return static_cast<::stride_mode>(stride_mode);
-    }
-    CONSTEXPR npu_set_dma0_dst_region_t &set_stride_mode(::stride_mode value)
-    {
-        stride_mode = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Inner size for 2D/3D mode.
-struct npu_set_dma0_size0_t
-{
-    uint32_t cmd_code : 10;     // NPU_SET_DMA0_SIZE0
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t param : 16;
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t reserved1 : 16;
+        uint32_t length : 32; //  Weight stream byte length
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_SET_DMA0_SIZE0) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_SET_DMA0_SIZE0);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
-    {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_set_dma0_size0_t &set_cmd_code(::cmd0 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_param() const
-    {
-        return static_cast<uint32_t>(param);
-    }
-    CONSTEXPR npu_set_dma0_size0_t &set_param(uint32_t value)
+      public:
+        npu_set_weight_length_t(uint32_t _length) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_WEIGHT_LENGTH)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0),
+            length(static_cast<uint32_t>(_length))
+        {
+        }
+        CONSTEXPR npu_set_weight_length_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_WEIGHT_LENGTH)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0), length(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_WEIGHT_LENGTH) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_WEIGHT_LENGTH);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd1_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd1_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_weight_length_t &set_opcode(NPU_NAMESPACE::cmd1_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_weight_length_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_length() const
+        {
+            return static_cast<uint32_t>(length);
+        }
+        CONSTEXPR npu_set_weight_length_t &set_length(uint32_t value)
+        {
+            length = static_cast<uint32_t>(value);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("length", std::to_string(length)));
+        }
+#endif
+#endif
+    };
+    // Scale and bias stream input byte offset from SCALE_REGION
+    struct npu_set_scale_base_t
     {
-        param = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Outer size for 3D mode.
-struct npu_set_dma0_size1_t
-{
-    uint32_t cmd_code : 10;     // NPU_SET_DMA0_SIZE1
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t param : 16;
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_SET_DMA0_SIZE1) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_SET_DMA0_SIZE1);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
-    {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_set_dma0_size1_t &set_cmd_code(::cmd0 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_param() const
-    {
-        return static_cast<uint32_t>(param);
-    }
-    CONSTEXPR npu_set_dma0_size1_t &set_param(uint32_t value)
-    {
-        param = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Set IFM2 Broadcast mode
-struct npu_set_ifm2_broadcast_t
-{
-    uint32_t cmd_code : 10;     // NPU_SET_IFM2_BROADCAST
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t broadcast_height : 1;
-    uint32_t broadcast_width : 1;
-    uint32_t broadcast_depth : 1;
-    uint32_t reserved0 : 3;
-    uint32_t operand_order : 1;
-    uint32_t broadcast_scalar : 1;
-    uint32_t reserved1 : 8;
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t reserved1 : 16;
+        uint32_t addr : 32; //  address offset
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_SET_IFM2_BROADCAST) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_SET_IFM2_BROADCAST);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR uint32_t get_broadcast_depth() const
-    {
-        return static_cast<uint32_t>(broadcast_depth);
-    }
-    CONSTEXPR npu_set_ifm2_broadcast_t &set_broadcast_depth(uint32_t value)
-    {
-        broadcast_depth = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_broadcast_height() const
-    {
-        return static_cast<uint32_t>(broadcast_height);
-    }
-    CONSTEXPR npu_set_ifm2_broadcast_t &set_broadcast_height(uint32_t value)
-    {
-        broadcast_height = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_broadcast_scalar() const
-    {
-        return static_cast<uint32_t>(broadcast_scalar);
-    }
-    CONSTEXPR npu_set_ifm2_broadcast_t &set_broadcast_scalar(uint32_t value)
-    {
-        broadcast_scalar = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_broadcast_width() const
-    {
-        return static_cast<uint32_t>(broadcast_width);
-    }
-    CONSTEXPR npu_set_ifm2_broadcast_t &set_broadcast_width(uint32_t value)
-    {
-        broadcast_width = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
-    {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_set_ifm2_broadcast_t &set_cmd_code(::cmd0 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_operand_order() const
-    {
-        return static_cast<uint32_t>(operand_order);
-    }
-    CONSTEXPR npu_set_ifm2_broadcast_t &set_operand_order(uint32_t value)
+      public:
+        npu_set_scale_base_t(uint32_t _addr) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_SCALE_BASE)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0),
+            addr(static_cast<uint32_t>(_addr))
+        {
+        }
+        CONSTEXPR npu_set_scale_base_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_SCALE_BASE)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0), addr(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_SCALE_BASE) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_SCALE_BASE);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd1_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd1_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_scale_base_t &set_opcode(NPU_NAMESPACE::cmd1_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_scale_base_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_addr() const
+        {
+            return static_cast<uint32_t>(addr);
+        }
+        CONSTEXPR npu_set_scale_base_t &set_addr(uint32_t value)
+        {
+            addr = static_cast<uint32_t>(value);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            std::stringstream saddr;
+            saddr << std::hex << "0x" << get_addr();
+            fields.push_back(std::make_pair<std::string, std::string>("addr", saddr.str()));
+        }
+#endif
+#endif
+    };
+    // Scale and bias stream input byte length
+    struct npu_set_scale_length_t
     {
-        operand_order = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// IFM2 scalar value at range IFM_PRECISION
-struct npu_set_ifm2_scalar_t
-{
-    uint32_t cmd_code : 10;     // NPU_SET_IFM2_SCALAR
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t param : 16;
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_SET_IFM2_SCALAR) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_SET_IFM2_SCALAR);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
-    {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_set_ifm2_scalar_t &set_cmd_code(::cmd0 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_param() const
-    {
-        return static_cast<uint32_t>(param);
-    }
-    CONSTEXPR npu_set_ifm2_scalar_t &set_param(uint32_t value)
-    {
-        param = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Set activation
-struct npu_set_ifm2_precision_t
-{
-    uint32_t cmd_code : 10;     // NPU_SET_IFM2_PRECISION
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t precision : 4;
-    uint32_t reserved0 : 2;
-    uint32_t format : 2;
-    uint32_t reserved1 : 8;
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t reserved1 : 16;
+        uint32_t length : 20; //  Scale and bias stream byte length
+        uint32_t reserved2 : 12;
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
+      public:
+        npu_set_scale_length_t(uint32_t _length) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_SCALE_LENGTH)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0),
+            length(static_cast<uint32_t>(_length) & ((1U << 20) - 1)), reserved2(0)
+        {
+        }
+        CONSTEXPR npu_set_scale_length_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_SCALE_LENGTH)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0), length(0), reserved2(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_SCALE_LENGTH) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_SCALE_LENGTH);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd1_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd1_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_scale_length_t &set_opcode(NPU_NAMESPACE::cmd1_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_scale_length_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_length() const
+        {
+            return static_cast<uint32_t>(length);
+        }
+        CONSTEXPR npu_set_scale_length_t &set_length(uint32_t value)
+        {
+            length = static_cast<uint32_t>(value) & ((1U << 20) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("length", std::to_string(length)));
+        }
+#endif
+#endif
+    };
+    // OFM scale
+    struct npu_set_ofm_scale_t
     {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_SET_IFM2_PRECISION) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_SET_IFM2_PRECISION);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
-    {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_set_ifm2_precision_t &set_cmd_code(::cmd0 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR ::data_format get_format() const
-    {
-        return static_cast<::data_format>(format);
-    }
-    CONSTEXPR npu_set_ifm2_precision_t &set_format(::data_format value)
-    {
-        format = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR ::ifm_precision get_precision() const
-    {
-        return static_cast<::ifm_precision>(precision);
-    }
-    CONSTEXPR npu_set_ifm2_precision_t &set_precision(::ifm_precision value)
-    {
-        precision = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Zero point offset (so value that 0 is encoded as) at range IFM_PRECISION
-struct npu_set_ifm2_zero_point_t
-{
-    uint32_t cmd_code : 10;     // NPU_SET_IFM2_ZERO_POINT
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t param : 16;
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_SET_IFM2_ZERO_POINT) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_SET_IFM2_ZERO_POINT);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
-    {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_set_ifm2_zero_point_t &set_cmd_code(::cmd0 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_param() const
-    {
-        return static_cast<uint32_t>(param);
-    }
-    CONSTEXPR npu_set_ifm2_zero_point_t &set_param(uint32_t value)
-    {
-        param = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// IFM2 Tile 0 and tile 2 (width-1)
-struct npu_set_ifm2_width0_m1_t
-{
-    uint32_t cmd_code : 10;     // NPU_SET_IFM2_WIDTH0_M1
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t param : 16;
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t shift : 6;   //  Shift
+        uint32_t reserved1 : 10;
+        uint32_t scale : 32; //  Scale. Not applied for 32-bit operations
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_SET_IFM2_WIDTH0_M1) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_SET_IFM2_WIDTH0_M1);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
-    {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_set_ifm2_width0_m1_t &set_cmd_code(::cmd0 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_param() const
-    {
-        return static_cast<uint32_t>(param);
-    }
-    CONSTEXPR npu_set_ifm2_width0_m1_t &set_param(uint32_t value)
+      public:
+        npu_set_ofm_scale_t(uint32_t _shift, uint32_t _scale) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_SCALE)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)),
+            shift(static_cast<uint8_t>(_shift) & ((1U << 6) - 1)), reserved1(0), scale(static_cast<uint32_t>(_scale))
+        {
+        }
+        CONSTEXPR npu_set_ofm_scale_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_SCALE)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), shift(0), reserved1(0), scale(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_SCALE) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_SCALE);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd1_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd1_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ofm_scale_t &set_opcode(NPU_NAMESPACE::cmd1_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ofm_scale_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_shift() const
+        {
+            return static_cast<uint32_t>(shift);
+        }
+        CONSTEXPR npu_set_ofm_scale_t &set_shift(uint32_t value)
+        {
+            shift = static_cast<uint8_t>(value) & ((1U << 6) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_scale() const
+        {
+            return static_cast<uint32_t>(scale);
+        }
+        CONSTEXPR npu_set_ofm_scale_t &set_scale(uint32_t value)
+        {
+            scale = static_cast<uint32_t>(value);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("shift", std::to_string(shift)));
+            fields.push_back(std::make_pair<std::string, std::string>("scale", std::to_string(scale)));
+        }
+#endif
+#endif
+    };
+    // Input operand A scale
+    struct npu_set_opa_scale_t
     {
-        param = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// IFM2 Tile 0 (height-1)
-struct npu_set_ifm2_height0_m1_t
-{
-    uint32_t cmd_code : 10;     // NPU_SET_IFM2_HEIGHT0_M1
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t param : 16;
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_SET_IFM2_HEIGHT0_M1) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_SET_IFM2_HEIGHT0_M1);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
-    {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_set_ifm2_height0_m1_t &set_cmd_code(::cmd0 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_param() const
-    {
-        return static_cast<uint32_t>(param);
-    }
-    CONSTEXPR npu_set_ifm2_height0_m1_t &set_param(uint32_t value)
-    {
-        param = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// IFM2 Tile 1 (height-1)
-struct npu_set_ifm2_height1_m1_t
-{
-    uint32_t cmd_code : 10;     // NPU_SET_IFM2_HEIGHT1_M1
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t param : 16;
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t shift : 6;   //  Shift. Ignored if IFM scale mode is 0
+        uint32_t reserved1 : 10;
+        uint32_t scale : 32; //  Scale. 16-bit if IFM scale mode is 0
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_SET_IFM2_HEIGHT1_M1) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_SET_IFM2_HEIGHT1_M1);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
-    {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_set_ifm2_height1_m1_t &set_cmd_code(::cmd0 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_param() const
-    {
-        return static_cast<uint32_t>(param);
-    }
-    CONSTEXPR npu_set_ifm2_height1_m1_t &set_param(uint32_t value)
+      public:
+        npu_set_opa_scale_t(uint32_t _shift, uint32_t _scale) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OPA_SCALE)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)),
+            shift(static_cast<uint8_t>(_shift) & ((1U << 6) - 1)), reserved1(0), scale(static_cast<uint32_t>(_scale))
+        {
+        }
+        CONSTEXPR npu_set_opa_scale_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OPA_SCALE)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), shift(0), reserved1(0), scale(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OPA_SCALE) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OPA_SCALE);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd1_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd1_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_opa_scale_t &set_opcode(NPU_NAMESPACE::cmd1_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_opa_scale_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_shift() const
+        {
+            return static_cast<uint32_t>(shift);
+        }
+        CONSTEXPR npu_set_opa_scale_t &set_shift(uint32_t value)
+        {
+            shift = static_cast<uint8_t>(value) & ((1U << 6) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_scale() const
+        {
+            return static_cast<uint32_t>(scale);
+        }
+        CONSTEXPR npu_set_opa_scale_t &set_scale(uint32_t value)
+        {
+            scale = static_cast<uint32_t>(value);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("shift", std::to_string(shift)));
+            fields.push_back(std::make_pair<std::string, std::string>("scale", std::to_string(scale)));
+        }
+#endif
+#endif
+    };
+    // Input operand B scale
+    struct npu_set_opb_scale_t
     {
-        param = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Start of IB0, IB1 buffers for IFM2 in SHRAM. In KB units, multiple of 2.
-struct npu_set_ifm2_ib_start_t
-{
-    uint32_t cmd_code : 10;     // NPU_SET_IFM2_IB_START
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t param : 16;
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_SET_IFM2_IB_START) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_SET_IFM2_IB_START);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
-    {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_set_ifm2_ib_start_t &set_cmd_code(::cmd0 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_param() const
-    {
-        return static_cast<uint32_t>(param);
-    }
-    CONSTEXPR npu_set_ifm2_ib_start_t &set_param(uint32_t value)
-    {
-        param = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Index n for IFM2 access: Region[n] is added to all IFM2 addresses
-struct npu_set_ifm2_region_t
-{
-    uint32_t cmd_code : 10;     // NPU_SET_IFM2_REGION
-    uint32_t must_be_zero0 : 6; // 0
-    uint32_t param : 16;
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t reserved1 : 16;
+        uint32_t scale : 16; //  Scale. Not used if IFM scale mode is 1 or 2
+        uint32_t reserved2 : 16;
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd0::NPU_SET_IFM2_REGION) && must_be_zero0 == 0;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code      = static_cast<uint32_t>(cmd0::NPU_SET_IFM2_REGION);
-        must_be_zero0 = 0;
-    }
-    CONSTEXPR ::cmd0 get_cmd_code() const
-    {
-        return static_cast<::cmd0>(cmd_code);
-    }
-    CONSTEXPR npu_set_ifm2_region_t &set_cmd_code(::cmd0 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_param() const
-    {
-        return static_cast<uint32_t>(param);
-    }
-    CONSTEXPR npu_set_ifm2_region_t &set_param(uint32_t value)
+      public:
+        npu_set_opb_scale_t(uint32_t _scale) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OPB_SCALE)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0),
+            scale(static_cast<uint16_t>(_scale) & ((1U << 16) - 1)), reserved2(0)
+        {
+        }
+        CONSTEXPR npu_set_opb_scale_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OPB_SCALE)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0), scale(0), reserved2(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OPB_SCALE) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OPB_SCALE);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd1_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd1_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_opb_scale_t &set_opcode(NPU_NAMESPACE::cmd1_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_opb_scale_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_scale() const
+        {
+            return static_cast<uint32_t>(scale);
+        }
+        CONSTEXPR npu_set_opb_scale_t &set_scale(uint32_t value)
+        {
+            scale = static_cast<uint16_t>(value) & ((1U << 16) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("scale", std::to_string(scale)));
+        }
+#endif
+#endif
+    };
+    // DMA user channel 0 source byte offset from DMA0_SRC_REGION
+    struct npu_set_dma0_src_t
     {
-        param = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Set IFM base address (top left tile)
-struct npu_set_ifm_base0_t
-{
-    uint32_t cmd_code : 10;    // NPU_SET_IFM_BASE0
-    uint32_t must_be_zero : 4; // 0
-    uint32_t payload_size : 2; // Min:1 Max:2
-    uint32_t reserved0 : 16;
-    uint32_t data : 32; // IFM base address (top left tile)
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd1::NPU_SET_IFM_BASE0) && must_be_zero == 0 && payload_size >= 1 &&
-               payload_size <= 2;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code     = static_cast<uint32_t>(cmd1::NPU_SET_IFM_BASE0);
-        must_be_zero = 0;
-        payload_size = 1;
-    }
-    CONSTEXPR ::cmd1 get_cmd_code() const
-    {
-        return static_cast<::cmd1>(cmd_code);
-    }
-    CONSTEXPR npu_set_ifm_base0_t &set_cmd_code(::cmd1 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_data() const
-    {
-        return static_cast<uint32_t>(data);
-    }
-    CONSTEXPR npu_set_ifm_base0_t &set_data(uint32_t value)
-    {
-        data = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_payload_size() const
-    {
-        return static_cast<uint32_t>(payload_size);
-    }
-    CONSTEXPR npu_set_ifm_base0_t &set_payload_size(uint32_t value)
-    {
-        payload_size = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Set IFM base address (top right tile)
-struct npu_set_ifm_base1_t
-{
-    uint32_t cmd_code : 10;    // NPU_SET_IFM_BASE1
-    uint32_t must_be_zero : 4; // 0
-    uint32_t payload_size : 2; // Min:1 Max:2
-    uint32_t reserved0 : 16;
-    uint32_t data : 32; // IFM base address (top right tile)
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t reserved1 : 16;
+        uint32_t addr : 32; //  address offset
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd1::NPU_SET_IFM_BASE1) && must_be_zero == 0 && payload_size >= 1 &&
-               payload_size <= 2;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code     = static_cast<uint32_t>(cmd1::NPU_SET_IFM_BASE1);
-        must_be_zero = 0;
-        payload_size = 1;
-    }
-    CONSTEXPR ::cmd1 get_cmd_code() const
-    {
-        return static_cast<::cmd1>(cmd_code);
-    }
-    CONSTEXPR npu_set_ifm_base1_t &set_cmd_code(::cmd1 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_data() const
-    {
-        return static_cast<uint32_t>(data);
-    }
-    CONSTEXPR npu_set_ifm_base1_t &set_data(uint32_t value)
-    {
-        data = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_payload_size() const
-    {
-        return static_cast<uint32_t>(payload_size);
-    }
-    CONSTEXPR npu_set_ifm_base1_t &set_payload_size(uint32_t value)
+      public:
+        npu_set_dma0_src_t(uint32_t _addr) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_DMA0_SRC)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0),
+            addr(static_cast<uint32_t>(_addr))
+        {
+        }
+        CONSTEXPR npu_set_dma0_src_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_DMA0_SRC)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0), addr(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_DMA0_SRC) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_DMA0_SRC);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd1_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd1_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_dma0_src_t &set_opcode(NPU_NAMESPACE::cmd1_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_dma0_src_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_addr() const
+        {
+            return static_cast<uint32_t>(addr);
+        }
+        CONSTEXPR npu_set_dma0_src_t &set_addr(uint32_t value)
+        {
+            addr = static_cast<uint32_t>(value);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            std::stringstream saddr;
+            saddr << std::hex << "0x" << get_addr();
+            fields.push_back(std::make_pair<std::string, std::string>("addr", saddr.str()));
+        }
+#endif
+#endif
+    };
+    // DMA user channel 0 destination byte offset from DMA0_DST_REGION
+    struct npu_set_dma0_dst_t
     {
-        payload_size = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Set IFM base address (bottom left tile)
-struct npu_set_ifm_base2_t
-{
-    uint32_t cmd_code : 10;    // NPU_SET_IFM_BASE2
-    uint32_t must_be_zero : 4; // 0
-    uint32_t payload_size : 2; // Min:1 Max:2
-    uint32_t reserved0 : 16;
-    uint32_t data : 32; // IFM base address (bottom left tile)
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd1::NPU_SET_IFM_BASE2) && must_be_zero == 0 && payload_size >= 1 &&
-               payload_size <= 2;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code     = static_cast<uint32_t>(cmd1::NPU_SET_IFM_BASE2);
-        must_be_zero = 0;
-        payload_size = 1;
-    }
-    CONSTEXPR ::cmd1 get_cmd_code() const
-    {
-        return static_cast<::cmd1>(cmd_code);
-    }
-    CONSTEXPR npu_set_ifm_base2_t &set_cmd_code(::cmd1 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_data() const
-    {
-        return static_cast<uint32_t>(data);
-    }
-    CONSTEXPR npu_set_ifm_base2_t &set_data(uint32_t value)
-    {
-        data = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_payload_size() const
-    {
-        return static_cast<uint32_t>(payload_size);
-    }
-    CONSTEXPR npu_set_ifm_base2_t &set_payload_size(uint32_t value)
-    {
-        payload_size = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Set IFM base address (bottom right tile)
-struct npu_set_ifm_base3_t
-{
-    uint32_t cmd_code : 10;    // NPU_SET_IFM_BASE3
-    uint32_t must_be_zero : 4; // 0
-    uint32_t payload_size : 2; // Min:1 Max:2
-    uint32_t reserved0 : 16;
-    uint32_t data : 32; // IFM base address (bottom right tile)
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t reserved1 : 16;
+        uint32_t addr : 32; //  address offset
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
+      public:
+        npu_set_dma0_dst_t(uint32_t _addr) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_DMA0_DST)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0),
+            addr(static_cast<uint32_t>(_addr))
+        {
+        }
+        CONSTEXPR npu_set_dma0_dst_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_DMA0_DST)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0), addr(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_DMA0_DST) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_DMA0_DST);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd1_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd1_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_dma0_dst_t &set_opcode(NPU_NAMESPACE::cmd1_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_dma0_dst_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_addr() const
+        {
+            return static_cast<uint32_t>(addr);
+        }
+        CONSTEXPR npu_set_dma0_dst_t &set_addr(uint32_t value)
+        {
+            addr = static_cast<uint32_t>(value);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            std::stringstream saddr;
+            saddr << std::hex << "0x" << get_addr();
+            fields.push_back(std::make_pair<std::string, std::string>("addr", saddr.str()));
+        }
+#endif
+#endif
+    };
+    // DMA user channel 0 transfer length in bytes for 1D mode
+    struct npu_set_dma0_len_t
     {
-        return cmd_code == static_cast<uint32_t>(cmd1::NPU_SET_IFM_BASE3) && must_be_zero == 0 && payload_size >= 1 &&
-               payload_size <= 2;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code     = static_cast<uint32_t>(cmd1::NPU_SET_IFM_BASE3);
-        must_be_zero = 0;
-        payload_size = 1;
-    }
-    CONSTEXPR ::cmd1 get_cmd_code() const
-    {
-        return static_cast<::cmd1>(cmd_code);
-    }
-    CONSTEXPR npu_set_ifm_base3_t &set_cmd_code(::cmd1 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_data() const
-    {
-        return static_cast<uint32_t>(data);
-    }
-    CONSTEXPR npu_set_ifm_base3_t &set_data(uint32_t value)
-    {
-        data = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_payload_size() const
-    {
-        return static_cast<uint32_t>(payload_size);
-    }
-    CONSTEXPR npu_set_ifm_base3_t &set_payload_size(uint32_t value)
-    {
-        payload_size = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Set IFM byte stride between horizontal values
-struct npu_set_ifm_stride_x_t
-{
-    uint32_t cmd_code : 10;    // NPU_SET_IFM_STRIDE_X
-    uint32_t must_be_zero : 4; // 0
-    uint32_t payload_size : 2; // Min:1 Max:2
-    uint32_t reserved0 : 16;
-    uint32_t data : 32; // IFM byte stride between horizontal values
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd1::NPU_SET_IFM_STRIDE_X) && must_be_zero == 0 &&
-               payload_size >= 1 && payload_size <= 2;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code     = static_cast<uint32_t>(cmd1::NPU_SET_IFM_STRIDE_X);
-        must_be_zero = 0;
-        payload_size = 1;
-    }
-    CONSTEXPR ::cmd1 get_cmd_code() const
-    {
-        return static_cast<::cmd1>(cmd_code);
-    }
-    CONSTEXPR npu_set_ifm_stride_x_t &set_cmd_code(::cmd1 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_data() const
-    {
-        return static_cast<uint32_t>(data);
-    }
-    CONSTEXPR npu_set_ifm_stride_x_t &set_data(uint32_t value)
-    {
-        data = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_payload_size() const
-    {
-        return static_cast<uint32_t>(payload_size);
-    }
-    CONSTEXPR npu_set_ifm_stride_x_t &set_payload_size(uint32_t value)
-    {
-        payload_size = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Set IFM byte stride between vertical values
-struct npu_set_ifm_stride_y_t
-{
-    uint32_t cmd_code : 10;    // NPU_SET_IFM_STRIDE_Y
-    uint32_t must_be_zero : 4; // 0
-    uint32_t payload_size : 2; // Min:1 Max:2
-    uint32_t reserved0 : 16;
-    uint32_t data : 32; // IFM byte stride between vertical values
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t reserved1 : 16;
+        uint32_t addr : 32; //  address offset
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd1::NPU_SET_IFM_STRIDE_Y) && must_be_zero == 0 &&
-               payload_size >= 1 && payload_size <= 2;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code     = static_cast<uint32_t>(cmd1::NPU_SET_IFM_STRIDE_Y);
-        must_be_zero = 0;
-        payload_size = 1;
-    }
-    CONSTEXPR ::cmd1 get_cmd_code() const
-    {
-        return static_cast<::cmd1>(cmd_code);
-    }
-    CONSTEXPR npu_set_ifm_stride_y_t &set_cmd_code(::cmd1 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_data() const
-    {
-        return static_cast<uint32_t>(data);
-    }
-    CONSTEXPR npu_set_ifm_stride_y_t &set_data(uint32_t value)
-    {
-        data = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_payload_size() const
-    {
-        return static_cast<uint32_t>(payload_size);
-    }
-    CONSTEXPR npu_set_ifm_stride_y_t &set_payload_size(uint32_t value)
+      public:
+        npu_set_dma0_len_t(uint32_t _addr) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_DMA0_LEN)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0),
+            addr(static_cast<uint32_t>(_addr))
+        {
+        }
+        CONSTEXPR npu_set_dma0_len_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_DMA0_LEN)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0), addr(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_DMA0_LEN) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_DMA0_LEN);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd1_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd1_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_dma0_len_t &set_opcode(NPU_NAMESPACE::cmd1_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_dma0_len_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_addr() const
+        {
+            return static_cast<uint32_t>(addr);
+        }
+        CONSTEXPR npu_set_dma0_len_t &set_addr(uint32_t value)
+        {
+            addr = static_cast<uint32_t>(value);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            std::stringstream saddr;
+            saddr << std::hex << "0x" << get_addr();
+            fields.push_back(std::make_pair<std::string, std::string>("addr", saddr.str()));
+        }
+#endif
+#endif
+    };
+    // IFM2 Tile 0 address
+    struct npu_set_ifm2_base0_t
     {
-        payload_size = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Set IFM byte stride between channel blocks (of 16 bytes each block)
-struct npu_set_ifm_stride_c_t
-{
-    uint32_t cmd_code : 10;    // NPU_SET_IFM_STRIDE_C
-    uint32_t must_be_zero : 4; // 0
-    uint32_t payload_size : 2; // Min:1 Max:2
-    uint32_t reserved0 : 16;
-    uint32_t data : 32; // IFM byte stride between channel blocks (of 16 bytes each block)
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd1::NPU_SET_IFM_STRIDE_C) && must_be_zero == 0 &&
-               payload_size >= 1 && payload_size <= 2;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code     = static_cast<uint32_t>(cmd1::NPU_SET_IFM_STRIDE_C);
-        must_be_zero = 0;
-        payload_size = 1;
-    }
-    CONSTEXPR ::cmd1 get_cmd_code() const
-    {
-        return static_cast<::cmd1>(cmd_code);
-    }
-    CONSTEXPR npu_set_ifm_stride_c_t &set_cmd_code(::cmd1 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_data() const
-    {
-        return static_cast<uint32_t>(data);
-    }
-    CONSTEXPR npu_set_ifm_stride_c_t &set_data(uint32_t value)
-    {
-        data = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_payload_size() const
-    {
-        return static_cast<uint32_t>(payload_size);
-    }
-    CONSTEXPR npu_set_ifm_stride_c_t &set_payload_size(uint32_t value)
-    {
-        payload_size = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Set OFM base address (top left tile)
-struct npu_set_ofm_base0_t
-{
-    uint32_t cmd_code : 10;    // NPU_SET_OFM_BASE0
-    uint32_t must_be_zero : 4; // 0
-    uint32_t payload_size : 2; // Min:1 Max:2
-    uint32_t reserved0 : 16;
-    uint32_t data : 32; // OFM base address (top left tile)
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t reserved1 : 16;
+        uint32_t addr : 32; //  address offset
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd1::NPU_SET_OFM_BASE0) && must_be_zero == 0 && payload_size >= 1 &&
-               payload_size <= 2;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code     = static_cast<uint32_t>(cmd1::NPU_SET_OFM_BASE0);
-        must_be_zero = 0;
-        payload_size = 1;
-    }
-    CONSTEXPR ::cmd1 get_cmd_code() const
-    {
-        return static_cast<::cmd1>(cmd_code);
-    }
-    CONSTEXPR npu_set_ofm_base0_t &set_cmd_code(::cmd1 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_data() const
-    {
-        return static_cast<uint32_t>(data);
-    }
-    CONSTEXPR npu_set_ofm_base0_t &set_data(uint32_t value)
-    {
-        data = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_payload_size() const
-    {
-        return static_cast<uint32_t>(payload_size);
-    }
-    CONSTEXPR npu_set_ofm_base0_t &set_payload_size(uint32_t value)
+      public:
+        npu_set_ifm2_base0_t(uint32_t _addr) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_BASE0)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0),
+            addr(static_cast<uint32_t>(_addr))
+        {
+        }
+        CONSTEXPR npu_set_ifm2_base0_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_BASE0)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0), addr(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_BASE0) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_BASE0);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd1_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd1_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ifm2_base0_t &set_opcode(NPU_NAMESPACE::cmd1_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ifm2_base0_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_addr() const
+        {
+            return static_cast<uint32_t>(addr);
+        }
+        CONSTEXPR npu_set_ifm2_base0_t &set_addr(uint32_t value)
+        {
+            addr = static_cast<uint32_t>(value);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            std::stringstream saddr;
+            saddr << std::hex << "0x" << get_addr();
+            fields.push_back(std::make_pair<std::string, std::string>("addr", saddr.str()));
+        }
+#endif
+#endif
+    };
+    // IFM2 Tile 1 address
+    struct npu_set_ifm2_base1_t
     {
-        payload_size = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Set OFM base address (top right tile)
-struct npu_set_ofm_base1_t
-{
-    uint32_t cmd_code : 10;    // NPU_SET_OFM_BASE1
-    uint32_t must_be_zero : 4; // 0
-    uint32_t payload_size : 2; // Min:1 Max:2
-    uint32_t reserved0 : 16;
-    uint32_t data : 32; // OFM base address (top right tile)
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd1::NPU_SET_OFM_BASE1) && must_be_zero == 0 && payload_size >= 1 &&
-               payload_size <= 2;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code     = static_cast<uint32_t>(cmd1::NPU_SET_OFM_BASE1);
-        must_be_zero = 0;
-        payload_size = 1;
-    }
-    CONSTEXPR ::cmd1 get_cmd_code() const
-    {
-        return static_cast<::cmd1>(cmd_code);
-    }
-    CONSTEXPR npu_set_ofm_base1_t &set_cmd_code(::cmd1 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_data() const
-    {
-        return static_cast<uint32_t>(data);
-    }
-    CONSTEXPR npu_set_ofm_base1_t &set_data(uint32_t value)
-    {
-        data = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_payload_size() const
-    {
-        return static_cast<uint32_t>(payload_size);
-    }
-    CONSTEXPR npu_set_ofm_base1_t &set_payload_size(uint32_t value)
-    {
-        payload_size = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Set OFM base address (bottom left tile)
-struct npu_set_ofm_base2_t
-{
-    uint32_t cmd_code : 10;    // NPU_SET_OFM_BASE2
-    uint32_t must_be_zero : 4; // 0
-    uint32_t payload_size : 2; // Min:1 Max:2
-    uint32_t reserved0 : 16;
-    uint32_t data : 32; // OFM base address (bottom left tile)
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t reserved1 : 16;
+        uint32_t addr : 32; //  address offset
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd1::NPU_SET_OFM_BASE2) && must_be_zero == 0 && payload_size >= 1 &&
-               payload_size <= 2;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code     = static_cast<uint32_t>(cmd1::NPU_SET_OFM_BASE2);
-        must_be_zero = 0;
-        payload_size = 1;
-    }
-    CONSTEXPR ::cmd1 get_cmd_code() const
-    {
-        return static_cast<::cmd1>(cmd_code);
-    }
-    CONSTEXPR npu_set_ofm_base2_t &set_cmd_code(::cmd1 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_data() const
-    {
-        return static_cast<uint32_t>(data);
-    }
-    CONSTEXPR npu_set_ofm_base2_t &set_data(uint32_t value)
-    {
-        data = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_payload_size() const
-    {
-        return static_cast<uint32_t>(payload_size);
-    }
-    CONSTEXPR npu_set_ofm_base2_t &set_payload_size(uint32_t value)
+      public:
+        npu_set_ifm2_base1_t(uint32_t _addr) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_BASE1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0),
+            addr(static_cast<uint32_t>(_addr))
+        {
+        }
+        CONSTEXPR npu_set_ifm2_base1_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_BASE1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0), addr(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_BASE1) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_BASE1);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd1_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd1_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ifm2_base1_t &set_opcode(NPU_NAMESPACE::cmd1_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ifm2_base1_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_addr() const
+        {
+            return static_cast<uint32_t>(addr);
+        }
+        CONSTEXPR npu_set_ifm2_base1_t &set_addr(uint32_t value)
+        {
+            addr = static_cast<uint32_t>(value);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            std::stringstream saddr;
+            saddr << std::hex << "0x" << get_addr();
+            fields.push_back(std::make_pair<std::string, std::string>("addr", saddr.str()));
+        }
+#endif
+#endif
+    };
+    // IFM2 Tile 2 address
+    struct npu_set_ifm2_base2_t
     {
-        payload_size = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Set OFM base address (bottom right tile)
-struct npu_set_ofm_base3_t
-{
-    uint32_t cmd_code : 10;    // NPU_SET_OFM_BASE3
-    uint32_t must_be_zero : 4; // 0
-    uint32_t payload_size : 2; // Min:1 Max:2
-    uint32_t reserved0 : 16;
-    uint32_t data : 32; // OFM base address (bottom right tile)
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd1::NPU_SET_OFM_BASE3) && must_be_zero == 0 && payload_size >= 1 &&
-               payload_size <= 2;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code     = static_cast<uint32_t>(cmd1::NPU_SET_OFM_BASE3);
-        must_be_zero = 0;
-        payload_size = 1;
-    }
-    CONSTEXPR ::cmd1 get_cmd_code() const
-    {
-        return static_cast<::cmd1>(cmd_code);
-    }
-    CONSTEXPR npu_set_ofm_base3_t &set_cmd_code(::cmd1 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_data() const
-    {
-        return static_cast<uint32_t>(data);
-    }
-    CONSTEXPR npu_set_ofm_base3_t &set_data(uint32_t value)
-    {
-        data = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_payload_size() const
-    {
-        return static_cast<uint32_t>(payload_size);
-    }
-    CONSTEXPR npu_set_ofm_base3_t &set_payload_size(uint32_t value)
-    {
-        payload_size = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Set OFM byte stride between horizontal values
-struct npu_set_ofm_stride_x_t
-{
-    uint32_t cmd_code : 10;    // NPU_SET_OFM_STRIDE_X
-    uint32_t must_be_zero : 4; // 0
-    uint32_t payload_size : 2; // Min:1 Max:2
-    uint32_t reserved0 : 16;
-    uint32_t data : 32; // OFM byte stride between horizontal values
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t reserved1 : 16;
+        uint32_t addr : 32; //  address offset
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd1::NPU_SET_OFM_STRIDE_X) && must_be_zero == 0 &&
-               payload_size >= 1 && payload_size <= 2;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code     = static_cast<uint32_t>(cmd1::NPU_SET_OFM_STRIDE_X);
-        must_be_zero = 0;
-        payload_size = 1;
-    }
-    CONSTEXPR ::cmd1 get_cmd_code() const
-    {
-        return static_cast<::cmd1>(cmd_code);
-    }
-    CONSTEXPR npu_set_ofm_stride_x_t &set_cmd_code(::cmd1 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_data() const
-    {
-        return static_cast<uint32_t>(data);
-    }
-    CONSTEXPR npu_set_ofm_stride_x_t &set_data(uint32_t value)
-    {
-        data = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_payload_size() const
-    {
-        return static_cast<uint32_t>(payload_size);
-    }
-    CONSTEXPR npu_set_ofm_stride_x_t &set_payload_size(uint32_t value)
+      public:
+        npu_set_ifm2_base2_t(uint32_t _addr) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_BASE2)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0),
+            addr(static_cast<uint32_t>(_addr))
+        {
+        }
+        CONSTEXPR npu_set_ifm2_base2_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_BASE2)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0), addr(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_BASE2) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_BASE2);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd1_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd1_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ifm2_base2_t &set_opcode(NPU_NAMESPACE::cmd1_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ifm2_base2_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_addr() const
+        {
+            return static_cast<uint32_t>(addr);
+        }
+        CONSTEXPR npu_set_ifm2_base2_t &set_addr(uint32_t value)
+        {
+            addr = static_cast<uint32_t>(value);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            std::stringstream saddr;
+            saddr << std::hex << "0x" << get_addr();
+            fields.push_back(std::make_pair<std::string, std::string>("addr", saddr.str()));
+        }
+#endif
+#endif
+    };
+    // IFM2 Tile 3 address
+    struct npu_set_ifm2_base3_t
     {
-        payload_size = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Set OFM byte stride between vertical values
-struct npu_set_ofm_stride_y_t
-{
-    uint32_t cmd_code : 10;    // NPU_SET_OFM_STRIDE_Y
-    uint32_t must_be_zero : 4; // 0
-    uint32_t payload_size : 2; // Min:1 Max:2
-    uint32_t reserved0 : 16;
-    uint32_t data : 32; // OFM byte stride between vertical values
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd1::NPU_SET_OFM_STRIDE_Y) && must_be_zero == 0 &&
-               payload_size >= 1 && payload_size <= 2;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code     = static_cast<uint32_t>(cmd1::NPU_SET_OFM_STRIDE_Y);
-        must_be_zero = 0;
-        payload_size = 1;
-    }
-    CONSTEXPR ::cmd1 get_cmd_code() const
-    {
-        return static_cast<::cmd1>(cmd_code);
-    }
-    CONSTEXPR npu_set_ofm_stride_y_t &set_cmd_code(::cmd1 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_data() const
-    {
-        return static_cast<uint32_t>(data);
-    }
-    CONSTEXPR npu_set_ofm_stride_y_t &set_data(uint32_t value)
-    {
-        data = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_payload_size() const
-    {
-        return static_cast<uint32_t>(payload_size);
-    }
-    CONSTEXPR npu_set_ofm_stride_y_t &set_payload_size(uint32_t value)
-    {
-        payload_size = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Set OFM byte stride between channel blocks (of 16 bytes each block)
-struct npu_set_ofm_stride_c_t
-{
-    uint32_t cmd_code : 10;    // NPU_SET_OFM_STRIDE_C
-    uint32_t must_be_zero : 4; // 0
-    uint32_t payload_size : 2; // Min:1 Max:2
-    uint32_t reserved0 : 16;
-    uint32_t data : 32; // OFM byte stride between channel blocks (of 16 bytes each block)
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t reserved1 : 16;
+        uint32_t addr : 32; //  address offset
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd1::NPU_SET_OFM_STRIDE_C) && must_be_zero == 0 &&
-               payload_size >= 1 && payload_size <= 2;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code     = static_cast<uint32_t>(cmd1::NPU_SET_OFM_STRIDE_C);
-        must_be_zero = 0;
-        payload_size = 1;
-    }
-    CONSTEXPR ::cmd1 get_cmd_code() const
-    {
-        return static_cast<::cmd1>(cmd_code);
-    }
-    CONSTEXPR npu_set_ofm_stride_c_t &set_cmd_code(::cmd1 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_data() const
-    {
-        return static_cast<uint32_t>(data);
-    }
-    CONSTEXPR npu_set_ofm_stride_c_t &set_data(uint32_t value)
-    {
-        data = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_payload_size() const
-    {
-        return static_cast<uint32_t>(payload_size);
-    }
-    CONSTEXPR npu_set_ofm_stride_c_t &set_payload_size(uint32_t value)
+      public:
+        npu_set_ifm2_base3_t(uint32_t _addr) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_BASE3)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0),
+            addr(static_cast<uint32_t>(_addr))
+        {
+        }
+        CONSTEXPR npu_set_ifm2_base3_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_BASE3)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0), addr(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_BASE3) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_BASE3);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd1_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd1_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ifm2_base3_t &set_opcode(NPU_NAMESPACE::cmd1_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ifm2_base3_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_addr() const
+        {
+            return static_cast<uint32_t>(addr);
+        }
+        CONSTEXPR npu_set_ifm2_base3_t &set_addr(uint32_t value)
+        {
+            addr = static_cast<uint32_t>(value);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            std::stringstream saddr;
+            saddr << std::hex << "0x" << get_addr();
+            fields.push_back(std::make_pair<std::string, std::string>("addr", saddr.str()));
+        }
+#endif
+#endif
+    };
+    // IFM2 byte stride between horizontal values
+    struct npu_set_ifm2_stride_x_t
     {
-        payload_size = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Set Weight stream input base address
-struct npu_set_weight_base_t
-{
-    uint32_t cmd_code : 10;    // NPU_SET_WEIGHT_BASE
-    uint32_t must_be_zero : 4; // 0
-    uint32_t payload_size : 2; // Min:1 Max:2
-    uint32_t reserved0 : 16;
-    uint32_t data : 32; // Weight stream input base address
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd1::NPU_SET_WEIGHT_BASE) && must_be_zero == 0 && payload_size >= 1 &&
-               payload_size <= 2;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code     = static_cast<uint32_t>(cmd1::NPU_SET_WEIGHT_BASE);
-        must_be_zero = 0;
-        payload_size = 1;
-    }
-    CONSTEXPR ::cmd1 get_cmd_code() const
-    {
-        return static_cast<::cmd1>(cmd_code);
-    }
-    CONSTEXPR npu_set_weight_base_t &set_cmd_code(::cmd1 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_data() const
-    {
-        return static_cast<uint32_t>(data);
-    }
-    CONSTEXPR npu_set_weight_base_t &set_data(uint32_t value)
-    {
-        data = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_payload_size() const
-    {
-        return static_cast<uint32_t>(payload_size);
-    }
-    CONSTEXPR npu_set_weight_base_t &set_payload_size(uint32_t value)
-    {
-        payload_size = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Set Weight stream length
-struct npu_set_weight_length_t
-{
-    uint32_t cmd_code : 10;    // NPU_SET_WEIGHT_LENGTH
-    uint32_t must_be_zero : 4; // 0
-    uint32_t payload_size : 2; // Min:1 Max:2
-    uint32_t reserved0 : 16;
-    uint32_t data : 32; // Weight stream length
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t reserved1 : 16;
+        uint32_t addr : 32; //  address offset
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
+      public:
+        npu_set_ifm2_stride_x_t(uint32_t _addr) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_STRIDE_X)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0),
+            addr(static_cast<uint32_t>(_addr))
+        {
+        }
+        CONSTEXPR npu_set_ifm2_stride_x_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_STRIDE_X)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0), addr(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_STRIDE_X) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_STRIDE_X);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd1_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd1_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ifm2_stride_x_t &set_opcode(NPU_NAMESPACE::cmd1_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ifm2_stride_x_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_addr() const
+        {
+            return static_cast<uint32_t>(addr);
+        }
+        CONSTEXPR npu_set_ifm2_stride_x_t &set_addr(uint32_t value)
+        {
+            addr = static_cast<uint32_t>(value);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            std::stringstream saddr;
+            saddr << std::hex << "0x" << get_addr();
+            fields.push_back(std::make_pair<std::string, std::string>("addr", saddr.str()));
+        }
+#endif
+#endif
+    };
+    // IFM2 byte stride between vertical values
+    struct npu_set_ifm2_stride_y_t
     {
-        return cmd_code == static_cast<uint32_t>(cmd1::NPU_SET_WEIGHT_LENGTH) && must_be_zero == 0 &&
-               payload_size >= 1 && payload_size <= 2;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code     = static_cast<uint32_t>(cmd1::NPU_SET_WEIGHT_LENGTH);
-        must_be_zero = 0;
-        payload_size = 1;
-    }
-    CONSTEXPR ::cmd1 get_cmd_code() const
-    {
-        return static_cast<::cmd1>(cmd_code);
-    }
-    CONSTEXPR npu_set_weight_length_t &set_cmd_code(::cmd1 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_data() const
-    {
-        return static_cast<uint32_t>(data);
-    }
-    CONSTEXPR npu_set_weight_length_t &set_data(uint32_t value)
-    {
-        data = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_payload_size() const
-    {
-        return static_cast<uint32_t>(payload_size);
-    }
-    CONSTEXPR npu_set_weight_length_t &set_payload_size(uint32_t value)
-    {
-        payload_size = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Set Scale and bias stream input base address
-struct npu_set_scale_base_t
-{
-    uint32_t cmd_code : 10;    // NPU_SET_SCALE_BASE
-    uint32_t must_be_zero : 4; // 0
-    uint32_t payload_size : 2; // Min:1 Max:2
-    uint32_t reserved0 : 16;
-    uint32_t data : 32; // Scale and bias stream input base address
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd1::NPU_SET_SCALE_BASE) && must_be_zero == 0 && payload_size >= 1 &&
-               payload_size <= 2;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code     = static_cast<uint32_t>(cmd1::NPU_SET_SCALE_BASE);
-        must_be_zero = 0;
-        payload_size = 1;
-    }
-    CONSTEXPR ::cmd1 get_cmd_code() const
-    {
-        return static_cast<::cmd1>(cmd_code);
-    }
-    CONSTEXPR npu_set_scale_base_t &set_cmd_code(::cmd1 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_data() const
-    {
-        return static_cast<uint32_t>(data);
-    }
-    CONSTEXPR npu_set_scale_base_t &set_data(uint32_t value)
-    {
-        data = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_payload_size() const
-    {
-        return static_cast<uint32_t>(payload_size);
-    }
-    CONSTEXPR npu_set_scale_base_t &set_payload_size(uint32_t value)
-    {
-        payload_size = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Set Scale and bias stream input length
-struct npu_set_scale_length_t
-{
-    uint32_t cmd_code : 10;    // NPU_SET_SCALE_LENGTH
-    uint32_t must_be_zero : 4; // 0
-    uint32_t payload_size : 2; // Min:1 Max:2
-    uint32_t reserved0 : 16;
-    uint32_t data : 32; // Scale and bias stream input length
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t reserved1 : 16;
+        uint32_t addr : 32; //  address offset
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd1::NPU_SET_SCALE_LENGTH) && must_be_zero == 0 &&
-               payload_size >= 1 && payload_size <= 2;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code     = static_cast<uint32_t>(cmd1::NPU_SET_SCALE_LENGTH);
-        must_be_zero = 0;
-        payload_size = 1;
-    }
-    CONSTEXPR ::cmd1 get_cmd_code() const
-    {
-        return static_cast<::cmd1>(cmd_code);
-    }
-    CONSTEXPR npu_set_scale_length_t &set_cmd_code(::cmd1 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_data() const
-    {
-        return static_cast<uint32_t>(data);
-    }
-    CONSTEXPR npu_set_scale_length_t &set_data(uint32_t value)
-    {
-        data = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_payload_size() const
-    {
-        return static_cast<uint32_t>(payload_size);
-    }
-    CONSTEXPR npu_set_scale_length_t &set_payload_size(uint32_t value)
+      public:
+        npu_set_ifm2_stride_y_t(uint32_t _addr) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_STRIDE_Y)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0),
+            addr(static_cast<uint32_t>(_addr))
+        {
+        }
+        CONSTEXPR npu_set_ifm2_stride_y_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_STRIDE_Y)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0), addr(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_STRIDE_Y) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_STRIDE_Y);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd1_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd1_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ifm2_stride_y_t &set_opcode(NPU_NAMESPACE::cmd1_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ifm2_stride_y_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_addr() const
+        {
+            return static_cast<uint32_t>(addr);
+        }
+        CONSTEXPR npu_set_ifm2_stride_y_t &set_addr(uint32_t value)
+        {
+            addr = static_cast<uint32_t>(value);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            std::stringstream saddr;
+            saddr << std::hex << "0x" << get_addr();
+            fields.push_back(std::make_pair<std::string, std::string>("addr", saddr.str()));
+        }
+#endif
+#endif
+    };
+    // IFM2 byte stride between channel blocks (of 16 bytes each block)
+    struct npu_set_ifm2_stride_c_t
     {
-        payload_size = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Set scale (32-bit). Used by average pool with pad=0, elementwise MUL, ADD, SUB
-struct npu_set_ofm_scale_t
-{
-    uint32_t cmd_code : 10;    // NPU_SET_OFM_SCALE
-    uint32_t must_be_zero : 4; // 0
-    uint32_t payload_size : 2; // Min:1 Max:2
-    uint32_t shift : 16;
-    uint32_t data : 32; // scale (32-bit). Used by average pool with pad=0, elementwise MUL, ADD, SUB
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd1::NPU_SET_OFM_SCALE) && must_be_zero == 0 && payload_size >= 1 &&
-               payload_size <= 2;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code     = static_cast<uint32_t>(cmd1::NPU_SET_OFM_SCALE);
-        must_be_zero = 0;
-        payload_size = 1;
-    }
-    CONSTEXPR ::cmd1 get_cmd_code() const
-    {
-        return static_cast<::cmd1>(cmd_code);
-    }
-    CONSTEXPR npu_set_ofm_scale_t &set_cmd_code(::cmd1 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_data() const
-    {
-        return static_cast<uint32_t>(data);
-    }
-    CONSTEXPR npu_set_ofm_scale_t &set_data(uint32_t value)
-    {
-        data = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_payload_size() const
-    {
-        return static_cast<uint32_t>(payload_size);
-    }
-    CONSTEXPR npu_set_ofm_scale_t &set_payload_size(uint32_t value)
-    {
-        payload_size = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_shift() const
-    {
-        return static_cast<uint32_t>(shift);
-    }
-    CONSTEXPR npu_set_ofm_scale_t &set_shift(uint32_t value)
-    {
-        shift = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Set scale (32-bit) used for elementwise ADD/SUB OPA prescale. If IFM scale mode is 0 then shift is ignored and scale
-// is 16-bit. If IFM scale mode is 1 or 2 then shift is 6-bit and scale is 32-bit
-struct npu_set_opa_scale_t
-{
-    uint32_t cmd_code : 10;    // NPU_SET_OPA_SCALE
-    uint32_t must_be_zero : 4; // 0
-    uint32_t payload_size : 2; // Min:1 Max:2
-    uint32_t shift : 16;
-    uint32_t
-        data : 32; // scale (32-bit) used for elementwise ADD/SUB OPA prescale. If IFM scale mode is 0 then shift is
-                   // ignored and scale is 16-bit. If IFM scale mode is 1 or 2 then shift is 6-bit and scale is 32-bit
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t reserved1 : 16;
+        uint32_t addr : 32; //  address offset
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd1::NPU_SET_OPA_SCALE) && must_be_zero == 0 && payload_size >= 1 &&
-               payload_size <= 2;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code     = static_cast<uint32_t>(cmd1::NPU_SET_OPA_SCALE);
-        must_be_zero = 0;
-        payload_size = 1;
-    }
-    CONSTEXPR ::cmd1 get_cmd_code() const
-    {
-        return static_cast<::cmd1>(cmd_code);
-    }
-    CONSTEXPR npu_set_opa_scale_t &set_cmd_code(::cmd1 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_data() const
-    {
-        return static_cast<uint32_t>(data);
-    }
-    CONSTEXPR npu_set_opa_scale_t &set_data(uint32_t value)
-    {
-        data = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_payload_size() const
-    {
-        return static_cast<uint32_t>(payload_size);
-    }
-    CONSTEXPR npu_set_opa_scale_t &set_payload_size(uint32_t value)
-    {
-        payload_size = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_shift() const
-    {
-        return static_cast<uint32_t>(shift);
-    }
-    CONSTEXPR npu_set_opa_scale_t &set_shift(uint32_t value)
+      public:
+        npu_set_ifm2_stride_c_t(uint32_t _addr) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_STRIDE_C)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0),
+            addr(static_cast<uint32_t>(_addr))
+        {
+        }
+        CONSTEXPR npu_set_ifm2_stride_c_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_STRIDE_C)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0), addr(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_STRIDE_C) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_STRIDE_C);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd1_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd1_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ifm2_stride_c_t &set_opcode(NPU_NAMESPACE::cmd1_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ifm2_stride_c_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_addr() const
+        {
+            return static_cast<uint32_t>(addr);
+        }
+        CONSTEXPR npu_set_ifm2_stride_c_t &set_addr(uint32_t value)
+        {
+            addr = static_cast<uint32_t>(value);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            std::stringstream saddr;
+            saddr << std::hex << "0x" << get_addr();
+            fields.push_back(std::make_pair<std::string, std::string>("addr", saddr.str()));
+        }
+#endif
+#endif
+    };
+    // User defined register 0
+    struct npu_set_user_defined0_t
     {
-        shift = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Set scale (16-bit) used for elementwise ADD/SUB OPB prescale. If IFM scale mode is 0 then scale is 16-bit. If IFM
-// scale mode is 1 or 2 then this register is not used
-struct npu_set_opb_scale_t
-{
-    uint32_t cmd_code : 10;    // NPU_SET_OPB_SCALE
-    uint32_t must_be_zero : 4; // 0
-    uint32_t payload_size : 2; // Min:1 Max:2
-    uint32_t reserved0 : 16;
-    uint32_t data : 32; // scale (16-bit) used for elementwise ADD/SUB OPB prescale. If IFM scale mode is 0 then scale
-                        // is 16-bit. If IFM scale mode is 1 or 2 then this register is not used
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd1::NPU_SET_OPB_SCALE) && must_be_zero == 0 && payload_size >= 1 &&
-               payload_size <= 2;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code     = static_cast<uint32_t>(cmd1::NPU_SET_OPB_SCALE);
-        must_be_zero = 0;
-        payload_size = 1;
-    }
-    CONSTEXPR ::cmd1 get_cmd_code() const
-    {
-        return static_cast<::cmd1>(cmd_code);
-    }
-    CONSTEXPR npu_set_opb_scale_t &set_cmd_code(::cmd1 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_data() const
-    {
-        return static_cast<uint32_t>(data);
-    }
-    CONSTEXPR npu_set_opb_scale_t &set_data(uint32_t value)
-    {
-        data = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_payload_size() const
-    {
-        return static_cast<uint32_t>(payload_size);
-    }
-    CONSTEXPR npu_set_opb_scale_t &set_payload_size(uint32_t value)
-    {
-        payload_size = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Set DMA source address
-struct npu_set_dma0_src_t
-{
-    uint32_t cmd_code : 10;    // NPU_SET_DMA0_SRC
-    uint32_t must_be_zero : 4; // 0
-    uint32_t payload_size : 2; // Min:1 Max:2
-    uint32_t reserved0 : 16;
-    uint32_t data : 32;
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t reserved1 : 16;
+        uint32_t user_reg : 32; //  User defined register
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
+      public:
+        npu_set_user_defined0_t(uint32_t _user_reg) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_USER_DEFINED0)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0),
+            user_reg(static_cast<uint32_t>(_user_reg))
+        {
+        }
+        CONSTEXPR npu_set_user_defined0_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_USER_DEFINED0)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0), user_reg(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_USER_DEFINED0) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_USER_DEFINED0);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd1_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd1_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_user_defined0_t &set_opcode(NPU_NAMESPACE::cmd1_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_user_defined0_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_user_reg() const
+        {
+            return static_cast<uint32_t>(user_reg);
+        }
+        CONSTEXPR npu_set_user_defined0_t &set_user_reg(uint32_t value)
+        {
+            user_reg = static_cast<uint32_t>(value);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("user_reg", std::to_string(user_reg)));
+        }
+#endif
+#endif
+    };
+    // User defined register 1
+    struct npu_set_user_defined1_t
     {
-        return cmd_code == static_cast<uint32_t>(cmd1::NPU_SET_DMA0_SRC) && must_be_zero == 0 && payload_size >= 1 &&
-               payload_size <= 2;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code     = static_cast<uint32_t>(cmd1::NPU_SET_DMA0_SRC);
-        must_be_zero = 0;
-        payload_size = 1;
-    }
-    CONSTEXPR ::cmd1 get_cmd_code() const
-    {
-        return static_cast<::cmd1>(cmd_code);
-    }
-    CONSTEXPR npu_set_dma0_src_t &set_cmd_code(::cmd1 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_data() const
-    {
-        return static_cast<uint32_t>(data);
-    }
-    CONSTEXPR npu_set_dma0_src_t &set_data(uint32_t value)
-    {
-        data = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_payload_size() const
-    {
-        return static_cast<uint32_t>(payload_size);
-    }
-    CONSTEXPR npu_set_dma0_src_t &set_payload_size(uint32_t value)
-    {
-        payload_size = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Set DMA destination address
-struct npu_set_dma0_dst_t
-{
-    uint32_t cmd_code : 10;    // NPU_SET_DMA0_DST
-    uint32_t must_be_zero : 4; // 0
-    uint32_t payload_size : 2; // Min:1 Max:2
-    uint32_t reserved0 : 16;
-    uint32_t data : 32;
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd1::NPU_SET_DMA0_DST) && must_be_zero == 0 && payload_size >= 1 &&
-               payload_size <= 2;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code     = static_cast<uint32_t>(cmd1::NPU_SET_DMA0_DST);
-        must_be_zero = 0;
-        payload_size = 1;
-    }
-    CONSTEXPR ::cmd1 get_cmd_code() const
-    {
-        return static_cast<::cmd1>(cmd_code);
-    }
-    CONSTEXPR npu_set_dma0_dst_t &set_cmd_code(::cmd1 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_data() const
-    {
-        return static_cast<uint32_t>(data);
-    }
-    CONSTEXPR npu_set_dma0_dst_t &set_data(uint32_t value)
-    {
-        data = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_payload_size() const
-    {
-        return static_cast<uint32_t>(payload_size);
-    }
-    CONSTEXPR npu_set_dma0_dst_t &set_payload_size(uint32_t value)
-    {
-        payload_size = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Set DMA length
-struct npu_set_dma0_len_t
-{
-    uint32_t cmd_code : 10;    // NPU_SET_DMA0_LEN
-    uint32_t must_be_zero : 4; // 0
-    uint32_t payload_size : 2; // Min:1 Max:2
-    uint32_t reserved0 : 16;
-    uint32_t data : 32; // DMA length
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t reserved1 : 16;
+        uint32_t user_reg : 32; //  User defined register
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd1::NPU_SET_DMA0_LEN) && must_be_zero == 0 && payload_size >= 1 &&
-               payload_size <= 2;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code     = static_cast<uint32_t>(cmd1::NPU_SET_DMA0_LEN);
-        must_be_zero = 0;
-        payload_size = 1;
-    }
-    CONSTEXPR ::cmd1 get_cmd_code() const
-    {
-        return static_cast<::cmd1>(cmd_code);
-    }
-    CONSTEXPR npu_set_dma0_len_t &set_cmd_code(::cmd1 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_data() const
-    {
-        return static_cast<uint32_t>(data);
-    }
-    CONSTEXPR npu_set_dma0_len_t &set_data(uint32_t value)
-    {
-        data = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_payload_size() const
-    {
-        return static_cast<uint32_t>(payload_size);
-    }
-    CONSTEXPR npu_set_dma0_len_t &set_payload_size(uint32_t value)
+      public:
+        npu_set_user_defined1_t(uint32_t _user_reg) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_USER_DEFINED1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0),
+            user_reg(static_cast<uint32_t>(_user_reg))
+        {
+        }
+        CONSTEXPR npu_set_user_defined1_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_USER_DEFINED1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0), user_reg(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_USER_DEFINED1) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_USER_DEFINED1);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd1_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd1_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_user_defined1_t &set_opcode(NPU_NAMESPACE::cmd1_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_user_defined1_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_user_reg() const
+        {
+            return static_cast<uint32_t>(user_reg);
+        }
+        CONSTEXPR npu_set_user_defined1_t &set_user_reg(uint32_t value)
+        {
+            user_reg = static_cast<uint32_t>(value);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("user_reg", std::to_string(user_reg)));
+        }
+#endif
+#endif
+    };
+    // User defined register 2
+    struct npu_set_user_defined2_t
     {
-        payload_size = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Set Byte distance to skip after inner size (2D/3D mode)
-struct npu_set_dma0_skip0_t
-{
-    uint32_t cmd_code : 10;    // NPU_SET_DMA0_SKIP0
-    uint32_t must_be_zero : 4; // 0
-    uint32_t payload_size : 2; // Min:1 Max:2
-    uint32_t param : 16;
-    uint32_t data : 32; // Byte distance to skip after inner size (2D/3D mode)
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd1::NPU_SET_DMA0_SKIP0) && must_be_zero == 0 && payload_size >= 1 &&
-               payload_size <= 2;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code     = static_cast<uint32_t>(cmd1::NPU_SET_DMA0_SKIP0);
-        must_be_zero = 0;
-        payload_size = 1;
-    }
-    CONSTEXPR ::cmd1 get_cmd_code() const
-    {
-        return static_cast<::cmd1>(cmd_code);
-    }
-    CONSTEXPR npu_set_dma0_skip0_t &set_cmd_code(::cmd1 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_data() const
-    {
-        return static_cast<uint32_t>(data);
-    }
-    CONSTEXPR npu_set_dma0_skip0_t &set_data(uint32_t value)
-    {
-        data = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_param() const
-    {
-        return static_cast<uint32_t>(param);
-    }
-    CONSTEXPR npu_set_dma0_skip0_t &set_param(uint32_t value)
-    {
-        param = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_payload_size() const
-    {
-        return static_cast<uint32_t>(payload_size);
-    }
-    CONSTEXPR npu_set_dma0_skip0_t &set_payload_size(uint32_t value)
-    {
-        payload_size = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Set Byte distance to skip after outer size (3D mode)
-struct npu_set_dma0_skip1_t
-{
-    uint32_t cmd_code : 10;    // NPU_SET_DMA0_SKIP1
-    uint32_t must_be_zero : 4; // 0
-    uint32_t payload_size : 2; // Min:1 Max:2
-    uint32_t param : 16;
-    uint32_t data : 32; // Byte distance to skip after outer size (3D mode)
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t reserved1 : 16;
+        uint32_t user_reg : 32; //  User defined register
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd1::NPU_SET_DMA0_SKIP1) && must_be_zero == 0 && payload_size >= 1 &&
-               payload_size <= 2;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code     = static_cast<uint32_t>(cmd1::NPU_SET_DMA0_SKIP1);
-        must_be_zero = 0;
-        payload_size = 1;
-    }
-    CONSTEXPR ::cmd1 get_cmd_code() const
-    {
-        return static_cast<::cmd1>(cmd_code);
-    }
-    CONSTEXPR npu_set_dma0_skip1_t &set_cmd_code(::cmd1 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_data() const
-    {
-        return static_cast<uint32_t>(data);
-    }
-    CONSTEXPR npu_set_dma0_skip1_t &set_data(uint32_t value)
-    {
-        data = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_param() const
-    {
-        return static_cast<uint32_t>(param);
-    }
-    CONSTEXPR npu_set_dma0_skip1_t &set_param(uint32_t value)
-    {
-        param = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_payload_size() const
-    {
-        return static_cast<uint32_t>(payload_size);
-    }
-    CONSTEXPR npu_set_dma0_skip1_t &set_payload_size(uint32_t value)
+      public:
+        npu_set_user_defined2_t(uint32_t _user_reg) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_USER_DEFINED2)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0),
+            user_reg(static_cast<uint32_t>(_user_reg))
+        {
+        }
+        CONSTEXPR npu_set_user_defined2_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_USER_DEFINED2)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0), user_reg(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_USER_DEFINED2) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_USER_DEFINED2);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd1_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd1_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_user_defined2_t &set_opcode(NPU_NAMESPACE::cmd1_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_user_defined2_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_user_reg() const
+        {
+            return static_cast<uint32_t>(user_reg);
+        }
+        CONSTEXPR npu_set_user_defined2_t &set_user_reg(uint32_t value)
+        {
+            user_reg = static_cast<uint32_t>(value);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("user_reg", std::to_string(user_reg)));
+        }
+#endif
+#endif
+    };
+    // User defined register 3
+    struct npu_set_user_defined3_t
     {
-        payload_size = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Set IFM2 tile0 offset (top left tile) from IFM_REGION start
-struct npu_set_ifm2_base0_t
-{
-    uint32_t cmd_code : 10;    // NPU_SET_IFM2_BASE0
-    uint32_t must_be_zero : 4; // 0
-    uint32_t payload_size : 2; // Min:1 Max:2
-    uint32_t reserved0 : 16;
-    uint32_t data : 32; // IFM2 tile0 offset (top left tile) from IFM_REGION start
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd1::NPU_SET_IFM2_BASE0) && must_be_zero == 0 && payload_size >= 1 &&
-               payload_size <= 2;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code     = static_cast<uint32_t>(cmd1::NPU_SET_IFM2_BASE0);
-        must_be_zero = 0;
-        payload_size = 1;
-    }
-    CONSTEXPR ::cmd1 get_cmd_code() const
-    {
-        return static_cast<::cmd1>(cmd_code);
-    }
-    CONSTEXPR npu_set_ifm2_base0_t &set_cmd_code(::cmd1 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_data() const
-    {
-        return static_cast<uint32_t>(data);
-    }
-    CONSTEXPR npu_set_ifm2_base0_t &set_data(uint32_t value)
-    {
-        data = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_payload_size() const
-    {
-        return static_cast<uint32_t>(payload_size);
-    }
-    CONSTEXPR npu_set_ifm2_base0_t &set_payload_size(uint32_t value)
-    {
-        payload_size = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Set IFM2 tile1 offset (top right tile) from IFM_REGION start
-struct npu_set_ifm2_base1_t
-{
-    uint32_t cmd_code : 10;    // NPU_SET_IFM2_BASE1
-    uint32_t must_be_zero : 4; // 0
-    uint32_t payload_size : 2; // Min:1 Max:2
-    uint32_t reserved0 : 16;
-    uint32_t data : 32; // IFM2 tile1 offset (top right tile) from IFM_REGION start
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t reserved1 : 16;
+        uint32_t user_reg : 32; //  User defined register
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd1::NPU_SET_IFM2_BASE1) && must_be_zero == 0 && payload_size >= 1 &&
-               payload_size <= 2;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code     = static_cast<uint32_t>(cmd1::NPU_SET_IFM2_BASE1);
-        must_be_zero = 0;
-        payload_size = 1;
-    }
-    CONSTEXPR ::cmd1 get_cmd_code() const
-    {
-        return static_cast<::cmd1>(cmd_code);
-    }
-    CONSTEXPR npu_set_ifm2_base1_t &set_cmd_code(::cmd1 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_data() const
-    {
-        return static_cast<uint32_t>(data);
-    }
-    CONSTEXPR npu_set_ifm2_base1_t &set_data(uint32_t value)
-    {
-        data = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_payload_size() const
-    {
-        return static_cast<uint32_t>(payload_size);
-    }
-    CONSTEXPR npu_set_ifm2_base1_t &set_payload_size(uint32_t value)
+      public:
+        npu_set_user_defined3_t(uint32_t _user_reg) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_USER_DEFINED3)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0),
+            user_reg(static_cast<uint32_t>(_user_reg))
+        {
+        }
+        CONSTEXPR npu_set_user_defined3_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_USER_DEFINED3)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0), user_reg(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_USER_DEFINED3) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_USER_DEFINED3);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd1_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd1_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_user_defined3_t &set_opcode(NPU_NAMESPACE::cmd1_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_user_defined3_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_user_reg() const
+        {
+            return static_cast<uint32_t>(user_reg);
+        }
+        CONSTEXPR npu_set_user_defined3_t &set_user_reg(uint32_t value)
+        {
+            user_reg = static_cast<uint32_t>(value);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("user_reg", std::to_string(user_reg)));
+        }
+#endif
+#endif
+    };
+    // User defined register 4
+    struct npu_set_user_defined4_t
     {
-        payload_size = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Set IFM2 tile2 offset (bottom left tile) from IFM_REGION start
-struct npu_set_ifm2_base2_t
-{
-    uint32_t cmd_code : 10;    // NPU_SET_IFM2_BASE2
-    uint32_t must_be_zero : 4; // 0
-    uint32_t payload_size : 2; // Min:1 Max:2
-    uint32_t reserved0 : 16;
-    uint32_t data : 32; // IFM2 tile2 offset (bottom left tile) from IFM_REGION start
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd1::NPU_SET_IFM2_BASE2) && must_be_zero == 0 && payload_size >= 1 &&
-               payload_size <= 2;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code     = static_cast<uint32_t>(cmd1::NPU_SET_IFM2_BASE2);
-        must_be_zero = 0;
-        payload_size = 1;
-    }
-    CONSTEXPR ::cmd1 get_cmd_code() const
-    {
-        return static_cast<::cmd1>(cmd_code);
-    }
-    CONSTEXPR npu_set_ifm2_base2_t &set_cmd_code(::cmd1 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_data() const
-    {
-        return static_cast<uint32_t>(data);
-    }
-    CONSTEXPR npu_set_ifm2_base2_t &set_data(uint32_t value)
-    {
-        data = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_payload_size() const
-    {
-        return static_cast<uint32_t>(payload_size);
-    }
-    CONSTEXPR npu_set_ifm2_base2_t &set_payload_size(uint32_t value)
-    {
-        payload_size = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Set IFM2 tile3 offset (bottom right tile) from IFM_REGION start
-struct npu_set_ifm2_base3_t
-{
-    uint32_t cmd_code : 10;    // NPU_SET_IFM2_BASE3
-    uint32_t must_be_zero : 4; // 0
-    uint32_t payload_size : 2; // Min:1 Max:2
-    uint32_t reserved0 : 16;
-    uint32_t data : 32; // IFM2 tile3 offset (bottom right tile) from IFM_REGION start
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t reserved1 : 16;
+        uint32_t user_reg : 32; //  User defined register
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd1::NPU_SET_IFM2_BASE3) && must_be_zero == 0 && payload_size >= 1 &&
-               payload_size <= 2;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code     = static_cast<uint32_t>(cmd1::NPU_SET_IFM2_BASE3);
-        must_be_zero = 0;
-        payload_size = 1;
-    }
-    CONSTEXPR ::cmd1 get_cmd_code() const
-    {
-        return static_cast<::cmd1>(cmd_code);
-    }
-    CONSTEXPR npu_set_ifm2_base3_t &set_cmd_code(::cmd1 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_data() const
-    {
-        return static_cast<uint32_t>(data);
-    }
-    CONSTEXPR npu_set_ifm2_base3_t &set_data(uint32_t value)
-    {
-        data = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_payload_size() const
-    {
-        return static_cast<uint32_t>(payload_size);
-    }
-    CONSTEXPR npu_set_ifm2_base3_t &set_payload_size(uint32_t value)
+      public:
+        npu_set_user_defined4_t(uint32_t _user_reg) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_USER_DEFINED4)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0),
+            user_reg(static_cast<uint32_t>(_user_reg))
+        {
+        }
+        CONSTEXPR npu_set_user_defined4_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_USER_DEFINED4)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0), user_reg(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_USER_DEFINED4) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_USER_DEFINED4);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd1_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd1_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_user_defined4_t &set_opcode(NPU_NAMESPACE::cmd1_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_user_defined4_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_user_reg() const
+        {
+            return static_cast<uint32_t>(user_reg);
+        }
+        CONSTEXPR npu_set_user_defined4_t &set_user_reg(uint32_t value)
+        {
+            user_reg = static_cast<uint32_t>(value);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("user_reg", std::to_string(user_reg)));
+        }
+#endif
+#endif
+    };
+    // User defined register 5
+    struct npu_set_user_defined5_t
     {
-        payload_size = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Set IFM2 byte stride between horizontal values
-struct npu_set_ifm2_stride_x_t
-{
-    uint32_t cmd_code : 10;    // NPU_SET_IFM2_STRIDE_X
-    uint32_t must_be_zero : 4; // 0
-    uint32_t payload_size : 2; // Min:1 Max:2
-    uint32_t reserved0 : 16;
-    uint32_t data : 32; // IFM2 byte stride between horizontal values
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd1::NPU_SET_IFM2_STRIDE_X) && must_be_zero == 0 &&
-               payload_size >= 1 && payload_size <= 2;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code     = static_cast<uint32_t>(cmd1::NPU_SET_IFM2_STRIDE_X);
-        must_be_zero = 0;
-        payload_size = 1;
-    }
-    CONSTEXPR ::cmd1 get_cmd_code() const
-    {
-        return static_cast<::cmd1>(cmd_code);
-    }
-    CONSTEXPR npu_set_ifm2_stride_x_t &set_cmd_code(::cmd1 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_data() const
-    {
-        return static_cast<uint32_t>(data);
-    }
-    CONSTEXPR npu_set_ifm2_stride_x_t &set_data(uint32_t value)
-    {
-        data = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_payload_size() const
-    {
-        return static_cast<uint32_t>(payload_size);
-    }
-    CONSTEXPR npu_set_ifm2_stride_x_t &set_payload_size(uint32_t value)
-    {
-        payload_size = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Set IFM2 byte stride between vertical values
-struct npu_set_ifm2_stride_y_t
-{
-    uint32_t cmd_code : 10;    // NPU_SET_IFM2_STRIDE_Y
-    uint32_t must_be_zero : 4; // 0
-    uint32_t payload_size : 2; // Min:1 Max:2
-    uint32_t reserved0 : 16;
-    uint32_t data : 32; // IFM2 byte stride between vertical values
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t reserved1 : 16;
+        uint32_t user_reg : 32; //  User defined register
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
+      public:
+        npu_set_user_defined5_t(uint32_t _user_reg) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_USER_DEFINED5)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0),
+            user_reg(static_cast<uint32_t>(_user_reg))
+        {
+        }
+        CONSTEXPR npu_set_user_defined5_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_USER_DEFINED5)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0), user_reg(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_USER_DEFINED5) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_USER_DEFINED5);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd1_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd1_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_user_defined5_t &set_opcode(NPU_NAMESPACE::cmd1_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_user_defined5_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_user_reg() const
+        {
+            return static_cast<uint32_t>(user_reg);
+        }
+        CONSTEXPR npu_set_user_defined5_t &set_user_reg(uint32_t value)
+        {
+            user_reg = static_cast<uint32_t>(value);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("user_reg", std::to_string(user_reg)));
+        }
+#endif
+#endif
+    };
+    // User defined register 6
+    struct npu_set_user_defined6_t
     {
-        return cmd_code == static_cast<uint32_t>(cmd1::NPU_SET_IFM2_STRIDE_Y) && must_be_zero == 0 &&
-               payload_size >= 1 && payload_size <= 2;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code     = static_cast<uint32_t>(cmd1::NPU_SET_IFM2_STRIDE_Y);
-        must_be_zero = 0;
-        payload_size = 1;
-    }
-    CONSTEXPR ::cmd1 get_cmd_code() const
-    {
-        return static_cast<::cmd1>(cmd_code);
-    }
-    CONSTEXPR npu_set_ifm2_stride_y_t &set_cmd_code(::cmd1 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_data() const
-    {
-        return static_cast<uint32_t>(data);
-    }
-    CONSTEXPR npu_set_ifm2_stride_y_t &set_data(uint32_t value)
-    {
-        data = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_payload_size() const
-    {
-        return static_cast<uint32_t>(payload_size);
-    }
-    CONSTEXPR npu_set_ifm2_stride_y_t &set_payload_size(uint32_t value)
-    {
-        payload_size = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Set IFM2 byte stride between channel blocks (of 16 bytes each block)
-struct npu_set_ifm2_stride_c_t
-{
-    uint32_t cmd_code : 10;    // NPU_SET_IFM2_STRIDE_C
-    uint32_t must_be_zero : 4; // 0
-    uint32_t payload_size : 2; // Min:1 Max:2
-    uint32_t reserved0 : 16;
-    uint32_t data : 32; // IFM2 byte stride between channel blocks (of 16 bytes each block)
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd1::NPU_SET_IFM2_STRIDE_C) && must_be_zero == 0 &&
-               payload_size >= 1 && payload_size <= 2;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code     = static_cast<uint32_t>(cmd1::NPU_SET_IFM2_STRIDE_C);
-        must_be_zero = 0;
-        payload_size = 1;
-    }
-    CONSTEXPR ::cmd1 get_cmd_code() const
-    {
-        return static_cast<::cmd1>(cmd_code);
-    }
-    CONSTEXPR npu_set_ifm2_stride_c_t &set_cmd_code(::cmd1 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_data() const
-    {
-        return static_cast<uint32_t>(data);
-    }
-    CONSTEXPR npu_set_ifm2_stride_c_t &set_data(uint32_t value)
-    {
-        data = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_payload_size() const
-    {
-        return static_cast<uint32_t>(payload_size);
-    }
-    CONSTEXPR npu_set_ifm2_stride_c_t &set_payload_size(uint32_t value)
-    {
-        payload_size = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Set Weight stream byte offset in WEIGHT_REGION
-struct npu_set_weight1_base_t
-{
-    uint32_t cmd_code : 10;    // NPU_SET_WEIGHT1_BASE
-    uint32_t must_be_zero : 4; // 0
-    uint32_t payload_size : 2; // Min:1 Max:2
-    uint32_t param : 16;
-    uint32_t data : 32; // Weight stream byte offset in WEIGHT_REGION
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t reserved1 : 16;
+        uint32_t user_reg : 32; //  User defined register
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd1::NPU_SET_WEIGHT1_BASE) && must_be_zero == 0 &&
-               payload_size >= 1 && payload_size <= 2;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code     = static_cast<uint32_t>(cmd1::NPU_SET_WEIGHT1_BASE);
-        must_be_zero = 0;
-        payload_size = 1;
-    }
-    CONSTEXPR ::cmd1 get_cmd_code() const
-    {
-        return static_cast<::cmd1>(cmd_code);
-    }
-    CONSTEXPR npu_set_weight1_base_t &set_cmd_code(::cmd1 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_data() const
-    {
-        return static_cast<uint32_t>(data);
-    }
-    CONSTEXPR npu_set_weight1_base_t &set_data(uint32_t value)
-    {
-        data = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_param() const
-    {
-        return static_cast<uint32_t>(param);
-    }
-    CONSTEXPR npu_set_weight1_base_t &set_param(uint32_t value)
-    {
-        param = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_payload_size() const
-    {
-        return static_cast<uint32_t>(payload_size);
-    }
-    CONSTEXPR npu_set_weight1_base_t &set_payload_size(uint32_t value)
+      public:
+        npu_set_user_defined6_t(uint32_t _user_reg) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_USER_DEFINED6)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0),
+            user_reg(static_cast<uint32_t>(_user_reg))
+        {
+        }
+        CONSTEXPR npu_set_user_defined6_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_USER_DEFINED6)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0), user_reg(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_USER_DEFINED6) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_USER_DEFINED6);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd1_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd1_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_user_defined6_t &set_opcode(NPU_NAMESPACE::cmd1_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_user_defined6_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_user_reg() const
+        {
+            return static_cast<uint32_t>(user_reg);
+        }
+        CONSTEXPR npu_set_user_defined6_t &set_user_reg(uint32_t value)
+        {
+            user_reg = static_cast<uint32_t>(value);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("user_reg", std::to_string(user_reg)));
+        }
+#endif
+#endif
+    };
+    // User defined register 7
+    struct npu_set_user_defined7_t
     {
-        payload_size = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Set Weight stream byte length (unsigned 32 bits)
-struct npu_set_weight1_length_t
-{
-    uint32_t cmd_code : 10;    // NPU_SET_WEIGHT1_LENGTH
-    uint32_t must_be_zero : 4; // 0
-    uint32_t payload_size : 2; // Min:1 Max:2
-    uint32_t reserved0 : 16;
-    uint32_t data : 32; // Weight stream byte length (unsigned 32 bits)
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd1::NPU_SET_WEIGHT1_LENGTH) && must_be_zero == 0 &&
-               payload_size >= 1 && payload_size <= 2;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code     = static_cast<uint32_t>(cmd1::NPU_SET_WEIGHT1_LENGTH);
-        must_be_zero = 0;
-        payload_size = 1;
-    }
-    CONSTEXPR ::cmd1 get_cmd_code() const
-    {
-        return static_cast<::cmd1>(cmd_code);
-    }
-    CONSTEXPR npu_set_weight1_length_t &set_cmd_code(::cmd1 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_data() const
-    {
-        return static_cast<uint32_t>(data);
-    }
-    CONSTEXPR npu_set_weight1_length_t &set_data(uint32_t value)
-    {
-        data = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_payload_size() const
-    {
-        return static_cast<uint32_t>(payload_size);
-    }
-    CONSTEXPR npu_set_weight1_length_t &set_payload_size(uint32_t value)
-    {
-        payload_size = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Set Scale and bias stream input byte offset from SCALE_REGION
-struct npu_set_scale1_base_t
-{
-    uint32_t cmd_code : 10;    // NPU_SET_SCALE1_BASE
-    uint32_t must_be_zero : 4; // 0
-    uint32_t payload_size : 2; // Min:1 Max:2
-    uint32_t param : 16;
-    uint32_t data : 32; // Scale and bias stream input byte offset from SCALE_REGION
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t reserved1 : 16;
+        uint32_t user_reg : 32; //  User defined register
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd1::NPU_SET_SCALE1_BASE) && must_be_zero == 0 && payload_size >= 1 &&
-               payload_size <= 2;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code     = static_cast<uint32_t>(cmd1::NPU_SET_SCALE1_BASE);
-        must_be_zero = 0;
-        payload_size = 1;
-    }
-    CONSTEXPR ::cmd1 get_cmd_code() const
-    {
-        return static_cast<::cmd1>(cmd_code);
-    }
-    CONSTEXPR npu_set_scale1_base_t &set_cmd_code(::cmd1 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_data() const
-    {
-        return static_cast<uint32_t>(data);
-    }
-    CONSTEXPR npu_set_scale1_base_t &set_data(uint32_t value)
-    {
-        data = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_param() const
-    {
-        return static_cast<uint32_t>(param);
-    }
-    CONSTEXPR npu_set_scale1_base_t &set_param(uint32_t value)
-    {
-        param = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_payload_size() const
-    {
-        return static_cast<uint32_t>(payload_size);
-    }
-    CONSTEXPR npu_set_scale1_base_t &set_payload_size(uint32_t value)
-    {
-        payload_size = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
-};
-
-// Set Scale and bias stream input byte length (unsigned 20 bits)
-struct npu_set_scale1_length_t
-{
-    uint32_t cmd_code : 10;    // NPU_SET_SCALE1_LENGTH
-    uint32_t must_be_zero : 4; // 0
-    uint32_t payload_size : 2; // Min:1 Max:2
-    uint32_t reserved0 : 16;
-    uint32_t data : 32; // Scale and bias stream input byte length (unsigned 20 bits)
+      public:
+        npu_set_user_defined7_t(uint32_t _user_reg) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_USER_DEFINED7)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0),
+            user_reg(static_cast<uint32_t>(_user_reg))
+        {
+        }
+        CONSTEXPR npu_set_user_defined7_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_USER_DEFINED7)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0), user_reg(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_USER_DEFINED7) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_USER_DEFINED7);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd1_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd1_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_user_defined7_t &set_opcode(NPU_NAMESPACE::cmd1_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_user_defined7_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_user_reg() const
+        {
+            return static_cast<uint32_t>(user_reg);
+        }
+        CONSTEXPR npu_set_user_defined7_t &set_user_reg(uint32_t value)
+        {
+            user_reg = static_cast<uint32_t>(value);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("user_reg", std::to_string(user_reg)));
+        }
+#endif
+#endif
+    };
 #ifdef __cplusplus
-    CONSTEXPR bool valid() const
-    {
-        return cmd_code == static_cast<uint32_t>(cmd1::NPU_SET_SCALE1_LENGTH) && must_be_zero == 0 &&
-               payload_size >= 1 && payload_size <= 2;
-    }
-    CONSTEXPR void init()
-    {
-        cmd_code     = static_cast<uint32_t>(cmd1::NPU_SET_SCALE1_LENGTH);
-        must_be_zero = 0;
-        payload_size = 1;
-    }
-    CONSTEXPR ::cmd1 get_cmd_code() const
-    {
-        return static_cast<::cmd1>(cmd_code);
-    }
-    CONSTEXPR npu_set_scale1_length_t &set_cmd_code(::cmd1 value)
-    {
-        cmd_code = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_data() const
-    {
-        return static_cast<uint32_t>(data);
-    }
-    CONSTEXPR npu_set_scale1_length_t &set_data(uint32_t value)
-    {
-        data = static_cast<uint32_t>(value);
-        return *this;
-    }
-    CONSTEXPR uint32_t get_payload_size() const
-    {
-        return static_cast<uint32_t>(payload_size);
-    }
-    CONSTEXPR npu_set_scale1_length_t &set_payload_size(uint32_t value)
-    {
-        payload_size = static_cast<uint32_t>(value);
-        return *this;
-    }
-#endif //__cplusplus
 };
-
-#define NPU_DATA_STRUCTS                                                                                               \
-    NPU_STRUCT(command_no_payload)                                                                                     \
-    NPU_STRUCT(command_with_payload)                                                                                   \
-    NPU_STRUCT(npu_op_stop)                                                                                            \
-    NPU_STRUCT(npu_op_irq)                                                                                             \
-    NPU_STRUCT(npu_op_conv)                                                                                            \
-    NPU_STRUCT(npu_op_depthwise)                                                                                       \
-    NPU_STRUCT(npu_op_pool)                                                                                            \
-    NPU_STRUCT(npu_op_elementwise)                                                                                     \
-    NPU_STRUCT(npu_op_dma_start)                                                                                       \
-    NPU_STRUCT(npu_op_dma_wait)                                                                                        \
-    NPU_STRUCT(npu_op_kernel_wait)                                                                                     \
-    NPU_STRUCT(npu_op_pmu_mask)                                                                                        \
-    NPU_STRUCT(npu_set_ifm_pad_top)                                                                                    \
-    NPU_STRUCT(npu_set_ifm_pad_left)                                                                                   \
-    NPU_STRUCT(npu_set_ifm_pad_right)                                                                                  \
-    NPU_STRUCT(npu_set_ifm_pad_bottom)                                                                                 \
-    NPU_STRUCT(npu_set_ifm_depth_m1)                                                                                   \
-    NPU_STRUCT(npu_set_ifm_precision)                                                                                  \
-    NPU_STRUCT(npu_set_ifm_upscale)                                                                                    \
-    NPU_STRUCT(npu_set_ifm_zero_point)                                                                                 \
-    NPU_STRUCT(npu_set_ifm_width0_m1)                                                                                  \
-    NPU_STRUCT(npu_set_ifm_height0_m1)                                                                                 \
-    NPU_STRUCT(npu_set_ifm_height1_m1)                                                                                 \
-    NPU_STRUCT(npu_set_ifm_ib_end)                                                                                     \
-    NPU_STRUCT(npu_set_ifm_region)                                                                                     \
-    NPU_STRUCT(npu_set_ofm_width_m1)                                                                                   \
-    NPU_STRUCT(npu_set_ofm_height_m1)                                                                                  \
-    NPU_STRUCT(npu_set_ofm_depth_m1)                                                                                   \
-    NPU_STRUCT(npu_set_ofm_precision)                                                                                  \
-    NPU_STRUCT(npu_set_ofm_blk_width_m1)                                                                               \
-    NPU_STRUCT(npu_set_ofm_blk_height_m1)                                                                              \
-    NPU_STRUCT(npu_set_ofm_blk_depth_m1)                                                                               \
-    NPU_STRUCT(npu_set_ofm_zero_point)                                                                                 \
-    NPU_STRUCT(npu_set_ofm_width0_m1)                                                                                  \
-    NPU_STRUCT(npu_set_ofm_height0_m1)                                                                                 \
-    NPU_STRUCT(npu_set_ofm_height1_m1)                                                                                 \
-    NPU_STRUCT(npu_set_ofm_region)                                                                                     \
-    NPU_STRUCT(npu_set_kernel_width_m1)                                                                                \
-    NPU_STRUCT(npu_set_kernel_height_m1)                                                                               \
-    NPU_STRUCT(npu_set_kernel_stride)                                                                                  \
-    NPU_STRUCT(npu_set_parallel_mode)                                                                                  \
-    NPU_STRUCT(npu_set_acc_format)                                                                                     \
-    NPU_STRUCT(npu_set_activation)                                                                                     \
-    NPU_STRUCT(npu_set_activation_min)                                                                                 \
-    NPU_STRUCT(npu_set_activation_max)                                                                                 \
-    NPU_STRUCT(npu_set_weight_region)                                                                                  \
-    NPU_STRUCT(npu_set_scale_region)                                                                                   \
-    NPU_STRUCT(npu_set_ab_start)                                                                                       \
-    NPU_STRUCT(npu_set_blockdep)                                                                                       \
-    NPU_STRUCT(npu_set_dma0_src_region)                                                                                \
-    NPU_STRUCT(npu_set_dma0_dst_region)                                                                                \
-    NPU_STRUCT(npu_set_dma0_size0)                                                                                     \
-    NPU_STRUCT(npu_set_dma0_size1)                                                                                     \
-    NPU_STRUCT(npu_set_ifm2_broadcast)                                                                                 \
-    NPU_STRUCT(npu_set_ifm2_scalar)                                                                                    \
-    NPU_STRUCT(npu_set_ifm2_precision)                                                                                 \
-    NPU_STRUCT(npu_set_ifm2_zero_point)                                                                                \
-    NPU_STRUCT(npu_set_ifm2_width0_m1)                                                                                 \
-    NPU_STRUCT(npu_set_ifm2_height0_m1)                                                                                \
-    NPU_STRUCT(npu_set_ifm2_height1_m1)                                                                                \
-    NPU_STRUCT(npu_set_ifm2_ib_start)                                                                                  \
-    NPU_STRUCT(npu_set_ifm2_region)                                                                                    \
-    NPU_STRUCT(npu_set_ifm_base0)                                                                                      \
-    NPU_STRUCT(npu_set_ifm_base1)                                                                                      \
-    NPU_STRUCT(npu_set_ifm_base2)                                                                                      \
-    NPU_STRUCT(npu_set_ifm_base3)                                                                                      \
-    NPU_STRUCT(npu_set_ifm_stride_x)                                                                                   \
-    NPU_STRUCT(npu_set_ifm_stride_y)                                                                                   \
-    NPU_STRUCT(npu_set_ifm_stride_c)                                                                                   \
-    NPU_STRUCT(npu_set_ofm_base0)                                                                                      \
-    NPU_STRUCT(npu_set_ofm_base1)                                                                                      \
-    NPU_STRUCT(npu_set_ofm_base2)                                                                                      \
-    NPU_STRUCT(npu_set_ofm_base3)                                                                                      \
-    NPU_STRUCT(npu_set_ofm_stride_x)                                                                                   \
-    NPU_STRUCT(npu_set_ofm_stride_y)                                                                                   \
-    NPU_STRUCT(npu_set_ofm_stride_c)                                                                                   \
-    NPU_STRUCT(npu_set_weight_base)                                                                                    \
-    NPU_STRUCT(npu_set_weight_length)                                                                                  \
-    NPU_STRUCT(npu_set_scale_base)                                                                                     \
-    NPU_STRUCT(npu_set_scale_length)                                                                                   \
-    NPU_STRUCT(npu_set_ofm_scale)                                                                                      \
-    NPU_STRUCT(npu_set_opa_scale)                                                                                      \
-    NPU_STRUCT(npu_set_opb_scale)                                                                                      \
-    NPU_STRUCT(npu_set_dma0_src)                                                                                       \
-    NPU_STRUCT(npu_set_dma0_dst)                                                                                       \
-    NPU_STRUCT(npu_set_dma0_len)                                                                                       \
-    NPU_STRUCT(npu_set_dma0_skip0)                                                                                     \
-    NPU_STRUCT(npu_set_dma0_skip1)                                                                                     \
-    NPU_STRUCT(npu_set_ifm2_base0)                                                                                     \
-    NPU_STRUCT(npu_set_ifm2_base1)                                                                                     \
-    NPU_STRUCT(npu_set_ifm2_base2)                                                                                     \
-    NPU_STRUCT(npu_set_ifm2_base3)                                                                                     \
-    NPU_STRUCT(npu_set_ifm2_stride_x)                                                                                  \
-    NPU_STRUCT(npu_set_ifm2_stride_y)                                                                                  \
-    NPU_STRUCT(npu_set_ifm2_stride_c)                                                                                  \
-    NPU_STRUCT(npu_set_weight1_base)                                                                                   \
-    NPU_STRUCT(npu_set_weight1_length)                                                                                 \
-    NPU_STRUCT(npu_set_scale1_base)                                                                                    \
-    NPU_STRUCT(npu_set_scale1_length)
+#endif
 #define NPU_OP_STRUCTS                                                                                                 \
     NPU_OP_(stop)                                                                                                      \
     NPU_OP_(irq)                                                                                                       \
@@ -13801,6 +23553,7 @@
     NPU_OP_(dma_wait)                                                                                                  \
     NPU_OP_(kernel_wait)                                                                                               \
     NPU_OP_(pmu_mask)
+
 #define NPU_SET_STRUCTS                                                                                                \
     NPU_SET_(ifm_pad_top)                                                                                              \
     NPU_SET_(ifm_pad_left)                                                                                             \
@@ -13830,7 +23583,6 @@
     NPU_SET_(kernel_width_m1)                                                                                          \
     NPU_SET_(kernel_height_m1)                                                                                         \
     NPU_SET_(kernel_stride)                                                                                            \
-    NPU_SET_(parallel_mode)                                                                                            \
     NPU_SET_(acc_format)                                                                                               \
     NPU_SET_(activation)                                                                                               \
     NPU_SET_(activation_min)                                                                                           \
@@ -13876,8 +23628,6 @@
     NPU_SET_(dma0_src)                                                                                                 \
     NPU_SET_(dma0_dst)                                                                                                 \
     NPU_SET_(dma0_len)                                                                                                 \
-    NPU_SET_(dma0_skip0)                                                                                               \
-    NPU_SET_(dma0_skip1)                                                                                               \
     NPU_SET_(ifm2_base0)                                                                                               \
     NPU_SET_(ifm2_base1)                                                                                               \
     NPU_SET_(ifm2_base2)                                                                                               \
@@ -13885,105 +23635,147 @@
     NPU_SET_(ifm2_stride_x)                                                                                            \
     NPU_SET_(ifm2_stride_y)                                                                                            \
     NPU_SET_(ifm2_stride_c)                                                                                            \
-    NPU_SET_(weight1_base)                                                                                             \
-    NPU_SET_(weight1_length)                                                                                           \
-    NPU_SET_(scale1_base)                                                                                              \
-    NPU_SET_(scale1_length)
-#define COMMAND_STRUCTS                                                                                                \
-    COMMAND_(no_payload)                                                                                               \
-    COMMAND_(with_payload)
+    NPU_SET_(user_defined0)                                                                                            \
+    NPU_SET_(user_defined1)                                                                                            \
+    NPU_SET_(user_defined2)                                                                                            \
+    NPU_SET_(user_defined3)                                                                                            \
+    NPU_SET_(user_defined4)                                                                                            \
+    NPU_SET_(user_defined5)                                                                                            \
+    NPU_SET_(user_defined6)                                                                                            \
+    NPU_SET_(user_defined7)
 
-#define EXPAND_ACC_FORMAT(FUNC, SEP)                                                                                   \
-    FUNC(acc_format, INT_32BIT) SEP FUNC(acc_format, INT_40BIT) SEP FUNC(acc_format, FP_S5_10)
+#define EXPAND_ACC_FORMAT(FUNC, SEP) FUNC(acc_format, I32) SEP FUNC(acc_format, I40) SEP FUNC(acc_format, F16)
 
-#define EXPAND_ACTIVATION(FUNC, SEP)                                                                                   \
-    FUNC(activation, NONE)                                                                                             \
-    SEP FUNC(activation, TANH) SEP FUNC(activation, SIGMOID) SEP FUNC(activation, LUT_START)                           \
-        SEP FUNC(activation, LUT_END)
+#define EXPAND_ACTIVATION_CLIP_RANGE(FUNC, SEP)                                                                        \
+    FUNC(activation_clip_range, OFM_PRECISION)                                                                         \
+    SEP FUNC(activation_clip_range, FORCE_UINT8) SEP FUNC(activation_clip_range, FORCE_INT8)                           \
+        SEP FUNC(activation_clip_range, FORCE_INT16)
 
-#define EXPAND_AXI_MEM_ENCODING_TYPE(FUNC, SEP)                                                                        \
-    FUNC(axi_mem_encoding_type, DEVICE_NON_BUFFERABLE)                                                                 \
-    SEP FUNC(axi_mem_encoding_type, DEVICE_BUFFERABLE)                                                                 \
-        SEP FUNC(axi_mem_encoding_type, NORMAL_NON_CACHEABLE_NON_BUFFERABLE)                                           \
-            SEP FUNC(axi_mem_encoding_type, NORMAL_NON_CACHEABLE_BUFFERABLE)                                           \
-                SEP FUNC(axi_mem_encoding_type, WRITE_THROUGH_NO_ALLOCATE)                                             \
-                    SEP FUNC(axi_mem_encoding_type, WRITE_THROUGH_READ_ALLOCATE)                                       \
-                        SEP FUNC(axi_mem_encoding_type, WRITE_THROUGH_WRITE_ALLOCATE)                                  \
-                            SEP FUNC(axi_mem_encoding_type, WRITE_THROUGH_READ_AND_WRITE_ALLOCATE)                     \
-                                SEP FUNC(axi_mem_encoding_type, WRITE_BACK_NO_ALLOCATE)                                \
-                                    SEP FUNC(axi_mem_encoding_type, WRITE_BACK_READ_ALLOCATE)                          \
-                                        SEP FUNC(axi_mem_encoding_type, WRITE_BACK_WRITE_ALLOCATE)                     \
-                                            SEP FUNC(axi_mem_encoding_type, WRITE_BACK_READ_AND_WRITE_ALLOCATE)        \
-                                                SEP FUNC(axi_mem_encoding_type, RESERVED_12)                           \
-                                                    SEP FUNC(axi_mem_encoding_type, RESERVED_13)                       \
-                                                        SEP FUNC(axi_mem_encoding_type, RESERVED_14)                   \
-                                                            SEP FUNC(axi_mem_encoding_type, RESERVED_15)
+#define EXPAND_ACTIVATION_FORMAT(FUNC, SEP) FUNC(activation_format, NHWC) SEP FUNC(activation_format, NHCWB16)
 
-#define EXPAND_CLIP_RANGE(FUNC, SEP)                                                                                   \
-    FUNC(clip_range, OFM_PRECISION)                                                                                    \
-    SEP FUNC(clip_range, FORCE_UINT8) SEP FUNC(clip_range, FORCE_INT8) SEP FUNC(clip_range, FORCE_INT16)
+#define EXPAND_ACTIVATION_FUNCTION(FUNC, SEP)                                                                          \
+    FUNC(activation_function, RELU)                                                                                    \
+    SEP FUNC(activation_function, TANH) SEP FUNC(activation_function, SIGMOID) SEP FUNC(activation_function, TABLE_0)  \
+        SEP FUNC(activation_function, TABLE_1) SEP FUNC(activation_function, TABLE_2)                                  \
+            SEP FUNC(activation_function, TABLE_3) SEP FUNC(activation_function, TABLE_4)                              \
+                SEP FUNC(activation_function, TABLE_5) SEP FUNC(activation_function, TABLE_6)                          \
+                    SEP FUNC(activation_function, TABLE_7)
 
-#define EXPAND_CMD0(FUNC, SEP)                                                                                         \
-    FUNC(cmd0, NPU_OP_STOP)                                                                                            \
-    SEP FUNC(cmd0, NPU_OP_IRQ) SEP FUNC(cmd0, NPU_OP_CONV) SEP FUNC(cmd0, NPU_OP_DEPTHWISE) SEP FUNC(                  \
-        cmd0, NPU_OP_POOL) SEP FUNC(cmd0, NPU_OP_ELEMENTWISE) SEP FUNC(cmd0, NPU_OP_DMA_START)                         \
-        SEP FUNC(cmd0, NPU_OP_DMA_WAIT) SEP FUNC(cmd0, NPU_OP_KERNEL_WAIT) SEP FUNC(cmd0, NPU_OP_PMU_MASK) SEP FUNC(   \
-            cmd0, NPU_SET_IFM_PAD_TOP) SEP FUNC(cmd0, NPU_SET_IFM_PAD_LEFT) SEP FUNC(cmd0, NPU_SET_IFM_PAD_RIGHT)      \
-            SEP FUNC(cmd0, NPU_SET_IFM_PAD_BOTTOM) SEP FUNC(cmd0, NPU_SET_IFM_DEPTH_M1) SEP FUNC(                      \
-                cmd0, NPU_SET_IFM_PRECISION) SEP FUNC(cmd0, NPU_SET_IFM_UPSCALE)                                       \
-                SEP FUNC(cmd0, NPU_SET_IFM_ZERO_POINT) SEP FUNC(cmd0, NPU_SET_IFM_WIDTH0_M1) SEP FUNC(                 \
-                    cmd0, NPU_SET_IFM_HEIGHT0_M1) SEP FUNC(cmd0, NPU_SET_IFM_HEIGHT1_M1) SEP FUNC(cmd0,                \
-                                                                                                  NPU_SET_IFM_IB_END)  \
-                    SEP FUNC(cmd0, NPU_SET_IFM_REGION) SEP FUNC(cmd0, NPU_SET_OFM_WIDTH_M1) SEP FUNC(                  \
-                        cmd0, NPU_SET_OFM_HEIGHT_M1) SEP FUNC(cmd0, NPU_SET_OFM_DEPTH_M1)                              \
-                        SEP FUNC(cmd0, NPU_SET_OFM_PRECISION) SEP FUNC(cmd0, NPU_SET_OFM_BLK_WIDTH_M1) SEP FUNC(       \
-                            cmd0, NPU_SET_OFM_BLK_HEIGHT_M1) SEP FUNC(cmd0, NPU_SET_OFM_BLK_DEPTH_M1)                  \
-                            SEP FUNC(cmd0, NPU_SET_OFM_ZERO_POINT) SEP FUNC(cmd0, NPU_SET_OFM_WIDTH0_M1) SEP FUNC(     \
-                                cmd0, NPU_SET_OFM_HEIGHT0_M1) SEP FUNC(cmd0, NPU_SET_OFM_HEIGHT1_M1)                   \
-                                SEP FUNC(cmd0, NPU_SET_OFM_REGION) SEP FUNC(cmd0, NPU_SET_KERNEL_WIDTH_M1) SEP FUNC(   \
-                                    cmd0, NPU_SET_KERNEL_HEIGHT_M1) SEP FUNC(cmd0, NPU_SET_KERNEL_STRIDE)              \
-                                    SEP FUNC(cmd0, NPU_SET_PARALLEL_MODE) SEP FUNC(cmd0, NPU_SET_ACC_FORMAT) SEP FUNC( \
-                                        cmd0, NPU_SET_ACTIVATION) SEP FUNC(cmd0, NPU_SET_ACTIVATION_MIN)               \
-                                        SEP FUNC(cmd0, NPU_SET_ACTIVATION_MAX) SEP FUNC(cmd0, NPU_SET_WEIGHT_REGION)   \
-                                            SEP FUNC(cmd0, NPU_SET_SCALE_REGION) SEP FUNC(cmd0, NPU_SET_AB_START)      \
-                                                SEP FUNC(cmd0,                                                         \
-                                                         NPU_SET_BLOCKDEP) SEP FUNC(cmd0, NPU_SET_DMA0_SRC_REGION)     \
-                                                    SEP FUNC(cmd0, NPU_SET_DMA0_DST_REGION) SEP FUNC(                  \
-                                                        cmd0, NPU_SET_DMA0_SIZE0) SEP FUNC(cmd0, NPU_SET_DMA0_SIZE1)   \
-                                                        SEP FUNC(cmd0, NPU_SET_IFM2_BROADCAST)                         \
-                                                            SEP FUNC(cmd0, NPU_SET_IFM2_SCALAR)                        \
-                                                                SEP FUNC(cmd0, NPU_SET_IFM2_PRECISION) SEP FUNC(       \
-                                                                    cmd0, NPU_SET_IFM2_ZERO_POINT)                     \
-                                                                    SEP FUNC(cmd0, NPU_SET_IFM2_WIDTH0_M1) SEP FUNC(   \
-                                                                        cmd0, NPU_SET_IFM2_HEIGHT0_M1)                 \
-                                                                        SEP FUNC(cmd0, NPU_SET_IFM2_HEIGHT1_M1)        \
-                                                                            SEP FUNC(cmd0, NPU_SET_IFM2_IB_START)      \
-                                                                                SEP FUNC(cmd0, NPU_SET_IFM2_REGION)
+#define EXPAND_ACTIVATION_PRECISION(FUNC, SEP)                                                                         \
+    FUNC(activation_precision, B8)                                                                                     \
+    SEP FUNC(activation_precision, B16) SEP FUNC(activation_precision, B32) SEP FUNC(activation_precision, B64)
 
-#define EXPAND_CMD1(FUNC, SEP)                                                                                         \
-    FUNC(cmd1, NPU_SET_IFM_BASE0)                                                                                      \
-    SEP FUNC(cmd1, NPU_SET_IFM_BASE1) SEP FUNC(cmd1, NPU_SET_IFM_BASE2) SEP FUNC(cmd1, NPU_SET_IFM_BASE3)              \
-        SEP FUNC(cmd1, NPU_SET_IFM_STRIDE_X) SEP FUNC(cmd1, NPU_SET_IFM_STRIDE_Y) SEP FUNC(cmd1, NPU_SET_IFM_STRIDE_C) \
-            SEP FUNC(cmd1, NPU_SET_OFM_BASE0) SEP FUNC(cmd1, NPU_SET_OFM_BASE1) SEP FUNC(cmd1, NPU_SET_OFM_BASE2)      \
-                SEP FUNC(cmd1, NPU_SET_OFM_BASE3) SEP FUNC(cmd1, NPU_SET_OFM_STRIDE_X)                                 \
-                    SEP FUNC(cmd1, NPU_SET_OFM_STRIDE_Y) SEP FUNC(cmd1, NPU_SET_OFM_STRIDE_C)                          \
-                        SEP FUNC(cmd1, NPU_SET_WEIGHT_BASE) SEP FUNC(cmd1, NPU_SET_WEIGHT_LENGTH)                      \
-                            SEP FUNC(cmd1, NPU_SET_SCALE_BASE) SEP FUNC(cmd1, NPU_SET_SCALE_LENGTH)                    \
-                                SEP FUNC(cmd1, NPU_SET_OFM_SCALE) SEP FUNC(cmd1, NPU_SET_OPA_SCALE)                    \
-                                    SEP FUNC(cmd1, NPU_SET_OPB_SCALE) SEP FUNC(cmd1, NPU_SET_DMA0_SRC)                 \
-                                        SEP FUNC(cmd1, NPU_SET_DMA0_DST) SEP FUNC(cmd1, NPU_SET_DMA0_LEN) SEP FUNC(    \
-                                            cmd1, NPU_SET_DMA0_SKIP0) SEP FUNC(cmd1, NPU_SET_DMA0_SKIP1)               \
-                                            SEP FUNC(cmd1, NPU_SET_IFM2_BASE0) SEP FUNC(cmd1, NPU_SET_IFM2_BASE1)      \
-                                                SEP FUNC(cmd1, NPU_SET_IFM2_BASE2) SEP FUNC(cmd1, NPU_SET_IFM2_BASE3)  \
-                                                    SEP FUNC(cmd1, NPU_SET_IFM2_STRIDE_X)                              \
-                                                        SEP FUNC(cmd1, NPU_SET_IFM2_STRIDE_Y)                          \
-                                                            SEP FUNC(cmd1, NPU_SET_IFM2_STRIDE_C)                      \
-                                                                SEP FUNC(cmd1, NPU_SET_WEIGHT1_BASE)                   \
-                                                                    SEP FUNC(cmd1, NPU_SET_WEIGHT1_LENGTH)             \
-                                                                        SEP FUNC(cmd1, NPU_SET_SCALE1_BASE)            \
-                                                                            SEP FUNC(cmd1, NPU_SET_SCALE1_LENGTH)
+#define EXPAND_ACTIVATION_TYPE(FUNC, SEP) FUNC(activation_type, UNSIGNED) SEP FUNC(activation_type, SIGNED)
 
-#define EXPAND_DATA_FORMAT(FUNC, SEP) FUNC(data_format, NHWC) SEP FUNC(data_format, NHCWB16)
+#define EXPAND_AXI_MEM_ENCODING(FUNC, SEP)                                                                             \
+    FUNC(axi_mem_encoding, DEVICE_NON_BUFFERABLE)                                                                      \
+    SEP FUNC(axi_mem_encoding, DEVICE_BUFFERABLE) SEP FUNC(axi_mem_encoding, NORMAL_NON_CACHEABLE_NON_BUFFERABLE)      \
+        SEP FUNC(axi_mem_encoding, NORMAL_NON_CACHEABLE_BUFFERABLE)                                                    \
+            SEP FUNC(axi_mem_encoding, WRITE_THROUGH_NO_ALLOCATE)                                                      \
+                SEP FUNC(axi_mem_encoding, WRITE_THROUGH_READ_ALLOCATE)                                                \
+                    SEP FUNC(axi_mem_encoding, WRITE_THROUGH_WRITE_ALLOCATE)                                           \
+                        SEP FUNC(axi_mem_encoding, WRITE_THROUGH_READ_AND_WRITE_ALLOCATE)                              \
+                            SEP FUNC(axi_mem_encoding, WRITE_BACK_NO_ALLOCATE)                                         \
+                                SEP FUNC(axi_mem_encoding, WRITE_BACK_READ_ALLOCATE)                                   \
+                                    SEP FUNC(axi_mem_encoding, WRITE_BACK_WRITE_ALLOCATE)                              \
+                                        SEP FUNC(axi_mem_encoding, WRITE_BACK_READ_AND_WRITE_ALLOCATE)
+
+#define EXPAND_BROADCAST_MODE(FUNC, SEP) FUNC(broadcast_mode, DISABLE) SEP FUNC(broadcast_mode, ENABLE)
+
+#define EXPAND_CMD0_OPCODE(FUNC, SEP)                                                                                  \
+    FUNC(cmd0_opcode, NPU_OP_STOP)                                                                                     \
+    SEP FUNC(cmd0_opcode, NPU_OP_IRQ) SEP FUNC(cmd0_opcode, NPU_OP_CONV) SEP FUNC(                                     \
+        cmd0_opcode, NPU_OP_DEPTHWISE) SEP FUNC(cmd0_opcode, NPU_OP_POOL) SEP FUNC(cmd0_opcode, NPU_OP_ELEMENTWISE)    \
+        SEP FUNC(cmd0_opcode, NPU_OP_DMA_START) SEP FUNC(cmd0_opcode, NPU_OP_DMA_WAIT) SEP FUNC(                       \
+            cmd0_opcode, NPU_OP_KERNEL_WAIT) SEP FUNC(cmd0_opcode, NPU_OP_PMU_MASK) SEP FUNC(cmd0_opcode,              \
+                                                                                             NPU_SET_IFM_PAD_TOP)      \
+            SEP FUNC(cmd0_opcode, NPU_SET_IFM_PAD_LEFT) SEP FUNC(cmd0_opcode, NPU_SET_IFM_PAD_RIGHT) SEP FUNC(         \
+                cmd0_opcode, NPU_SET_IFM_PAD_BOTTOM) SEP FUNC(cmd0_opcode,                                             \
+                                                              NPU_SET_IFM_DEPTH_M1) SEP FUNC(cmd0_opcode,              \
+                                                                                             NPU_SET_IFM_PRECISION)    \
+                SEP FUNC(cmd0_opcode, NPU_SET_IFM_UPSCALE) SEP FUNC(cmd0_opcode, NPU_SET_IFM_ZERO_POINT) SEP FUNC(     \
+                    cmd0_opcode, NPU_SET_IFM_WIDTH0_M1) SEP FUNC(cmd0_opcode, NPU_SET_IFM_HEIGHT0_M1)                  \
+                    SEP FUNC(cmd0_opcode, NPU_SET_IFM_HEIGHT1_M1) SEP FUNC(cmd0_opcode, NPU_SET_IFM_IB_END) SEP FUNC(  \
+                        cmd0_opcode, NPU_SET_IFM_REGION) SEP FUNC(cmd0_opcode, NPU_SET_OFM_WIDTH_M1)                   \
+                        SEP FUNC(cmd0_opcode, NPU_SET_OFM_HEIGHT_M1) SEP FUNC(cmd0_opcode, NPU_SET_OFM_DEPTH_M1)       \
+                            SEP FUNC(cmd0_opcode, NPU_SET_OFM_PRECISION) SEP FUNC(                                     \
+                                cmd0_opcode, NPU_SET_OFM_BLK_WIDTH_M1) SEP FUNC(cmd0_opcode,                           \
+                                                                                NPU_SET_OFM_BLK_HEIGHT_M1)             \
+                                SEP FUNC(cmd0_opcode, NPU_SET_OFM_BLK_DEPTH_M1) SEP FUNC(                              \
+                                    cmd0_opcode, NPU_SET_OFM_ZERO_POINT) SEP FUNC(cmd0_opcode, NPU_SET_OFM_WIDTH0_M1)  \
+                                    SEP FUNC(cmd0_opcode, NPU_SET_OFM_HEIGHT0_M1) SEP FUNC(                            \
+                                        cmd0_opcode,                                                                   \
+                                        NPU_SET_OFM_HEIGHT1_M1) SEP FUNC(cmd0_opcode, NPU_SET_OFM_REGION)              \
+                                        SEP FUNC(cmd0_opcode, NPU_SET_KERNEL_WIDTH_M1) SEP FUNC(                       \
+                                            cmd0_opcode,                                                               \
+                                            NPU_SET_KERNEL_HEIGHT_M1) SEP FUNC(cmd0_opcode, NPU_SET_KERNEL_STRIDE)     \
+                                            SEP FUNC(cmd0_opcode, NPU_SET_ACC_FORMAT) SEP FUNC(                        \
+                                                cmd0_opcode,                                                           \
+                                                NPU_SET_ACTIVATION) SEP FUNC(cmd0_opcode, NPU_SET_ACTIVATION_MIN)      \
+                                                SEP FUNC(cmd0_opcode, NPU_SET_ACTIVATION_MAX) SEP FUNC(                \
+                                                    cmd0_opcode,                                                       \
+                                                    NPU_SET_WEIGHT_REGION) SEP FUNC(cmd0_opcode, NPU_SET_SCALE_REGION) \
+                                                    SEP FUNC(cmd0_opcode,                                              \
+                                                             NPU_SET_AB_START) SEP FUNC(cmd0_opcode, NPU_SET_BLOCKDEP) \
+                                                        SEP FUNC(cmd0_opcode, NPU_SET_DMA0_SRC_REGION) SEP FUNC(       \
+                                                            cmd0_opcode,                                               \
+                                                            NPU_SET_DMA0_DST_REGION) SEP FUNC(cmd0_opcode,             \
+                                                                                              NPU_SET_DMA0_SIZE0)      \
+                                                            SEP FUNC(cmd0_opcode, NPU_SET_DMA0_SIZE1) SEP FUNC(        \
+                                                                cmd0_opcode,                                           \
+                                                                NPU_SET_IFM2_BROADCAST)                                \
+                                                                SEP FUNC(cmd0_opcode, NPU_SET_IFM2_SCALAR) SEP FUNC(   \
+                                                                    cmd0_opcode,                                       \
+                                                                    NPU_SET_IFM2_PRECISION)                            \
+                                                                    SEP FUNC(cmd0_opcode, NPU_SET_IFM2_ZERO_POINT)     \
+                                                                        SEP FUNC(cmd0_opcode, NPU_SET_IFM2_WIDTH0_M1)  \
+                                                                            SEP FUNC(cmd0_opcode,                      \
+                                                                                     NPU_SET_IFM2_HEIGHT0_M1)          \
+                                                                                SEP FUNC(cmd0_opcode,                  \
+                                                                                         NPU_SET_IFM2_HEIGHT1_M1)      \
+                                                                                    SEP FUNC(cmd0_opcode,              \
+                                                                                             NPU_SET_IFM2_IB_START)    \
+                                                                                        SEP FUNC(cmd0_opcode,          \
+                                                                                                 NPU_SET_IFM2_REGION)
+
+#define EXPAND_CMD1_OPCODE(FUNC, SEP)                                                                                  \
+    FUNC(cmd1_opcode, NPU_SET_IFM_BASE0)                                                                               \
+    SEP FUNC(cmd1_opcode, NPU_SET_IFM_BASE1) SEP FUNC(cmd1_opcode, NPU_SET_IFM_BASE2) SEP FUNC(                        \
+        cmd1_opcode, NPU_SET_IFM_BASE3) SEP FUNC(cmd1_opcode, NPU_SET_IFM_STRIDE_X)                                    \
+        SEP FUNC(cmd1_opcode, NPU_SET_IFM_STRIDE_Y) SEP FUNC(cmd1_opcode, NPU_SET_IFM_STRIDE_C) SEP FUNC(              \
+            cmd1_opcode, NPU_SET_OFM_BASE0) SEP FUNC(cmd1_opcode, NPU_SET_OFM_BASE1)                                   \
+            SEP FUNC(cmd1_opcode, NPU_SET_OFM_BASE2) SEP FUNC(cmd1_opcode, NPU_SET_OFM_BASE3) SEP FUNC(                \
+                cmd1_opcode, NPU_SET_OFM_STRIDE_X) SEP FUNC(cmd1_opcode, NPU_SET_OFM_STRIDE_Y)                         \
+                SEP FUNC(cmd1_opcode, NPU_SET_OFM_STRIDE_C) SEP FUNC(cmd1_opcode, NPU_SET_WEIGHT_BASE) SEP FUNC(       \
+                    cmd1_opcode, NPU_SET_WEIGHT_LENGTH) SEP FUNC(cmd1_opcode, NPU_SET_SCALE_BASE)                      \
+                    SEP FUNC(cmd1_opcode, NPU_SET_SCALE_LENGTH) SEP FUNC(cmd1_opcode, NPU_SET_OFM_SCALE) SEP FUNC(     \
+                        cmd1_opcode, NPU_SET_OPA_SCALE) SEP FUNC(cmd1_opcode, NPU_SET_OPB_SCALE)                       \
+                        SEP FUNC(cmd1_opcode, NPU_SET_DMA0_SRC) SEP FUNC(cmd1_opcode, NPU_SET_DMA0_DST) SEP FUNC(      \
+                            cmd1_opcode, NPU_SET_DMA0_LEN) SEP FUNC(cmd1_opcode, NPU_SET_IFM2_BASE0)                   \
+                            SEP FUNC(cmd1_opcode, NPU_SET_IFM2_BASE1) SEP FUNC(cmd1_opcode, NPU_SET_IFM2_BASE2)        \
+                                SEP FUNC(cmd1_opcode, NPU_SET_IFM2_BASE3) SEP FUNC(cmd1_opcode, NPU_SET_IFM2_STRIDE_X) \
+                                    SEP FUNC(cmd1_opcode, NPU_SET_IFM2_STRIDE_Y)                                       \
+                                        SEP FUNC(cmd1_opcode, NPU_SET_IFM2_STRIDE_C)                                   \
+                                            SEP FUNC(cmd1_opcode, NPU_SET_USER_DEFINED0)                               \
+                                                SEP FUNC(cmd1_opcode, NPU_SET_USER_DEFINED1)                           \
+                                                    SEP FUNC(cmd1_opcode, NPU_SET_USER_DEFINED2)                       \
+                                                        SEP FUNC(cmd1_opcode, NPU_SET_USER_DEFINED3)                   \
+                                                            SEP FUNC(cmd1_opcode, NPU_SET_USER_DEFINED4)               \
+                                                                SEP FUNC(cmd1_opcode, NPU_SET_USER_DEFINED5)           \
+                                                                    SEP FUNC(cmd1_opcode, NPU_SET_USER_DEFINED6)       \
+                                                                        SEP FUNC(cmd1_opcode, NPU_SET_USER_DEFINED7)
+
+#define EXPAND_CMD_CTRL(FUNC, SEP) FUNC(cmd_ctrl, CMD0_CTRL) SEP FUNC(cmd_ctrl, CMD1_CTRL)
+
+#define EXPAND_CUSTOM_DMA_CS(FUNC, SEP) FUNC(custom_dma_cs, DISABLE) SEP FUNC(custom_dma_cs, ENABLE)
+
+#define EXPAND_CUSTOM_DMA(FUNC, SEP) FUNC(custom_dma, NOT_IMPLEMENTED) SEP FUNC(custom_dma, IMPLEMENTED)
+
+#define EXPAND_DMA_FAULT_SRC(FUNC, SEP) FUNC(dma_fault_src, AXI_M0) SEP FUNC(dma_fault_src, AXI_M1)
+
+#define EXPAND_DMA_REGION_MODE(FUNC, SEP) FUNC(dma_region_mode, EXTERNAL) SEP FUNC(dma_region_mode, INTERNAL)
+
+#define EXPAND_DMA_STRIDE_MODE(FUNC, SEP) FUNC(dma_stride_mode, D1)
 
 #define EXPAND_ELEMENTWISE_MODE(FUNC, SEP)                                                                             \
     FUNC(elementwise_mode, MUL)                                                                                        \
@@ -13991,116 +23783,112 @@
         SEP FUNC(elementwise_mode, MAX) SEP FUNC(elementwise_mode, LRELU) SEP FUNC(elementwise_mode, ABS)              \
             SEP FUNC(elementwise_mode, CLZ) SEP FUNC(elementwise_mode, SHR) SEP FUNC(elementwise_mode, SHL)
 
-#define EXPAND_IFM_PRECISION(FUNC, SEP)                                                                                \
-    FUNC(ifm_precision, U8)                                                                                            \
-    SEP FUNC(ifm_precision, S8) SEP FUNC(ifm_precision, U16) SEP FUNC(ifm_precision, S16) SEP FUNC(ifm_precision, S32)
+#define EXPAND_FUNCTIONAL_SAFETY(FUNC, SEP)                                                                            \
+    FUNC(functional_safety, NOT_IMPLEMENTED) SEP FUNC(functional_safety, IMPLEMENTED)
+
+#define EXPAND_IFM2_OPERAND_ORDER(FUNC, SEP) FUNC(ifm2_operand_order, ORDER_B) SEP FUNC(ifm2_operand_order, ORDER_A)
 
 #define EXPAND_IFM_SCALE_MODE(FUNC, SEP)                                                                               \
-    FUNC(ifm_scale_mode, SCALE_16BIT)                                                                                  \
-    SEP FUNC(ifm_scale_mode, SCALE_OPA_32BIT) SEP FUNC(ifm_scale_mode, SCALE_OPB_32BIT)
+    FUNC(ifm_scale_mode, OPA_OPB_16) SEP FUNC(ifm_scale_mode, OPA_32) SEP FUNC(ifm_scale_mode, OPB_32)
 
-#define EXPAND_MACS_PER_CC(FUNC, SEP)                                                                                  \
-    FUNC(macs_per_cc, MACS_PER_CC_IS_5)                                                                                \
-    SEP FUNC(macs_per_cc, MACS_PER_CC_IS_6) SEP FUNC(macs_per_cc, MACS_PER_CC_IS_7)                                    \
-        SEP FUNC(macs_per_cc, MACS_PER_CC_IS_8)
+#define EXPAND_IFM_UPSCALE_MODE(FUNC, SEP)                                                                             \
+    FUNC(ifm_upscale_mode, NONE) SEP FUNC(ifm_upscale_mode, NEAREST) SEP FUNC(ifm_upscale_mode, ZEROS)
 
-#define EXPAND_MEMORY_TYPE(FUNC, SEP)                                                                                  \
-    FUNC(memory_type, AXI0_OUTSTANDING_COUNTER0)                                                                       \
-    SEP FUNC(memory_type, AXI0_OUTSTANDING_COUNTER1) SEP FUNC(memory_type, AXI1_OUTSTANDING_COUNTER2)                  \
-        SEP FUNC(memory_type, AXI1_OUTSTANDING_COUNTER3)
+#define EXPAND_KERNEL_DECOMPOSITION(FUNC, SEP) FUNC(kernel_decomposition, D8X8) SEP FUNC(kernel_decomposition, D4X4)
 
-#define EXPAND_OFM_PRECISION(FUNC, SEP)                                                                                \
-    FUNC(ofm_precision, U8)                                                                                            \
-    SEP FUNC(ofm_precision, S8) SEP FUNC(ofm_precision, U16) SEP FUNC(ofm_precision, S16) SEP FUNC(ofm_precision, S32)
+#define EXPAND_KERNEL_DILATION(FUNC, SEP) FUNC(kernel_dilation, NONE) SEP FUNC(kernel_dilation, X2)
 
-#define EXPAND_PMU_EVENT_TYPE(FUNC, SEP)                                                                                           \
-    FUNC(pmu_event_type, NO_EVENT)                                                                                                 \
-    SEP FUNC(pmu_event_type, CYCLE) SEP FUNC(pmu_event_type, NPU_IDLE) SEP FUNC(                                                   \
-        pmu_event_type, CC_STALLED_ON_BLOCKDEP) SEP FUNC(pmu_event_type,                                                           \
-                                                         CC_STALLED_ON_SHRAM_RECONFIG) SEP FUNC(pmu_event_type,                    \
-                                                                                                NPU_ACTIVE)                        \
-        SEP FUNC(pmu_event_type, MAC_ACTIVE) SEP FUNC(pmu_event_type, MAC_ACTIVE_8BIT) SEP FUNC(                                   \
-            pmu_event_type, MAC_ACTIVE_16BIT) SEP FUNC(pmu_event_type, MAC_DPU_ACTIVE) SEP FUNC(pmu_event_type,                    \
-                                                                                                MAC_STALLED_BY_WD_ACC)             \
-            SEP FUNC(pmu_event_type, MAC_STALLED_BY_WD) SEP FUNC(pmu_event_type, MAC_STALLED_BY_ACC) SEP FUNC(                     \
-                pmu_event_type, MAC_STALLED_BY_IB) SEP FUNC(pmu_event_type,                                                        \
-                                                            MAC_ACTIVE_32BIT) SEP FUNC(pmu_event_type,                             \
-                                                                                       MAC_STALLED_BY_INT_W)                       \
-                SEP FUNC(pmu_event_type, MAC_STALLED_BY_INT_ACC) SEP FUNC(pmu_event_type, AO_ACTIVE) SEP FUNC(                     \
-                    pmu_event_type, AO_ACTIVE_8BIT) SEP FUNC(pmu_event_type,                                                       \
-                                                             AO_ACTIVE_16BIT) SEP FUNC(pmu_event_type,                             \
-                                                                                       AO_STALLED_BY_OFMP_OB)                      \
-                    SEP FUNC(pmu_event_type, AO_STALLED_BY_OFMP) SEP FUNC(pmu_event_type, AO_STALLED_BY_OB) SEP FUNC(              \
-                        pmu_event_type,                                                                                            \
-                        AO_STALLED_BY_ACC_IB) SEP FUNC(pmu_event_type,                                                             \
-                                                       AO_STALLED_BY_ACC) SEP FUNC(pmu_event_type,                                 \
-                                                                                   AO_STALLED_BY_IB) SEP FUNC(pmu_event_type,      \
-                                                                                                              WD_ACTIVE) SEP       \
-                        FUNC(pmu_event_type, WD_STALLED) SEP FUNC(pmu_event_type, WD_STALLED_BY_WS) SEP FUNC(                      \
-                            pmu_event_type,                                                                                        \
-                            WD_STALLED_BY_WD_BUF) SEP                                                                              \
-                            FUNC(pmu_event_type, WD_PARSE_ACTIVE) SEP FUNC(pmu_event_type, WD_PARSE_STALLED) SEP FUNC(             \
-                                pmu_event_type,                                                                                    \
-                                WD_PARSE_STALLED_IN) SEP FUNC(pmu_event_type,                                                      \
-                                                              WD_PARSE_STALLED_OUT) SEP                                            \
-                                FUNC(pmu_event_type, WD_TRANS_WS) SEP FUNC(pmu_event_type, WD_TRANS_WB) SEP FUNC(                  \
-                                    pmu_event_type,                                                                                \
-                                    WD_TRANS_DW0) SEP FUNC(pmu_event_type,                                                         \
-                                                           WD_TRANS_DW1) SEP FUNC(pmu_event_type,                                  \
-                                                                                  AXI0_RD_TRANS_ACCEPTED) SEP                      \
-                                    FUNC(pmu_event_type, AXI0_RD_TRANS_COMPLETED) SEP FUNC(                                        \
-                                        pmu_event_type,                                                                            \
-                                        AXI0_RD_DATA_BEAT_RECEIVED) SEP FUNC(pmu_event_type, AXI0_RD_TRAN_REQ_STALLED)             \
-                                        SEP FUNC(pmu_event_type,                                                                   \
-                                                 AXI0_WR_TRANS_ACCEPTED) SEP FUNC(pmu_event_type,                                  \
-                                                                                  AXI0_WR_TRANS_COMPLETED_M)                       \
-                                            SEP FUNC(pmu_event_type, AXI0_WR_TRANS_COMPLETED_S) SEP FUNC(                          \
-                                                pmu_event_type,                                                                    \
-                                                AXI0_WR_DATA_BEAT_WRITTEN)                                                         \
-                                                SEP FUNC(pmu_event_type, AXI0_WR_TRAN_REQ_STALLED) SEP FUNC(                       \
-                                                    pmu_event_type,                                                                \
-                                                    AXI0_WR_DATA_BEAT_STALLED) SEP                                                 \
-                                                    FUNC(pmu_event_type, AXI0_ENABLED_CYCLES) SEP FUNC(                            \
-                                                        pmu_event_type,                                                            \
-                                                        AXI0_RD_STALL_LIMIT) SEP FUNC(pmu_event_type,                              \
-                                                                                      AXI0_WR_STALL_LIMIT) SEP                     \
-                                                        FUNC(pmu_event_type, AXI1_RD_TRANS_ACCEPTED) SEP FUNC(                     \
-                                                            pmu_event_type,                                                        \
-                                                            AXI1_RD_TRANS_COMPLETED) SEP FUNC(pmu_event_type,                      \
-                                                                                              AXI1_RD_DATA_BEAT_RECEIVED) SEP      \
-                                                            FUNC(pmu_event_type, AXI1_RD_TRAN_REQ_STALLED) SEP FUNC(               \
-                                                                pmu_event_type,                                                    \
-                                                                AXI1_WR_TRANS_ACCEPTED) SEP                                        \
-                                                                FUNC(pmu_event_type, AXI1_WR_TRANS_COMPLETED_M) SEP FUNC(          \
-                                                                    pmu_event_type,                                                \
-                                                                    AXI1_WR_TRANS_COMPLETED_S) SEP                                 \
-                                                                    FUNC(pmu_event_type, AXI1_WR_DATA_BEAT_WRITTEN) SEP FUNC(      \
-                                                                        pmu_event_type,                                            \
-                                                                        AXI1_WR_TRAN_REQ_STALLED) SEP                              \
-                                                                        FUNC(pmu_event_type, AXI1_WR_DATA_BEAT_STALLED) SEP FUNC(  \
-                                                                            pmu_event_type,                                        \
-                                                                            AXI1_ENABLED_CYCLES) SEP FUNC(pmu_event_type,          \
-                                                                                                          AXI1_RD_STALL_LIMIT) SEP \
-                                                                            FUNC(pmu_event_type, AXI1_WR_STALL_LIMIT) SEP FUNC(    \
-                                                                                pmu_event_type,                                    \
-                                                                                AXI_LATENCY_ANY) SEP FUNC(pmu_event_type,          \
-                                                                                                          AXI_LATENCY_32) SEP      \
-                                                                                FUNC(pmu_event_type, AXI_LATENCY_64) SEP FUNC(     \
-                                                                                    pmu_event_type,                                \
-                                                                                    AXI_LATENCY_128) SEP                           \
-                                                                                    FUNC(pmu_event_type,                           \
-                                                                                         AXI_LATENCY_256) SEP                      \
-                                                                                        FUNC(pmu_event_type,                       \
-                                                                                             AXI_LATENCY_512) SEP                  \
-                                                                                            FUNC(pmu_event_type,                   \
-                                                                                                 AXI_LATENCY_1024) SEP             \
-                                                                                                FUNC(pmu_event_type,               \
-                                                                                                     ECC_DMA) SEP                  \
-                                                                                                    FUNC(                          \
-                                                                                                        pmu_event_type,            \
-                                                                                                        ECC_SB0) SEP               \
-                                                                                                        FUNC(                      \
-                                                                                                            pmu_event_type,        \
+#define EXPAND_MAX_BEATS(FUNC, SEP) FUNC(max_beats, B64) SEP FUNC(max_beats, B128) SEP FUNC(max_beats, B256)
+
+#define EXPAND_MEM_ATTR(FUNC, SEP)                                                                                     \
+    FUNC(mem_attr, AXI0_OUTSTANDING_COUNTER0)                                                                          \
+    SEP FUNC(mem_attr, AXI0_OUTSTANDING_COUNTER1) SEP FUNC(mem_attr, AXI1_OUTSTANDING_COUNTER2)                        \
+        SEP FUNC(mem_attr, AXI1_OUTSTANDING_COUNTER3)
+
+#define EXPAND_OFM_SCALE_MODE(FUNC, SEP) FUNC(ofm_scale_mode, PER_CHANNEL) SEP FUNC(ofm_scale_mode, GLOBAL)
+
+#define EXPAND_PMU_AXI_CHANNEL(FUNC, SEP)                                                                              \
+    FUNC(pmu_axi_channel, RD_CMD)                                                                                      \
+    SEP FUNC(pmu_axi_channel, RD_IFM) SEP FUNC(pmu_axi_channel, RD_WEIGHTS) SEP FUNC(pmu_axi_channel, RD_SCALE_BIAS)   \
+        SEP FUNC(pmu_axi_channel, RD_MEM2MEM) SEP FUNC(pmu_axi_channel, WR_OFM) SEP FUNC(pmu_axi_channel, WR_MEM2MEM)
+
+#define EXPAND_PMU_EVENT(FUNC, SEP)                                                                                                    \
+    FUNC(pmu_event, NO_EVENT)                                                                                                          \
+    SEP FUNC(pmu_event, CYCLE) SEP FUNC(pmu_event, NPU_IDLE) SEP FUNC(pmu_event, CC_STALLED_ON_BLOCKDEP) SEP FUNC(                     \
+        pmu_event, CC_STALLED_ON_SHRAM_RECONFIG) SEP FUNC(pmu_event, NPU_ACTIVE) SEP FUNC(pmu_event, MAC_ACTIVE)                       \
+        SEP FUNC(pmu_event, MAC_ACTIVE_8BIT) SEP FUNC(pmu_event, MAC_ACTIVE_16BIT) SEP FUNC(                                           \
+            pmu_event, MAC_DPU_ACTIVE) SEP FUNC(pmu_event, MAC_STALLED_BY_WD_ACC) SEP FUNC(pmu_event,                                  \
+                                                                                           MAC_STALLED_BY_WD)                          \
+            SEP FUNC(pmu_event, MAC_STALLED_BY_ACC) SEP FUNC(pmu_event, MAC_STALLED_BY_IB) SEP FUNC(                                   \
+                pmu_event,                                                                                                             \
+                MAC_ACTIVE_32BIT) SEP FUNC(pmu_event,                                                                                  \
+                                           MAC_STALLED_BY_INT_W) SEP FUNC(pmu_event,                                                   \
+                                                                          MAC_STALLED_BY_INT_ACC) SEP FUNC(pmu_event,                  \
+                                                                                                           AO_ACTIVE)                  \
+                SEP FUNC(pmu_event, AO_ACTIVE_8BIT) SEP FUNC(pmu_event, AO_ACTIVE_16BIT) SEP FUNC(                                     \
+                    pmu_event, AO_STALLED_BY_OFMP_OB) SEP FUNC(pmu_event, AO_STALLED_BY_OFMP) SEP                                      \
+                    FUNC(pmu_event, AO_STALLED_BY_OB) SEP FUNC(pmu_event, AO_STALLED_BY_ACC_IB) SEP FUNC(                              \
+                        pmu_event, AO_STALLED_BY_ACC) SEP FUNC(pmu_event, AO_STALLED_BY_IB) SEP                                        \
+                        FUNC(pmu_event, WD_ACTIVE) SEP FUNC(pmu_event, WD_STALLED) SEP FUNC(pmu_event, WD_STALLED_BY_WS) SEP FUNC(     \
+                            pmu_event, WD_STALLED_BY_WD_BUF) SEP FUNC(pmu_event,                                                       \
+                                                                      WD_PARSE_ACTIVE) SEP                                             \
+                            FUNC(pmu_event, WD_PARSE_STALLED) SEP FUNC(pmu_event, WD_PARSE_STALLED_IN) SEP FUNC(                       \
+                                pmu_event, WD_PARSE_STALLED_OUT) SEP FUNC(pmu_event,                                                   \
+                                                                          WD_TRANS_WS) SEP                                             \
+                                FUNC(pmu_event, WD_TRANS_WB) SEP FUNC(pmu_event, WD_TRANS_DW0) SEP FUNC(                               \
+                                    pmu_event, WD_TRANS_DW1) SEP FUNC(pmu_event,                                                       \
+                                                                      AXI0_RD_TRANS_ACCEPTED) SEP                                      \
+                                    FUNC(pmu_event, AXI0_RD_TRANS_COMPLETED) SEP FUNC(pmu_event, AXI0_RD_DATA_BEAT_RECEIVED) SEP FUNC( \
+                                        pmu_event, AXI0_RD_TRAN_REQ_STALLED) SEP FUNC(pmu_event,                                       \
+                                                                                      AXI0_WR_TRANS_ACCEPTED) SEP                      \
+                                        FUNC(pmu_event, AXI0_WR_TRANS_COMPLETED_M) SEP FUNC(                                           \
+                                            pmu_event, AXI0_WR_TRANS_COMPLETED_S) SEP                                                  \
+                                            FUNC(pmu_event, AXI0_WR_DATA_BEAT_WRITTEN) SEP FUNC(                                       \
+                                                pmu_event, AXI0_WR_TRAN_REQ_STALLED) SEP                                               \
+                                                FUNC(pmu_event, AXI0_WR_DATA_BEAT_STALLED) SEP FUNC(                                   \
+                                                    pmu_event,                                                                         \
+                                                    AXI0_ENABLED_CYCLES) SEP FUNC(pmu_event,                                           \
+                                                                                  AXI0_RD_STALL_LIMIT) SEP                             \
+                                                    FUNC(pmu_event, AXI0_WR_STALL_LIMIT) SEP FUNC(                                     \
+                                                        pmu_event,                                                                     \
+                                                        AXI_LATENCY_ANY) SEP FUNC(pmu_event,                                           \
+                                                                                  AXI_LATENCY_32) SEP                                  \
+                                                        FUNC(pmu_event,                                                                \
+                                                             AXI_LATENCY_64) SEP FUNC(pmu_event,                                       \
+                                                                                      AXI_LATENCY_128) SEP                             \
+                                                            FUNC(pmu_event, AXI_LATENCY_256) SEP FUNC(                                 \
+                                                                pmu_event,                                                             \
+                                                                AXI_LATENCY_512) SEP FUNC(pmu_event,                                   \
+                                                                                          AXI_LATENCY_1024) SEP                        \
+                                                                FUNC(pmu_event, ECC_DMA) SEP FUNC(                                     \
+                                                                    pmu_event,                                                         \
+                                                                    ECC_SB0) SEP FUNC(pmu_event,                                       \
+                                                                                      AXI1_RD_TRANS_ACCEPTED) SEP                      \
+                                                                    FUNC(pmu_event, AXI1_RD_TRANS_COMPLETED) SEP FUNC(                 \
+                                                                        pmu_event, AXI1_RD_DATA_BEAT_RECEIVED) SEP                     \
+                                                                        FUNC(pmu_event, AXI1_RD_TRAN_REQ_STALLED) SEP FUNC(            \
+                                                                            pmu_event, AXI1_WR_TRANS_ACCEPTED) SEP                     \
+                                                                            FUNC(pmu_event, AXI1_WR_TRANS_COMPLETED_M) SEP FUNC(       \
+                                                                                pmu_event,                                             \
+                                                                                AXI1_WR_TRANS_COMPLETED_S) SEP                         \
+                                                                                FUNC(pmu_event,                                        \
+                                                                                     AXI1_WR_DATA_BEAT_WRITTEN) SEP                    \
+                                                                                    FUNC(pmu_event,                                    \
+                                                                                         AXI1_WR_TRAN_REQ_STALLED) SEP                 \
+                                                                                        FUNC(                                          \
+                                                                                            pmu_event,                                 \
+                                                                                            AXI1_WR_DATA_BEAT_STALLED) SEP             \
+                                                                                            FUNC(                                      \
+                                                                                                pmu_event,                             \
+                                                                                                AXI1_ENABLED_CYCLES) SEP               \
+                                                                                                FUNC(                                  \
+                                                                                                    pmu_event,                         \
+                                                                                                    AXI1_RD_STALL_LIMIT) SEP           \
+                                                                                                    FUNC(                              \
+                                                                                                        pmu_event,                     \
+                                                                                                        AXI1_WR_STALL_LIMIT)           \
+                                                                                                        SEP FUNC(                      \
+                                                                                                            pmu_event,                 \
                                                                                                             ECC_SB1)
 
 #define EXPAND_POOLING_MODE(FUNC, SEP)                                                                                 \
@@ -14108,19 +23896,22 @@
 
 #define EXPAND_PRIVILEGE_LEVEL(FUNC, SEP) FUNC(privilege_level, USER) SEP FUNC(privilege_level, PRIVILEGED)
 
-#define EXPAND_RESAMPLING_MODE(FUNC, SEP)                                                                              \
-    FUNC(resampling_mode, NONE) SEP FUNC(resampling_mode, NEAREST) SEP FUNC(resampling_mode, TRANSPOSE)
-
-#define EXPAND_ROUNDING(FUNC, SEP) FUNC(rounding, TFL) SEP FUNC(rounding, TRUNCATE) SEP FUNC(rounding, NATURAL)
+#define EXPAND_ROUND_MODE(FUNC, SEP) FUNC(round_mode, DBL) SEP FUNC(round_mode, TRUNCATE) SEP FUNC(round_mode, NATURAL)
 
 #define EXPAND_SECURITY_LEVEL(FUNC, SEP) FUNC(security_level, SECURE) SEP FUNC(security_level, NON_SECURE)
 
-#define EXPAND_SHRAM_SIZE(FUNC, SEP)                                                                                   \
-    FUNC(shram_size, SHRAM_96KB)                                                                                       \
-    SEP FUNC(shram_size, SHRAM_48KB) SEP FUNC(shram_size, SHRAM_24KB) SEP FUNC(shram_size, SHRAM_16KB)
-
 #define EXPAND_STATE(FUNC, SEP) FUNC(state, STOPPED) SEP FUNC(state, RUNNING)
 
-#define EXPAND_STRIDE_MODE(FUNC, SEP)                                                                                  \
-    FUNC(stride_mode, STRIDE_MODE_1D) SEP FUNC(stride_mode, STRIDE_MODE_2D) SEP FUNC(stride_mode, STRIDE_MODE_3D)
-#endif /* ETHOSU55_INTERFACE_H */
+#define EXPAND_WD_CORE_SLICE_STATE(FUNC, SEP)                                                                          \
+    FUNC(wd_core_slice_state, HEADER) SEP FUNC(wd_core_slice_state, PALETTE) SEP FUNC(wd_core_slice_state, WEIGHTS)
+
+#define EXPAND_WD_CTRL_STATE(FUNC, SEP)                                                                                \
+    FUNC(wd_ctrl_state, IDLE)                                                                                          \
+    SEP FUNC(wd_ctrl_state, DRAIN) SEP FUNC(wd_ctrl_state, OFD_INIT) SEP FUNC(wd_ctrl_state, OFD_RUN)
+
+#define EXPAND_WEIGHT_ORDER(FUNC, SEP) FUNC(weight_order, DEPTH_FIRST) SEP FUNC(weight_order, PART_KERNEL_FIRST)
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/src/ethosu65_interface.h b/src/ethosu65_interface.h
new file mode 100644
index 0000000..33737b2
--- /dev/null
+++ b/src/ethosu65_interface.h
@@ -0,0 +1,23797 @@
+/*
+ * Copyright (c) 2020-2021 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ETHOSU65_INTERFACE_H
+#define ETHOSU65_INTERFACE_H
+
+#ifdef __KERNEL__
+#include <linux/types.h>
+#else
+#include <stdint.h>
+#endif
+
+#if !defined(__cplusplus) || __cplusplus < 201402L
+#define CONSTEXPR
+#else
+#define CONSTEXPR constexpr
+#endif
+
+#ifndef __cplusplus
+#define STRUCT struct
+#else
+#define STRUCT
+#endif
+
+#if defined(__cplusplus) && defined(NPU_DISASSEMBLE)
+#include <iomanip>
+#include <sstream>
+#include <vector>
+#endif
+
+#if defined(__cplusplus) && !defined(NPU_NAMESPACE)
+#define NPU_NAMESPACE npu
+#endif
+
+#ifdef __cplusplus
+#include <cstring>
+#include <limits>
+#endif
+
+#ifdef __cplusplus
+namespace NPU_NAMESPACE
+{
+#endif
+#define NNX_ARCH_VERSION_MAJOR 1
+#define NNX_ARCH_VERSION_MINOR 0
+#define NNX_ARCH_VERSION_PATCH 6
+
+// Register offsets
+//
+// Register subpage BASE
+//
+#define NPU_REG_ID 0x0000
+#define NPU_REG_STATUS 0x0004
+#define NPU_REG_CMD 0x0008
+#define NPU_REG_RESET 0x000C
+#define NPU_REG_QBASE 0x0010
+#define NPU_REG_QBASE_HI 0x0014
+#define NPU_REG_QREAD 0x0018
+#define NPU_REG_QCONFIG 0x001C
+#define NPU_REG_QSIZE 0x0020
+#define NPU_REG_PROT 0x0024
+#define NPU_REG_CONFIG 0x0028
+#define NPU_REG_LOCK 0x002C
+#define NPU_REG_REGIONCFG 0x003C
+#define NPU_REG_AXI_LIMIT0 0x0040
+#define NPU_REG_AXI_LIMIT1 0x0044
+#define NPU_REG_AXI_LIMIT2 0x0048
+#define NPU_REG_AXI_LIMIT3 0x004C
+#define BASE_REGISTERS_SIZE 0x0080
+
+//
+// Register subpage BASE_POINTERS
+//
+#define NPU_REG_BASEP_BASE 0x0080
+#define NPU_REG_BASEP_ARRLEN 0x0008
+#define BASE_POINTERS_REGISTERS_SIZE 0x0100
+
+//
+// Register subpage DEBUG
+//
+#define NPU_REG_WD_STATUS 0x0100
+#define NPU_REG_MAC_STATUS 0x0104
+#define NPU_REG_AO_STATUS 0x0108
+#define NPU_REG_DMA_STATUS0 0x0110
+#define NPU_REG_DMA_STATUS1 0x0114
+#define NPU_REG_CLKFORCE 0x0140
+#define NPU_REG_DEBUG_ADDRESS 0x0144
+#define NPU_REG_DEBUG_MISC 0x0148
+#define NPU_REG_DEBUGCORE 0x014C
+#define NPU_REG_DEBUG_BLOCK 0x0150
+#define DEBUG_REGISTERS_SIZE 0x0180
+
+//
+// Register subpage PMU
+//
+#define NPU_REG_PMCR 0x0180
+#define NPU_REG_PMCNTENSET 0x0184
+#define NPU_REG_PMCNTENCLR 0x0188
+#define NPU_REG_PMOVSSET 0x018C
+#define NPU_REG_PMOVSCLR 0x0190
+#define NPU_REG_PMINTSET 0x0194
+#define NPU_REG_PMINTCLR 0x0198
+#define NPU_REG_PMCCNTR 0x01A0
+#define NPU_REG_PMCCNTR_HI 0x01A4
+#define NPU_REG_PMCCNTR_CFG 0x01A8
+#define NPU_REG_PMCAXI_CHAN 0x01AC
+#define PMU_REGISTERS_SIZE 0x0200
+
+//
+// Register subpage TSU_DEBUG
+//
+#define NPU_REG_KERNEL_X 0x0200
+#define NPU_REG_KERNEL_Y 0x0204
+#define NPU_REG_KERNEL_W_M1 0x0208
+#define NPU_REG_KERNEL_H_M1 0x020C
+#define NPU_REG_OFM_CBLK_WIDTH_M1 0x0210
+#define NPU_REG_OFM_CBLK_HEIGHT_M1 0x0214
+#define NPU_REG_OFM_CBLK_DEPTH_M1 0x0218
+#define NPU_REG_IFM_CBLK_DEPTH_M1 0x021C
+#define NPU_REG_OFM_X 0x0220
+#define NPU_REG_OFM_Y 0x0224
+#define NPU_REG_OFM_Z 0x0228
+#define NPU_REG_IFM_Z 0x022C
+#define NPU_REG_PAD_TOP 0x0230
+#define NPU_REG_PAD_LEFT 0x0234
+#define NPU_REG_IFM_CBLK_WIDTH 0x0238
+#define NPU_REG_IFM_CBLK_HEIGHT 0x023C
+#define NPU_REG_DMA_IFM_SRC 0x0240
+#define NPU_REG_DMA_IFM_SRC_HI 0x0244
+#define NPU_REG_DMA_IFM_DST 0x0248
+#define NPU_REG_DMA_OFM_SRC 0x024C
+#define NPU_REG_DMA_OFM_DST 0x0250
+#define NPU_REG_DMA_OFM_DST_HI 0x0254
+#define NPU_REG_DMA_WEIGHT_SRC 0x0258
+#define NPU_REG_DMA_WEIGHT_SRC_HI 0x025C
+#define NPU_REG_DMA_CMD_SRC 0x0260
+#define NPU_REG_DMA_CMD_SRC_HI 0x0264
+#define NPU_REG_DMA_CMD_SIZE 0x0268
+#define NPU_REG_DMA_M2M_SRC 0x026C
+#define NPU_REG_DMA_M2M_SRC_HI 0x0270
+#define NPU_REG_DMA_M2M_DST 0x0274
+#define NPU_REG_DMA_M2M_DST_HI 0x0278
+#define NPU_REG_CURRENT_QREAD 0x027C
+#define NPU_REG_DMA_SCALE_SRC 0x0280
+#define NPU_REG_DMA_SCALE_SRC_HI 0x0284
+#define NPU_REG_CURRENT_BLOCK 0x02B4
+#define NPU_REG_CURRENT_OP 0x02B8
+#define NPU_REG_CURRENT_CMD 0x02BC
+#define TSU_DEBUG_REGISTERS_SIZE 0x02C0
+
+//
+// Register subpage PMU_COUNTERS
+//
+#define NPU_REG_PMEVCNTR_BASE 0x0300
+#define NPU_REG_PMEVCNTR_ARRLEN 0x0004
+#define NPU_REG_PMEVTYPER_BASE 0x0380
+#define NPU_REG_PMEVTYPER_ARRLEN 0x0004
+#define PMU_COUNTERS_REGISTERS_SIZE 0x0400
+
+//
+// Register subpage SHARED_BUFFER
+//
+#define NPU_REG_SHARED_BUFFER_BASE 0x0400
+#define NPU_REG_SHARED_BUFFER_ARRLEN 0x0100
+#define SHARED_BUFFER_REGISTERS_SIZE 0x0800
+
+//
+// Register subpage TSU_IFM
+//
+#define NPU_REG_IFM_PAD_TOP 0x0800
+#define NPU_REG_IFM_PAD_LEFT 0x0804
+#define NPU_REG_IFM_PAD_RIGHT 0x0808
+#define NPU_REG_IFM_PAD_BOTTOM 0x080C
+#define NPU_REG_IFM_DEPTH_M1 0x0810
+#define NPU_REG_IFM_PRECISION 0x0814
+#define NPU_REG_IFM_UPSCALE 0x081C
+#define NPU_REG_IFM_ZERO_POINT 0x0824
+#define NPU_REG_IFM_WIDTH0_M1 0x0828
+#define NPU_REG_IFM_HEIGHT0_M1 0x082C
+#define NPU_REG_IFM_HEIGHT1_M1 0x0830
+#define NPU_REG_IFM_IB_END 0x0834
+#define NPU_REG_IFM_REGION 0x083C
+#define TSU_IFM_REGISTERS_SIZE 0x0840
+
+//
+// Register subpage TSU_OFM
+//
+#define NPU_REG_OFM_WIDTH_M1 0x0844
+#define NPU_REG_OFM_HEIGHT_M1 0x0848
+#define NPU_REG_OFM_DEPTH_M1 0x084C
+#define NPU_REG_OFM_PRECISION 0x0850
+#define NPU_REG_OFM_BLK_WIDTH_M1 0x0854
+#define NPU_REG_OFM_BLK_HEIGHT_M1 0x0858
+#define NPU_REG_OFM_BLK_DEPTH_M1 0x085C
+#define NPU_REG_OFM_ZERO_POINT 0x0860
+#define NPU_REG_OFM_WIDTH0_M1 0x0868
+#define NPU_REG_OFM_HEIGHT0_M1 0x086C
+#define NPU_REG_OFM_HEIGHT1_M1 0x0870
+#define NPU_REG_OFM_REGION 0x087C
+#define TSU_OFM_REGISTERS_SIZE 0x0880
+
+//
+// Register subpage TSU_KERNEL
+//
+#define NPU_REG_KERNEL_WIDTH_M1 0x0880
+#define NPU_REG_KERNEL_HEIGHT_M1 0x0884
+#define NPU_REG_KERNEL_STRIDE 0x0888
+#define NPU_REG_PARALLEL_MODE 0x088C
+#define NPU_REG_ACC_FORMAT 0x0890
+#define NPU_REG_ACTIVATION 0x0894
+#define NPU_REG_ACTIVATION_MIN 0x0898
+#define NPU_REG_ACTIVATION_MAX 0x089C
+#define NPU_REG_WEIGHT_REGION 0x08A0
+#define NPU_REG_SCALE_REGION 0x08A4
+#define NPU_REG_AB_START 0x08B4
+#define NPU_REG_BLOCKDEP 0x08BC
+#define TSU_KERNEL_REGISTERS_SIZE 0x08C0
+
+//
+// Register subpage TSU_DMA
+//
+#define NPU_REG_DMA0_SRC_REGION 0x08C0
+#define NPU_REG_DMA0_DST_REGION 0x08C4
+#define NPU_REG_DMA0_SIZE0 0x08C8
+#define NPU_REG_DMA0_SIZE1 0x08CC
+#define TSU_DMA_REGISTERS_SIZE 0x0900
+
+//
+// Register subpage TSU_IFM2
+//
+#define NPU_REG_IFM2_BROADCAST 0x0900
+#define NPU_REG_IFM2_SCALAR 0x0904
+#define NPU_REG_IFM2_PRECISION 0x0914
+#define NPU_REG_IFM2_ZERO_POINT 0x0924
+#define NPU_REG_IFM2_WIDTH0_M1 0x0928
+#define NPU_REG_IFM2_HEIGHT0_M1 0x092C
+#define NPU_REG_IFM2_HEIGHT1_M1 0x0930
+#define NPU_REG_IFM2_IB_START 0x0934
+#define NPU_REG_IFM2_REGION 0x093C
+#define TSU_IFM2_REGISTERS_SIZE 0x0940
+
+//
+// Register subpage TSU_IFM_BASE
+//
+#define NPU_REG_IFM_BASE0 0x0A00
+#define NPU_REG_IFM_BASE0_HI 0x0A04
+#define NPU_REG_IFM_BASE1 0x0A08
+#define NPU_REG_IFM_BASE1_HI 0x0A0C
+#define NPU_REG_IFM_BASE2 0x0A10
+#define NPU_REG_IFM_BASE2_HI 0x0A14
+#define NPU_REG_IFM_BASE3 0x0A18
+#define NPU_REG_IFM_BASE3_HI 0x0A1C
+#define NPU_REG_IFM_STRIDE_X 0x0A20
+#define NPU_REG_IFM_STRIDE_X_HI 0x0A24
+#define NPU_REG_IFM_STRIDE_Y 0x0A28
+#define NPU_REG_IFM_STRIDE_Y_HI 0x0A2C
+#define NPU_REG_IFM_STRIDE_C 0x0A30
+#define NPU_REG_IFM_STRIDE_C_HI 0x0A34
+#define TSU_IFM_BASE_REGISTERS_SIZE 0x0A40
+
+//
+// Register subpage TSU_OFM_BASE
+//
+#define NPU_REG_OFM_BASE0 0x0A40
+#define NPU_REG_OFM_BASE0_HI 0x0A44
+#define NPU_REG_OFM_BASE1 0x0A48
+#define NPU_REG_OFM_BASE1_HI 0x0A4C
+#define NPU_REG_OFM_BASE2 0x0A50
+#define NPU_REG_OFM_BASE2_HI 0x0A54
+#define NPU_REG_OFM_BASE3 0x0A58
+#define NPU_REG_OFM_BASE3_HI 0x0A5C
+#define NPU_REG_OFM_STRIDE_X 0x0A60
+#define NPU_REG_OFM_STRIDE_X_HI 0x0A64
+#define NPU_REG_OFM_STRIDE_Y 0x0A68
+#define NPU_REG_OFM_STRIDE_Y_HI 0x0A6C
+#define NPU_REG_OFM_STRIDE_C 0x0A70
+#define NPU_REG_OFM_STRIDE_C_HI 0x0A74
+#define TSU_OFM_BASE_REGISTERS_SIZE 0x0A80
+
+//
+// Register subpage TSU_WS_BASE
+//
+#define NPU_REG_WEIGHT_BASE 0x0A80
+#define NPU_REG_WEIGHT_BASE_HI 0x0A84
+#define NPU_REG_WEIGHT_LENGTH 0x0A88
+#define NPU_REG_SCALE_BASE 0x0A90
+#define NPU_REG_SCALE_BASE_HI 0x0A94
+#define NPU_REG_SCALE_LENGTH 0x0A98
+#define NPU_REG_OFM_SCALE 0x0AA0
+#define NPU_REG_OFM_SCALE_SHIFT 0x0AA4
+#define NPU_REG_OPA_SCALE 0x0AA8
+#define NPU_REG_OPA_SCALE_SHIFT 0x0AAC
+#define NPU_REG_OPB_SCALE 0x0AB0
+#define TSU_WS_BASE_REGISTERS_SIZE 0x0AC0
+
+//
+// Register subpage TSU_DMA_BASE
+//
+#define NPU_REG_DMA0_SRC 0x0AC0
+#define NPU_REG_DMA0_SRC_HI 0x0AC4
+#define NPU_REG_DMA0_DST 0x0AC8
+#define NPU_REG_DMA0_DST_HI 0x0ACC
+#define NPU_REG_DMA0_LEN 0x0AD0
+#define NPU_REG_DMA0_LEN_HI 0x0AD4
+#define NPU_REG_DMA0_SKIP0 0x0AD8
+#define NPU_REG_DMA0_SKIP0_HI 0x0ADC
+#define NPU_REG_DMA0_SKIP1 0x0AE0
+#define NPU_REG_DMA0_SKIP1_HI 0x0AE4
+#define TSU_DMA_BASE_REGISTERS_SIZE 0x0B00
+
+//
+// Register subpage TSU_IFM2_BASE
+//
+#define NPU_REG_IFM2_BASE0 0x0B00
+#define NPU_REG_IFM2_BASE0_HI 0x0B04
+#define NPU_REG_IFM2_BASE1 0x0B08
+#define NPU_REG_IFM2_BASE1_HI 0x0B0C
+#define NPU_REG_IFM2_BASE2 0x0B10
+#define NPU_REG_IFM2_BASE2_HI 0x0B14
+#define NPU_REG_IFM2_BASE3 0x0B18
+#define NPU_REG_IFM2_BASE3_HI 0x0B1C
+#define NPU_REG_IFM2_STRIDE_X 0x0B20
+#define NPU_REG_IFM2_STRIDE_X_HI 0x0B24
+#define NPU_REG_IFM2_STRIDE_Y 0x0B28
+#define NPU_REG_IFM2_STRIDE_Y_HI 0x0B2C
+#define NPU_REG_IFM2_STRIDE_C 0x0B30
+#define NPU_REG_IFM2_STRIDE_C_HI 0x0B34
+#define TSU_IFM2_BASE_REGISTERS_SIZE 0x0B40
+
+//
+// Register subpage TSU_WS1_BASE
+//
+#define NPU_REG_WEIGHT1_BASE 0x0B40
+#define NPU_REG_WEIGHT1_BASE_HI 0x0B44
+#define NPU_REG_WEIGHT1_LENGTH 0x0B48
+#define NPU_REG_SCALE1_BASE 0x0B50
+#define NPU_REG_SCALE1_BASE_HI 0x0B54
+#define NPU_REG_SCALE1_LENGTH 0x0B58
+#define TSU_WS1_BASE_REGISTERS_SIZE 0x0B80
+
+//
+// Register subpage TSU_USER_BASE
+//
+#define TSU_USER_BASE_REGISTERS_SIZE 0x0BC0
+
+//
+// Register subpage TSU_DMA_EBASE
+//
+#define TSU_DMA_EBASE_REGISTERS_SIZE 0x0C00
+
+//
+// Register subpage ID
+//
+#define NPU_REG_REVISION 0x0FC0
+#define NPU_REG_PID4 0x0FD0
+#define NPU_REG_PID5 0x0FD4
+#define NPU_REG_PID6 0x0FD8
+#define NPU_REG_PID7 0x0FDC
+#define NPU_REG_PID0 0x0FE0
+#define NPU_REG_PID1 0x0FE4
+#define NPU_REG_PID2 0x0FE8
+#define NPU_REG_PID3 0x0FEC
+#define NPU_REG_CID0 0x0FF0
+#define NPU_REG_CID1 0x0FF4
+#define NPU_REG_CID2 0x0FF8
+#define NPU_REG_CID3 0x0FFC
+#define ID_REGISTERS_SIZE 0x1000
+
+#ifdef __cplusplus
+// Enum types
+enum class acc_format : uint8_t
+{
+    I32 = 0,
+    I40 = 1,
+    F16 = 2,
+};
+
+enum class activation_clip_range : uint8_t
+{
+    OFM_PRECISION = 0,
+    FORCE_UINT8   = 2,
+    FORCE_INT8    = 3,
+    FORCE_INT16   = 5,
+};
+
+enum class activation_format : uint8_t
+{
+    NHWC    = 0,
+    NHCWB16 = 1,
+};
+
+enum class activation_function : uint8_t
+{
+    RELU    = 0,
+    TANH    = 3,
+    SIGMOID = 4,
+    TABLE_0 = 16,
+    TABLE_1 = 17,
+    TABLE_2 = 18,
+    TABLE_3 = 19,
+    TABLE_4 = 20,
+    TABLE_5 = 21,
+    TABLE_6 = 22,
+    TABLE_7 = 23,
+};
+
+enum class activation_precision : uint8_t
+{
+    B8  = 0,
+    B16 = 1,
+    B32 = 2,
+    B64 = 3,
+};
+
+enum class activation_type : uint8_t
+{
+    UNSIGNED = 0,
+    SIGNED   = 1,
+};
+
+enum class axi_mem_encoding : uint8_t
+{
+    DEVICE_NON_BUFFERABLE                 = 0,
+    DEVICE_BUFFERABLE                     = 1,
+    NORMAL_NON_CACHEABLE_NON_BUFFERABLE   = 2,
+    NORMAL_NON_CACHEABLE_BUFFERABLE       = 3,
+    WRITE_THROUGH_NO_ALLOCATE             = 4,
+    WRITE_THROUGH_READ_ALLOCATE           = 5,
+    WRITE_THROUGH_WRITE_ALLOCATE          = 6,
+    WRITE_THROUGH_READ_AND_WRITE_ALLOCATE = 7,
+    WRITE_BACK_NO_ALLOCATE                = 8,
+    WRITE_BACK_READ_ALLOCATE              = 9,
+    WRITE_BACK_WRITE_ALLOCATE             = 10,
+    WRITE_BACK_READ_AND_WRITE_ALLOCATE    = 11,
+};
+
+enum class broadcast_mode : uint8_t
+{
+    DISABLE = 0,
+    ENABLE  = 1,
+};
+
+enum class cmd0_opcode : uint16_t
+{
+    NPU_OP_STOP               = 0,
+    NPU_OP_IRQ                = 1,
+    NPU_OP_CONV               = 2,
+    NPU_OP_DEPTHWISE          = 3,
+    NPU_OP_POOL               = 5,
+    NPU_OP_ELEMENTWISE        = 6,
+    NPU_OP_DMA_START          = 16,
+    NPU_OP_DMA_WAIT           = 17,
+    NPU_OP_KERNEL_WAIT        = 18,
+    NPU_OP_PMU_MASK           = 19,
+    NPU_SET_IFM_PAD_TOP       = 256,
+    NPU_SET_IFM_PAD_LEFT      = 257,
+    NPU_SET_IFM_PAD_RIGHT     = 258,
+    NPU_SET_IFM_PAD_BOTTOM    = 259,
+    NPU_SET_IFM_DEPTH_M1      = 260,
+    NPU_SET_IFM_PRECISION     = 261,
+    NPU_SET_IFM_UPSCALE       = 263,
+    NPU_SET_IFM_ZERO_POINT    = 265,
+    NPU_SET_IFM_WIDTH0_M1     = 266,
+    NPU_SET_IFM_HEIGHT0_M1    = 267,
+    NPU_SET_IFM_HEIGHT1_M1    = 268,
+    NPU_SET_IFM_IB_END        = 269,
+    NPU_SET_IFM_REGION        = 271,
+    NPU_SET_OFM_WIDTH_M1      = 273,
+    NPU_SET_OFM_HEIGHT_M1     = 274,
+    NPU_SET_OFM_DEPTH_M1      = 275,
+    NPU_SET_OFM_PRECISION     = 276,
+    NPU_SET_OFM_BLK_WIDTH_M1  = 277,
+    NPU_SET_OFM_BLK_HEIGHT_M1 = 278,
+    NPU_SET_OFM_BLK_DEPTH_M1  = 279,
+    NPU_SET_OFM_ZERO_POINT    = 280,
+    NPU_SET_OFM_WIDTH0_M1     = 282,
+    NPU_SET_OFM_HEIGHT0_M1    = 283,
+    NPU_SET_OFM_HEIGHT1_M1    = 284,
+    NPU_SET_OFM_REGION        = 287,
+    NPU_SET_KERNEL_WIDTH_M1   = 288,
+    NPU_SET_KERNEL_HEIGHT_M1  = 289,
+    NPU_SET_KERNEL_STRIDE     = 290,
+    NPU_SET_PARALLEL_MODE     = 291,
+    NPU_SET_ACC_FORMAT        = 292,
+    NPU_SET_ACTIVATION        = 293,
+    NPU_SET_ACTIVATION_MIN    = 294,
+    NPU_SET_ACTIVATION_MAX    = 295,
+    NPU_SET_WEIGHT_REGION     = 296,
+    NPU_SET_SCALE_REGION      = 297,
+    NPU_SET_AB_START          = 301,
+    NPU_SET_BLOCKDEP          = 303,
+    NPU_SET_DMA0_SRC_REGION   = 304,
+    NPU_SET_DMA0_DST_REGION   = 305,
+    NPU_SET_DMA0_SIZE0        = 306,
+    NPU_SET_DMA0_SIZE1        = 307,
+    NPU_SET_IFM2_BROADCAST    = 384,
+    NPU_SET_IFM2_SCALAR       = 385,
+    NPU_SET_IFM2_PRECISION    = 389,
+    NPU_SET_IFM2_ZERO_POINT   = 393,
+    NPU_SET_IFM2_WIDTH0_M1    = 394,
+    NPU_SET_IFM2_HEIGHT0_M1   = 395,
+    NPU_SET_IFM2_HEIGHT1_M1   = 396,
+    NPU_SET_IFM2_IB_START     = 397,
+    NPU_SET_IFM2_REGION       = 399,
+};
+
+enum class cmd1_opcode : uint16_t
+{
+    NPU_SET_IFM_BASE0      = 0,
+    NPU_SET_IFM_BASE1      = 1,
+    NPU_SET_IFM_BASE2      = 2,
+    NPU_SET_IFM_BASE3      = 3,
+    NPU_SET_IFM_STRIDE_X   = 4,
+    NPU_SET_IFM_STRIDE_Y   = 5,
+    NPU_SET_IFM_STRIDE_C   = 6,
+    NPU_SET_OFM_BASE0      = 16,
+    NPU_SET_OFM_BASE1      = 17,
+    NPU_SET_OFM_BASE2      = 18,
+    NPU_SET_OFM_BASE3      = 19,
+    NPU_SET_OFM_STRIDE_X   = 20,
+    NPU_SET_OFM_STRIDE_Y   = 21,
+    NPU_SET_OFM_STRIDE_C   = 22,
+    NPU_SET_WEIGHT_BASE    = 32,
+    NPU_SET_WEIGHT_LENGTH  = 33,
+    NPU_SET_SCALE_BASE     = 34,
+    NPU_SET_SCALE_LENGTH   = 35,
+    NPU_SET_OFM_SCALE      = 36,
+    NPU_SET_OPA_SCALE      = 37,
+    NPU_SET_OPB_SCALE      = 38,
+    NPU_SET_DMA0_SRC       = 48,
+    NPU_SET_DMA0_DST       = 49,
+    NPU_SET_DMA0_LEN       = 50,
+    NPU_SET_DMA0_SKIP0     = 51,
+    NPU_SET_DMA0_SKIP1     = 52,
+    NPU_SET_IFM2_BASE0     = 128,
+    NPU_SET_IFM2_BASE1     = 129,
+    NPU_SET_IFM2_BASE2     = 130,
+    NPU_SET_IFM2_BASE3     = 131,
+    NPU_SET_IFM2_STRIDE_X  = 132,
+    NPU_SET_IFM2_STRIDE_Y  = 133,
+    NPU_SET_IFM2_STRIDE_C  = 134,
+    NPU_SET_WEIGHT1_BASE   = 144,
+    NPU_SET_WEIGHT1_LENGTH = 145,
+    NPU_SET_SCALE1_BASE    = 146,
+    NPU_SET_SCALE1_LENGTH  = 147,
+};
+
+enum class cmd_ctrl : uint8_t
+{
+    CMD0_CTRL = 0,
+    CMD1_CTRL = 1,
+};
+
+enum class custom_dma : uint8_t
+{
+    NOT_IMPLEMENTED = 0,
+    IMPLEMENTED     = 1,
+};
+
+enum class dma_fault_src : uint8_t
+{
+    AXI_M0 = 0,
+    AXI_M1 = 1,
+};
+
+enum class dma_region_mode : uint8_t
+{
+    EXTERNAL = 0,
+    INTERNAL = 1,
+};
+
+enum class dma_stride_mode : uint8_t
+{
+    D1 = 0,
+    D2 = 1,
+    D3 = 2,
+};
+
+enum class elementwise_mode : uint8_t
+{
+    MUL   = 0,
+    ADD   = 1,
+    SUB   = 2,
+    MIN   = 3,
+    MAX   = 4,
+    LRELU = 5,
+    ABS   = 6,
+    CLZ   = 7,
+    SHR   = 8,
+    SHL   = 9,
+};
+
+enum class functional_safety : uint8_t
+{
+    NOT_IMPLEMENTED = 0,
+    IMPLEMENTED     = 1,
+};
+
+enum class ifm2_operand_order : uint8_t
+{
+    ORDER_B = 0,
+    ORDER_A = 1,
+};
+
+enum class ifm_scale_mode : uint8_t
+{
+    OPA_OPB_16 = 0,
+    OPA_32     = 1,
+    OPB_32     = 2,
+};
+
+enum class ifm_upscale_mode : uint8_t
+{
+    NONE    = 0,
+    NEAREST = 1,
+    ZEROS   = 2,
+};
+
+enum class kernel_decomposition : uint8_t
+{
+    D8X8 = 0,
+    D4X4 = 1,
+};
+
+enum class kernel_dilation : uint8_t
+{
+    NONE = 0,
+    X2   = 1,
+};
+
+enum class max_beats : uint8_t
+{
+    B64  = 0,
+    B128 = 1,
+    B256 = 2,
+};
+
+enum class mem_attr : uint8_t
+{
+    AXI0_OUTSTANDING_COUNTER0 = 0,
+    AXI0_OUTSTANDING_COUNTER1 = 1,
+    AXI1_OUTSTANDING_COUNTER2 = 2,
+    AXI1_OUTSTANDING_COUNTER3 = 3,
+};
+
+enum class ofm_scale_mode : uint8_t
+{
+    PER_CHANNEL = 0,
+    GLOBAL      = 1,
+};
+
+enum class parallel_mode : uint8_t
+{
+    SINGLE_CORE     = 0,
+    DUAL_CORE_DEPTH = 1,
+};
+
+enum class pmu_axi_channel : uint8_t
+{
+    RD_CMD        = 0,
+    RD_IFM        = 1,
+    RD_WEIGHTS    = 2,
+    RD_SCALE_BIAS = 3,
+    RD_MEM2MEM    = 4,
+    WR_OFM        = 8,
+    WR_MEM2MEM    = 9,
+};
+
+enum class pmu_event : uint16_t
+{
+    NO_EVENT                     = 0,
+    CYCLE                        = 17,
+    NPU_IDLE                     = 32,
+    CC_STALLED_ON_BLOCKDEP       = 33,
+    CC_STALLED_ON_SHRAM_RECONFIG = 34,
+    NPU_ACTIVE                   = 35,
+    MAC_ACTIVE                   = 48,
+    MAC_ACTIVE_8BIT              = 49,
+    MAC_ACTIVE_16BIT             = 50,
+    MAC_DPU_ACTIVE               = 51,
+    MAC_STALLED_BY_WD_ACC        = 52,
+    MAC_STALLED_BY_WD            = 53,
+    MAC_STALLED_BY_ACC           = 54,
+    MAC_STALLED_BY_IB            = 55,
+    MAC_ACTIVE_32BIT             = 56,
+    MAC_STALLED_BY_INT_W         = 57,
+    MAC_STALLED_BY_INT_ACC       = 58,
+    AO_ACTIVE                    = 64,
+    AO_ACTIVE_8BIT               = 65,
+    AO_ACTIVE_16BIT              = 66,
+    AO_STALLED_BY_OFMP_OB        = 67,
+    AO_STALLED_BY_OFMP           = 68,
+    AO_STALLED_BY_OB             = 69,
+    AO_STALLED_BY_ACC_IB         = 70,
+    AO_STALLED_BY_ACC            = 71,
+    AO_STALLED_BY_IB             = 72,
+    WD_ACTIVE                    = 80,
+    WD_STALLED                   = 81,
+    WD_STALLED_BY_WS             = 82,
+    WD_STALLED_BY_WD_BUF         = 83,
+    WD_PARSE_ACTIVE              = 84,
+    WD_PARSE_STALLED             = 85,
+    WD_PARSE_STALLED_IN          = 86,
+    WD_PARSE_STALLED_OUT         = 87,
+    WD_TRANS_WS                  = 88,
+    WD_TRANS_WB                  = 89,
+    WD_TRANS_DW0                 = 90,
+    WD_TRANS_DW1                 = 91,
+    AXI0_RD_TRANS_ACCEPTED       = 128,
+    AXI0_RD_TRANS_COMPLETED      = 129,
+    AXI0_RD_DATA_BEAT_RECEIVED   = 130,
+    AXI0_RD_TRAN_REQ_STALLED     = 131,
+    AXI0_WR_TRANS_ACCEPTED       = 132,
+    AXI0_WR_TRANS_COMPLETED_M    = 133,
+    AXI0_WR_TRANS_COMPLETED_S    = 134,
+    AXI0_WR_DATA_BEAT_WRITTEN    = 135,
+    AXI0_WR_TRAN_REQ_STALLED     = 136,
+    AXI0_WR_DATA_BEAT_STALLED    = 137,
+    AXI0_ENABLED_CYCLES          = 140,
+    AXI0_RD_STALL_LIMIT          = 142,
+    AXI0_WR_STALL_LIMIT          = 143,
+    AXI_LATENCY_ANY              = 160,
+    AXI_LATENCY_32               = 161,
+    AXI_LATENCY_64               = 162,
+    AXI_LATENCY_128              = 163,
+    AXI_LATENCY_256              = 164,
+    AXI_LATENCY_512              = 165,
+    AXI_LATENCY_1024             = 166,
+    ECC_DMA                      = 176,
+    ECC_SB0                      = 177,
+    AXI1_RD_TRANS_ACCEPTED       = 384,
+    AXI1_RD_TRANS_COMPLETED      = 385,
+    AXI1_RD_DATA_BEAT_RECEIVED   = 386,
+    AXI1_RD_TRAN_REQ_STALLED     = 387,
+    AXI1_WR_TRANS_ACCEPTED       = 388,
+    AXI1_WR_TRANS_COMPLETED_M    = 389,
+    AXI1_WR_TRANS_COMPLETED_S    = 390,
+    AXI1_WR_DATA_BEAT_WRITTEN    = 391,
+    AXI1_WR_TRAN_REQ_STALLED     = 392,
+    AXI1_WR_DATA_BEAT_STALLED    = 393,
+    AXI1_ENABLED_CYCLES          = 396,
+    AXI1_RD_STALL_LIMIT          = 398,
+    AXI1_WR_STALL_LIMIT          = 399,
+    ECC_SB1                      = 433,
+};
+
+enum class pooling_mode : uint8_t
+{
+    MAX        = 0,
+    AVERAGE    = 1,
+    REDUCE_SUM = 2,
+};
+
+enum class privilege_level : uint8_t
+{
+    USER       = 0,
+    PRIVILEGED = 1,
+};
+
+enum class round_mode : uint8_t
+{
+    DBL      = 0,
+    TRUNCATE = 1,
+    NATURAL  = 2,
+};
+
+enum class security_level : uint8_t
+{
+    SECURE     = 0,
+    NON_SECURE = 1,
+};
+
+enum class state : uint8_t
+{
+    STOPPED = 0,
+    RUNNING = 1,
+};
+
+enum class wd_core_slice_state : uint8_t
+{
+    HEADER  = 0,
+    PALETTE = 1,
+    WEIGHTS = 2,
+};
+
+enum class wd_ctrl_state : uint8_t
+{
+    IDLE     = 0,
+    DRAIN    = 1,
+    OFD_INIT = 2,
+    OFD_RUN  = 3,
+};
+
+enum class weight_order : uint8_t
+{
+    DEPTH_FIRST       = 0,
+    PART_KERNEL_FIRST = 1,
+};
+
+#else
+
+enum acc_format
+{
+    ACC_FORMAT_I32 = 0,
+    ACC_FORMAT_I40 = 1,
+    ACC_FORMAT_F16 = 2,
+};
+
+enum activation_clip_range
+{
+    ACTIVATION_CLIP_RANGE_OFM_PRECISION = 0,
+    ACTIVATION_CLIP_RANGE_FORCE_UINT8   = 2,
+    ACTIVATION_CLIP_RANGE_FORCE_INT8    = 3,
+    ACTIVATION_CLIP_RANGE_FORCE_INT16   = 5,
+};
+
+enum activation_format
+{
+    ACTIVATION_FORMAT_NHWC    = 0,
+    ACTIVATION_FORMAT_NHCWB16 = 1,
+};
+
+enum activation_function
+{
+    ACTIVATION_FUNCTION_RELU    = 0,
+    ACTIVATION_FUNCTION_TANH    = 3,
+    ACTIVATION_FUNCTION_SIGMOID = 4,
+    ACTIVATION_FUNCTION_TABLE_0 = 16,
+    ACTIVATION_FUNCTION_TABLE_1 = 17,
+    ACTIVATION_FUNCTION_TABLE_2 = 18,
+    ACTIVATION_FUNCTION_TABLE_3 = 19,
+    ACTIVATION_FUNCTION_TABLE_4 = 20,
+    ACTIVATION_FUNCTION_TABLE_5 = 21,
+    ACTIVATION_FUNCTION_TABLE_6 = 22,
+    ACTIVATION_FUNCTION_TABLE_7 = 23,
+};
+
+enum activation_precision
+{
+    ACTIVATION_PRECISION_B8  = 0,
+    ACTIVATION_PRECISION_B16 = 1,
+    ACTIVATION_PRECISION_B32 = 2,
+    ACTIVATION_PRECISION_B64 = 3,
+};
+
+enum activation_type
+{
+    ACTIVATION_TYPE_UNSIGNED = 0,
+    ACTIVATION_TYPE_SIGNED   = 1,
+};
+
+enum axi_mem_encoding
+{
+    AXI_MEM_ENCODING_DEVICE_NON_BUFFERABLE                 = 0,
+    AXI_MEM_ENCODING_DEVICE_BUFFERABLE                     = 1,
+    AXI_MEM_ENCODING_NORMAL_NON_CACHEABLE_NON_BUFFERABLE   = 2,
+    AXI_MEM_ENCODING_NORMAL_NON_CACHEABLE_BUFFERABLE       = 3,
+    AXI_MEM_ENCODING_WRITE_THROUGH_NO_ALLOCATE             = 4,
+    AXI_MEM_ENCODING_WRITE_THROUGH_READ_ALLOCATE           = 5,
+    AXI_MEM_ENCODING_WRITE_THROUGH_WRITE_ALLOCATE          = 6,
+    AXI_MEM_ENCODING_WRITE_THROUGH_READ_AND_WRITE_ALLOCATE = 7,
+    AXI_MEM_ENCODING_WRITE_BACK_NO_ALLOCATE                = 8,
+    AXI_MEM_ENCODING_WRITE_BACK_READ_ALLOCATE              = 9,
+    AXI_MEM_ENCODING_WRITE_BACK_WRITE_ALLOCATE             = 10,
+    AXI_MEM_ENCODING_WRITE_BACK_READ_AND_WRITE_ALLOCATE    = 11,
+};
+
+enum broadcast_mode
+{
+    BROADCAST_MODE_DISABLE = 0,
+    BROADCAST_MODE_ENABLE  = 1,
+};
+
+enum cmd0_opcode
+{
+    CMD0_OPCODE_NPU_OP_STOP               = 0,
+    CMD0_OPCODE_NPU_OP_IRQ                = 1,
+    CMD0_OPCODE_NPU_OP_CONV               = 2,
+    CMD0_OPCODE_NPU_OP_DEPTHWISE          = 3,
+    CMD0_OPCODE_NPU_OP_POOL               = 5,
+    CMD0_OPCODE_NPU_OP_ELEMENTWISE        = 6,
+    CMD0_OPCODE_NPU_OP_DMA_START          = 16,
+    CMD0_OPCODE_NPU_OP_DMA_WAIT           = 17,
+    CMD0_OPCODE_NPU_OP_KERNEL_WAIT        = 18,
+    CMD0_OPCODE_NPU_OP_PMU_MASK           = 19,
+    CMD0_OPCODE_NPU_SET_IFM_PAD_TOP       = 256,
+    CMD0_OPCODE_NPU_SET_IFM_PAD_LEFT      = 257,
+    CMD0_OPCODE_NPU_SET_IFM_PAD_RIGHT     = 258,
+    CMD0_OPCODE_NPU_SET_IFM_PAD_BOTTOM    = 259,
+    CMD0_OPCODE_NPU_SET_IFM_DEPTH_M1      = 260,
+    CMD0_OPCODE_NPU_SET_IFM_PRECISION     = 261,
+    CMD0_OPCODE_NPU_SET_IFM_UPSCALE       = 263,
+    CMD0_OPCODE_NPU_SET_IFM_ZERO_POINT    = 265,
+    CMD0_OPCODE_NPU_SET_IFM_WIDTH0_M1     = 266,
+    CMD0_OPCODE_NPU_SET_IFM_HEIGHT0_M1    = 267,
+    CMD0_OPCODE_NPU_SET_IFM_HEIGHT1_M1    = 268,
+    CMD0_OPCODE_NPU_SET_IFM_IB_END        = 269,
+    CMD0_OPCODE_NPU_SET_IFM_REGION        = 271,
+    CMD0_OPCODE_NPU_SET_OFM_WIDTH_M1      = 273,
+    CMD0_OPCODE_NPU_SET_OFM_HEIGHT_M1     = 274,
+    CMD0_OPCODE_NPU_SET_OFM_DEPTH_M1      = 275,
+    CMD0_OPCODE_NPU_SET_OFM_PRECISION     = 276,
+    CMD0_OPCODE_NPU_SET_OFM_BLK_WIDTH_M1  = 277,
+    CMD0_OPCODE_NPU_SET_OFM_BLK_HEIGHT_M1 = 278,
+    CMD0_OPCODE_NPU_SET_OFM_BLK_DEPTH_M1  = 279,
+    CMD0_OPCODE_NPU_SET_OFM_ZERO_POINT    = 280,
+    CMD0_OPCODE_NPU_SET_OFM_WIDTH0_M1     = 282,
+    CMD0_OPCODE_NPU_SET_OFM_HEIGHT0_M1    = 283,
+    CMD0_OPCODE_NPU_SET_OFM_HEIGHT1_M1    = 284,
+    CMD0_OPCODE_NPU_SET_OFM_REGION        = 287,
+    CMD0_OPCODE_NPU_SET_KERNEL_WIDTH_M1   = 288,
+    CMD0_OPCODE_NPU_SET_KERNEL_HEIGHT_M1  = 289,
+    CMD0_OPCODE_NPU_SET_KERNEL_STRIDE     = 290,
+    CMD0_OPCODE_NPU_SET_PARALLEL_MODE     = 291,
+    CMD0_OPCODE_NPU_SET_ACC_FORMAT        = 292,
+    CMD0_OPCODE_NPU_SET_ACTIVATION        = 293,
+    CMD0_OPCODE_NPU_SET_ACTIVATION_MIN    = 294,
+    CMD0_OPCODE_NPU_SET_ACTIVATION_MAX    = 295,
+    CMD0_OPCODE_NPU_SET_WEIGHT_REGION     = 296,
+    CMD0_OPCODE_NPU_SET_SCALE_REGION      = 297,
+    CMD0_OPCODE_NPU_SET_AB_START          = 301,
+    CMD0_OPCODE_NPU_SET_BLOCKDEP          = 303,
+    CMD0_OPCODE_NPU_SET_DMA0_SRC_REGION   = 304,
+    CMD0_OPCODE_NPU_SET_DMA0_DST_REGION   = 305,
+    CMD0_OPCODE_NPU_SET_DMA0_SIZE0        = 306,
+    CMD0_OPCODE_NPU_SET_DMA0_SIZE1        = 307,
+    CMD0_OPCODE_NPU_SET_IFM2_BROADCAST    = 384,
+    CMD0_OPCODE_NPU_SET_IFM2_SCALAR       = 385,
+    CMD0_OPCODE_NPU_SET_IFM2_PRECISION    = 389,
+    CMD0_OPCODE_NPU_SET_IFM2_ZERO_POINT   = 393,
+    CMD0_OPCODE_NPU_SET_IFM2_WIDTH0_M1    = 394,
+    CMD0_OPCODE_NPU_SET_IFM2_HEIGHT0_M1   = 395,
+    CMD0_OPCODE_NPU_SET_IFM2_HEIGHT1_M1   = 396,
+    CMD0_OPCODE_NPU_SET_IFM2_IB_START     = 397,
+    CMD0_OPCODE_NPU_SET_IFM2_REGION       = 399,
+};
+
+enum cmd1_opcode
+{
+    CMD1_OPCODE_NPU_SET_IFM_BASE0      = 0,
+    CMD1_OPCODE_NPU_SET_IFM_BASE1      = 1,
+    CMD1_OPCODE_NPU_SET_IFM_BASE2      = 2,
+    CMD1_OPCODE_NPU_SET_IFM_BASE3      = 3,
+    CMD1_OPCODE_NPU_SET_IFM_STRIDE_X   = 4,
+    CMD1_OPCODE_NPU_SET_IFM_STRIDE_Y   = 5,
+    CMD1_OPCODE_NPU_SET_IFM_STRIDE_C   = 6,
+    CMD1_OPCODE_NPU_SET_OFM_BASE0      = 16,
+    CMD1_OPCODE_NPU_SET_OFM_BASE1      = 17,
+    CMD1_OPCODE_NPU_SET_OFM_BASE2      = 18,
+    CMD1_OPCODE_NPU_SET_OFM_BASE3      = 19,
+    CMD1_OPCODE_NPU_SET_OFM_STRIDE_X   = 20,
+    CMD1_OPCODE_NPU_SET_OFM_STRIDE_Y   = 21,
+    CMD1_OPCODE_NPU_SET_OFM_STRIDE_C   = 22,
+    CMD1_OPCODE_NPU_SET_WEIGHT_BASE    = 32,
+    CMD1_OPCODE_NPU_SET_WEIGHT_LENGTH  = 33,
+    CMD1_OPCODE_NPU_SET_SCALE_BASE     = 34,
+    CMD1_OPCODE_NPU_SET_SCALE_LENGTH   = 35,
+    CMD1_OPCODE_NPU_SET_OFM_SCALE      = 36,
+    CMD1_OPCODE_NPU_SET_OPA_SCALE      = 37,
+    CMD1_OPCODE_NPU_SET_OPB_SCALE      = 38,
+    CMD1_OPCODE_NPU_SET_DMA0_SRC       = 48,
+    CMD1_OPCODE_NPU_SET_DMA0_DST       = 49,
+    CMD1_OPCODE_NPU_SET_DMA0_LEN       = 50,
+    CMD1_OPCODE_NPU_SET_DMA0_SKIP0     = 51,
+    CMD1_OPCODE_NPU_SET_DMA0_SKIP1     = 52,
+    CMD1_OPCODE_NPU_SET_IFM2_BASE0     = 128,
+    CMD1_OPCODE_NPU_SET_IFM2_BASE1     = 129,
+    CMD1_OPCODE_NPU_SET_IFM2_BASE2     = 130,
+    CMD1_OPCODE_NPU_SET_IFM2_BASE3     = 131,
+    CMD1_OPCODE_NPU_SET_IFM2_STRIDE_X  = 132,
+    CMD1_OPCODE_NPU_SET_IFM2_STRIDE_Y  = 133,
+    CMD1_OPCODE_NPU_SET_IFM2_STRIDE_C  = 134,
+    CMD1_OPCODE_NPU_SET_WEIGHT1_BASE   = 144,
+    CMD1_OPCODE_NPU_SET_WEIGHT1_LENGTH = 145,
+    CMD1_OPCODE_NPU_SET_SCALE1_BASE    = 146,
+    CMD1_OPCODE_NPU_SET_SCALE1_LENGTH  = 147,
+};
+
+enum cmd_ctrl
+{
+    CMD_CTRL_CMD0_CTRL = 0,
+    CMD_CTRL_CMD1_CTRL = 1,
+};
+
+enum custom_dma
+{
+    CUSTOM_DMA_NOT_IMPLEMENTED = 0,
+    CUSTOM_DMA_IMPLEMENTED     = 1,
+};
+
+enum dma_fault_src
+{
+    DMA_FAULT_SRC_AXI_M0 = 0,
+    DMA_FAULT_SRC_AXI_M1 = 1,
+};
+
+enum dma_region_mode
+{
+    DMA_REGION_MODE_EXTERNAL = 0,
+    DMA_REGION_MODE_INTERNAL = 1,
+};
+
+enum dma_stride_mode
+{
+    DMA_STRIDE_MODE_D1 = 0,
+    DMA_STRIDE_MODE_D2 = 1,
+    DMA_STRIDE_MODE_D3 = 2,
+};
+
+enum elementwise_mode
+{
+    ELEMENTWISE_MODE_MUL   = 0,
+    ELEMENTWISE_MODE_ADD   = 1,
+    ELEMENTWISE_MODE_SUB   = 2,
+    ELEMENTWISE_MODE_MIN   = 3,
+    ELEMENTWISE_MODE_MAX   = 4,
+    ELEMENTWISE_MODE_LRELU = 5,
+    ELEMENTWISE_MODE_ABS   = 6,
+    ELEMENTWISE_MODE_CLZ   = 7,
+    ELEMENTWISE_MODE_SHR   = 8,
+    ELEMENTWISE_MODE_SHL   = 9,
+};
+
+enum functional_safety
+{
+    FUNCTIONAL_SAFETY_NOT_IMPLEMENTED = 0,
+    FUNCTIONAL_SAFETY_IMPLEMENTED     = 1,
+};
+
+enum ifm2_operand_order
+{
+    IFM2_OPERAND_ORDER_ORDER_B = 0,
+    IFM2_OPERAND_ORDER_ORDER_A = 1,
+};
+
+enum ifm_scale_mode
+{
+    IFM_SCALE_MODE_OPA_OPB_16 = 0,
+    IFM_SCALE_MODE_OPA_32     = 1,
+    IFM_SCALE_MODE_OPB_32     = 2,
+};
+
+enum ifm_upscale_mode
+{
+    IFM_UPSCALE_MODE_NONE    = 0,
+    IFM_UPSCALE_MODE_NEAREST = 1,
+    IFM_UPSCALE_MODE_ZEROS   = 2,
+};
+
+enum kernel_decomposition
+{
+    KERNEL_DECOMPOSITION_D8X8 = 0,
+    KERNEL_DECOMPOSITION_D4X4 = 1,
+};
+
+enum kernel_dilation
+{
+    KERNEL_DILATION_NONE = 0,
+    KERNEL_DILATION_X2   = 1,
+};
+
+enum max_beats
+{
+    MAX_BEATS_B64  = 0,
+    MAX_BEATS_B128 = 1,
+    MAX_BEATS_B256 = 2,
+};
+
+enum mem_attr
+{
+    MEM_ATTR_AXI0_OUTSTANDING_COUNTER0 = 0,
+    MEM_ATTR_AXI0_OUTSTANDING_COUNTER1 = 1,
+    MEM_ATTR_AXI1_OUTSTANDING_COUNTER2 = 2,
+    MEM_ATTR_AXI1_OUTSTANDING_COUNTER3 = 3,
+};
+
+enum ofm_scale_mode
+{
+    OFM_SCALE_MODE_PER_CHANNEL = 0,
+    OFM_SCALE_MODE_GLOBAL      = 1,
+};
+
+enum parallel_mode
+{
+    PARALLEL_MODE_SINGLE_CORE     = 0,
+    PARALLEL_MODE_DUAL_CORE_DEPTH = 1,
+};
+
+enum pmu_axi_channel
+{
+    PMU_AXI_CHANNEL_RD_CMD        = 0,
+    PMU_AXI_CHANNEL_RD_IFM        = 1,
+    PMU_AXI_CHANNEL_RD_WEIGHTS    = 2,
+    PMU_AXI_CHANNEL_RD_SCALE_BIAS = 3,
+    PMU_AXI_CHANNEL_RD_MEM2MEM    = 4,
+    PMU_AXI_CHANNEL_WR_OFM        = 8,
+    PMU_AXI_CHANNEL_WR_MEM2MEM    = 9,
+};
+
+enum pmu_event
+{
+    PMU_EVENT_NO_EVENT                     = 0,
+    PMU_EVENT_CYCLE                        = 17,
+    PMU_EVENT_NPU_IDLE                     = 32,
+    PMU_EVENT_CC_STALLED_ON_BLOCKDEP       = 33,
+    PMU_EVENT_CC_STALLED_ON_SHRAM_RECONFIG = 34,
+    PMU_EVENT_NPU_ACTIVE                   = 35,
+    PMU_EVENT_MAC_ACTIVE                   = 48,
+    PMU_EVENT_MAC_ACTIVE_8BIT              = 49,
+    PMU_EVENT_MAC_ACTIVE_16BIT             = 50,
+    PMU_EVENT_MAC_DPU_ACTIVE               = 51,
+    PMU_EVENT_MAC_STALLED_BY_WD_ACC        = 52,
+    PMU_EVENT_MAC_STALLED_BY_WD            = 53,
+    PMU_EVENT_MAC_STALLED_BY_ACC           = 54,
+    PMU_EVENT_MAC_STALLED_BY_IB            = 55,
+    PMU_EVENT_MAC_ACTIVE_32BIT             = 56,
+    PMU_EVENT_MAC_STALLED_BY_INT_W         = 57,
+    PMU_EVENT_MAC_STALLED_BY_INT_ACC       = 58,
+    PMU_EVENT_AO_ACTIVE                    = 64,
+    PMU_EVENT_AO_ACTIVE_8BIT               = 65,
+    PMU_EVENT_AO_ACTIVE_16BIT              = 66,
+    PMU_EVENT_AO_STALLED_BY_OFMP_OB        = 67,
+    PMU_EVENT_AO_STALLED_BY_OFMP           = 68,
+    PMU_EVENT_AO_STALLED_BY_OB             = 69,
+    PMU_EVENT_AO_STALLED_BY_ACC_IB         = 70,
+    PMU_EVENT_AO_STALLED_BY_ACC            = 71,
+    PMU_EVENT_AO_STALLED_BY_IB             = 72,
+    PMU_EVENT_WD_ACTIVE                    = 80,
+    PMU_EVENT_WD_STALLED                   = 81,
+    PMU_EVENT_WD_STALLED_BY_WS             = 82,
+    PMU_EVENT_WD_STALLED_BY_WD_BUF         = 83,
+    PMU_EVENT_WD_PARSE_ACTIVE              = 84,
+    PMU_EVENT_WD_PARSE_STALLED             = 85,
+    PMU_EVENT_WD_PARSE_STALLED_IN          = 86,
+    PMU_EVENT_WD_PARSE_STALLED_OUT         = 87,
+    PMU_EVENT_WD_TRANS_WS                  = 88,
+    PMU_EVENT_WD_TRANS_WB                  = 89,
+    PMU_EVENT_WD_TRANS_DW0                 = 90,
+    PMU_EVENT_WD_TRANS_DW1                 = 91,
+    PMU_EVENT_AXI0_RD_TRANS_ACCEPTED       = 128,
+    PMU_EVENT_AXI0_RD_TRANS_COMPLETED      = 129,
+    PMU_EVENT_AXI0_RD_DATA_BEAT_RECEIVED   = 130,
+    PMU_EVENT_AXI0_RD_TRAN_REQ_STALLED     = 131,
+    PMU_EVENT_AXI0_WR_TRANS_ACCEPTED       = 132,
+    PMU_EVENT_AXI0_WR_TRANS_COMPLETED_M    = 133,
+    PMU_EVENT_AXI0_WR_TRANS_COMPLETED_S    = 134,
+    PMU_EVENT_AXI0_WR_DATA_BEAT_WRITTEN    = 135,
+    PMU_EVENT_AXI0_WR_TRAN_REQ_STALLED     = 136,
+    PMU_EVENT_AXI0_WR_DATA_BEAT_STALLED    = 137,
+    PMU_EVENT_AXI0_ENABLED_CYCLES          = 140,
+    PMU_EVENT_AXI0_RD_STALL_LIMIT          = 142,
+    PMU_EVENT_AXI0_WR_STALL_LIMIT          = 143,
+    PMU_EVENT_AXI_LATENCY_ANY              = 160,
+    PMU_EVENT_AXI_LATENCY_32               = 161,
+    PMU_EVENT_AXI_LATENCY_64               = 162,
+    PMU_EVENT_AXI_LATENCY_128              = 163,
+    PMU_EVENT_AXI_LATENCY_256              = 164,
+    PMU_EVENT_AXI_LATENCY_512              = 165,
+    PMU_EVENT_AXI_LATENCY_1024             = 166,
+    PMU_EVENT_ECC_DMA                      = 176,
+    PMU_EVENT_ECC_SB0                      = 177,
+    PMU_EVENT_AXI1_RD_TRANS_ACCEPTED       = 384,
+    PMU_EVENT_AXI1_RD_TRANS_COMPLETED      = 385,
+    PMU_EVENT_AXI1_RD_DATA_BEAT_RECEIVED   = 386,
+    PMU_EVENT_AXI1_RD_TRAN_REQ_STALLED     = 387,
+    PMU_EVENT_AXI1_WR_TRANS_ACCEPTED       = 388,
+    PMU_EVENT_AXI1_WR_TRANS_COMPLETED_M    = 389,
+    PMU_EVENT_AXI1_WR_TRANS_COMPLETED_S    = 390,
+    PMU_EVENT_AXI1_WR_DATA_BEAT_WRITTEN    = 391,
+    PMU_EVENT_AXI1_WR_TRAN_REQ_STALLED     = 392,
+    PMU_EVENT_AXI1_WR_DATA_BEAT_STALLED    = 393,
+    PMU_EVENT_AXI1_ENABLED_CYCLES          = 396,
+    PMU_EVENT_AXI1_RD_STALL_LIMIT          = 398,
+    PMU_EVENT_AXI1_WR_STALL_LIMIT          = 399,
+    PMU_EVENT_ECC_SB1                      = 433,
+};
+
+enum pooling_mode
+{
+    POOLING_MODE_MAX        = 0,
+    POOLING_MODE_AVERAGE    = 1,
+    POOLING_MODE_REDUCE_SUM = 2,
+};
+
+enum privilege_level
+{
+    PRIVILEGE_LEVEL_USER       = 0,
+    PRIVILEGE_LEVEL_PRIVILEGED = 1,
+};
+
+enum round_mode
+{
+    ROUND_MODE_DBL      = 0,
+    ROUND_MODE_TRUNCATE = 1,
+    ROUND_MODE_NATURAL  = 2,
+};
+
+enum security_level
+{
+    SECURITY_LEVEL_SECURE     = 0,
+    SECURITY_LEVEL_NON_SECURE = 1,
+};
+
+enum state
+{
+    STATE_STOPPED = 0,
+    STATE_RUNNING = 1,
+};
+
+enum wd_core_slice_state
+{
+    WD_CORE_SLICE_STATE_HEADER  = 0,
+    WD_CORE_SLICE_STATE_PALETTE = 1,
+    WD_CORE_SLICE_STATE_WEIGHTS = 2,
+};
+
+enum wd_ctrl_state
+{
+    WD_CTRL_STATE_IDLE     = 0,
+    WD_CTRL_STATE_DRAIN    = 1,
+    WD_CTRL_STATE_OFD_INIT = 2,
+    WD_CTRL_STATE_OFD_RUN  = 3,
+};
+
+enum weight_order
+{
+    WEIGHT_ORDER_DEPTH_FIRST       = 0,
+    WEIGHT_ORDER_PART_KERNEL_FIRST = 1,
+};
+
+#endif
+
+#ifdef NPU_DISASSEMBLE
+
+static const char *acc_format_str[] = {
+    "ACC_FORMAT_I32",
+    "ACC_FORMAT_I40",
+    "ACC_FORMAT_F16",
+};
+
+static const char *activation_clip_range_str[] = {
+    "ACTIVATION_CLIP_RANGE_OFM_PRECISION",
+    "ACTIVATION_CLIP_RANGE_FORCE_UINT8",
+    "ACTIVATION_CLIP_RANGE_FORCE_INT8",
+    "ACTIVATION_CLIP_RANGE_FORCE_INT16",
+};
+
+static const char *activation_format_str[] = {
+    "ACTIVATION_FORMAT_NHWC",
+    "ACTIVATION_FORMAT_NHCWB16",
+};
+
+static const char *activation_function_str[] = {
+    "ACTIVATION_FUNCTION_RELU",
+    "ACTIVATION_FUNCTION_TANH",
+    "ACTIVATION_FUNCTION_SIGMOID",
+    "ACTIVATION_FUNCTION_TABLE_0",
+    "ACTIVATION_FUNCTION_TABLE_1",
+    "ACTIVATION_FUNCTION_TABLE_2",
+    "ACTIVATION_FUNCTION_TABLE_3",
+    "ACTIVATION_FUNCTION_TABLE_4",
+    "ACTIVATION_FUNCTION_TABLE_5",
+    "ACTIVATION_FUNCTION_TABLE_6",
+    "ACTIVATION_FUNCTION_TABLE_7",
+};
+
+static const char *activation_precision_str[] = {
+    "ACTIVATION_PRECISION_B8",
+    "ACTIVATION_PRECISION_B16",
+    "ACTIVATION_PRECISION_B32",
+    "ACTIVATION_PRECISION_B64",
+};
+
+static const char *activation_type_str[] = {
+    "ACTIVATION_TYPE_UNSIGNED",
+    "ACTIVATION_TYPE_SIGNED",
+};
+
+static const char *axi_mem_encoding_str[] = {
+    "AXI_MEM_ENCODING_DEVICE_NON_BUFFERABLE",
+    "AXI_MEM_ENCODING_DEVICE_BUFFERABLE",
+    "AXI_MEM_ENCODING_NORMAL_NON_CACHEABLE_NON_BUFFERABLE",
+    "AXI_MEM_ENCODING_NORMAL_NON_CACHEABLE_BUFFERABLE",
+    "AXI_MEM_ENCODING_WRITE_THROUGH_NO_ALLOCATE",
+    "AXI_MEM_ENCODING_WRITE_THROUGH_READ_ALLOCATE",
+    "AXI_MEM_ENCODING_WRITE_THROUGH_WRITE_ALLOCATE",
+    "AXI_MEM_ENCODING_WRITE_THROUGH_READ_AND_WRITE_ALLOCATE",
+    "AXI_MEM_ENCODING_WRITE_BACK_NO_ALLOCATE",
+    "AXI_MEM_ENCODING_WRITE_BACK_READ_ALLOCATE",
+    "AXI_MEM_ENCODING_WRITE_BACK_WRITE_ALLOCATE",
+    "AXI_MEM_ENCODING_WRITE_BACK_READ_AND_WRITE_ALLOCATE",
+};
+
+static const char *broadcast_mode_str[] = {
+    "BROADCAST_MODE_DISABLE",
+    "BROADCAST_MODE_ENABLE",
+};
+
+static const char *cmd0_opcode_str[] = {
+    "CMD0_OPCODE_NPU_OP_STOP",
+    "CMD0_OPCODE_NPU_OP_IRQ",
+    "CMD0_OPCODE_NPU_OP_CONV",
+    "CMD0_OPCODE_NPU_OP_DEPTHWISE",
+    "CMD0_OPCODE_NPU_OP_POOL",
+    "CMD0_OPCODE_NPU_OP_ELEMENTWISE",
+    "CMD0_OPCODE_NPU_OP_DMA_START",
+    "CMD0_OPCODE_NPU_OP_DMA_WAIT",
+    "CMD0_OPCODE_NPU_OP_KERNEL_WAIT",
+    "CMD0_OPCODE_NPU_OP_PMU_MASK",
+    "CMD0_OPCODE_NPU_SET_IFM_PAD_TOP",
+    "CMD0_OPCODE_NPU_SET_IFM_PAD_LEFT",
+    "CMD0_OPCODE_NPU_SET_IFM_PAD_RIGHT",
+    "CMD0_OPCODE_NPU_SET_IFM_PAD_BOTTOM",
+    "CMD0_OPCODE_NPU_SET_IFM_DEPTH_M1",
+    "CMD0_OPCODE_NPU_SET_IFM_PRECISION",
+    "CMD0_OPCODE_NPU_SET_IFM_UPSCALE",
+    "CMD0_OPCODE_NPU_SET_IFM_ZERO_POINT",
+    "CMD0_OPCODE_NPU_SET_IFM_WIDTH0_M1",
+    "CMD0_OPCODE_NPU_SET_IFM_HEIGHT0_M1",
+    "CMD0_OPCODE_NPU_SET_IFM_HEIGHT1_M1",
+    "CMD0_OPCODE_NPU_SET_IFM_IB_END",
+    "CMD0_OPCODE_NPU_SET_IFM_REGION",
+    "CMD0_OPCODE_NPU_SET_OFM_WIDTH_M1",
+    "CMD0_OPCODE_NPU_SET_OFM_HEIGHT_M1",
+    "CMD0_OPCODE_NPU_SET_OFM_DEPTH_M1",
+    "CMD0_OPCODE_NPU_SET_OFM_PRECISION",
+    "CMD0_OPCODE_NPU_SET_OFM_BLK_WIDTH_M1",
+    "CMD0_OPCODE_NPU_SET_OFM_BLK_HEIGHT_M1",
+    "CMD0_OPCODE_NPU_SET_OFM_BLK_DEPTH_M1",
+    "CMD0_OPCODE_NPU_SET_OFM_ZERO_POINT",
+    "CMD0_OPCODE_NPU_SET_OFM_WIDTH0_M1",
+    "CMD0_OPCODE_NPU_SET_OFM_HEIGHT0_M1",
+    "CMD0_OPCODE_NPU_SET_OFM_HEIGHT1_M1",
+    "CMD0_OPCODE_NPU_SET_OFM_REGION",
+    "CMD0_OPCODE_NPU_SET_KERNEL_WIDTH_M1",
+    "CMD0_OPCODE_NPU_SET_KERNEL_HEIGHT_M1",
+    "CMD0_OPCODE_NPU_SET_KERNEL_STRIDE",
+    "CMD0_OPCODE_NPU_SET_PARALLEL_MODE",
+    "CMD0_OPCODE_NPU_SET_ACC_FORMAT",
+    "CMD0_OPCODE_NPU_SET_ACTIVATION",
+    "CMD0_OPCODE_NPU_SET_ACTIVATION_MIN",
+    "CMD0_OPCODE_NPU_SET_ACTIVATION_MAX",
+    "CMD0_OPCODE_NPU_SET_WEIGHT_REGION",
+    "CMD0_OPCODE_NPU_SET_SCALE_REGION",
+    "CMD0_OPCODE_NPU_SET_AB_START",
+    "CMD0_OPCODE_NPU_SET_BLOCKDEP",
+    "CMD0_OPCODE_NPU_SET_DMA0_SRC_REGION",
+    "CMD0_OPCODE_NPU_SET_DMA0_DST_REGION",
+    "CMD0_OPCODE_NPU_SET_DMA0_SIZE0",
+    "CMD0_OPCODE_NPU_SET_DMA0_SIZE1",
+    "CMD0_OPCODE_NPU_SET_IFM2_BROADCAST",
+    "CMD0_OPCODE_NPU_SET_IFM2_SCALAR",
+    "CMD0_OPCODE_NPU_SET_IFM2_PRECISION",
+    "CMD0_OPCODE_NPU_SET_IFM2_ZERO_POINT",
+    "CMD0_OPCODE_NPU_SET_IFM2_WIDTH0_M1",
+    "CMD0_OPCODE_NPU_SET_IFM2_HEIGHT0_M1",
+    "CMD0_OPCODE_NPU_SET_IFM2_HEIGHT1_M1",
+    "CMD0_OPCODE_NPU_SET_IFM2_IB_START",
+    "CMD0_OPCODE_NPU_SET_IFM2_REGION",
+};
+
+static const char *cmd1_opcode_str[] = {
+    "CMD1_OPCODE_NPU_SET_IFM_BASE0",     "CMD1_OPCODE_NPU_SET_IFM_BASE1",      "CMD1_OPCODE_NPU_SET_IFM_BASE2",
+    "CMD1_OPCODE_NPU_SET_IFM_BASE3",     "CMD1_OPCODE_NPU_SET_IFM_STRIDE_X",   "CMD1_OPCODE_NPU_SET_IFM_STRIDE_Y",
+    "CMD1_OPCODE_NPU_SET_IFM_STRIDE_C",  "CMD1_OPCODE_NPU_SET_OFM_BASE0",      "CMD1_OPCODE_NPU_SET_OFM_BASE1",
+    "CMD1_OPCODE_NPU_SET_OFM_BASE2",     "CMD1_OPCODE_NPU_SET_OFM_BASE3",      "CMD1_OPCODE_NPU_SET_OFM_STRIDE_X",
+    "CMD1_OPCODE_NPU_SET_OFM_STRIDE_Y",  "CMD1_OPCODE_NPU_SET_OFM_STRIDE_C",   "CMD1_OPCODE_NPU_SET_WEIGHT_BASE",
+    "CMD1_OPCODE_NPU_SET_WEIGHT_LENGTH", "CMD1_OPCODE_NPU_SET_SCALE_BASE",     "CMD1_OPCODE_NPU_SET_SCALE_LENGTH",
+    "CMD1_OPCODE_NPU_SET_OFM_SCALE",     "CMD1_OPCODE_NPU_SET_OPA_SCALE",      "CMD1_OPCODE_NPU_SET_OPB_SCALE",
+    "CMD1_OPCODE_NPU_SET_DMA0_SRC",      "CMD1_OPCODE_NPU_SET_DMA0_DST",       "CMD1_OPCODE_NPU_SET_DMA0_LEN",
+    "CMD1_OPCODE_NPU_SET_DMA0_SKIP0",    "CMD1_OPCODE_NPU_SET_DMA0_SKIP1",     "CMD1_OPCODE_NPU_SET_IFM2_BASE0",
+    "CMD1_OPCODE_NPU_SET_IFM2_BASE1",    "CMD1_OPCODE_NPU_SET_IFM2_BASE2",     "CMD1_OPCODE_NPU_SET_IFM2_BASE3",
+    "CMD1_OPCODE_NPU_SET_IFM2_STRIDE_X", "CMD1_OPCODE_NPU_SET_IFM2_STRIDE_Y",  "CMD1_OPCODE_NPU_SET_IFM2_STRIDE_C",
+    "CMD1_OPCODE_NPU_SET_WEIGHT1_BASE",  "CMD1_OPCODE_NPU_SET_WEIGHT1_LENGTH", "CMD1_OPCODE_NPU_SET_SCALE1_BASE",
+    "CMD1_OPCODE_NPU_SET_SCALE1_LENGTH",
+};
+
+static const char *cmd_ctrl_str[] = {
+    "CMD_CTRL_CMD0_CTRL",
+    "CMD_CTRL_CMD1_CTRL",
+};
+
+static const char *custom_dma_str[] = {
+    "CUSTOM_DMA_NOT_IMPLEMENTED",
+    "CUSTOM_DMA_IMPLEMENTED",
+};
+
+static const char *dma_fault_src_str[] = {
+    "DMA_FAULT_SRC_AXI_M0",
+    "DMA_FAULT_SRC_AXI_M1",
+};
+
+static const char *dma_region_mode_str[] = {
+    "DMA_REGION_MODE_EXTERNAL",
+    "DMA_REGION_MODE_INTERNAL",
+};
+
+static const char *dma_stride_mode_str[] = {
+    "DMA_STRIDE_MODE_D1",
+    "DMA_STRIDE_MODE_D2",
+    "DMA_STRIDE_MODE_D3",
+};
+
+static const char *elementwise_mode_str[] = {
+    "ELEMENTWISE_MODE_MUL",
+    "ELEMENTWISE_MODE_ADD",
+    "ELEMENTWISE_MODE_SUB",
+    "ELEMENTWISE_MODE_MIN",
+    "ELEMENTWISE_MODE_MAX",
+    "ELEMENTWISE_MODE_LRELU",
+    "ELEMENTWISE_MODE_ABS",
+    "ELEMENTWISE_MODE_CLZ",
+    "ELEMENTWISE_MODE_SHR",
+    "ELEMENTWISE_MODE_SHL",
+};
+
+static const char *functional_safety_str[] = {
+    "FUNCTIONAL_SAFETY_NOT_IMPLEMENTED",
+    "FUNCTIONAL_SAFETY_IMPLEMENTED",
+};
+
+static const char *ifm2_operand_order_str[] = {
+    "IFM2_OPERAND_ORDER_ORDER_B",
+    "IFM2_OPERAND_ORDER_ORDER_A",
+};
+
+static const char *ifm_scale_mode_str[] = {
+    "IFM_SCALE_MODE_OPA_OPB_16",
+    "IFM_SCALE_MODE_OPA_32",
+    "IFM_SCALE_MODE_OPB_32",
+};
+
+static const char *ifm_upscale_mode_str[] = {
+    "IFM_UPSCALE_MODE_NONE",
+    "IFM_UPSCALE_MODE_NEAREST",
+    "IFM_UPSCALE_MODE_ZEROS",
+};
+
+static const char *kernel_decomposition_str[] = {
+    "KERNEL_DECOMPOSITION_D8X8",
+    "KERNEL_DECOMPOSITION_D4X4",
+};
+
+static const char *kernel_dilation_str[] = {
+    "KERNEL_DILATION_NONE",
+    "KERNEL_DILATION_X2",
+};
+
+static const char *max_beats_str[] = {
+    "MAX_BEATS_B64",
+    "MAX_BEATS_B128",
+    "MAX_BEATS_B256",
+};
+
+static const char *mem_attr_str[] = {
+    "MEM_ATTR_AXI0_OUTSTANDING_COUNTER0",
+    "MEM_ATTR_AXI0_OUTSTANDING_COUNTER1",
+    "MEM_ATTR_AXI1_OUTSTANDING_COUNTER2",
+    "MEM_ATTR_AXI1_OUTSTANDING_COUNTER3",
+};
+
+static const char *ofm_scale_mode_str[] = {
+    "OFM_SCALE_MODE_PER_CHANNEL",
+    "OFM_SCALE_MODE_GLOBAL",
+};
+
+static const char *parallel_mode_str[] = {
+    "PARALLEL_MODE_SINGLE_CORE",
+    "PARALLEL_MODE_DUAL_CORE_DEPTH",
+};
+
+static const char *pmu_axi_channel_str[] = {
+    "PMU_AXI_CHANNEL_RD_CMD",
+    "PMU_AXI_CHANNEL_RD_IFM",
+    "PMU_AXI_CHANNEL_RD_WEIGHTS",
+    "PMU_AXI_CHANNEL_RD_SCALE_BIAS",
+    "PMU_AXI_CHANNEL_RD_MEM2MEM",
+    "PMU_AXI_CHANNEL_WR_OFM",
+    "PMU_AXI_CHANNEL_WR_MEM2MEM",
+};
+
+static const char *pmu_event_str[] = {
+    "PMU_EVENT_NO_EVENT",
+    "PMU_EVENT_CYCLE",
+    "PMU_EVENT_NPU_IDLE",
+    "PMU_EVENT_CC_STALLED_ON_BLOCKDEP",
+    "PMU_EVENT_CC_STALLED_ON_SHRAM_RECONFIG",
+    "PMU_EVENT_NPU_ACTIVE",
+    "PMU_EVENT_MAC_ACTIVE",
+    "PMU_EVENT_MAC_ACTIVE_8BIT",
+    "PMU_EVENT_MAC_ACTIVE_16BIT",
+    "PMU_EVENT_MAC_DPU_ACTIVE",
+    "PMU_EVENT_MAC_STALLED_BY_WD_ACC",
+    "PMU_EVENT_MAC_STALLED_BY_WD",
+    "PMU_EVENT_MAC_STALLED_BY_ACC",
+    "PMU_EVENT_MAC_STALLED_BY_IB",
+    "PMU_EVENT_MAC_ACTIVE_32BIT",
+    "PMU_EVENT_MAC_STALLED_BY_INT_W",
+    "PMU_EVENT_MAC_STALLED_BY_INT_ACC",
+    "PMU_EVENT_AO_ACTIVE",
+    "PMU_EVENT_AO_ACTIVE_8BIT",
+    "PMU_EVENT_AO_ACTIVE_16BIT",
+    "PMU_EVENT_AO_STALLED_BY_OFMP_OB",
+    "PMU_EVENT_AO_STALLED_BY_OFMP",
+    "PMU_EVENT_AO_STALLED_BY_OB",
+    "PMU_EVENT_AO_STALLED_BY_ACC_IB",
+    "PMU_EVENT_AO_STALLED_BY_ACC",
+    "PMU_EVENT_AO_STALLED_BY_IB",
+    "PMU_EVENT_WD_ACTIVE",
+    "PMU_EVENT_WD_STALLED",
+    "PMU_EVENT_WD_STALLED_BY_WS",
+    "PMU_EVENT_WD_STALLED_BY_WD_BUF",
+    "PMU_EVENT_WD_PARSE_ACTIVE",
+    "PMU_EVENT_WD_PARSE_STALLED",
+    "PMU_EVENT_WD_PARSE_STALLED_IN",
+    "PMU_EVENT_WD_PARSE_STALLED_OUT",
+    "PMU_EVENT_WD_TRANS_WS",
+    "PMU_EVENT_WD_TRANS_WB",
+    "PMU_EVENT_WD_TRANS_DW0",
+    "PMU_EVENT_WD_TRANS_DW1",
+    "PMU_EVENT_AXI0_RD_TRANS_ACCEPTED",
+    "PMU_EVENT_AXI0_RD_TRANS_COMPLETED",
+    "PMU_EVENT_AXI0_RD_DATA_BEAT_RECEIVED",
+    "PMU_EVENT_AXI0_RD_TRAN_REQ_STALLED",
+    "PMU_EVENT_AXI0_WR_TRANS_ACCEPTED",
+    "PMU_EVENT_AXI0_WR_TRANS_COMPLETED_M",
+    "PMU_EVENT_AXI0_WR_TRANS_COMPLETED_S",
+    "PMU_EVENT_AXI0_WR_DATA_BEAT_WRITTEN",
+    "PMU_EVENT_AXI0_WR_TRAN_REQ_STALLED",
+    "PMU_EVENT_AXI0_WR_DATA_BEAT_STALLED",
+    "PMU_EVENT_AXI0_ENABLED_CYCLES",
+    "PMU_EVENT_AXI0_RD_STALL_LIMIT",
+    "PMU_EVENT_AXI0_WR_STALL_LIMIT",
+    "PMU_EVENT_AXI_LATENCY_ANY",
+    "PMU_EVENT_AXI_LATENCY_32",
+    "PMU_EVENT_AXI_LATENCY_64",
+    "PMU_EVENT_AXI_LATENCY_128",
+    "PMU_EVENT_AXI_LATENCY_256",
+    "PMU_EVENT_AXI_LATENCY_512",
+    "PMU_EVENT_AXI_LATENCY_1024",
+    "PMU_EVENT_ECC_DMA",
+    "PMU_EVENT_ECC_SB0",
+    "PMU_EVENT_AXI1_RD_TRANS_ACCEPTED",
+    "PMU_EVENT_AXI1_RD_TRANS_COMPLETED",
+    "PMU_EVENT_AXI1_RD_DATA_BEAT_RECEIVED",
+    "PMU_EVENT_AXI1_RD_TRAN_REQ_STALLED",
+    "PMU_EVENT_AXI1_WR_TRANS_ACCEPTED",
+    "PMU_EVENT_AXI1_WR_TRANS_COMPLETED_M",
+    "PMU_EVENT_AXI1_WR_TRANS_COMPLETED_S",
+    "PMU_EVENT_AXI1_WR_DATA_BEAT_WRITTEN",
+    "PMU_EVENT_AXI1_WR_TRAN_REQ_STALLED",
+    "PMU_EVENT_AXI1_WR_DATA_BEAT_STALLED",
+    "PMU_EVENT_AXI1_ENABLED_CYCLES",
+    "PMU_EVENT_AXI1_RD_STALL_LIMIT",
+    "PMU_EVENT_AXI1_WR_STALL_LIMIT",
+    "PMU_EVENT_ECC_SB1",
+};
+
+static const char *pooling_mode_str[] = {
+    "POOLING_MODE_MAX",
+    "POOLING_MODE_AVERAGE",
+    "POOLING_MODE_REDUCE_SUM",
+};
+
+static const char *privilege_level_str[] = {
+    "PRIVILEGE_LEVEL_USER",
+    "PRIVILEGE_LEVEL_PRIVILEGED",
+};
+
+static const char *round_mode_str[] = {
+    "ROUND_MODE_DBL",
+    "ROUND_MODE_TRUNCATE",
+    "ROUND_MODE_NATURAL",
+};
+
+static const char *security_level_str[] = {
+    "SECURITY_LEVEL_SECURE",
+    "SECURITY_LEVEL_NON_SECURE",
+};
+
+static const char *state_str[] = {
+    "STATE_STOPPED",
+    "STATE_RUNNING",
+};
+
+static const char *wd_core_slice_state_str[] = {
+    "WD_CORE_SLICE_STATE_HEADER",
+    "WD_CORE_SLICE_STATE_PALETTE",
+    "WD_CORE_SLICE_STATE_WEIGHTS",
+};
+
+static const char *wd_ctrl_state_str[] = {
+    "WD_CTRL_STATE_IDLE",
+    "WD_CTRL_STATE_DRAIN",
+    "WD_CTRL_STATE_OFD_INIT",
+    "WD_CTRL_STATE_OFD_RUN",
+};
+
+static const char *weight_order_str[] = {
+    "WEIGHT_ORDER_DEPTH_FIRST",
+    "WEIGHT_ORDER_PART_KERNEL_FIRST",
+};
+
+#endif
+
+// Register type structs
+// id_r - ID register
+struct id_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t version_status : 4; // This is the version of the product
+            uint32_t version_minor : 4;  // This is the n for the P part of an RnPn release number
+            uint32_t version_major : 4;  // This is the n for the R part of an RnPn release number
+            uint32_t product_major : 4;  // Product major ID number (unique per base product)
+            uint32_t arch_patch_rev : 4; // This is the patch number of the architecture version a.b
+            uint32_t
+                arch_minor_rev : 8; // This is the minor architecture version number, b in the architecture version a.b
+            uint32_t
+                arch_major_rev : 4; // This is the major architecture version number, a in the architecture version a.b
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR id_r() : word0(268853249) {}
+    CONSTEXPR id_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    id_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_version_status() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 4) - 1) & (word0 >> 0));
+        return value;
+    }
+    uint32_t get_version_status() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 4) - 1) & (word0 >> 0));
+        return value;
+    }
+    CONSTEXPR id_r &set_version_status(uint32_t value)
+    {
+        word0 = (((~((1U << 4) - 1)) << 0) & word0) | ((((1U << 4) - 1) & static_cast<uint32_t>(value)) << 0);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_version_minor() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 4) - 1) & (word0 >> 4));
+        return value;
+    }
+    uint32_t get_version_minor() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 4) - 1) & (word0 >> 4));
+        return value;
+    }
+    CONSTEXPR id_r &set_version_minor(uint32_t value)
+    {
+        word0 = (((~((1U << 4) - 1)) << 4) & word0) | ((((1U << 4) - 1) & static_cast<uint32_t>(value)) << 4);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_version_major() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 4) - 1) & (word0 >> 8));
+        return value;
+    }
+    uint32_t get_version_major() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 4) - 1) & (word0 >> 8));
+        return value;
+    }
+    CONSTEXPR id_r &set_version_major(uint32_t value)
+    {
+        word0 = (((~((1U << 4) - 1)) << 8) & word0) | ((((1U << 4) - 1) & static_cast<uint32_t>(value)) << 8);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_product_major() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 4) - 1) & (word0 >> 12));
+        return value;
+    }
+    uint32_t get_product_major() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 4) - 1) & (word0 >> 12));
+        return value;
+    }
+    CONSTEXPR id_r &set_product_major(uint32_t value)
+    {
+        word0 = (((~((1U << 4) - 1)) << 12) & word0) | ((((1U << 4) - 1) & static_cast<uint32_t>(value)) << 12);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_arch_patch_rev() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 4) - 1) & (word0 >> 16));
+        return value;
+    }
+    uint32_t get_arch_patch_rev() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 4) - 1) & (word0 >> 16));
+        return value;
+    }
+    CONSTEXPR id_r &set_arch_patch_rev(uint32_t value)
+    {
+        word0 = (((~((1U << 4) - 1)) << 16) & word0) | ((((1U << 4) - 1) & static_cast<uint32_t>(value)) << 16);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_arch_minor_rev() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 8) - 1) & (word0 >> 20));
+        return value;
+    }
+    uint32_t get_arch_minor_rev() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 8) - 1) & (word0 >> 20));
+        return value;
+    }
+    CONSTEXPR id_r &set_arch_minor_rev(uint32_t value)
+    {
+        word0 = (((~((1U << 8) - 1)) << 20) & word0) | ((((1U << 8) - 1) & static_cast<uint32_t>(value)) << 20);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_arch_major_rev() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 4) - 1) & (word0 >> 28));
+        return value;
+    }
+    uint32_t get_arch_major_rev() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 4) - 1) & (word0 >> 28));
+        return value;
+    }
+    CONSTEXPR id_r &set_arch_major_rev(uint32_t value)
+    {
+        word0 = (((~((1U << 4) - 1)) << 28) & word0) | ((((1U << 4) - 1) & static_cast<uint32_t>(value)) << 28);
+        return *this;
+    }
+#endif
+};
+
+// status_r - Register describes the current operating status of the NPU
+struct status_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t state : 1;      // NPU state, 0 = Stopped, 1 = Running
+            uint32_t irq_raised : 1; // Raw IRQ status, 0 = IRQ not raised, 1 = IRQ raised. IRQ is cleared using command
+                                     // register bit 1
+            uint32_t
+                bus_status : 1; // 0=OK, 1=Bus abort detected and processing halted (NPU will reach IDLE state and not
+                                // to start process any more commands/AXI transactions). Can only be cleared by a reset
+            uint32_t reset_status : 1; // Reset is ongoing and only this register can be read (other registers read as 0
+                                       // and writes are ignored.) A value of 0 means NPU is not being reset and can be
+                                       // accessed as normal
+            uint32_t
+                cmd_parse_error : 1; // 0=No error 1=Command stream parsing error detected. Can only be cleared by reset
+            uint32_t cmd_end_reached : 1; // 0=Not reached, 1=Reached. Cleared by writing QBASE or QSIZE when NPU is in
+                                          // stopped state
+            uint32_t pmu_irq_raised : 1;  // 0=No PMU IRQ, 1=PMU IRQ raised. Cleared by using command register bit 1
+            uint32_t wd_fault : 1; // Weight decoder state: 0=no fault 1=weight decoder decompression fault. Can only be
+                                   // cleared by reset
+            uint32_t ecc_fault : 1; // ECC state for internal RAMs: 0=no fault 1=ECC fault signalled. Can only be
+                                    // cleared by reset
+            uint32_t reserved0 : 2;
+            uint32_t faulting_interface : 1; // Faulting interface on bus abort
+            uint32_t faulting_channel : 4;  // Faulting channel on a bus abort. Read: 0=Cmd 1=IFM 2=Weights 3=Scale+Bias
+                                            // 4=Mem2Mem; Write: 8=OFM 9=Mem2Mem
+            uint32_t irq_history_mask : 16; // IRQ History mask
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR status_r() : word0(8) {}
+    CONSTEXPR status_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    status_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR NPU_NAMESPACE::state get_state() const
+    {
+        NPU_NAMESPACE::state value = static_cast<NPU_NAMESPACE::state>(((1U << 1) - 1) & (word0 >> 0));
+        return value;
+    }
+    NPU_NAMESPACE::state get_state() const volatile
+    {
+        NPU_NAMESPACE::state value = static_cast<NPU_NAMESPACE::state>(((1U << 1) - 1) & (word0 >> 0));
+        return value;
+    }
+    CONSTEXPR status_r &set_state(NPU_NAMESPACE::state value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 0) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 0);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_irq_raised() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 1));
+        return value;
+    }
+    uint32_t get_irq_raised() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 1));
+        return value;
+    }
+    CONSTEXPR status_r &set_irq_raised(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 1) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 1);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_bus_status() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
+        return value;
+    }
+    uint32_t get_bus_status() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
+        return value;
+    }
+    CONSTEXPR status_r &set_bus_status(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 2) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 2);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_reset_status() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 3));
+        return value;
+    }
+    uint32_t get_reset_status() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 3));
+        return value;
+    }
+    CONSTEXPR status_r &set_reset_status(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 3) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 3);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_cmd_parse_error() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 4));
+        return value;
+    }
+    uint32_t get_cmd_parse_error() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 4));
+        return value;
+    }
+    CONSTEXPR status_r &set_cmd_parse_error(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 4) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 4);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_cmd_end_reached() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 5));
+        return value;
+    }
+    uint32_t get_cmd_end_reached() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 5));
+        return value;
+    }
+    CONSTEXPR status_r &set_cmd_end_reached(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 5) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 5);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_pmu_irq_raised() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 6));
+        return value;
+    }
+    uint32_t get_pmu_irq_raised() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 6));
+        return value;
+    }
+    CONSTEXPR status_r &set_pmu_irq_raised(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 6) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 6);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_wd_fault() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 7));
+        return value;
+    }
+    uint32_t get_wd_fault() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 7));
+        return value;
+    }
+    CONSTEXPR status_r &set_wd_fault(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 7) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 7);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_ecc_fault() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 8));
+        return value;
+    }
+    uint32_t get_ecc_fault() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 8));
+        return value;
+    }
+    CONSTEXPR status_r &set_ecc_fault(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 8) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 8);
+        return *this;
+    }
+    CONSTEXPR NPU_NAMESPACE::dma_fault_src get_faulting_interface() const
+    {
+        NPU_NAMESPACE::dma_fault_src value = static_cast<NPU_NAMESPACE::dma_fault_src>(((1U << 1) - 1) & (word0 >> 11));
+        return value;
+    }
+    NPU_NAMESPACE::dma_fault_src get_faulting_interface() const volatile
+    {
+        NPU_NAMESPACE::dma_fault_src value = static_cast<NPU_NAMESPACE::dma_fault_src>(((1U << 1) - 1) & (word0 >> 11));
+        return value;
+    }
+    CONSTEXPR status_r &set_faulting_interface(NPU_NAMESPACE::dma_fault_src value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 11) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 11);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_faulting_channel() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 4) - 1) & (word0 >> 12));
+        return value;
+    }
+    uint32_t get_faulting_channel() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 4) - 1) & (word0 >> 12));
+        return value;
+    }
+    CONSTEXPR status_r &set_faulting_channel(uint32_t value)
+    {
+        word0 = (((~((1U << 4) - 1)) << 12) & word0) | ((((1U << 4) - 1) & static_cast<uint32_t>(value)) << 12);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_irq_history_mask() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 16) - 1) & (word0 >> 16));
+        return value;
+    }
+    uint32_t get_irq_history_mask() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 16) - 1) & (word0 >> 16));
+        return value;
+    }
+    CONSTEXPR status_r &set_irq_history_mask(uint32_t value)
+    {
+        word0 = (((~((1U << 16) - 1)) << 16) & word0) | ((((1U << 16) - 1) & static_cast<uint32_t>(value)) << 16);
+        return *this;
+    }
+#endif
+};
+
+// cmd_r - Command register, reads as last written command
+struct cmd_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t transition_to_running_state : 1; // Write 1 to transition the NPU to running state. Writing 0 has
+                                                      // no effect
+            uint32_t clear_irq : 1; // Write 1 to clear the IRQ status in the STATUS register. Writing 0 has no effect
+            uint32_t clock_q_enable : 1; // Write 1 to this bit to enable clock off using clock q-interface and enable
+                                         // the requester clock gate
+            uint32_t power_q_enable : 1; // Write 1 to this bit to enable power off using power q-interface
+            uint32_t
+                stop_request : 1; // Write 1 to this bit to request STOP after completing any already-started commands
+            uint32_t reserved0 : 11;
+            uint32_t clear_irq_history : 16; // Clears the IRQ history mask
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR cmd_r() : word0(12) {}
+    CONSTEXPR cmd_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    cmd_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_transition_to_running_state() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 0));
+        return value;
+    }
+    uint32_t get_transition_to_running_state() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 0));
+        return value;
+    }
+    CONSTEXPR cmd_r &set_transition_to_running_state(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 0) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 0);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_clear_irq() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 1));
+        return value;
+    }
+    uint32_t get_clear_irq() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 1));
+        return value;
+    }
+    CONSTEXPR cmd_r &set_clear_irq(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 1) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 1);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_clock_q_enable() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
+        return value;
+    }
+    uint32_t get_clock_q_enable() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
+        return value;
+    }
+    CONSTEXPR cmd_r &set_clock_q_enable(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 2) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 2);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_power_q_enable() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 3));
+        return value;
+    }
+    uint32_t get_power_q_enable() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 3));
+        return value;
+    }
+    CONSTEXPR cmd_r &set_power_q_enable(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 3) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 3);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_stop_request() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 4));
+        return value;
+    }
+    uint32_t get_stop_request() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 4));
+        return value;
+    }
+    CONSTEXPR cmd_r &set_stop_request(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 4) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 4);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_clear_irq_history() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 16) - 1) & (word0 >> 16));
+        return value;
+    }
+    uint32_t get_clear_irq_history() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 16) - 1) & (word0 >> 16));
+        return value;
+    }
+    CONSTEXPR cmd_r &set_clear_irq_history(uint32_t value)
+    {
+        word0 = (((~((1U << 16) - 1)) << 16) & word0) | ((((1U << 16) - 1) & static_cast<uint32_t>(value)) << 16);
+        return *this;
+    }
+#endif
+};
+
+// reset_r - Request Reset and new security mode
+struct reset_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t pending_CPL : 1; // Current privilege level 0=User 1=Privileged
+            uint32_t pending_CSL : 1; // Current security level 0=Secure 1=Non secure
+            uint32_t reserved0 : 30;
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR reset_r() : word0(0) {}
+    CONSTEXPR reset_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    reset_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR NPU_NAMESPACE::privilege_level get_pending_CPL() const
+    {
+        NPU_NAMESPACE::privilege_level value =
+            static_cast<NPU_NAMESPACE::privilege_level>(((1U << 1) - 1) & (word0 >> 0));
+        return value;
+    }
+    NPU_NAMESPACE::privilege_level get_pending_CPL() const volatile
+    {
+        NPU_NAMESPACE::privilege_level value =
+            static_cast<NPU_NAMESPACE::privilege_level>(((1U << 1) - 1) & (word0 >> 0));
+        return value;
+    }
+    CONSTEXPR reset_r &set_pending_CPL(NPU_NAMESPACE::privilege_level value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 0) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 0);
+        return *this;
+    }
+    CONSTEXPR NPU_NAMESPACE::security_level get_pending_CSL() const
+    {
+        NPU_NAMESPACE::security_level value =
+            static_cast<NPU_NAMESPACE::security_level>(((1U << 1) - 1) & (word0 >> 1));
+        return value;
+    }
+    NPU_NAMESPACE::security_level get_pending_CSL() const volatile
+    {
+        NPU_NAMESPACE::security_level value =
+            static_cast<NPU_NAMESPACE::security_level>(((1U << 1) - 1) & (word0 >> 1));
+        return value;
+    }
+    CONSTEXPR reset_r &set_pending_CSL(NPU_NAMESPACE::security_level value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 1) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 1);
+        return *this;
+    }
+#endif
+};
+
+// qbase_r - Base address of command queue. The address is 4 byte aligned
+struct qbase_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t offset_LO : 32; // Offset - LSB
+            uint32_t offset_HI : 8;  // Offset - MSB
+            uint32_t reserved0 : 24;
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR qbase_r() : word0(0), word1(0) {}
+    CONSTEXPR qbase_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    qbase_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// qread_r - Read offset in the command stream in bytes. Multiple of 4 in the range 0 to 16 MB
+struct qread_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t QREAD : 32; // The read offset of the current command under execution
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR qread_r() : word0(0) {}
+    CONSTEXPR qread_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    qread_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_QREAD() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_QREAD() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR qread_r &set_QREAD(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// qconfig_r - AXI configuration for the command stream in the range 0-3. Same encoding as for REGIONCFG
+struct qconfig_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t cmd_region0 : 2; // Command region configuration
+            uint32_t reserved0 : 30;
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR qconfig_r() : word0(0) {}
+    CONSTEXPR qconfig_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    qconfig_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR NPU_NAMESPACE::mem_attr get_cmd_region0() const
+    {
+        NPU_NAMESPACE::mem_attr value = static_cast<NPU_NAMESPACE::mem_attr>(((1U << 2) - 1) & (word0 >> 0));
+        return value;
+    }
+    NPU_NAMESPACE::mem_attr get_cmd_region0() const volatile
+    {
+        NPU_NAMESPACE::mem_attr value = static_cast<NPU_NAMESPACE::mem_attr>(((1U << 2) - 1) & (word0 >> 0));
+        return value;
+    }
+    CONSTEXPR qconfig_r &set_cmd_region0(NPU_NAMESPACE::mem_attr value)
+    {
+        word0 = (((~((1U << 2) - 1)) << 0) & word0) | ((((1U << 2) - 1) & static_cast<uint32_t>(value)) << 0);
+        return *this;
+    }
+#endif
+};
+
+// qsize_r - Size of the command stream in bytes. Multiple of 4 in the range 0 to 16 MB
+struct qsize_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t QSIZE : 32; // Size of the next command stream to be executed by the NPU
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR qsize_r() : word0(0) {}
+    CONSTEXPR qsize_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    qsize_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_QSIZE() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_QSIZE() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR qsize_r &set_QSIZE(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// prot_r - Protection level configured for the NPU when acting as an AXI requester
+struct prot_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t active_CPL : 1; // Current privilege level 0=User 1=Privileged
+            uint32_t active_CSL : 1; // Current security level 0=Secure 1=Non secure
+            uint32_t reserved0 : 30;
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR prot_r() : word0(0) {}
+    CONSTEXPR prot_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    prot_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR NPU_NAMESPACE::privilege_level get_active_CPL() const
+    {
+        NPU_NAMESPACE::privilege_level value =
+            static_cast<NPU_NAMESPACE::privilege_level>(((1U << 1) - 1) & (word0 >> 0));
+        return value;
+    }
+    NPU_NAMESPACE::privilege_level get_active_CPL() const volatile
+    {
+        NPU_NAMESPACE::privilege_level value =
+            static_cast<NPU_NAMESPACE::privilege_level>(((1U << 1) - 1) & (word0 >> 0));
+        return value;
+    }
+    CONSTEXPR prot_r &set_active_CPL(NPU_NAMESPACE::privilege_level value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 0) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 0);
+        return *this;
+    }
+    CONSTEXPR NPU_NAMESPACE::security_level get_active_CSL() const
+    {
+        NPU_NAMESPACE::security_level value =
+            static_cast<NPU_NAMESPACE::security_level>(((1U << 1) - 1) & (word0 >> 1));
+        return value;
+    }
+    NPU_NAMESPACE::security_level get_active_CSL() const volatile
+    {
+        NPU_NAMESPACE::security_level value =
+            static_cast<NPU_NAMESPACE::security_level>(((1U << 1) - 1) & (word0 >> 1));
+        return value;
+    }
+    CONSTEXPR prot_r &set_active_CSL(NPU_NAMESPACE::security_level value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 1) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 1);
+        return *this;
+    }
+#endif
+};
+
+// config_r - RTL configuration
+struct config_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t macs_per_cc : 4;        // The log2(macs/clock cycle)
+            uint32_t cmd_stream_version : 4; // command stream version accepted by this NPU
+            uint32_t shram_size : 8;         // Total size in KB of internal SHRAM
+            uint32_t reserved0 : 10;
+            uint32_t functional_safety : 1; // Functional safety configuration
+            uint32_t custom_dma : 1;        // Custom DMA configuration
+            uint32_t product : 4;           // Product configuration
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR config_r() : word0(268435456) {}
+    CONSTEXPR config_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    config_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_macs_per_cc() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 4) - 1) & (word0 >> 0));
+        return value;
+    }
+    uint32_t get_macs_per_cc() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 4) - 1) & (word0 >> 0));
+        return value;
+    }
+    CONSTEXPR config_r &set_macs_per_cc(uint32_t value)
+    {
+        word0 = (((~((1U << 4) - 1)) << 0) & word0) | ((((1U << 4) - 1) & static_cast<uint32_t>(value)) << 0);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_cmd_stream_version() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 4) - 1) & (word0 >> 4));
+        return value;
+    }
+    uint32_t get_cmd_stream_version() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 4) - 1) & (word0 >> 4));
+        return value;
+    }
+    CONSTEXPR config_r &set_cmd_stream_version(uint32_t value)
+    {
+        word0 = (((~((1U << 4) - 1)) << 4) & word0) | ((((1U << 4) - 1) & static_cast<uint32_t>(value)) << 4);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_shram_size() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 8) - 1) & (word0 >> 8));
+        return value;
+    }
+    uint32_t get_shram_size() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 8) - 1) & (word0 >> 8));
+        return value;
+    }
+    CONSTEXPR config_r &set_shram_size(uint32_t value)
+    {
+        word0 = (((~((1U << 8) - 1)) << 8) & word0) | ((((1U << 8) - 1) & static_cast<uint32_t>(value)) << 8);
+        return *this;
+    }
+    CONSTEXPR NPU_NAMESPACE::functional_safety get_functional_safety() const
+    {
+        NPU_NAMESPACE::functional_safety value =
+            static_cast<NPU_NAMESPACE::functional_safety>(((1U << 1) - 1) & (word0 >> 26));
+        return value;
+    }
+    NPU_NAMESPACE::functional_safety get_functional_safety() const volatile
+    {
+        NPU_NAMESPACE::functional_safety value =
+            static_cast<NPU_NAMESPACE::functional_safety>(((1U << 1) - 1) & (word0 >> 26));
+        return value;
+    }
+    CONSTEXPR config_r &set_functional_safety(NPU_NAMESPACE::functional_safety value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 26) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 26);
+        return *this;
+    }
+    CONSTEXPR NPU_NAMESPACE::custom_dma get_custom_dma() const
+    {
+        NPU_NAMESPACE::custom_dma value = static_cast<NPU_NAMESPACE::custom_dma>(((1U << 1) - 1) & (word0 >> 27));
+        return value;
+    }
+    NPU_NAMESPACE::custom_dma get_custom_dma() const volatile
+    {
+        NPU_NAMESPACE::custom_dma value = static_cast<NPU_NAMESPACE::custom_dma>(((1U << 1) - 1) & (word0 >> 27));
+        return value;
+    }
+    CONSTEXPR config_r &set_custom_dma(NPU_NAMESPACE::custom_dma value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 27) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 27);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_product() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 4) - 1) & (word0 >> 28));
+        return value;
+    }
+    uint32_t get_product() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 4) - 1) & (word0 >> 28));
+        return value;
+    }
+    CONSTEXPR config_r &set_product(uint32_t value)
+    {
+        word0 = (((~((1U << 4) - 1)) << 28) & word0) | ((((1U << 4) - 1) & static_cast<uint32_t>(value)) << 28);
+        return *this;
+    }
+#endif
+};
+
+// lock_r - Lock register. This register is designed for driver use and does not affect NPU functionality
+struct lock_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t LOCK : 32; // 32 bit value for LOCK configuration
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR lock_r() : word0(0) {}
+    CONSTEXPR lock_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    lock_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_LOCK() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_LOCK() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR lock_r &set_LOCK(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// regioncfg_r - Region memory type configuration. Bits[2*k+1:2*k] give the memory type for REGION[k]
+struct regioncfg_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t region0 : 2; // Bits for Region0 Configuration
+            uint32_t region1 : 2; // Bits for Region1 Configuration
+            uint32_t region2 : 2; // Bits for Region2 Configuration
+            uint32_t region3 : 2; // Bits for Region3 Configuration
+            uint32_t region4 : 2; // Bits for Region4 Configuration
+            uint32_t region5 : 2; // Bits for Region5 Configuration
+            uint32_t region6 : 2; // Bits for Region6 Configuration
+            uint32_t region7 : 2; // Bits for Region7 Configuration
+            uint32_t reserved0 : 16;
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR regioncfg_r() : word0(0) {}
+    CONSTEXPR regioncfg_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    regioncfg_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR NPU_NAMESPACE::mem_attr get_region0() const
+    {
+        NPU_NAMESPACE::mem_attr value = static_cast<NPU_NAMESPACE::mem_attr>(((1U << 2) - 1) & (word0 >> 0));
+        return value;
+    }
+    NPU_NAMESPACE::mem_attr get_region0() const volatile
+    {
+        NPU_NAMESPACE::mem_attr value = static_cast<NPU_NAMESPACE::mem_attr>(((1U << 2) - 1) & (word0 >> 0));
+        return value;
+    }
+    CONSTEXPR regioncfg_r &set_region0(NPU_NAMESPACE::mem_attr value)
+    {
+        word0 = (((~((1U << 2) - 1)) << 0) & word0) | ((((1U << 2) - 1) & static_cast<uint32_t>(value)) << 0);
+        return *this;
+    }
+    CONSTEXPR NPU_NAMESPACE::mem_attr get_region1() const
+    {
+        NPU_NAMESPACE::mem_attr value = static_cast<NPU_NAMESPACE::mem_attr>(((1U << 2) - 1) & (word0 >> 2));
+        return value;
+    }
+    NPU_NAMESPACE::mem_attr get_region1() const volatile
+    {
+        NPU_NAMESPACE::mem_attr value = static_cast<NPU_NAMESPACE::mem_attr>(((1U << 2) - 1) & (word0 >> 2));
+        return value;
+    }
+    CONSTEXPR regioncfg_r &set_region1(NPU_NAMESPACE::mem_attr value)
+    {
+        word0 = (((~((1U << 2) - 1)) << 2) & word0) | ((((1U << 2) - 1) & static_cast<uint32_t>(value)) << 2);
+        return *this;
+    }
+    CONSTEXPR NPU_NAMESPACE::mem_attr get_region2() const
+    {
+        NPU_NAMESPACE::mem_attr value = static_cast<NPU_NAMESPACE::mem_attr>(((1U << 2) - 1) & (word0 >> 4));
+        return value;
+    }
+    NPU_NAMESPACE::mem_attr get_region2() const volatile
+    {
+        NPU_NAMESPACE::mem_attr value = static_cast<NPU_NAMESPACE::mem_attr>(((1U << 2) - 1) & (word0 >> 4));
+        return value;
+    }
+    CONSTEXPR regioncfg_r &set_region2(NPU_NAMESPACE::mem_attr value)
+    {
+        word0 = (((~((1U << 2) - 1)) << 4) & word0) | ((((1U << 2) - 1) & static_cast<uint32_t>(value)) << 4);
+        return *this;
+    }
+    CONSTEXPR NPU_NAMESPACE::mem_attr get_region3() const
+    {
+        NPU_NAMESPACE::mem_attr value = static_cast<NPU_NAMESPACE::mem_attr>(((1U << 2) - 1) & (word0 >> 6));
+        return value;
+    }
+    NPU_NAMESPACE::mem_attr get_region3() const volatile
+    {
+        NPU_NAMESPACE::mem_attr value = static_cast<NPU_NAMESPACE::mem_attr>(((1U << 2) - 1) & (word0 >> 6));
+        return value;
+    }
+    CONSTEXPR regioncfg_r &set_region3(NPU_NAMESPACE::mem_attr value)
+    {
+        word0 = (((~((1U << 2) - 1)) << 6) & word0) | ((((1U << 2) - 1) & static_cast<uint32_t>(value)) << 6);
+        return *this;
+    }
+    CONSTEXPR NPU_NAMESPACE::mem_attr get_region4() const
+    {
+        NPU_NAMESPACE::mem_attr value = static_cast<NPU_NAMESPACE::mem_attr>(((1U << 2) - 1) & (word0 >> 8));
+        return value;
+    }
+    NPU_NAMESPACE::mem_attr get_region4() const volatile
+    {
+        NPU_NAMESPACE::mem_attr value = static_cast<NPU_NAMESPACE::mem_attr>(((1U << 2) - 1) & (word0 >> 8));
+        return value;
+    }
+    CONSTEXPR regioncfg_r &set_region4(NPU_NAMESPACE::mem_attr value)
+    {
+        word0 = (((~((1U << 2) - 1)) << 8) & word0) | ((((1U << 2) - 1) & static_cast<uint32_t>(value)) << 8);
+        return *this;
+    }
+    CONSTEXPR NPU_NAMESPACE::mem_attr get_region5() const
+    {
+        NPU_NAMESPACE::mem_attr value = static_cast<NPU_NAMESPACE::mem_attr>(((1U << 2) - 1) & (word0 >> 10));
+        return value;
+    }
+    NPU_NAMESPACE::mem_attr get_region5() const volatile
+    {
+        NPU_NAMESPACE::mem_attr value = static_cast<NPU_NAMESPACE::mem_attr>(((1U << 2) - 1) & (word0 >> 10));
+        return value;
+    }
+    CONSTEXPR regioncfg_r &set_region5(NPU_NAMESPACE::mem_attr value)
+    {
+        word0 = (((~((1U << 2) - 1)) << 10) & word0) | ((((1U << 2) - 1) & static_cast<uint32_t>(value)) << 10);
+        return *this;
+    }
+    CONSTEXPR NPU_NAMESPACE::mem_attr get_region6() const
+    {
+        NPU_NAMESPACE::mem_attr value = static_cast<NPU_NAMESPACE::mem_attr>(((1U << 2) - 1) & (word0 >> 12));
+        return value;
+    }
+    NPU_NAMESPACE::mem_attr get_region6() const volatile
+    {
+        NPU_NAMESPACE::mem_attr value = static_cast<NPU_NAMESPACE::mem_attr>(((1U << 2) - 1) & (word0 >> 12));
+        return value;
+    }
+    CONSTEXPR regioncfg_r &set_region6(NPU_NAMESPACE::mem_attr value)
+    {
+        word0 = (((~((1U << 2) - 1)) << 12) & word0) | ((((1U << 2) - 1) & static_cast<uint32_t>(value)) << 12);
+        return *this;
+    }
+    CONSTEXPR NPU_NAMESPACE::mem_attr get_region7() const
+    {
+        NPU_NAMESPACE::mem_attr value = static_cast<NPU_NAMESPACE::mem_attr>(((1U << 2) - 1) & (word0 >> 14));
+        return value;
+    }
+    NPU_NAMESPACE::mem_attr get_region7() const volatile
+    {
+        NPU_NAMESPACE::mem_attr value = static_cast<NPU_NAMESPACE::mem_attr>(((1U << 2) - 1) & (word0 >> 14));
+        return value;
+    }
+    CONSTEXPR regioncfg_r &set_region7(NPU_NAMESPACE::mem_attr value)
+    {
+        word0 = (((~((1U << 2) - 1)) << 14) & word0) | ((((1U << 2) - 1) & static_cast<uint32_t>(value)) << 14);
+        return *this;
+    }
+#endif
+};
+
+// axi_limit0_r - AXI limits for port 0 counter 0
+struct axi_limit0_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t max_beats : 2; // Burst split alignment
+            uint32_t reserved0 : 2;
+            uint32_t memtype : 4; // Memtype to be used to encode AxCACHE signals
+            uint32_t reserved1 : 8;
+            uint32_t
+                max_outstanding_read_m1 : 6; // Maximum number of outstanding AXI read transactions - 1 in range 0 to 63
+            uint32_t reserved2 : 2;
+            uint32_t max_outstanding_write_m1 : 5; // Maximum number of outstanding AXI write transactions - 1 in range
+                                                   // 0 to 31
+            uint32_t reserved3 : 3;
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR axi_limit0_r() : word0(0) {}
+    CONSTEXPR axi_limit0_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    axi_limit0_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR NPU_NAMESPACE::max_beats get_max_beats() const
+    {
+        NPU_NAMESPACE::max_beats value = static_cast<NPU_NAMESPACE::max_beats>(((1U << 2) - 1) & (word0 >> 0));
+        return value;
+    }
+    NPU_NAMESPACE::max_beats get_max_beats() const volatile
+    {
+        NPU_NAMESPACE::max_beats value = static_cast<NPU_NAMESPACE::max_beats>(((1U << 2) - 1) & (word0 >> 0));
+        return value;
+    }
+    CONSTEXPR axi_limit0_r &set_max_beats(NPU_NAMESPACE::max_beats value)
+    {
+        word0 = (((~((1U << 2) - 1)) << 0) & word0) | ((((1U << 2) - 1) & static_cast<uint32_t>(value)) << 0);
+        return *this;
+    }
+    CONSTEXPR NPU_NAMESPACE::axi_mem_encoding get_memtype() const
+    {
+        NPU_NAMESPACE::axi_mem_encoding value =
+            static_cast<NPU_NAMESPACE::axi_mem_encoding>(((1U << 4) - 1) & (word0 >> 4));
+        return value;
+    }
+    NPU_NAMESPACE::axi_mem_encoding get_memtype() const volatile
+    {
+        NPU_NAMESPACE::axi_mem_encoding value =
+            static_cast<NPU_NAMESPACE::axi_mem_encoding>(((1U << 4) - 1) & (word0 >> 4));
+        return value;
+    }
+    CONSTEXPR axi_limit0_r &set_memtype(NPU_NAMESPACE::axi_mem_encoding value)
+    {
+        word0 = (((~((1U << 4) - 1)) << 4) & word0) | ((((1U << 4) - 1) & static_cast<uint32_t>(value)) << 4);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_max_outstanding_read_m1() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 6) - 1) & (word0 >> 16));
+        return value;
+    }
+    uint32_t get_max_outstanding_read_m1() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 6) - 1) & (word0 >> 16));
+        return value;
+    }
+    CONSTEXPR axi_limit0_r &set_max_outstanding_read_m1(uint32_t value)
+    {
+        word0 = (((~((1U << 6) - 1)) << 16) & word0) | ((((1U << 6) - 1) & static_cast<uint32_t>(value)) << 16);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_max_outstanding_write_m1() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 5) - 1) & (word0 >> 24));
+        return value;
+    }
+    uint32_t get_max_outstanding_write_m1() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 5) - 1) & (word0 >> 24));
+        return value;
+    }
+    CONSTEXPR axi_limit0_r &set_max_outstanding_write_m1(uint32_t value)
+    {
+        word0 = (((~((1U << 5) - 1)) << 24) & word0) | ((((1U << 5) - 1) & static_cast<uint32_t>(value)) << 24);
+        return *this;
+    }
+#endif
+};
+
+// axi_limit1_r - AXI limits for port 0 counter 1
+struct axi_limit1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t max_beats : 2; // Burst split alignment
+            uint32_t reserved0 : 2;
+            uint32_t memtype : 4; // Memtype to be used to encode AxCACHE signals
+            uint32_t reserved1 : 8;
+            uint32_t
+                max_outstanding_read_m1 : 6; // Maximum number of outstanding AXI read transactions - 1 in range 0 to 63
+            uint32_t reserved2 : 2;
+            uint32_t max_outstanding_write_m1 : 5; // Maximum number of outstanding AXI write transactions - 1 in range
+                                                   // 0 to 31
+            uint32_t reserved3 : 3;
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR axi_limit1_r() : word0(0) {}
+    CONSTEXPR axi_limit1_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    axi_limit1_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR NPU_NAMESPACE::max_beats get_max_beats() const
+    {
+        NPU_NAMESPACE::max_beats value = static_cast<NPU_NAMESPACE::max_beats>(((1U << 2) - 1) & (word0 >> 0));
+        return value;
+    }
+    NPU_NAMESPACE::max_beats get_max_beats() const volatile
+    {
+        NPU_NAMESPACE::max_beats value = static_cast<NPU_NAMESPACE::max_beats>(((1U << 2) - 1) & (word0 >> 0));
+        return value;
+    }
+    CONSTEXPR axi_limit1_r &set_max_beats(NPU_NAMESPACE::max_beats value)
+    {
+        word0 = (((~((1U << 2) - 1)) << 0) & word0) | ((((1U << 2) - 1) & static_cast<uint32_t>(value)) << 0);
+        return *this;
+    }
+    CONSTEXPR NPU_NAMESPACE::axi_mem_encoding get_memtype() const
+    {
+        NPU_NAMESPACE::axi_mem_encoding value =
+            static_cast<NPU_NAMESPACE::axi_mem_encoding>(((1U << 4) - 1) & (word0 >> 4));
+        return value;
+    }
+    NPU_NAMESPACE::axi_mem_encoding get_memtype() const volatile
+    {
+        NPU_NAMESPACE::axi_mem_encoding value =
+            static_cast<NPU_NAMESPACE::axi_mem_encoding>(((1U << 4) - 1) & (word0 >> 4));
+        return value;
+    }
+    CONSTEXPR axi_limit1_r &set_memtype(NPU_NAMESPACE::axi_mem_encoding value)
+    {
+        word0 = (((~((1U << 4) - 1)) << 4) & word0) | ((((1U << 4) - 1) & static_cast<uint32_t>(value)) << 4);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_max_outstanding_read_m1() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 6) - 1) & (word0 >> 16));
+        return value;
+    }
+    uint32_t get_max_outstanding_read_m1() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 6) - 1) & (word0 >> 16));
+        return value;
+    }
+    CONSTEXPR axi_limit1_r &set_max_outstanding_read_m1(uint32_t value)
+    {
+        word0 = (((~((1U << 6) - 1)) << 16) & word0) | ((((1U << 6) - 1) & static_cast<uint32_t>(value)) << 16);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_max_outstanding_write_m1() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 5) - 1) & (word0 >> 24));
+        return value;
+    }
+    uint32_t get_max_outstanding_write_m1() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 5) - 1) & (word0 >> 24));
+        return value;
+    }
+    CONSTEXPR axi_limit1_r &set_max_outstanding_write_m1(uint32_t value)
+    {
+        word0 = (((~((1U << 5) - 1)) << 24) & word0) | ((((1U << 5) - 1) & static_cast<uint32_t>(value)) << 24);
+        return *this;
+    }
+#endif
+};
+
+// axi_limit2_r - AXI limits for port 1 counter 2
+struct axi_limit2_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t max_beats : 2; // Burst split alignment
+            uint32_t reserved0 : 2;
+            uint32_t memtype : 4; // Memtype to be used to encode AxCACHE signals
+            uint32_t reserved1 : 8;
+            uint32_t
+                max_outstanding_read_m1 : 6; // Maximum number of outstanding AXI read transactions - 1 in range 0 to 63
+            uint32_t reserved2 : 2;
+            uint32_t max_outstanding_write_m1 : 5; // Maximum number of outstanding AXI write transactions - 1 in range
+                                                   // 0 to 31
+            uint32_t reserved3 : 3;
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR axi_limit2_r() : word0(0) {}
+    CONSTEXPR axi_limit2_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    axi_limit2_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR NPU_NAMESPACE::max_beats get_max_beats() const
+    {
+        NPU_NAMESPACE::max_beats value = static_cast<NPU_NAMESPACE::max_beats>(((1U << 2) - 1) & (word0 >> 0));
+        return value;
+    }
+    NPU_NAMESPACE::max_beats get_max_beats() const volatile
+    {
+        NPU_NAMESPACE::max_beats value = static_cast<NPU_NAMESPACE::max_beats>(((1U << 2) - 1) & (word0 >> 0));
+        return value;
+    }
+    CONSTEXPR axi_limit2_r &set_max_beats(NPU_NAMESPACE::max_beats value)
+    {
+        word0 = (((~((1U << 2) - 1)) << 0) & word0) | ((((1U << 2) - 1) & static_cast<uint32_t>(value)) << 0);
+        return *this;
+    }
+    CONSTEXPR NPU_NAMESPACE::axi_mem_encoding get_memtype() const
+    {
+        NPU_NAMESPACE::axi_mem_encoding value =
+            static_cast<NPU_NAMESPACE::axi_mem_encoding>(((1U << 4) - 1) & (word0 >> 4));
+        return value;
+    }
+    NPU_NAMESPACE::axi_mem_encoding get_memtype() const volatile
+    {
+        NPU_NAMESPACE::axi_mem_encoding value =
+            static_cast<NPU_NAMESPACE::axi_mem_encoding>(((1U << 4) - 1) & (word0 >> 4));
+        return value;
+    }
+    CONSTEXPR axi_limit2_r &set_memtype(NPU_NAMESPACE::axi_mem_encoding value)
+    {
+        word0 = (((~((1U << 4) - 1)) << 4) & word0) | ((((1U << 4) - 1) & static_cast<uint32_t>(value)) << 4);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_max_outstanding_read_m1() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 6) - 1) & (word0 >> 16));
+        return value;
+    }
+    uint32_t get_max_outstanding_read_m1() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 6) - 1) & (word0 >> 16));
+        return value;
+    }
+    CONSTEXPR axi_limit2_r &set_max_outstanding_read_m1(uint32_t value)
+    {
+        word0 = (((~((1U << 6) - 1)) << 16) & word0) | ((((1U << 6) - 1) & static_cast<uint32_t>(value)) << 16);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_max_outstanding_write_m1() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 5) - 1) & (word0 >> 24));
+        return value;
+    }
+    uint32_t get_max_outstanding_write_m1() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 5) - 1) & (word0 >> 24));
+        return value;
+    }
+    CONSTEXPR axi_limit2_r &set_max_outstanding_write_m1(uint32_t value)
+    {
+        word0 = (((~((1U << 5) - 1)) << 24) & word0) | ((((1U << 5) - 1) & static_cast<uint32_t>(value)) << 24);
+        return *this;
+    }
+#endif
+};
+
+// axi_limit3_r - AXI limits for port 1 counter 3
+struct axi_limit3_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t max_beats : 2; // Burst split alignment
+            uint32_t reserved0 : 2;
+            uint32_t memtype : 4; // Memtype to be used to encode AxCACHE signals
+            uint32_t reserved1 : 8;
+            uint32_t
+                max_outstanding_read_m1 : 6; // Maximum number of outstanding AXI read transactions - 1 in range 0 to 63
+            uint32_t reserved2 : 2;
+            uint32_t max_outstanding_write_m1 : 5; // Maximum number of outstanding AXI write transactions - 1 in range
+                                                   // 0 to 31
+            uint32_t reserved3 : 3;
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR axi_limit3_r() : word0(0) {}
+    CONSTEXPR axi_limit3_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    axi_limit3_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR NPU_NAMESPACE::max_beats get_max_beats() const
+    {
+        NPU_NAMESPACE::max_beats value = static_cast<NPU_NAMESPACE::max_beats>(((1U << 2) - 1) & (word0 >> 0));
+        return value;
+    }
+    NPU_NAMESPACE::max_beats get_max_beats() const volatile
+    {
+        NPU_NAMESPACE::max_beats value = static_cast<NPU_NAMESPACE::max_beats>(((1U << 2) - 1) & (word0 >> 0));
+        return value;
+    }
+    CONSTEXPR axi_limit3_r &set_max_beats(NPU_NAMESPACE::max_beats value)
+    {
+        word0 = (((~((1U << 2) - 1)) << 0) & word0) | ((((1U << 2) - 1) & static_cast<uint32_t>(value)) << 0);
+        return *this;
+    }
+    CONSTEXPR NPU_NAMESPACE::axi_mem_encoding get_memtype() const
+    {
+        NPU_NAMESPACE::axi_mem_encoding value =
+            static_cast<NPU_NAMESPACE::axi_mem_encoding>(((1U << 4) - 1) & (word0 >> 4));
+        return value;
+    }
+    NPU_NAMESPACE::axi_mem_encoding get_memtype() const volatile
+    {
+        NPU_NAMESPACE::axi_mem_encoding value =
+            static_cast<NPU_NAMESPACE::axi_mem_encoding>(((1U << 4) - 1) & (word0 >> 4));
+        return value;
+    }
+    CONSTEXPR axi_limit3_r &set_memtype(NPU_NAMESPACE::axi_mem_encoding value)
+    {
+        word0 = (((~((1U << 4) - 1)) << 4) & word0) | ((((1U << 4) - 1) & static_cast<uint32_t>(value)) << 4);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_max_outstanding_read_m1() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 6) - 1) & (word0 >> 16));
+        return value;
+    }
+    uint32_t get_max_outstanding_read_m1() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 6) - 1) & (word0 >> 16));
+        return value;
+    }
+    CONSTEXPR axi_limit3_r &set_max_outstanding_read_m1(uint32_t value)
+    {
+        word0 = (((~((1U << 6) - 1)) << 16) & word0) | ((((1U << 6) - 1) & static_cast<uint32_t>(value)) << 16);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_max_outstanding_write_m1() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 5) - 1) & (word0 >> 24));
+        return value;
+    }
+    uint32_t get_max_outstanding_write_m1() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 5) - 1) & (word0 >> 24));
+        return value;
+    }
+    CONSTEXPR axi_limit3_r &set_max_outstanding_write_m1(uint32_t value)
+    {
+        word0 = (((~((1U << 5) - 1)) << 24) & word0) | ((((1U << 5) - 1) & static_cast<uint32_t>(value)) << 24);
+        return *this;
+    }
+#endif
+};
+
+// basep_r - The driver can use this address to relocate the command stream on region 0
+struct basep_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t offset_LO : 32; // Offset - LSB
+            uint32_t offset_HI : 8;  // Offset - MSB
+            uint32_t reserved0 : 24;
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR basep_r() : word0(0), word1(0) {}
+    CONSTEXPR basep_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    basep_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// wd_status_r - WD_STATUS
+struct wd_status_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t core_slice_state : 2; // WD core slice parser state
+            uint32_t core_idle : 1;        // Core idle
+            uint32_t ctrl_state : 2;       // WD control state
+            uint32_t ctrl_idle : 1;        // All stripe jobs idle (all weights consumed)
+            uint32_t write_buf_index0 : 3; // current write index for next data from core
+            uint32_t write_buf_valid0 : 1; // write buf valid (full)
+            uint32_t write_buf_idle0 : 1;  // write buf idle (empty)
+            uint32_t write_buf_index1 : 3; // current write index for next data from core
+            uint32_t write_buf_valid1 : 1; // write buf valid (full)
+            uint32_t write_buf_idle1 : 1;  // write buf idle (empty)
+            uint32_t events : 12;          // WD events mapped as appendix A
+            uint32_t reserved0 : 4;
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR wd_status_r() : word0(0) {}
+    CONSTEXPR wd_status_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    wd_status_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR NPU_NAMESPACE::wd_core_slice_state get_core_slice_state() const
+    {
+        NPU_NAMESPACE::wd_core_slice_state value =
+            static_cast<NPU_NAMESPACE::wd_core_slice_state>(((1U << 2) - 1) & (word0 >> 0));
+        return value;
+    }
+    NPU_NAMESPACE::wd_core_slice_state get_core_slice_state() const volatile
+    {
+        NPU_NAMESPACE::wd_core_slice_state value =
+            static_cast<NPU_NAMESPACE::wd_core_slice_state>(((1U << 2) - 1) & (word0 >> 0));
+        return value;
+    }
+    CONSTEXPR wd_status_r &set_core_slice_state(NPU_NAMESPACE::wd_core_slice_state value)
+    {
+        word0 = (((~((1U << 2) - 1)) << 0) & word0) | ((((1U << 2) - 1) & static_cast<uint32_t>(value)) << 0);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_core_idle() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
+        return value;
+    }
+    uint32_t get_core_idle() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
+        return value;
+    }
+    CONSTEXPR wd_status_r &set_core_idle(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 2) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 2);
+        return *this;
+    }
+    CONSTEXPR NPU_NAMESPACE::wd_ctrl_state get_ctrl_state() const
+    {
+        NPU_NAMESPACE::wd_ctrl_state value = static_cast<NPU_NAMESPACE::wd_ctrl_state>(((1U << 2) - 1) & (word0 >> 3));
+        return value;
+    }
+    NPU_NAMESPACE::wd_ctrl_state get_ctrl_state() const volatile
+    {
+        NPU_NAMESPACE::wd_ctrl_state value = static_cast<NPU_NAMESPACE::wd_ctrl_state>(((1U << 2) - 1) & (word0 >> 3));
+        return value;
+    }
+    CONSTEXPR wd_status_r &set_ctrl_state(NPU_NAMESPACE::wd_ctrl_state value)
+    {
+        word0 = (((~((1U << 2) - 1)) << 3) & word0) | ((((1U << 2) - 1) & static_cast<uint32_t>(value)) << 3);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_ctrl_idle() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 5));
+        return value;
+    }
+    uint32_t get_ctrl_idle() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 5));
+        return value;
+    }
+    CONSTEXPR wd_status_r &set_ctrl_idle(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 5) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 5);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_write_buf_index0() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 3) - 1) & (word0 >> 6));
+        return value;
+    }
+    uint32_t get_write_buf_index0() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 3) - 1) & (word0 >> 6));
+        return value;
+    }
+    CONSTEXPR wd_status_r &set_write_buf_index0(uint32_t value)
+    {
+        word0 = (((~((1U << 3) - 1)) << 6) & word0) | ((((1U << 3) - 1) & static_cast<uint32_t>(value)) << 6);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_write_buf_valid0() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 9));
+        return value;
+    }
+    uint32_t get_write_buf_valid0() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 9));
+        return value;
+    }
+    CONSTEXPR wd_status_r &set_write_buf_valid0(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 9) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 9);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_write_buf_idle0() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 10));
+        return value;
+    }
+    uint32_t get_write_buf_idle0() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 10));
+        return value;
+    }
+    CONSTEXPR wd_status_r &set_write_buf_idle0(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 10) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 10);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_write_buf_index1() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 3) - 1) & (word0 >> 11));
+        return value;
+    }
+    uint32_t get_write_buf_index1() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 3) - 1) & (word0 >> 11));
+        return value;
+    }
+    CONSTEXPR wd_status_r &set_write_buf_index1(uint32_t value)
+    {
+        word0 = (((~((1U << 3) - 1)) << 11) & word0) | ((((1U << 3) - 1) & static_cast<uint32_t>(value)) << 11);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_write_buf_valid1() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 14));
+        return value;
+    }
+    uint32_t get_write_buf_valid1() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 14));
+        return value;
+    }
+    CONSTEXPR wd_status_r &set_write_buf_valid1(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 14) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 14);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_write_buf_idle1() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 15));
+        return value;
+    }
+    uint32_t get_write_buf_idle1() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 15));
+        return value;
+    }
+    CONSTEXPR wd_status_r &set_write_buf_idle1(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 15) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 15);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_events() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 12) - 1) & (word0 >> 16));
+        return value;
+    }
+    uint32_t get_events() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 12) - 1) & (word0 >> 16));
+        return value;
+    }
+    CONSTEXPR wd_status_r &set_events(uint32_t value)
+    {
+        word0 = (((~((1U << 12) - 1)) << 16) & word0) | ((((1U << 12) - 1) & static_cast<uint32_t>(value)) << 16);
+        return *this;
+    }
+#endif
+};
+
+// mac_status_r - MAC_STATUS
+struct mac_status_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t block_cfg_valid : 1;     // MAC has a valid block configuration
+            uint32_t trav_en : 1;             // MAC is doing block traversal
+            uint32_t wait_for_ib : 1;         // MAC is waiting for an Input Buffer to become available
+            uint32_t wait_for_acc_buf : 1;    // MAC is waiting for an Accumulator Buffer to become available
+            uint32_t wait_for_weights : 1;    // MAC is waiting for a Weight Block to become available
+            uint32_t stall_stripe : 1;        // MAC is stalling between two stripes
+            uint32_t dw_sel : 1;              // Currently used weight interface in MAC AI
+            uint32_t wait_for_dw0_ready : 1;  // MAC AI is waiting for MAC DPU to send dw0_ready to WD
+            uint32_t wait_for_dw1_ready : 1;  // MAC AI is waiting for MAC DPU to send dw1_ready to WD
+            uint32_t acc_buf_sel_ai : 1;      // Currently used AccBuf interface in MAC AI
+            uint32_t wait_for_acc0_ready : 1; // MAC AI is waiting for acc0_ready from AO
+            uint32_t wait_for_acc1_ready : 1; // MAC AI is waiting for acc1_ready from AO
+            uint32_t acc_buf_sel_aa : 1;      // Currently used AccBuf interface in MAC ADDER_ARRAY
+            uint32_t acc0_valid : 1;          // MAC outgoing value of acc0_valid
+            uint32_t acc1_valid : 1;          // MAC outgoing value of acc1_valid
+            uint32_t reserved0 : 1;
+            uint32_t events : 11; // Mapped to MAC events described in Appendix A
+            uint32_t reserved1 : 5;
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR mac_status_r() : word0(0) {}
+    CONSTEXPR mac_status_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    mac_status_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_block_cfg_valid() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 0));
+        return value;
+    }
+    uint32_t get_block_cfg_valid() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 0));
+        return value;
+    }
+    CONSTEXPR mac_status_r &set_block_cfg_valid(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 0) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 0);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_trav_en() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 1));
+        return value;
+    }
+    uint32_t get_trav_en() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 1));
+        return value;
+    }
+    CONSTEXPR mac_status_r &set_trav_en(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 1) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 1);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_wait_for_ib() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
+        return value;
+    }
+    uint32_t get_wait_for_ib() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
+        return value;
+    }
+    CONSTEXPR mac_status_r &set_wait_for_ib(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 2) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 2);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_wait_for_acc_buf() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 3));
+        return value;
+    }
+    uint32_t get_wait_for_acc_buf() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 3));
+        return value;
+    }
+    CONSTEXPR mac_status_r &set_wait_for_acc_buf(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 3) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 3);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_wait_for_weights() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 4));
+        return value;
+    }
+    uint32_t get_wait_for_weights() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 4));
+        return value;
+    }
+    CONSTEXPR mac_status_r &set_wait_for_weights(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 4) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 4);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_stall_stripe() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 5));
+        return value;
+    }
+    uint32_t get_stall_stripe() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 5));
+        return value;
+    }
+    CONSTEXPR mac_status_r &set_stall_stripe(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 5) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 5);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_dw_sel() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 6));
+        return value;
+    }
+    uint32_t get_dw_sel() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 6));
+        return value;
+    }
+    CONSTEXPR mac_status_r &set_dw_sel(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 6) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 6);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_wait_for_dw0_ready() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 7));
+        return value;
+    }
+    uint32_t get_wait_for_dw0_ready() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 7));
+        return value;
+    }
+    CONSTEXPR mac_status_r &set_wait_for_dw0_ready(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 7) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 7);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_wait_for_dw1_ready() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 8));
+        return value;
+    }
+    uint32_t get_wait_for_dw1_ready() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 8));
+        return value;
+    }
+    CONSTEXPR mac_status_r &set_wait_for_dw1_ready(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 8) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 8);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_acc_buf_sel_ai() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 9));
+        return value;
+    }
+    uint32_t get_acc_buf_sel_ai() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 9));
+        return value;
+    }
+    CONSTEXPR mac_status_r &set_acc_buf_sel_ai(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 9) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 9);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_wait_for_acc0_ready() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 10));
+        return value;
+    }
+    uint32_t get_wait_for_acc0_ready() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 10));
+        return value;
+    }
+    CONSTEXPR mac_status_r &set_wait_for_acc0_ready(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 10) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 10);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_wait_for_acc1_ready() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 11));
+        return value;
+    }
+    uint32_t get_wait_for_acc1_ready() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 11));
+        return value;
+    }
+    CONSTEXPR mac_status_r &set_wait_for_acc1_ready(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 11) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 11);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_acc_buf_sel_aa() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 12));
+        return value;
+    }
+    uint32_t get_acc_buf_sel_aa() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 12));
+        return value;
+    }
+    CONSTEXPR mac_status_r &set_acc_buf_sel_aa(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 12) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 12);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_acc0_valid() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 13));
+        return value;
+    }
+    uint32_t get_acc0_valid() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 13));
+        return value;
+    }
+    CONSTEXPR mac_status_r &set_acc0_valid(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 13) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 13);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_acc1_valid() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 14));
+        return value;
+    }
+    uint32_t get_acc1_valid() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 14));
+        return value;
+    }
+    CONSTEXPR mac_status_r &set_acc1_valid(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 14) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 14);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_events() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 11) - 1) & (word0 >> 16));
+        return value;
+    }
+    uint32_t get_events() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 11) - 1) & (word0 >> 16));
+        return value;
+    }
+    CONSTEXPR mac_status_r &set_events(uint32_t value)
+    {
+        word0 = (((~((1U << 11) - 1)) << 16) & word0) | ((((1U << 11) - 1) & static_cast<uint32_t>(value)) << 16);
+        return *this;
+    }
+#endif
+};
+
+// ao_status_r - AO_STATUS
+struct ao_status_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t cmd_sbw_valid : 1; // Block command to shared buffer write module is valid
+            uint32_t cmd_act_valid : 1; // Block command to activation function module is valid
+            uint32_t cmd_ctl_valid : 1; // Block command to control module is valid
+            uint32_t cmd_scl_valid : 1; // Block command to scale module is valid
+            uint32_t cmd_sbr_valid : 1; // Block command to shared buffer read module is valid
+            uint32_t cmd_ofm_valid : 1; // Block command to ofm parameter module is valid
+            uint32_t blk_cmd_ready : 1; // Ready to accept block command
+            uint32_t blk_cmd_valid : 1; // Block command from CC is valid
+            uint32_t reserved0 : 8;
+            uint32_t events : 8; // Mapped to AO events described in Appendix A
+            uint32_t reserved1 : 8;
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ao_status_r() : word0(0) {}
+    CONSTEXPR ao_status_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ao_status_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_cmd_sbw_valid() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 0));
+        return value;
+    }
+    uint32_t get_cmd_sbw_valid() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 0));
+        return value;
+    }
+    CONSTEXPR ao_status_r &set_cmd_sbw_valid(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 0) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 0);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_cmd_act_valid() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 1));
+        return value;
+    }
+    uint32_t get_cmd_act_valid() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 1));
+        return value;
+    }
+    CONSTEXPR ao_status_r &set_cmd_act_valid(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 1) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 1);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_cmd_ctl_valid() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
+        return value;
+    }
+    uint32_t get_cmd_ctl_valid() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
+        return value;
+    }
+    CONSTEXPR ao_status_r &set_cmd_ctl_valid(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 2) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 2);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_cmd_scl_valid() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 3));
+        return value;
+    }
+    uint32_t get_cmd_scl_valid() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 3));
+        return value;
+    }
+    CONSTEXPR ao_status_r &set_cmd_scl_valid(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 3) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 3);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_cmd_sbr_valid() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 4));
+        return value;
+    }
+    uint32_t get_cmd_sbr_valid() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 4));
+        return value;
+    }
+    CONSTEXPR ao_status_r &set_cmd_sbr_valid(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 4) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 4);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_cmd_ofm_valid() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 5));
+        return value;
+    }
+    uint32_t get_cmd_ofm_valid() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 5));
+        return value;
+    }
+    CONSTEXPR ao_status_r &set_cmd_ofm_valid(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 5) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 5);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_blk_cmd_ready() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 6));
+        return value;
+    }
+    uint32_t get_blk_cmd_ready() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 6));
+        return value;
+    }
+    CONSTEXPR ao_status_r &set_blk_cmd_ready(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 6) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 6);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_blk_cmd_valid() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 7));
+        return value;
+    }
+    uint32_t get_blk_cmd_valid() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 7));
+        return value;
+    }
+    CONSTEXPR ao_status_r &set_blk_cmd_valid(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 7) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 7);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_events() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 8) - 1) & (word0 >> 16));
+        return value;
+    }
+    uint32_t get_events() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 8) - 1) & (word0 >> 16));
+        return value;
+    }
+    CONSTEXPR ao_status_r &set_events(uint32_t value)
+    {
+        word0 = (((~((1U << 8) - 1)) << 16) & word0) | ((((1U << 8) - 1) & static_cast<uint32_t>(value)) << 16);
+        return *this;
+    }
+#endif
+};
+
+// dma_status0_r - DMA_STATUS0
+struct dma_status0_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t cmd_idle : 1; // When this bit is high means that the CMD block is not busy in generating addresses
+                                   // for a CMD job
+            uint32_t ifm_idle : 1; // When this bit is high means that there are no ongoing IFM jobs
+            uint32_t wgt_idle_c0 : 1; // When this bit is high means that the WGT block is not busy in generating
+                                      // addresses for a WGT job
+            uint32_t bas_idle_c0 : 1; // When this bit is high means that the BAS block is not busy in generating
+                                      // addresses for a BAS job
+            uint32_t m2m_idle : 1;    // When this bit is high means that there are no ongoing M2M jobs
+            uint32_t ofm_idle : 1;    // When this bit is high means that there are no ongoing OFM jobs
+            uint32_t halt_req : 1;    // CPM has requested to HALT AXI bus before soft reset
+            uint32_t halt_ack : 1;    // DMA is in condition to halt the AXI bus since there are no pending transactions
+            uint32_t pause_req : 1;   // CC has requested to pause the AXI
+            uint32_t pause_ack : 1; // DMA is in condition to pause the AXI bus since there are no pending transactions
+            uint32_t ib0_ai_valid_c0 : 1;       // Data for AI to be read in IFM input buffer 0 - Core 0
+            uint32_t ib0_ai_ready_c0 : 1;       // Data consumed from AI in IFM input buffer 0 - Core 0
+            uint32_t ib1_ai_valid_c0 : 1;       // Data for AI to be read in IFM input buffer 1 - Core 0
+            uint32_t ib1_ai_ready_c0 : 1;       // Data consumed from AI in IFM input buffer 1 - Core 0
+            uint32_t ib0_ao_valid_c0 : 1;       // Data for AO to be read in IFM input buffer 0 - Core 0
+            uint32_t ib0_ao_ready_c0 : 1;       // Data consumed from AO in IFM input buffer 0 - Core 0
+            uint32_t ib1_ao_valid_c0 : 1;       // Data for AO to be read in IFM input buffer 0 - Core 0
+            uint32_t ib1_ao_ready_c0 : 1;       // Data consumed from AO in IFM input buffer 1 - Core 0
+            uint32_t ob0_valid_c0 : 1;          // Data for DMA ready to be consumed in OFM output buffer 0 -  Core 0
+            uint32_t ob0_ready_c0 : 1;          // Data consumed from DMA in OFM output buffer 0 - Core 0
+            uint32_t ob1_valid_c0 : 1;          // Data for DMA ready to be consumed in OFM output buffer 1 -  Core 0
+            uint32_t ob1_ready_c0 : 1;          // Data consumed from DMA in OFM output buffer 1 - Core 0
+            uint32_t cmd_valid : 1;             // New command word for CC to be consumed
+            uint32_t cmd_ready : 1;             // command word consumed by CC
+            uint32_t wd_bitstream_valid_c0 : 1; // New weight word for WD to be consumed - Core 0
+            uint32_t wd_bitstream_ready_c0 : 1; // Weight word consumed by WD - Core 0
+            uint32_t bs_bitstream_valid_c0 : 1; // New BaS word for AO to be consumed - Core 0
+            uint32_t bs_bitstream_ready_c0 : 1; // BaS word consumed by AO - Core 0
+            uint32_t axi0_ar_stalled : 1; // Read transfer request stalled on arready low AXI0 (due to memory system)
+            uint32_t axi0_rd_limit_stall : 1; // Read stalled due to one AXI0 limit counter being reached
+            uint32_t axi0_aw_stalled : 1; // Write transfer request stalled on awready low AXI0 (due to memory system)
+            uint32_t axi0_w_stalled : 1;  // Write transfer stalled on awready low AXI0 (due to memory system)
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR dma_status0_r() : word0(0) {}
+    CONSTEXPR dma_status0_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    dma_status0_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_cmd_idle() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 0));
+        return value;
+    }
+    uint32_t get_cmd_idle() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 0));
+        return value;
+    }
+    CONSTEXPR dma_status0_r &set_cmd_idle(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 0) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 0);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_ifm_idle() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 1));
+        return value;
+    }
+    uint32_t get_ifm_idle() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 1));
+        return value;
+    }
+    CONSTEXPR dma_status0_r &set_ifm_idle(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 1) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 1);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_wgt_idle_c0() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
+        return value;
+    }
+    uint32_t get_wgt_idle_c0() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
+        return value;
+    }
+    CONSTEXPR dma_status0_r &set_wgt_idle_c0(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 2) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 2);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_bas_idle_c0() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 3));
+        return value;
+    }
+    uint32_t get_bas_idle_c0() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 3));
+        return value;
+    }
+    CONSTEXPR dma_status0_r &set_bas_idle_c0(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 3) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 3);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_m2m_idle() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 4));
+        return value;
+    }
+    uint32_t get_m2m_idle() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 4));
+        return value;
+    }
+    CONSTEXPR dma_status0_r &set_m2m_idle(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 4) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 4);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_ofm_idle() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 5));
+        return value;
+    }
+    uint32_t get_ofm_idle() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 5));
+        return value;
+    }
+    CONSTEXPR dma_status0_r &set_ofm_idle(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 5) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 5);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_halt_req() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 6));
+        return value;
+    }
+    uint32_t get_halt_req() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 6));
+        return value;
+    }
+    CONSTEXPR dma_status0_r &set_halt_req(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 6) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 6);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_halt_ack() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 7));
+        return value;
+    }
+    uint32_t get_halt_ack() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 7));
+        return value;
+    }
+    CONSTEXPR dma_status0_r &set_halt_ack(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 7) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 7);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_pause_req() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 8));
+        return value;
+    }
+    uint32_t get_pause_req() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 8));
+        return value;
+    }
+    CONSTEXPR dma_status0_r &set_pause_req(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 8) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 8);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_pause_ack() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 9));
+        return value;
+    }
+    uint32_t get_pause_ack() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 9));
+        return value;
+    }
+    CONSTEXPR dma_status0_r &set_pause_ack(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 9) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 9);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_ib0_ai_valid_c0() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 10));
+        return value;
+    }
+    uint32_t get_ib0_ai_valid_c0() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 10));
+        return value;
+    }
+    CONSTEXPR dma_status0_r &set_ib0_ai_valid_c0(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 10) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 10);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_ib0_ai_ready_c0() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 11));
+        return value;
+    }
+    uint32_t get_ib0_ai_ready_c0() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 11));
+        return value;
+    }
+    CONSTEXPR dma_status0_r &set_ib0_ai_ready_c0(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 11) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 11);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_ib1_ai_valid_c0() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 12));
+        return value;
+    }
+    uint32_t get_ib1_ai_valid_c0() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 12));
+        return value;
+    }
+    CONSTEXPR dma_status0_r &set_ib1_ai_valid_c0(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 12) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 12);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_ib1_ai_ready_c0() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 13));
+        return value;
+    }
+    uint32_t get_ib1_ai_ready_c0() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 13));
+        return value;
+    }
+    CONSTEXPR dma_status0_r &set_ib1_ai_ready_c0(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 13) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 13);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_ib0_ao_valid_c0() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 14));
+        return value;
+    }
+    uint32_t get_ib0_ao_valid_c0() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 14));
+        return value;
+    }
+    CONSTEXPR dma_status0_r &set_ib0_ao_valid_c0(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 14) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 14);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_ib0_ao_ready_c0() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 15));
+        return value;
+    }
+    uint32_t get_ib0_ao_ready_c0() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 15));
+        return value;
+    }
+    CONSTEXPR dma_status0_r &set_ib0_ao_ready_c0(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 15) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 15);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_ib1_ao_valid_c0() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 16));
+        return value;
+    }
+    uint32_t get_ib1_ao_valid_c0() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 16));
+        return value;
+    }
+    CONSTEXPR dma_status0_r &set_ib1_ao_valid_c0(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 16) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 16);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_ib1_ao_ready_c0() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 17));
+        return value;
+    }
+    uint32_t get_ib1_ao_ready_c0() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 17));
+        return value;
+    }
+    CONSTEXPR dma_status0_r &set_ib1_ao_ready_c0(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 17) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 17);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_ob0_valid_c0() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 18));
+        return value;
+    }
+    uint32_t get_ob0_valid_c0() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 18));
+        return value;
+    }
+    CONSTEXPR dma_status0_r &set_ob0_valid_c0(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 18) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 18);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_ob0_ready_c0() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 19));
+        return value;
+    }
+    uint32_t get_ob0_ready_c0() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 19));
+        return value;
+    }
+    CONSTEXPR dma_status0_r &set_ob0_ready_c0(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 19) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 19);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_ob1_valid_c0() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 20));
+        return value;
+    }
+    uint32_t get_ob1_valid_c0() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 20));
+        return value;
+    }
+    CONSTEXPR dma_status0_r &set_ob1_valid_c0(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 20) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 20);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_ob1_ready_c0() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 21));
+        return value;
+    }
+    uint32_t get_ob1_ready_c0() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 21));
+        return value;
+    }
+    CONSTEXPR dma_status0_r &set_ob1_ready_c0(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 21) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 21);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_cmd_valid() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 22));
+        return value;
+    }
+    uint32_t get_cmd_valid() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 22));
+        return value;
+    }
+    CONSTEXPR dma_status0_r &set_cmd_valid(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 22) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 22);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_cmd_ready() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 23));
+        return value;
+    }
+    uint32_t get_cmd_ready() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 23));
+        return value;
+    }
+    CONSTEXPR dma_status0_r &set_cmd_ready(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 23) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 23);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_wd_bitstream_valid_c0() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 24));
+        return value;
+    }
+    uint32_t get_wd_bitstream_valid_c0() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 24));
+        return value;
+    }
+    CONSTEXPR dma_status0_r &set_wd_bitstream_valid_c0(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 24) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 24);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_wd_bitstream_ready_c0() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 25));
+        return value;
+    }
+    uint32_t get_wd_bitstream_ready_c0() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 25));
+        return value;
+    }
+    CONSTEXPR dma_status0_r &set_wd_bitstream_ready_c0(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 25) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 25);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_bs_bitstream_valid_c0() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 26));
+        return value;
+    }
+    uint32_t get_bs_bitstream_valid_c0() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 26));
+        return value;
+    }
+    CONSTEXPR dma_status0_r &set_bs_bitstream_valid_c0(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 26) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 26);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_bs_bitstream_ready_c0() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 27));
+        return value;
+    }
+    uint32_t get_bs_bitstream_ready_c0() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 27));
+        return value;
+    }
+    CONSTEXPR dma_status0_r &set_bs_bitstream_ready_c0(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 27) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 27);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_axi0_ar_stalled() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 28));
+        return value;
+    }
+    uint32_t get_axi0_ar_stalled() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 28));
+        return value;
+    }
+    CONSTEXPR dma_status0_r &set_axi0_ar_stalled(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 28) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 28);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_axi0_rd_limit_stall() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 29));
+        return value;
+    }
+    uint32_t get_axi0_rd_limit_stall() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 29));
+        return value;
+    }
+    CONSTEXPR dma_status0_r &set_axi0_rd_limit_stall(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 29) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 29);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_axi0_aw_stalled() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 30));
+        return value;
+    }
+    uint32_t get_axi0_aw_stalled() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 30));
+        return value;
+    }
+    CONSTEXPR dma_status0_r &set_axi0_aw_stalled(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 30) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 30);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_axi0_w_stalled() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 31));
+        return value;
+    }
+    uint32_t get_axi0_w_stalled() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 31));
+        return value;
+    }
+    CONSTEXPR dma_status0_r &set_axi0_w_stalled(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 31) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 31);
+        return *this;
+    }
+#endif
+};
+
+// dma_status1_r - DMA_STATUS1
+struct dma_status1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t axi0_wr_limit_stall : 1; // Write stalled due to one AXI0 limit counter being reached
+            uint32_t axi1_ar_stalled : 1; // Read transfer request stalled on arready low AXI1 (due to memory system)
+            uint32_t axi1_rd_limit_stall : 1; // Read stalled due to one AXI1 limit counter being reached
+            uint32_t axi1_wr_stalled : 1; // Write transfer request stalled on awready low AXI1 (due to memory system)
+            uint32_t axi1_w_stalled : 1;  // Write transfer stalled on wready low AXI1 (due to memory system)
+            uint32_t axi1_wr_limit_stall : 1; // Write stalled due to one AXI1 limit counter being reached
+            uint32_t wgt_idle_c1 : 1;     // When this bit is high means that the WGT block is not busy in generating
+                                          // addresses for a WGT job
+            uint32_t bas_idle_c1 : 1;     // When this bit is high means that the BAS block is not busy in generating
+                                          // addresses for a BAS job
+            uint32_t ib0_ai_valid_c1 : 1; // Data for AI to be read in IFM input buffer 0 - Core 1
+            uint32_t ib0_ai_ready_c1 : 1; // Data consumed from AI in IFM input buffer 0 - Core 1
+            uint32_t ib1_ai_valid_c1 : 1; // Data for AI to be read in IFM input buffer 1 - Core 1
+            uint32_t ib1_ai_ready_c1 : 1; // Data consumed from AI in IFM input buffer 1 - Core 1
+            uint32_t ib0_ao_valid_c1 : 1; // Data for AO to be read in IFM input buffer 0 - Core 1
+            uint32_t ib0_ao_ready_c1 : 1; // Data consumed from AO in IFM input buffer 0 - Core 1
+            uint32_t ib1_ao_valid_c1 : 1; // Data for AO to be read in IFM input buffer 0 - Core 1
+            uint32_t ib1_ao_ready_c1 : 1; // Data consumed from AO in IFM input buffer 1 - Core 1
+            uint32_t ob0_valid_c1 : 1;    // Data for DMA ready to be consumed in OFM output buffer 0 - Core 1
+            uint32_t ob0_ready_c1 : 1;    // Data consumed from DMA in OFM output buffer 0 - Core 1
+            uint32_t ob1_valid_c1 : 1;    // Data for DMA ready to be consumed in OFM output buffer 1 - Core 1
+            uint32_t ob1_ready_c1 : 1;    // Data consumed from DMA in OFM output buffer 1 - Core 1
+            uint32_t wd_bitstream_valid_c1 : 1; // New weight word for WD to be consumed - Core 1
+            uint32_t wd_bitstream_ready_c1 : 1; // Weight word consumed by WD - Core 1
+            uint32_t bs_bitstream_valid_c1 : 1; // New BaS word for AO to be consumed - Core 1
+            uint32_t bs_bitstream_ready_c1 : 1; // BaS word consumed by AO - Core 1
+            uint32_t reserved0 : 8;
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR dma_status1_r() : word0(0) {}
+    CONSTEXPR dma_status1_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    dma_status1_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_axi0_wr_limit_stall() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 0));
+        return value;
+    }
+    uint32_t get_axi0_wr_limit_stall() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 0));
+        return value;
+    }
+    CONSTEXPR dma_status1_r &set_axi0_wr_limit_stall(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 0) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 0);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_axi1_ar_stalled() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 1));
+        return value;
+    }
+    uint32_t get_axi1_ar_stalled() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 1));
+        return value;
+    }
+    CONSTEXPR dma_status1_r &set_axi1_ar_stalled(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 1) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 1);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_axi1_rd_limit_stall() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
+        return value;
+    }
+    uint32_t get_axi1_rd_limit_stall() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
+        return value;
+    }
+    CONSTEXPR dma_status1_r &set_axi1_rd_limit_stall(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 2) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 2);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_axi1_wr_stalled() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 3));
+        return value;
+    }
+    uint32_t get_axi1_wr_stalled() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 3));
+        return value;
+    }
+    CONSTEXPR dma_status1_r &set_axi1_wr_stalled(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 3) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 3);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_axi1_w_stalled() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 4));
+        return value;
+    }
+    uint32_t get_axi1_w_stalled() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 4));
+        return value;
+    }
+    CONSTEXPR dma_status1_r &set_axi1_w_stalled(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 4) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 4);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_axi1_wr_limit_stall() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 5));
+        return value;
+    }
+    uint32_t get_axi1_wr_limit_stall() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 5));
+        return value;
+    }
+    CONSTEXPR dma_status1_r &set_axi1_wr_limit_stall(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 5) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 5);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_wgt_idle_c1() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 6));
+        return value;
+    }
+    uint32_t get_wgt_idle_c1() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 6));
+        return value;
+    }
+    CONSTEXPR dma_status1_r &set_wgt_idle_c1(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 6) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 6);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_bas_idle_c1() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 7));
+        return value;
+    }
+    uint32_t get_bas_idle_c1() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 7));
+        return value;
+    }
+    CONSTEXPR dma_status1_r &set_bas_idle_c1(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 7) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 7);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_ib0_ai_valid_c1() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 8));
+        return value;
+    }
+    uint32_t get_ib0_ai_valid_c1() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 8));
+        return value;
+    }
+    CONSTEXPR dma_status1_r &set_ib0_ai_valid_c1(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 8) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 8);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_ib0_ai_ready_c1() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 9));
+        return value;
+    }
+    uint32_t get_ib0_ai_ready_c1() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 9));
+        return value;
+    }
+    CONSTEXPR dma_status1_r &set_ib0_ai_ready_c1(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 9) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 9);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_ib1_ai_valid_c1() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 10));
+        return value;
+    }
+    uint32_t get_ib1_ai_valid_c1() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 10));
+        return value;
+    }
+    CONSTEXPR dma_status1_r &set_ib1_ai_valid_c1(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 10) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 10);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_ib1_ai_ready_c1() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 11));
+        return value;
+    }
+    uint32_t get_ib1_ai_ready_c1() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 11));
+        return value;
+    }
+    CONSTEXPR dma_status1_r &set_ib1_ai_ready_c1(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 11) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 11);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_ib0_ao_valid_c1() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 12));
+        return value;
+    }
+    uint32_t get_ib0_ao_valid_c1() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 12));
+        return value;
+    }
+    CONSTEXPR dma_status1_r &set_ib0_ao_valid_c1(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 12) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 12);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_ib0_ao_ready_c1() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 13));
+        return value;
+    }
+    uint32_t get_ib0_ao_ready_c1() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 13));
+        return value;
+    }
+    CONSTEXPR dma_status1_r &set_ib0_ao_ready_c1(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 13) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 13);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_ib1_ao_valid_c1() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 14));
+        return value;
+    }
+    uint32_t get_ib1_ao_valid_c1() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 14));
+        return value;
+    }
+    CONSTEXPR dma_status1_r &set_ib1_ao_valid_c1(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 14) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 14);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_ib1_ao_ready_c1() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 15));
+        return value;
+    }
+    uint32_t get_ib1_ao_ready_c1() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 15));
+        return value;
+    }
+    CONSTEXPR dma_status1_r &set_ib1_ao_ready_c1(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 15) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 15);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_ob0_valid_c1() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 16));
+        return value;
+    }
+    uint32_t get_ob0_valid_c1() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 16));
+        return value;
+    }
+    CONSTEXPR dma_status1_r &set_ob0_valid_c1(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 16) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 16);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_ob0_ready_c1() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 17));
+        return value;
+    }
+    uint32_t get_ob0_ready_c1() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 17));
+        return value;
+    }
+    CONSTEXPR dma_status1_r &set_ob0_ready_c1(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 17) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 17);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_ob1_valid_c1() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 18));
+        return value;
+    }
+    uint32_t get_ob1_valid_c1() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 18));
+        return value;
+    }
+    CONSTEXPR dma_status1_r &set_ob1_valid_c1(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 18) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 18);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_ob1_ready_c1() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 19));
+        return value;
+    }
+    uint32_t get_ob1_ready_c1() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 19));
+        return value;
+    }
+    CONSTEXPR dma_status1_r &set_ob1_ready_c1(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 19) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 19);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_wd_bitstream_valid_c1() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 20));
+        return value;
+    }
+    uint32_t get_wd_bitstream_valid_c1() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 20));
+        return value;
+    }
+    CONSTEXPR dma_status1_r &set_wd_bitstream_valid_c1(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 20) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 20);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_wd_bitstream_ready_c1() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 21));
+        return value;
+    }
+    uint32_t get_wd_bitstream_ready_c1() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 21));
+        return value;
+    }
+    CONSTEXPR dma_status1_r &set_wd_bitstream_ready_c1(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 21) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 21);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_bs_bitstream_valid_c1() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 22));
+        return value;
+    }
+    uint32_t get_bs_bitstream_valid_c1() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 22));
+        return value;
+    }
+    CONSTEXPR dma_status1_r &set_bs_bitstream_valid_c1(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 22) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 22);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_bs_bitstream_ready_c1() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 23));
+        return value;
+    }
+    uint32_t get_bs_bitstream_ready_c1() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 23));
+        return value;
+    }
+    CONSTEXPR dma_status1_r &set_bs_bitstream_ready_c1(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 23) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 23);
+        return *this;
+    }
+#endif
+};
+
+// clkforce_r - Force clocks on for clock gating
+struct clkforce_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t top_level_clk : 1; // set to 1 to force on TOP level clock
+            uint32_t cc_clk : 1;        // set to 1 to force on CC clock
+            uint32_t dma_clk : 1;       // set to 1 to force on DMA clock
+            uint32_t mac_clk : 1;       // set to 1 to force on MAC clock
+            uint32_t ao_clk : 1;        // set to 1 to force on AO clock
+            uint32_t wd_clk : 1;        // set to 1 to force on WD clock
+            uint32_t reserved0 : 26;
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR clkforce_r() : word0(0) {}
+    CONSTEXPR clkforce_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    clkforce_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_top_level_clk() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 0));
+        return value;
+    }
+    uint32_t get_top_level_clk() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 0));
+        return value;
+    }
+    CONSTEXPR clkforce_r &set_top_level_clk(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 0) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 0);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_cc_clk() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 1));
+        return value;
+    }
+    uint32_t get_cc_clk() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 1));
+        return value;
+    }
+    CONSTEXPR clkforce_r &set_cc_clk(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 1) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 1);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_dma_clk() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
+        return value;
+    }
+    uint32_t get_dma_clk() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
+        return value;
+    }
+    CONSTEXPR clkforce_r &set_dma_clk(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 2) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 2);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_mac_clk() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 3));
+        return value;
+    }
+    uint32_t get_mac_clk() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 3));
+        return value;
+    }
+    CONSTEXPR clkforce_r &set_mac_clk(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 3) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 3);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_ao_clk() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 4));
+        return value;
+    }
+    uint32_t get_ao_clk() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 4));
+        return value;
+    }
+    CONSTEXPR clkforce_r &set_ao_clk(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 4) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 4);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_wd_clk() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 5));
+        return value;
+    }
+    uint32_t get_wd_clk() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 5));
+        return value;
+    }
+    CONSTEXPR clkforce_r &set_wd_clk(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 5) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 5);
+        return *this;
+    }
+#endif
+};
+
+// debug_address_r - Set debug address for register reads 0x400-0x7FF. The address must be 1KB aligned
+struct debug_address_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t addr : 32; // Register address
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR debug_address_r() : word0(0) {}
+    CONSTEXPR debug_address_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    debug_address_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_addr() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_addr() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR debug_address_r &set_addr(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// debug_misc_r - 32-bit read/write register for driver debug use. This does not affect NPU function
+struct debug_misc_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t misc : 32; // Debug misc
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR debug_misc_r() : word0(0) {}
+    CONSTEXPR debug_misc_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    debug_misc_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_misc() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_misc() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR debug_misc_r &set_misc(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// debugcore_r - Select core number for debug registers (0x200-0x2FF) and RAM reads (0x400-0x7FF). Value is 0 or 1
+struct debugcore_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t core : 32; // Debug core
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR debugcore_r() : word0(0) {}
+    CONSTEXPR debugcore_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    debugcore_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_core() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_core() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR debugcore_r &set_core(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// debug_block_r - Set from which of four block banks the TSU registers are read. 0 = read from the current bank 256+n =
+// force to read from bank n where n is in the range 0 to 3
+struct debug_block_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t block : 32; // Debug block
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR debug_block_r() : word0(0) {}
+    CONSTEXPR debug_block_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    debug_block_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_block() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_block() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR debug_block_r &set_block(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// pmcr_r - PMU Register control
+struct pmcr_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t cnt_en : 1;        // Enable counter
+            uint32_t event_cnt_rst : 1; // Reset event counter
+            uint32_t cycle_cnt_rst : 1; // Reset cycle counter
+            uint32_t mask_en : 1;       // PMU can be enabled/disabled by command stream operation NPU_OP_PMU_MASK
+            uint32_t reserved0 : 7;
+            uint32_t num_event_cnt : 5; // Number of event counters
+            uint32_t reserved1 : 16;
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR pmcr_r() : word0(8192) {}
+    CONSTEXPR pmcr_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    pmcr_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_cnt_en() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 0));
+        return value;
+    }
+    uint32_t get_cnt_en() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 0));
+        return value;
+    }
+    CONSTEXPR pmcr_r &set_cnt_en(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 0) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 0);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_event_cnt_rst() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 1));
+        return value;
+    }
+    uint32_t get_event_cnt_rst() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 1));
+        return value;
+    }
+    CONSTEXPR pmcr_r &set_event_cnt_rst(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 1) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 1);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_cycle_cnt_rst() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
+        return value;
+    }
+    uint32_t get_cycle_cnt_rst() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
+        return value;
+    }
+    CONSTEXPR pmcr_r &set_cycle_cnt_rst(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 2) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 2);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_mask_en() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 3));
+        return value;
+    }
+    uint32_t get_mask_en() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 3));
+        return value;
+    }
+    CONSTEXPR pmcr_r &set_mask_en(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 3) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 3);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_num_event_cnt() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 5) - 1) & (word0 >> 11));
+        return value;
+    }
+    uint32_t get_num_event_cnt() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 5) - 1) & (word0 >> 11));
+        return value;
+    }
+    CONSTEXPR pmcr_r &set_num_event_cnt(uint32_t value)
+    {
+        word0 = (((~((1U << 5) - 1)) << 11) & word0) | ((((1U << 5) - 1) & static_cast<uint32_t>(value)) << 11);
+        return *this;
+    }
+#endif
+};
+
+// pmcntenset_r - Count enable set register
+struct pmcntenset_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t EVENT_CNT_0 : 1; // Event counter enable bit for PMEVCNTR0
+            uint32_t EVENT_CNT_1 : 1; // Event counter enable bit for PMEVCNTR1
+            uint32_t EVENT_CNT_2 : 1; // Event counter enable bit for PMEVCNTR2
+            uint32_t EVENT_CNT_3 : 1; // Event counter enable bit for PMEVCNTR3
+            uint32_t reserved0 : 27;
+            uint32_t CYCLE_CNT : 1; // PMCCNTR enable bit
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR pmcntenset_r() : word0(0) {}
+    CONSTEXPR pmcntenset_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    pmcntenset_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_EVENT_CNT_0() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 0));
+        return value;
+    }
+    uint32_t get_EVENT_CNT_0() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 0));
+        return value;
+    }
+    CONSTEXPR pmcntenset_r &set_EVENT_CNT_0(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 0) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 0);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_EVENT_CNT_1() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 1));
+        return value;
+    }
+    uint32_t get_EVENT_CNT_1() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 1));
+        return value;
+    }
+    CONSTEXPR pmcntenset_r &set_EVENT_CNT_1(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 1) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 1);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_EVENT_CNT_2() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
+        return value;
+    }
+    uint32_t get_EVENT_CNT_2() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
+        return value;
+    }
+    CONSTEXPR pmcntenset_r &set_EVENT_CNT_2(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 2) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 2);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_EVENT_CNT_3() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 3));
+        return value;
+    }
+    uint32_t get_EVENT_CNT_3() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 3));
+        return value;
+    }
+    CONSTEXPR pmcntenset_r &set_EVENT_CNT_3(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 3) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 3);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_CYCLE_CNT() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 31));
+        return value;
+    }
+    uint32_t get_CYCLE_CNT() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 31));
+        return value;
+    }
+    CONSTEXPR pmcntenset_r &set_CYCLE_CNT(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 31) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 31);
+        return *this;
+    }
+#endif
+};
+
+// pmcntenclr_r - Count enable clear register
+struct pmcntenclr_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t EVENT_CNT_0 : 1; // Event counter disable bit for PMEVCNTR0
+            uint32_t EVENT_CNT_1 : 1; // Event counter disable bit for PMEVCNTR1
+            uint32_t EVENT_CNT_2 : 1; // Event counter disable bit for PMEVCNTR2
+            uint32_t EVENT_CNT_3 : 1; // Event counter disable bit for PMEVCNTR3
+            uint32_t reserved0 : 27;
+            uint32_t CYCLE_CNT : 1; // PMCCNTR disable bit
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR pmcntenclr_r() : word0(0) {}
+    CONSTEXPR pmcntenclr_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    pmcntenclr_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_EVENT_CNT_0() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 0));
+        return value;
+    }
+    uint32_t get_EVENT_CNT_0() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 0));
+        return value;
+    }
+    CONSTEXPR pmcntenclr_r &set_EVENT_CNT_0(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 0) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 0);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_EVENT_CNT_1() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 1));
+        return value;
+    }
+    uint32_t get_EVENT_CNT_1() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 1));
+        return value;
+    }
+    CONSTEXPR pmcntenclr_r &set_EVENT_CNT_1(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 1) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 1);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_EVENT_CNT_2() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
+        return value;
+    }
+    uint32_t get_EVENT_CNT_2() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
+        return value;
+    }
+    CONSTEXPR pmcntenclr_r &set_EVENT_CNT_2(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 2) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 2);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_EVENT_CNT_3() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 3));
+        return value;
+    }
+    uint32_t get_EVENT_CNT_3() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 3));
+        return value;
+    }
+    CONSTEXPR pmcntenclr_r &set_EVENT_CNT_3(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 3) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 3);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_CYCLE_CNT() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 31));
+        return value;
+    }
+    uint32_t get_CYCLE_CNT() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 31));
+        return value;
+    }
+    CONSTEXPR pmcntenclr_r &set_CYCLE_CNT(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 31) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 31);
+        return *this;
+    }
+#endif
+};
+
+// pmovsset_r - Overflow flag status set register
+struct pmovsset_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t EVENT_CNT_0_OVF : 1; // Event counter overflow set bit for PMEVCNTR0
+            uint32_t EVENT_CNT_1_OVF : 1; // Event counter overflow set bit for PMEVCNTR1
+            uint32_t EVENT_CNT_2_OVF : 1; // Event counter overflow set bit for PMEVCNTR2
+            uint32_t EVENT_CNT_3_OVF : 1; // Event counter overflow set bit for PMEVCNTR3
+            uint32_t reserved0 : 27;
+            uint32_t CYCLE_CNT_OVF : 1; // PMCCNTR overflow set bit
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR pmovsset_r() : word0(0) {}
+    CONSTEXPR pmovsset_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    pmovsset_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_EVENT_CNT_0_OVF() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 0));
+        return value;
+    }
+    uint32_t get_EVENT_CNT_0_OVF() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 0));
+        return value;
+    }
+    CONSTEXPR pmovsset_r &set_EVENT_CNT_0_OVF(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 0) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 0);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_EVENT_CNT_1_OVF() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 1));
+        return value;
+    }
+    uint32_t get_EVENT_CNT_1_OVF() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 1));
+        return value;
+    }
+    CONSTEXPR pmovsset_r &set_EVENT_CNT_1_OVF(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 1) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 1);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_EVENT_CNT_2_OVF() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
+        return value;
+    }
+    uint32_t get_EVENT_CNT_2_OVF() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
+        return value;
+    }
+    CONSTEXPR pmovsset_r &set_EVENT_CNT_2_OVF(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 2) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 2);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_EVENT_CNT_3_OVF() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 3));
+        return value;
+    }
+    uint32_t get_EVENT_CNT_3_OVF() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 3));
+        return value;
+    }
+    CONSTEXPR pmovsset_r &set_EVENT_CNT_3_OVF(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 3) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 3);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_CYCLE_CNT_OVF() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 31));
+        return value;
+    }
+    uint32_t get_CYCLE_CNT_OVF() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 31));
+        return value;
+    }
+    CONSTEXPR pmovsset_r &set_CYCLE_CNT_OVF(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 31) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 31);
+        return *this;
+    }
+#endif
+};
+
+// pmovsclr_r - Overflow flag status clear register
+struct pmovsclr_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t EVENT_CNT_0_OVF : 1; // Event counter overflow clear bit for PMEVCNTR0
+            uint32_t EVENT_CNT_1_OVF : 1; // Event counter overflow clear bit for PMEVCNTR1
+            uint32_t EVENT_CNT_2_OVF : 1; // Event counter overflow clear bit for PMEVCNTR2
+            uint32_t EVENT_CNT_3_OVF : 1; // Event counter overflow clear bit for PMEVCNTR3
+            uint32_t reserved0 : 27;
+            uint32_t CYCLE_CNT_OVF : 1; // PMCCNTR overflow clear bit
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR pmovsclr_r() : word0(0) {}
+    CONSTEXPR pmovsclr_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    pmovsclr_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_EVENT_CNT_0_OVF() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 0));
+        return value;
+    }
+    uint32_t get_EVENT_CNT_0_OVF() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 0));
+        return value;
+    }
+    CONSTEXPR pmovsclr_r &set_EVENT_CNT_0_OVF(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 0) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 0);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_EVENT_CNT_1_OVF() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 1));
+        return value;
+    }
+    uint32_t get_EVENT_CNT_1_OVF() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 1));
+        return value;
+    }
+    CONSTEXPR pmovsclr_r &set_EVENT_CNT_1_OVF(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 1) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 1);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_EVENT_CNT_2_OVF() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
+        return value;
+    }
+    uint32_t get_EVENT_CNT_2_OVF() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
+        return value;
+    }
+    CONSTEXPR pmovsclr_r &set_EVENT_CNT_2_OVF(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 2) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 2);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_EVENT_CNT_3_OVF() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 3));
+        return value;
+    }
+    uint32_t get_EVENT_CNT_3_OVF() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 3));
+        return value;
+    }
+    CONSTEXPR pmovsclr_r &set_EVENT_CNT_3_OVF(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 3) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 3);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_CYCLE_CNT_OVF() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 31));
+        return value;
+    }
+    uint32_t get_CYCLE_CNT_OVF() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 31));
+        return value;
+    }
+    CONSTEXPR pmovsclr_r &set_CYCLE_CNT_OVF(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 31) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 31);
+        return *this;
+    }
+#endif
+};
+
+// pmintset_r - Interrupt enable set register
+struct pmintset_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t EVENT_CNT_0_INT : 1; // Event counter overflow interrupt request enable bit for PMEVCNTR0
+            uint32_t EVENT_CNT_1_INT : 1; // Event counter overflow interrupt request enable bit for PMEVCNTR1
+            uint32_t EVENT_CNT_2_INT : 1; // Event counter overflow interrupt request enable bit for PMEVCNTR2
+            uint32_t EVENT_CNT_3_INT : 1; // Event counter overflow interrupt request enable bit for PMEVCNTR3
+            uint32_t reserved0 : 27;
+            uint32_t CYCLE_CNT_INT : 1; // PMCCNTR overflow interrupt request enable bit
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR pmintset_r() : word0(0) {}
+    CONSTEXPR pmintset_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    pmintset_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_EVENT_CNT_0_INT() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 0));
+        return value;
+    }
+    uint32_t get_EVENT_CNT_0_INT() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 0));
+        return value;
+    }
+    CONSTEXPR pmintset_r &set_EVENT_CNT_0_INT(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 0) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 0);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_EVENT_CNT_1_INT() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 1));
+        return value;
+    }
+    uint32_t get_EVENT_CNT_1_INT() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 1));
+        return value;
+    }
+    CONSTEXPR pmintset_r &set_EVENT_CNT_1_INT(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 1) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 1);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_EVENT_CNT_2_INT() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
+        return value;
+    }
+    uint32_t get_EVENT_CNT_2_INT() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
+        return value;
+    }
+    CONSTEXPR pmintset_r &set_EVENT_CNT_2_INT(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 2) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 2);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_EVENT_CNT_3_INT() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 3));
+        return value;
+    }
+    uint32_t get_EVENT_CNT_3_INT() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 3));
+        return value;
+    }
+    CONSTEXPR pmintset_r &set_EVENT_CNT_3_INT(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 3) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 3);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_CYCLE_CNT_INT() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 31));
+        return value;
+    }
+    uint32_t get_CYCLE_CNT_INT() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 31));
+        return value;
+    }
+    CONSTEXPR pmintset_r &set_CYCLE_CNT_INT(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 31) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 31);
+        return *this;
+    }
+#endif
+};
+
+// pmintclr_r - Interrupt enable clear register
+struct pmintclr_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t EVENT_CNT_0_INT : 1; // Event counter overflow interrupt request disable bit for PMEVCNTR0
+            uint32_t EVENT_CNT_1_INT : 1; // Event counter overflow interrupt request disable bit for PMEVCNTR1
+            uint32_t EVENT_CNT_2_INT : 1; // Event counter overflow interrupt request disable bit for PMEVCNTR2
+            uint32_t EVENT_CNT_3_INT : 1; // Event counter overflow interrupt request disable bit for PMEVCNTR3
+            uint32_t reserved0 : 27;
+            uint32_t CYCLE_CNT_INT : 1; // PMCCNTR overflow interrupt request disable bit
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR pmintclr_r() : word0(0) {}
+    CONSTEXPR pmintclr_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    pmintclr_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_EVENT_CNT_0_INT() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 0));
+        return value;
+    }
+    uint32_t get_EVENT_CNT_0_INT() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 0));
+        return value;
+    }
+    CONSTEXPR pmintclr_r &set_EVENT_CNT_0_INT(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 0) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 0);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_EVENT_CNT_1_INT() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 1));
+        return value;
+    }
+    uint32_t get_EVENT_CNT_1_INT() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 1));
+        return value;
+    }
+    CONSTEXPR pmintclr_r &set_EVENT_CNT_1_INT(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 1) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 1);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_EVENT_CNT_2_INT() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
+        return value;
+    }
+    uint32_t get_EVENT_CNT_2_INT() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 2));
+        return value;
+    }
+    CONSTEXPR pmintclr_r &set_EVENT_CNT_2_INT(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 2) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 2);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_EVENT_CNT_3_INT() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 3));
+        return value;
+    }
+    uint32_t get_EVENT_CNT_3_INT() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 3));
+        return value;
+    }
+    CONSTEXPR pmintclr_r &set_EVENT_CNT_3_INT(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 3) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 3);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_CYCLE_CNT_INT() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 31));
+        return value;
+    }
+    uint32_t get_CYCLE_CNT_INT() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 31));
+        return value;
+    }
+    CONSTEXPR pmintclr_r &set_CYCLE_CNT_INT(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 31) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 31);
+        return *this;
+    }
+#endif
+};
+
+// pmccntr_r - Performance monitor cycle count register
+struct pmccntr_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t CYCLE_CNT_LO : 32; // Cycle count - LSB
+            uint32_t CYCLE_CNT_HI : 16; // Cycle count - MSB
+            uint32_t reserved0 : 16;
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR pmccntr_r() : word0(0), word1(0) {}
+    CONSTEXPR pmccntr_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    pmccntr_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// pmccntr_cfg_r - Set start/stop event on the cycle counter
+struct pmccntr_cfg_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t CYCLE_CNT_CFG_START : 10; // Cycle counter start event
+            uint32_t reserved0 : 6;
+            uint32_t CYCLE_CNT_CFG_STOP : 10; // Cycle counter stop event
+            uint32_t reserved1 : 6;
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR pmccntr_cfg_r() : word0(0) {}
+    CONSTEXPR pmccntr_cfg_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    pmccntr_cfg_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR NPU_NAMESPACE::pmu_event get_CYCLE_CNT_CFG_START() const
+    {
+        NPU_NAMESPACE::pmu_event value = static_cast<NPU_NAMESPACE::pmu_event>(((1U << 10) - 1) & (word0 >> 0));
+        return value;
+    }
+    NPU_NAMESPACE::pmu_event get_CYCLE_CNT_CFG_START() const volatile
+    {
+        NPU_NAMESPACE::pmu_event value = static_cast<NPU_NAMESPACE::pmu_event>(((1U << 10) - 1) & (word0 >> 0));
+        return value;
+    }
+    CONSTEXPR pmccntr_cfg_r &set_CYCLE_CNT_CFG_START(NPU_NAMESPACE::pmu_event value)
+    {
+        word0 = (((~((1U << 10) - 1)) << 0) & word0) | ((((1U << 10) - 1) & static_cast<uint32_t>(value)) << 0);
+        return *this;
+    }
+    CONSTEXPR NPU_NAMESPACE::pmu_event get_CYCLE_CNT_CFG_STOP() const
+    {
+        NPU_NAMESPACE::pmu_event value = static_cast<NPU_NAMESPACE::pmu_event>(((1U << 10) - 1) & (word0 >> 16));
+        return value;
+    }
+    NPU_NAMESPACE::pmu_event get_CYCLE_CNT_CFG_STOP() const volatile
+    {
+        NPU_NAMESPACE::pmu_event value = static_cast<NPU_NAMESPACE::pmu_event>(((1U << 10) - 1) & (word0 >> 16));
+        return value;
+    }
+    CONSTEXPR pmccntr_cfg_r &set_CYCLE_CNT_CFG_STOP(NPU_NAMESPACE::pmu_event value)
+    {
+        word0 = (((~((1U << 10) - 1)) << 16) & word0) | ((((1U << 10) - 1) & static_cast<uint32_t>(value)) << 16);
+        return *this;
+    }
+#endif
+};
+
+// pmcaxi_chan_r - Set which AXI channel to monitor for latency measurements in PMU
+struct pmcaxi_chan_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t CH_SEL : 4; // Channel select for latency measurements
+            uint32_t reserved0 : 4;
+            uint32_t AXI_CNT_SEL : 2;  // AXI counter to monitor for latency measurements
+            uint32_t BW_CH_SEL_EN : 1; // Bandwidth channel selector
+            uint32_t reserved1 : 21;
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR pmcaxi_chan_r() : word0(0) {}
+    CONSTEXPR pmcaxi_chan_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    pmcaxi_chan_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR NPU_NAMESPACE::pmu_axi_channel get_CH_SEL() const
+    {
+        NPU_NAMESPACE::pmu_axi_channel value =
+            static_cast<NPU_NAMESPACE::pmu_axi_channel>(((1U << 4) - 1) & (word0 >> 0));
+        return value;
+    }
+    NPU_NAMESPACE::pmu_axi_channel get_CH_SEL() const volatile
+    {
+        NPU_NAMESPACE::pmu_axi_channel value =
+            static_cast<NPU_NAMESPACE::pmu_axi_channel>(((1U << 4) - 1) & (word0 >> 0));
+        return value;
+    }
+    CONSTEXPR pmcaxi_chan_r &set_CH_SEL(NPU_NAMESPACE::pmu_axi_channel value)
+    {
+        word0 = (((~((1U << 4) - 1)) << 0) & word0) | ((((1U << 4) - 1) & static_cast<uint32_t>(value)) << 0);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_AXI_CNT_SEL() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 2) - 1) & (word0 >> 8));
+        return value;
+    }
+    uint32_t get_AXI_CNT_SEL() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 2) - 1) & (word0 >> 8));
+        return value;
+    }
+    CONSTEXPR pmcaxi_chan_r &set_AXI_CNT_SEL(uint32_t value)
+    {
+        word0 = (((~((1U << 2) - 1)) << 8) & word0) | ((((1U << 2) - 1) & static_cast<uint32_t>(value)) << 8);
+        return *this;
+    }
+    CONSTEXPR uint32_t get_BW_CH_SEL_EN() const
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 10));
+        return value;
+    }
+    uint32_t get_BW_CH_SEL_EN() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(((1U << 1) - 1) & (word0 >> 10));
+        return value;
+    }
+    CONSTEXPR pmcaxi_chan_r &set_BW_CH_SEL_EN(uint32_t value)
+    {
+        word0 = (((~((1U << 1) - 1)) << 10) & word0) | ((((1U << 1) - 1) & static_cast<uint32_t>(value)) << 10);
+        return *this;
+    }
+#endif
+};
+
+// kernel_x_r - Kernel X offset of in kernel decomposition
+struct kernel_x_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR kernel_x_r() : word0(0) {}
+    CONSTEXPR kernel_x_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    kernel_x_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR kernel_x_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// kernel_y_r - Kernel Y offset of in kernel decomposition
+struct kernel_y_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR kernel_y_r() : word0(0) {}
+    CONSTEXPR kernel_y_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    kernel_y_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR kernel_y_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// kernel_w_m1_r - Kernel (width-1) of current block
+struct kernel_w_m1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR kernel_w_m1_r() : word0(0) {}
+    CONSTEXPR kernel_w_m1_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    kernel_w_m1_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR kernel_w_m1_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// kernel_h_m1_r - Kernel (height-1) of current block
+struct kernel_h_m1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR kernel_h_m1_r() : word0(0) {}
+    CONSTEXPR kernel_h_m1_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    kernel_h_m1_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR kernel_h_m1_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ofm_cblk_width_m1_r - OFM current block (width-1)
+struct ofm_cblk_width_m1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ofm_cblk_width_m1_r() : word0(0) {}
+    CONSTEXPR ofm_cblk_width_m1_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ofm_cblk_width_m1_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ofm_cblk_width_m1_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ofm_cblk_height_m1_r - OFM current block (height-1)
+struct ofm_cblk_height_m1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ofm_cblk_height_m1_r() : word0(0) {}
+    CONSTEXPR ofm_cblk_height_m1_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ofm_cblk_height_m1_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ofm_cblk_height_m1_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ofm_cblk_depth_m1_r - OFM current block (depth-1)
+struct ofm_cblk_depth_m1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ofm_cblk_depth_m1_r() : word0(0) {}
+    CONSTEXPR ofm_cblk_depth_m1_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ofm_cblk_depth_m1_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ofm_cblk_depth_m1_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ifm_cblk_depth_m1_r - IFM current block (depth-1)
+struct ifm_cblk_depth_m1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ifm_cblk_depth_m1_r() : word0(0) {}
+    CONSTEXPR ifm_cblk_depth_m1_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ifm_cblk_depth_m1_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ifm_cblk_depth_m1_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ofm_x_r - Block X coordinate in OFM
+struct ofm_x_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ofm_x_r() : word0(0) {}
+    CONSTEXPR ofm_x_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ofm_x_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ofm_x_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ofm_y_r - Block Y coordinate in OFM
+struct ofm_y_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ofm_y_r() : word0(0) {}
+    CONSTEXPR ofm_y_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ofm_y_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ofm_y_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ofm_z_r - Block Z (channel) coordinate in OFM
+struct ofm_z_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ofm_z_r() : word0(0) {}
+    CONSTEXPR ofm_z_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ofm_z_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ofm_z_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ifm_z_r - Block Z (channel) coordinate in IFM
+struct ifm_z_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ifm_z_r() : word0(0) {}
+    CONSTEXPR ifm_z_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ifm_z_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ifm_z_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// pad_top_r - Block top pad
+struct pad_top_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR pad_top_r() : word0(0) {}
+    CONSTEXPR pad_top_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    pad_top_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR pad_top_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// pad_left_r - Block left pad
+struct pad_left_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR pad_left_r() : word0(0) {}
+    CONSTEXPR pad_left_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    pad_left_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR pad_left_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ifm_cblk_width_r - IFM current block derived width
+struct ifm_cblk_width_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ifm_cblk_width_r() : word0(0) {}
+    CONSTEXPR ifm_cblk_width_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ifm_cblk_width_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ifm_cblk_width_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ifm_cblk_height_r - IFM current block derived height
+struct ifm_cblk_height_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ifm_cblk_height_r() : word0(0) {}
+    CONSTEXPR ifm_cblk_height_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ifm_cblk_height_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ifm_cblk_height_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// dma_ifm_src_r - DMA IFM channel source position on AXI
+struct dma_ifm_src_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t offset_LO : 32; // Offset - LSB
+            uint32_t offset_HI : 8;  // Offset - MSB
+            uint32_t reserved0 : 24;
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR dma_ifm_src_r() : word0(0), word1(0) {}
+    CONSTEXPR dma_ifm_src_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    dma_ifm_src_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// dma_ifm_dst_r - DMA IFM channel destination position in SHRAM
+struct dma_ifm_dst_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR dma_ifm_dst_r() : word0(0) {}
+    CONSTEXPR dma_ifm_dst_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    dma_ifm_dst_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR dma_ifm_dst_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// dma_ofm_src_r - DMA OFM channel source position in SHRAM
+struct dma_ofm_src_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR dma_ofm_src_r() : word0(0) {}
+    CONSTEXPR dma_ofm_src_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    dma_ofm_src_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR dma_ofm_src_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// dma_ofm_dst_r - DMA OFM channel destination position on AXI
+struct dma_ofm_dst_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t offset_LO : 32; // Offset - LSB
+            uint32_t offset_HI : 8;  // Offset - MSB
+            uint32_t reserved0 : 24;
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR dma_ofm_dst_r() : word0(0), word1(0) {}
+    CONSTEXPR dma_ofm_dst_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    dma_ofm_dst_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// dma_weight_src_r - DMA weight channel source position on AXI
+struct dma_weight_src_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t offset_LO : 32; // Offset - LSB
+            uint32_t offset_HI : 8;  // Offset - MSB
+            uint32_t reserved0 : 24;
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR dma_weight_src_r() : word0(0), word1(0) {}
+    CONSTEXPR dma_weight_src_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    dma_weight_src_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// dma_cmd_src_r - DMA command channel source position on AXI
+struct dma_cmd_src_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t offset_LO : 32; // Offset - LSB
+            uint32_t offset_HI : 8;  // Offset - MSB
+            uint32_t reserved0 : 24;
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR dma_cmd_src_r() : word0(0), word1(0) {}
+    CONSTEXPR dma_cmd_src_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    dma_cmd_src_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// dma_cmd_size_r - DMA command channel number of bytes buffered
+struct dma_cmd_size_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR dma_cmd_size_r() : word0(0) {}
+    CONSTEXPR dma_cmd_size_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    dma_cmd_size_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR dma_cmd_size_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// dma_m2m_src_r - DMA memory to memory source position on AXI
+struct dma_m2m_src_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t offset_LO : 32; // Offset - LSB
+            uint32_t offset_HI : 8;  // Offset - MSB
+            uint32_t reserved0 : 24;
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR dma_m2m_src_r() : word0(0), word1(0) {}
+    CONSTEXPR dma_m2m_src_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    dma_m2m_src_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// dma_m2m_dst_r - DMA memory to memory destination position on AXI
+struct dma_m2m_dst_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t offset_LO : 32; // Offset - LSB
+            uint32_t offset_HI : 8;  // Offset - MSB
+            uint32_t reserved0 : 24;
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR dma_m2m_dst_r() : word0(0), word1(0) {}
+    CONSTEXPR dma_m2m_dst_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    dma_m2m_dst_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// current_qread_r - QREAD position being issued (rather than completed)
+struct current_qread_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR current_qread_r() : word0(0) {}
+    CONSTEXPR current_qread_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    current_qread_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR current_qread_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// dma_scale_src_r - DMA scale and bias channel source position on AXI
+struct dma_scale_src_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t offset_LO : 32; // Offset - LSB
+            uint32_t offset_HI : 8;  // Offset - MSB
+            uint32_t reserved0 : 24;
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR dma_scale_src_r() : word0(0), word1(0) {}
+    CONSTEXPR dma_scale_src_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    dma_scale_src_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// current_block_r - 0-3. Current block bank being executed by the TSU or last one executed if TSU is stopped
+struct current_block_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR current_block_r() : word0(0) {}
+    CONSTEXPR current_block_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    current_block_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR current_block_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// current_op_r - Current NPU OP command being executed by the TSU
+struct current_op_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR current_op_r() : word0(0) {}
+    CONSTEXPR current_op_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    current_op_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR current_op_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// current_cmd_r - Current 32-bit command being parsed by the command stream parser
+struct current_cmd_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR current_cmd_r() : word0(0) {}
+    CONSTEXPR current_cmd_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    current_cmd_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR current_cmd_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// pmevcntr_r - Performance monitor event 0 count register
+struct pmevcntr_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t count : 32; // Count word
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR pmevcntr_r() : word0(0) {}
+    CONSTEXPR pmevcntr_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    pmevcntr_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_count() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_count() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR pmevcntr_r &set_count(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// pmevtyper_r - Performance monitor event type register 0
+struct pmevtyper_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t EV_TYPE : 10; // Event Type
+            uint32_t reserved0 : 22;
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR pmevtyper_r() : word0(0) {}
+    CONSTEXPR pmevtyper_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    pmevtyper_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR NPU_NAMESPACE::pmu_event get_EV_TYPE() const
+    {
+        NPU_NAMESPACE::pmu_event value = static_cast<NPU_NAMESPACE::pmu_event>(((1U << 10) - 1) & (word0 >> 0));
+        return value;
+    }
+    NPU_NAMESPACE::pmu_event get_EV_TYPE() const volatile
+    {
+        NPU_NAMESPACE::pmu_event value = static_cast<NPU_NAMESPACE::pmu_event>(((1U << 10) - 1) & (word0 >> 0));
+        return value;
+    }
+    CONSTEXPR pmevtyper_r &set_EV_TYPE(NPU_NAMESPACE::pmu_event value)
+    {
+        word0 = (((~((1U << 10) - 1)) << 0) & word0) | ((((1U << 10) - 1) & static_cast<uint32_t>(value)) << 0);
+        return *this;
+    }
+#endif
+};
+
+// shared_buffer_r - Shared buffer debug access. Only valid in STOPPED state
+struct shared_buffer_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t mem_word : 32; // Memory word
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR shared_buffer_r() : word0(0) {}
+    CONSTEXPR shared_buffer_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    shared_buffer_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_mem_word() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_mem_word() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR shared_buffer_r &set_mem_word(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ifm_pad_top_r - None
+struct ifm_pad_top_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ifm_pad_top_r() : word0(0) {}
+    CONSTEXPR ifm_pad_top_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ifm_pad_top_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ifm_pad_top_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ifm_pad_left_r - None
+struct ifm_pad_left_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ifm_pad_left_r() : word0(0) {}
+    CONSTEXPR ifm_pad_left_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ifm_pad_left_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ifm_pad_left_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ifm_pad_right_r - None
+struct ifm_pad_right_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ifm_pad_right_r() : word0(0) {}
+    CONSTEXPR ifm_pad_right_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ifm_pad_right_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ifm_pad_right_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ifm_pad_bottom_r - None
+struct ifm_pad_bottom_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ifm_pad_bottom_r() : word0(0) {}
+    CONSTEXPR ifm_pad_bottom_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ifm_pad_bottom_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ifm_pad_bottom_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ifm_depth_m1_r - None
+struct ifm_depth_m1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ifm_depth_m1_r() : word0(0) {}
+    CONSTEXPR ifm_depth_m1_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ifm_depth_m1_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ifm_depth_m1_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ifm_precision_r - None
+struct ifm_precision_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ifm_precision_r() : word0(0) {}
+    CONSTEXPR ifm_precision_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ifm_precision_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ifm_precision_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ifm_upscale_r - None
+struct ifm_upscale_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ifm_upscale_r() : word0(0) {}
+    CONSTEXPR ifm_upscale_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ifm_upscale_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ifm_upscale_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ifm_zero_point_r - None
+struct ifm_zero_point_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ifm_zero_point_r() : word0(0) {}
+    CONSTEXPR ifm_zero_point_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ifm_zero_point_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ifm_zero_point_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ifm_width0_m1_r - None
+struct ifm_width0_m1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ifm_width0_m1_r() : word0(0) {}
+    CONSTEXPR ifm_width0_m1_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ifm_width0_m1_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ifm_width0_m1_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ifm_height0_m1_r - None
+struct ifm_height0_m1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ifm_height0_m1_r() : word0(0) {}
+    CONSTEXPR ifm_height0_m1_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ifm_height0_m1_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ifm_height0_m1_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ifm_height1_m1_r - None
+struct ifm_height1_m1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ifm_height1_m1_r() : word0(0) {}
+    CONSTEXPR ifm_height1_m1_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ifm_height1_m1_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ifm_height1_m1_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ifm_ib_end_r - None
+struct ifm_ib_end_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ifm_ib_end_r() : word0(0) {}
+    CONSTEXPR ifm_ib_end_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ifm_ib_end_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ifm_ib_end_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ifm_region_r - None
+struct ifm_region_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ifm_region_r() : word0(0) {}
+    CONSTEXPR ifm_region_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ifm_region_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ifm_region_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ofm_width_m1_r - None
+struct ofm_width_m1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ofm_width_m1_r() : word0(0) {}
+    CONSTEXPR ofm_width_m1_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ofm_width_m1_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ofm_width_m1_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ofm_height_m1_r - None
+struct ofm_height_m1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ofm_height_m1_r() : word0(0) {}
+    CONSTEXPR ofm_height_m1_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ofm_height_m1_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ofm_height_m1_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ofm_depth_m1_r - None
+struct ofm_depth_m1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ofm_depth_m1_r() : word0(0) {}
+    CONSTEXPR ofm_depth_m1_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ofm_depth_m1_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ofm_depth_m1_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ofm_precision_r - None
+struct ofm_precision_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ofm_precision_r() : word0(0) {}
+    CONSTEXPR ofm_precision_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ofm_precision_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ofm_precision_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ofm_blk_width_m1_r - None
+struct ofm_blk_width_m1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ofm_blk_width_m1_r() : word0(0) {}
+    CONSTEXPR ofm_blk_width_m1_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ofm_blk_width_m1_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ofm_blk_width_m1_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ofm_blk_height_m1_r - None
+struct ofm_blk_height_m1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ofm_blk_height_m1_r() : word0(0) {}
+    CONSTEXPR ofm_blk_height_m1_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ofm_blk_height_m1_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ofm_blk_height_m1_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ofm_blk_depth_m1_r - None
+struct ofm_blk_depth_m1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ofm_blk_depth_m1_r() : word0(0) {}
+    CONSTEXPR ofm_blk_depth_m1_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ofm_blk_depth_m1_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ofm_blk_depth_m1_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ofm_zero_point_r - None
+struct ofm_zero_point_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ofm_zero_point_r() : word0(0) {}
+    CONSTEXPR ofm_zero_point_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ofm_zero_point_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ofm_zero_point_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ofm_width0_m1_r - None
+struct ofm_width0_m1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ofm_width0_m1_r() : word0(0) {}
+    CONSTEXPR ofm_width0_m1_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ofm_width0_m1_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ofm_width0_m1_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ofm_height0_m1_r - None
+struct ofm_height0_m1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ofm_height0_m1_r() : word0(0) {}
+    CONSTEXPR ofm_height0_m1_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ofm_height0_m1_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ofm_height0_m1_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ofm_height1_m1_r - None
+struct ofm_height1_m1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ofm_height1_m1_r() : word0(0) {}
+    CONSTEXPR ofm_height1_m1_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ofm_height1_m1_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ofm_height1_m1_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ofm_region_r - None
+struct ofm_region_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ofm_region_r() : word0(0) {}
+    CONSTEXPR ofm_region_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ofm_region_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ofm_region_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// kernel_width_m1_r - None
+struct kernel_width_m1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR kernel_width_m1_r() : word0(0) {}
+    CONSTEXPR kernel_width_m1_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    kernel_width_m1_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR kernel_width_m1_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// kernel_height_m1_r - None
+struct kernel_height_m1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR kernel_height_m1_r() : word0(0) {}
+    CONSTEXPR kernel_height_m1_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    kernel_height_m1_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR kernel_height_m1_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// kernel_stride_r - None
+struct kernel_stride_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR kernel_stride_r() : word0(0) {}
+    CONSTEXPR kernel_stride_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    kernel_stride_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR kernel_stride_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// parallel_mode_r - None
+struct parallel_mode_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR parallel_mode_r() : word0(0) {}
+    CONSTEXPR parallel_mode_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    parallel_mode_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR parallel_mode_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// acc_format_r - None
+struct acc_format_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR acc_format_r() : word0(0) {}
+    CONSTEXPR acc_format_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    acc_format_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR acc_format_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// activation_r - None
+struct activation_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR activation_r() : word0(0) {}
+    CONSTEXPR activation_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    activation_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR activation_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// activation_min_r - None
+struct activation_min_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR activation_min_r() : word0(0) {}
+    CONSTEXPR activation_min_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    activation_min_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR activation_min_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// activation_max_r - None
+struct activation_max_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR activation_max_r() : word0(0) {}
+    CONSTEXPR activation_max_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    activation_max_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR activation_max_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// weight_region_r - None
+struct weight_region_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR weight_region_r() : word0(0) {}
+    CONSTEXPR weight_region_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    weight_region_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR weight_region_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// scale_region_r - None
+struct scale_region_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR scale_region_r() : word0(0) {}
+    CONSTEXPR scale_region_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    scale_region_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR scale_region_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ab_start_r - None
+struct ab_start_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ab_start_r() : word0(0) {}
+    CONSTEXPR ab_start_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ab_start_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ab_start_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// blockdep_r - None
+struct blockdep_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR blockdep_r() : word0(0) {}
+    CONSTEXPR blockdep_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    blockdep_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR blockdep_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// dma0_src_region_r - None
+struct dma0_src_region_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR dma0_src_region_r() : word0(0) {}
+    CONSTEXPR dma0_src_region_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    dma0_src_region_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR dma0_src_region_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// dma0_dst_region_r - None
+struct dma0_dst_region_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR dma0_dst_region_r() : word0(0) {}
+    CONSTEXPR dma0_dst_region_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    dma0_dst_region_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR dma0_dst_region_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// dma0_size0_r - None
+struct dma0_size0_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR dma0_size0_r() : word0(0) {}
+    CONSTEXPR dma0_size0_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    dma0_size0_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR dma0_size0_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// dma0_size1_r - None
+struct dma0_size1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR dma0_size1_r() : word0(0) {}
+    CONSTEXPR dma0_size1_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    dma0_size1_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR dma0_size1_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ifm2_broadcast_r - None
+struct ifm2_broadcast_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ifm2_broadcast_r() : word0(0) {}
+    CONSTEXPR ifm2_broadcast_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ifm2_broadcast_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ifm2_broadcast_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ifm2_scalar_r - None
+struct ifm2_scalar_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ifm2_scalar_r() : word0(0) {}
+    CONSTEXPR ifm2_scalar_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ifm2_scalar_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ifm2_scalar_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ifm2_precision_r - None
+struct ifm2_precision_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ifm2_precision_r() : word0(0) {}
+    CONSTEXPR ifm2_precision_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ifm2_precision_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ifm2_precision_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ifm2_zero_point_r - None
+struct ifm2_zero_point_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ifm2_zero_point_r() : word0(0) {}
+    CONSTEXPR ifm2_zero_point_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ifm2_zero_point_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ifm2_zero_point_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ifm2_width0_m1_r - None
+struct ifm2_width0_m1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ifm2_width0_m1_r() : word0(0) {}
+    CONSTEXPR ifm2_width0_m1_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ifm2_width0_m1_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ifm2_width0_m1_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ifm2_height0_m1_r - None
+struct ifm2_height0_m1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ifm2_height0_m1_r() : word0(0) {}
+    CONSTEXPR ifm2_height0_m1_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ifm2_height0_m1_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ifm2_height0_m1_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ifm2_height1_m1_r - None
+struct ifm2_height1_m1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ifm2_height1_m1_r() : word0(0) {}
+    CONSTEXPR ifm2_height1_m1_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ifm2_height1_m1_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ifm2_height1_m1_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ifm2_ib_start_r - None
+struct ifm2_ib_start_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ifm2_ib_start_r() : word0(0) {}
+    CONSTEXPR ifm2_ib_start_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ifm2_ib_start_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ifm2_ib_start_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ifm2_region_r - None
+struct ifm2_region_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ifm2_region_r() : word0(0) {}
+    CONSTEXPR ifm2_region_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ifm2_region_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ifm2_region_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ifm_base0_r - None
+struct ifm_base0_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value_LO : 32; // 64-bit register value - LSB
+            uint32_t value_HI : 32; // 64-bit register value - MSB
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR ifm_base0_r() : word0(0), word1(0) {}
+    CONSTEXPR ifm_base0_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    ifm_base0_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// ifm_base1_r - None
+struct ifm_base1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value_LO : 32; // 64-bit register value - LSB
+            uint32_t value_HI : 32; // 64-bit register value - MSB
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR ifm_base1_r() : word0(0), word1(0) {}
+    CONSTEXPR ifm_base1_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    ifm_base1_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// ifm_base2_r - None
+struct ifm_base2_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value_LO : 32; // 64-bit register value - LSB
+            uint32_t value_HI : 32; // 64-bit register value - MSB
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR ifm_base2_r() : word0(0), word1(0) {}
+    CONSTEXPR ifm_base2_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    ifm_base2_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// ifm_base3_r - None
+struct ifm_base3_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value_LO : 32; // 64-bit register value - LSB
+            uint32_t value_HI : 32; // 64-bit register value - MSB
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR ifm_base3_r() : word0(0), word1(0) {}
+    CONSTEXPR ifm_base3_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    ifm_base3_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// ifm_stride_x_r - None
+struct ifm_stride_x_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value_LO : 32; // 64-bit register value - LSB
+            uint32_t value_HI : 32; // 64-bit register value - MSB
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR ifm_stride_x_r() : word0(0), word1(0) {}
+    CONSTEXPR ifm_stride_x_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    ifm_stride_x_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// ifm_stride_y_r - None
+struct ifm_stride_y_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value_LO : 32; // 64-bit register value - LSB
+            uint32_t value_HI : 32; // 64-bit register value - MSB
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR ifm_stride_y_r() : word0(0), word1(0) {}
+    CONSTEXPR ifm_stride_y_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    ifm_stride_y_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// ifm_stride_c_r - None
+struct ifm_stride_c_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value_LO : 32; // 64-bit register value - LSB
+            uint32_t value_HI : 32; // 64-bit register value - MSB
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR ifm_stride_c_r() : word0(0), word1(0) {}
+    CONSTEXPR ifm_stride_c_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    ifm_stride_c_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// ofm_base0_r - None
+struct ofm_base0_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value_LO : 32; // 64-bit register value - LSB
+            uint32_t value_HI : 32; // 64-bit register value - MSB
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR ofm_base0_r() : word0(0), word1(0) {}
+    CONSTEXPR ofm_base0_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    ofm_base0_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// ofm_base1_r - None
+struct ofm_base1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value_LO : 32; // 64-bit register value - LSB
+            uint32_t value_HI : 32; // 64-bit register value - MSB
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR ofm_base1_r() : word0(0), word1(0) {}
+    CONSTEXPR ofm_base1_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    ofm_base1_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// ofm_base2_r - None
+struct ofm_base2_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value_LO : 32; // 64-bit register value - LSB
+            uint32_t value_HI : 32; // 64-bit register value - MSB
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR ofm_base2_r() : word0(0), word1(0) {}
+    CONSTEXPR ofm_base2_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    ofm_base2_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// ofm_base3_r - None
+struct ofm_base3_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value_LO : 32; // 64-bit register value - LSB
+            uint32_t value_HI : 32; // 64-bit register value - MSB
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR ofm_base3_r() : word0(0), word1(0) {}
+    CONSTEXPR ofm_base3_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    ofm_base3_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// ofm_stride_x_r - None
+struct ofm_stride_x_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value_LO : 32; // 64-bit register value - LSB
+            uint32_t value_HI : 32; // 64-bit register value - MSB
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR ofm_stride_x_r() : word0(0), word1(0) {}
+    CONSTEXPR ofm_stride_x_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    ofm_stride_x_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// ofm_stride_y_r - None
+struct ofm_stride_y_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value_LO : 32; // 64-bit register value - LSB
+            uint32_t value_HI : 32; // 64-bit register value - MSB
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR ofm_stride_y_r() : word0(0), word1(0) {}
+    CONSTEXPR ofm_stride_y_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    ofm_stride_y_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// ofm_stride_c_r - None
+struct ofm_stride_c_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value_LO : 32; // 64-bit register value - LSB
+            uint32_t value_HI : 32; // 64-bit register value - MSB
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR ofm_stride_c_r() : word0(0), word1(0) {}
+    CONSTEXPR ofm_stride_c_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    ofm_stride_c_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// weight_base_r - None
+struct weight_base_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value_LO : 32; // 64-bit register value - LSB
+            uint32_t value_HI : 32; // 64-bit register value - MSB
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR weight_base_r() : word0(0), word1(0) {}
+    CONSTEXPR weight_base_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    weight_base_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// weight_length_r - None
+struct weight_length_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR weight_length_r() : word0(0) {}
+    CONSTEXPR weight_length_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    weight_length_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR weight_length_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// scale_base_r - None
+struct scale_base_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value_LO : 32; // 64-bit register value - LSB
+            uint32_t value_HI : 32; // 64-bit register value - MSB
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR scale_base_r() : word0(0), word1(0) {}
+    CONSTEXPR scale_base_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    scale_base_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// scale_length_r - None
+struct scale_length_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR scale_length_r() : word0(0) {}
+    CONSTEXPR scale_length_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    scale_length_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR scale_length_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ofm_scale_r - None
+struct ofm_scale_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ofm_scale_r() : word0(0) {}
+    CONSTEXPR ofm_scale_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ofm_scale_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ofm_scale_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// ofm_scale_shift_r - None
+struct ofm_scale_shift_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR ofm_scale_shift_r() : word0(0) {}
+    CONSTEXPR ofm_scale_shift_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    ofm_scale_shift_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR ofm_scale_shift_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// opa_scale_r - None
+struct opa_scale_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR opa_scale_r() : word0(0) {}
+    CONSTEXPR opa_scale_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    opa_scale_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR opa_scale_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// opa_scale_shift_r - None
+struct opa_scale_shift_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR opa_scale_shift_r() : word0(0) {}
+    CONSTEXPR opa_scale_shift_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    opa_scale_shift_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR opa_scale_shift_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// opb_scale_r - None
+struct opb_scale_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR opb_scale_r() : word0(0) {}
+    CONSTEXPR opb_scale_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    opb_scale_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR opb_scale_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// dma0_src_r - None
+struct dma0_src_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value_LO : 32; // 64-bit register value - LSB
+            uint32_t value_HI : 32; // 64-bit register value - MSB
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR dma0_src_r() : word0(0), word1(0) {}
+    CONSTEXPR dma0_src_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    dma0_src_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// dma0_dst_r - None
+struct dma0_dst_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value_LO : 32; // 64-bit register value - LSB
+            uint32_t value_HI : 32; // 64-bit register value - MSB
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR dma0_dst_r() : word0(0), word1(0) {}
+    CONSTEXPR dma0_dst_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    dma0_dst_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// dma0_len_r - None
+struct dma0_len_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value_LO : 32; // 64-bit register value - LSB
+            uint32_t value_HI : 32; // 64-bit register value - MSB
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR dma0_len_r() : word0(0), word1(0) {}
+    CONSTEXPR dma0_len_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    dma0_len_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// dma0_skip0_r - None
+struct dma0_skip0_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value_LO : 32; // 64-bit register value - LSB
+            uint32_t value_HI : 32; // 64-bit register value - MSB
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR dma0_skip0_r() : word0(0), word1(0) {}
+    CONSTEXPR dma0_skip0_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    dma0_skip0_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// dma0_skip1_r - None
+struct dma0_skip1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value_LO : 32; // 64-bit register value - LSB
+            uint32_t value_HI : 32; // 64-bit register value - MSB
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR dma0_skip1_r() : word0(0), word1(0) {}
+    CONSTEXPR dma0_skip1_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    dma0_skip1_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// ifm2_base0_r - None
+struct ifm2_base0_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value_LO : 32; // 64-bit register value - LSB
+            uint32_t value_HI : 32; // 64-bit register value - MSB
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR ifm2_base0_r() : word0(0), word1(0) {}
+    CONSTEXPR ifm2_base0_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    ifm2_base0_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// ifm2_base1_r - None
+struct ifm2_base1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value_LO : 32; // 64-bit register value - LSB
+            uint32_t value_HI : 32; // 64-bit register value - MSB
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR ifm2_base1_r() : word0(0), word1(0) {}
+    CONSTEXPR ifm2_base1_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    ifm2_base1_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// ifm2_base2_r - None
+struct ifm2_base2_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value_LO : 32; // 64-bit register value - LSB
+            uint32_t value_HI : 32; // 64-bit register value - MSB
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR ifm2_base2_r() : word0(0), word1(0) {}
+    CONSTEXPR ifm2_base2_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    ifm2_base2_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// ifm2_base3_r - None
+struct ifm2_base3_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value_LO : 32; // 64-bit register value - LSB
+            uint32_t value_HI : 32; // 64-bit register value - MSB
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR ifm2_base3_r() : word0(0), word1(0) {}
+    CONSTEXPR ifm2_base3_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    ifm2_base3_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// ifm2_stride_x_r - None
+struct ifm2_stride_x_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value_LO : 32; // 64-bit register value - LSB
+            uint32_t value_HI : 32; // 64-bit register value - MSB
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR ifm2_stride_x_r() : word0(0), word1(0) {}
+    CONSTEXPR ifm2_stride_x_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    ifm2_stride_x_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// ifm2_stride_y_r - None
+struct ifm2_stride_y_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value_LO : 32; // 64-bit register value - LSB
+            uint32_t value_HI : 32; // 64-bit register value - MSB
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR ifm2_stride_y_r() : word0(0), word1(0) {}
+    CONSTEXPR ifm2_stride_y_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    ifm2_stride_y_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// ifm2_stride_c_r - None
+struct ifm2_stride_c_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value_LO : 32; // 64-bit register value - LSB
+            uint32_t value_HI : 32; // 64-bit register value - MSB
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR ifm2_stride_c_r() : word0(0), word1(0) {}
+    CONSTEXPR ifm2_stride_c_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    ifm2_stride_c_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// weight1_base_r - None
+struct weight1_base_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value_LO : 32; // 64-bit register value - LSB
+            uint32_t value_HI : 32; // 64-bit register value - MSB
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR weight1_base_r() : word0(0), word1(0) {}
+    CONSTEXPR weight1_base_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    weight1_base_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// weight1_length_r - None
+struct weight1_length_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR weight1_length_r() : word0(0) {}
+    CONSTEXPR weight1_length_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    weight1_length_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR weight1_length_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// scale1_base_r - None
+struct scale1_base_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value_LO : 32; // 64-bit register value - LSB
+            uint32_t value_HI : 32; // 64-bit register value - MSB
+        };
+        uint32_t word[2];
+    };
+#else
+  private:
+    uint32_t word0;
+    uint32_t word1;
+
+  public:
+    CONSTEXPR scale1_base_r() : word0(0), word1(0) {}
+    CONSTEXPR scale1_base_r(uint64_t init) :
+        word0(static_cast<uint32_t>((init) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+        word1(static_cast<uint32_t>((init >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+    {
+    }
+    CONSTEXPR void operator=(uint64_t value)
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    void operator=(uint64_t value) volatile
+    {
+        word0 = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+        word1 = static_cast<uint32_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+    }
+    CONSTEXPR operator uint64_t()
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    operator uint64_t() volatile
+    {
+        return (static_cast<uint64_t>(word1) << 32) | word0;
+    }
+    scale1_base_r copy() volatile
+    {
+        return *this;
+    }
+#endif
+};
+
+// scale1_length_r - None
+struct scale1_length_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR scale1_length_r() : word0(0) {}
+    CONSTEXPR scale1_length_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    scale1_length_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR scale1_length_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// revision_r - Internal FPGA build revision: first 32-bits of the Ultan Git hash used for the build
+struct revision_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t value : 32; // 32-bit register value
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR revision_r() : word0(0) {}
+    CONSTEXPR revision_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    revision_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_value() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_value() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR revision_r &set_value(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// pid4_r - Peripheral ID byte 4 (Arm=code 4)
+struct pid4_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t PID4 : 32; // Byte 4 of Peripheral ID (Lower 8 bits valid)
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR pid4_r() : word0(4) {}
+    CONSTEXPR pid4_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    pid4_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_PID4() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_PID4() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR pid4_r &set_PID4(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// pid5_r - Peripheral ID byte 5 (reserved)
+struct pid5_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t PID5 : 32; // Byte 5 of Peripheral ID (Lower 8 bits valid)
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR pid5_r() : word0(0) {}
+    CONSTEXPR pid5_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    pid5_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_PID5() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_PID5() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR pid5_r &set_PID5(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// pid6_r - Peripheral ID byte 6 (reserved)
+struct pid6_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t PID6 : 32; // Byte 6 of Peripheral ID (Lower 8 bits valid)
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR pid6_r() : word0(0) {}
+    CONSTEXPR pid6_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    pid6_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_PID6() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_PID6() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR pid6_r &set_PID6(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// pid7_r - Peripheral ID byte 7 (reserved)
+struct pid7_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t PID7 : 32; // Byte 7 of Peripheral ID (Lower 8 bits valid)
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR pid7_r() : word0(0) {}
+    CONSTEXPR pid7_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    pid7_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_PID7() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_PID7() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR pid7_r &set_PID7(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// pid0_r - Peripheral ID byte 0. This is bits[7:0] of the part number
+struct pid0_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t PID0 : 32; // Byte 0 of Peripheral ID (Lower 8 bits valid)
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR pid0_r() : word0(129) {}
+    CONSTEXPR pid0_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    pid0_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_PID0() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_PID0() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR pid0_r &set_PID0(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// pid1_r - Peripheral ID byte 1. This is bits[11:8] of the part number in bits[3:0], and bits[3:0] of the Arm ID in
+// bits[7:4]
+struct pid1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t PID1 : 32; // Byte 1 of Peripheral ID (Lower 8 bits valid)
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR pid1_r() : word0(181) {}
+    CONSTEXPR pid1_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    pid1_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_PID1() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_PID1() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR pid1_r &set_PID1(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// pid2_r - Peripheral ID byte 2. This is bits[6:4] of the Arm ID in bits[2:0], and bit 3 indicates format B
+struct pid2_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t PID2 : 32; // Byte 2 of Peripheral ID (Lower 8 bits valid)
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR pid2_r() : word0(11) {}
+    CONSTEXPR pid2_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    pid2_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_PID2() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_PID2() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR pid2_r &set_PID2(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// pid3_r - Peripheral ID byte 3
+struct pid3_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t PID3 : 32; // Byte 1 of Peripheral ID (Lower 8 bits valid)
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR pid3_r() : word0(0) {}
+    CONSTEXPR pid3_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    pid3_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_PID3() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_PID3() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR pid3_r &set_PID3(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// cid0_r - Component ID byte 0
+struct cid0_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t CID0 : 32; // Byte 0 of Component ID (Lower 8 bits valid)
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR cid0_r() : word0(13) {}
+    CONSTEXPR cid0_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    cid0_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_CID0() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_CID0() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR cid0_r &set_CID0(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// cid1_r - Component ID byte 1
+struct cid1_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t CID1 : 32; // Byte 1 of Component ID (Lower 8 bits valid)
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR cid1_r() : word0(240) {}
+    CONSTEXPR cid1_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    cid1_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_CID1() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_CID1() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR cid1_r &set_CID1(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// cid2_r - Component ID byte 2
+struct cid2_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t CID2 : 32; // Byte 2 of Component ID (Lower 8 bits valid)
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR cid2_r() : word0(5) {}
+    CONSTEXPR cid2_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    cid2_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_CID2() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_CID2() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR cid2_r &set_CID2(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+// cid3_r - Component ID byte 3
+struct cid3_r
+{
+#ifndef __cplusplus
+    union
+    {
+        struct
+        {
+            uint32_t CID3 : 32; // Byte 3 of Component ID (Lower 8 bits valid)
+        };
+        uint32_t word;
+    };
+#else
+  private:
+    uint32_t word0;
+
+  public:
+    CONSTEXPR cid3_r() : word0(177) {}
+    CONSTEXPR cid3_r(uint32_t init) : word0(init) {}
+    CONSTEXPR void operator=(uint32_t value)
+    {
+        word0 = value;
+    }
+    void operator=(uint32_t value) volatile
+    {
+        word0 = value;
+    }
+    CONSTEXPR operator uint32_t()
+    {
+        return word0;
+    }
+    operator uint32_t() volatile
+    {
+        return word0;
+    }
+    cid3_r copy() volatile
+    {
+        return *this;
+    }
+    CONSTEXPR uint32_t get_CID3() const
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    uint32_t get_CID3() const volatile
+    {
+        uint32_t value = static_cast<uint32_t>(word0);
+        return value;
+    }
+    CONSTEXPR cid3_r &set_CID3(uint32_t value)
+    {
+        word0 = static_cast<uint32_t>(value);
+        return *this;
+    }
+#endif
+};
+
+struct NPU_REG
+{
+    STRUCT id_r ID;           // 0x0000
+    STRUCT status_r STATUS;   // 0x0004
+    STRUCT cmd_r CMD;         // 0x0008
+    STRUCT reset_r RESET;     // 0x000C
+    STRUCT qbase_r QBASE;     // 0x0010
+    STRUCT qread_r QREAD;     // 0x0018
+    STRUCT qconfig_r QCONFIG; // 0x001C
+    STRUCT qsize_r QSIZE;     // 0x0020
+    STRUCT prot_r PROT;       // 0x0024
+    STRUCT config_r CONFIG;   // 0x0028
+    STRUCT lock_r LOCK;       // 0x002C
+    uint32_t unused0[3];
+    STRUCT regioncfg_r REGIONCFG;   // 0x003C
+    STRUCT axi_limit0_r AXI_LIMIT0; // 0x0040
+    STRUCT axi_limit1_r AXI_LIMIT1; // 0x0044
+    STRUCT axi_limit2_r AXI_LIMIT2; // 0x0048
+    STRUCT axi_limit3_r AXI_LIMIT3; // 0x004C
+    uint32_t unused1[12];
+    STRUCT basep_r BASEP[8]; // 0x0080
+    uint32_t unused2[16];
+    STRUCT wd_status_r WD_STATUS;   // 0x0100
+    STRUCT mac_status_r MAC_STATUS; // 0x0104
+    STRUCT ao_status_r AO_STATUS;   // 0x0108
+    uint32_t unused3[1];
+    STRUCT dma_status0_r DMA_STATUS0; // 0x0110
+    STRUCT dma_status1_r DMA_STATUS1; // 0x0114
+    uint32_t unused4[10];
+    STRUCT clkforce_r CLKFORCE;           // 0x0140
+    STRUCT debug_address_r DEBUG_ADDRESS; // 0x0144
+    STRUCT debug_misc_r DEBUG_MISC;       // 0x0148
+    STRUCT debugcore_r DEBUGCORE;         // 0x014C
+    STRUCT debug_block_r DEBUG_BLOCK;     // 0x0150
+    uint32_t unused5[11];
+    STRUCT pmcr_r PMCR;             // 0x0180
+    STRUCT pmcntenset_r PMCNTENSET; // 0x0184
+    STRUCT pmcntenclr_r PMCNTENCLR; // 0x0188
+    STRUCT pmovsset_r PMOVSSET;     // 0x018C
+    STRUCT pmovsclr_r PMOVSCLR;     // 0x0190
+    STRUCT pmintset_r PMINTSET;     // 0x0194
+    STRUCT pmintclr_r PMINTCLR;     // 0x0198
+    uint32_t unused6[1];
+    STRUCT pmccntr_r PMCCNTR;         // 0x01A0
+    STRUCT pmccntr_cfg_r PMCCNTR_CFG; // 0x01A8
+    STRUCT pmcaxi_chan_r PMCAXI_CHAN; // 0x01AC
+    uint32_t unused7[20];
+    STRUCT kernel_x_r KERNEL_X;                     // 0x0200
+    STRUCT kernel_y_r KERNEL_Y;                     // 0x0204
+    STRUCT kernel_w_m1_r KERNEL_W_M1;               // 0x0208
+    STRUCT kernel_h_m1_r KERNEL_H_M1;               // 0x020C
+    STRUCT ofm_cblk_width_m1_r OFM_CBLK_WIDTH_M1;   // 0x0210
+    STRUCT ofm_cblk_height_m1_r OFM_CBLK_HEIGHT_M1; // 0x0214
+    STRUCT ofm_cblk_depth_m1_r OFM_CBLK_DEPTH_M1;   // 0x0218
+    STRUCT ifm_cblk_depth_m1_r IFM_CBLK_DEPTH_M1;   // 0x021C
+    STRUCT ofm_x_r OFM_X;                           // 0x0220
+    STRUCT ofm_y_r OFM_Y;                           // 0x0224
+    STRUCT ofm_z_r OFM_Z;                           // 0x0228
+    STRUCT ifm_z_r IFM_Z;                           // 0x022C
+    STRUCT pad_top_r PAD_TOP;                       // 0x0230
+    STRUCT pad_left_r PAD_LEFT;                     // 0x0234
+    STRUCT ifm_cblk_width_r IFM_CBLK_WIDTH;         // 0x0238
+    STRUCT ifm_cblk_height_r IFM_CBLK_HEIGHT;       // 0x023C
+    STRUCT dma_ifm_src_r DMA_IFM_SRC;               // 0x0240
+    STRUCT dma_ifm_dst_r DMA_IFM_DST;               // 0x0248
+    STRUCT dma_ofm_src_r DMA_OFM_SRC;               // 0x024C
+    STRUCT dma_ofm_dst_r DMA_OFM_DST;               // 0x0250
+    STRUCT dma_weight_src_r DMA_WEIGHT_SRC;         // 0x0258
+    STRUCT dma_cmd_src_r DMA_CMD_SRC;               // 0x0260
+    STRUCT dma_cmd_size_r DMA_CMD_SIZE;             // 0x0268
+    STRUCT dma_m2m_src_r DMA_M2M_SRC;               // 0x026C
+    STRUCT dma_m2m_dst_r DMA_M2M_DST;               // 0x0274
+    STRUCT current_qread_r CURRENT_QREAD;           // 0x027C
+    STRUCT dma_scale_src_r DMA_SCALE_SRC;           // 0x0280
+    uint32_t unused8[11];
+    STRUCT current_block_r CURRENT_BLOCK; // 0x02B4
+    STRUCT current_op_r CURRENT_OP;       // 0x02B8
+    STRUCT current_cmd_r CURRENT_CMD;     // 0x02BC
+    uint32_t unused9[16];
+    STRUCT pmevcntr_r PMEVCNTR[4]; // 0x0300
+    uint32_t unused10[28];
+    STRUCT pmevtyper_r PMEVTYPER[4]; // 0x0380
+    uint32_t unused11[28];
+    STRUCT shared_buffer_r SHARED_BUFFER[256]; // 0x0400
+    STRUCT ifm_pad_top_r IFM_PAD_TOP;          // 0x0800
+    STRUCT ifm_pad_left_r IFM_PAD_LEFT;        // 0x0804
+    STRUCT ifm_pad_right_r IFM_PAD_RIGHT;      // 0x0808
+    STRUCT ifm_pad_bottom_r IFM_PAD_BOTTOM;    // 0x080C
+    STRUCT ifm_depth_m1_r IFM_DEPTH_M1;        // 0x0810
+    STRUCT ifm_precision_r IFM_PRECISION;      // 0x0814
+    uint32_t unused12[1];
+    STRUCT ifm_upscale_r IFM_UPSCALE; // 0x081C
+    uint32_t unused13[1];
+    STRUCT ifm_zero_point_r IFM_ZERO_POINT; // 0x0824
+    STRUCT ifm_width0_m1_r IFM_WIDTH0_M1;   // 0x0828
+    STRUCT ifm_height0_m1_r IFM_HEIGHT0_M1; // 0x082C
+    STRUCT ifm_height1_m1_r IFM_HEIGHT1_M1; // 0x0830
+    STRUCT ifm_ib_end_r IFM_IB_END;         // 0x0834
+    uint32_t unused14[1];
+    STRUCT ifm_region_r IFM_REGION; // 0x083C
+    uint32_t unused15[1];
+    STRUCT ofm_width_m1_r OFM_WIDTH_M1;           // 0x0844
+    STRUCT ofm_height_m1_r OFM_HEIGHT_M1;         // 0x0848
+    STRUCT ofm_depth_m1_r OFM_DEPTH_M1;           // 0x084C
+    STRUCT ofm_precision_r OFM_PRECISION;         // 0x0850
+    STRUCT ofm_blk_width_m1_r OFM_BLK_WIDTH_M1;   // 0x0854
+    STRUCT ofm_blk_height_m1_r OFM_BLK_HEIGHT_M1; // 0x0858
+    STRUCT ofm_blk_depth_m1_r OFM_BLK_DEPTH_M1;   // 0x085C
+    STRUCT ofm_zero_point_r OFM_ZERO_POINT;       // 0x0860
+    uint32_t unused16[1];
+    STRUCT ofm_width0_m1_r OFM_WIDTH0_M1;   // 0x0868
+    STRUCT ofm_height0_m1_r OFM_HEIGHT0_M1; // 0x086C
+    STRUCT ofm_height1_m1_r OFM_HEIGHT1_M1; // 0x0870
+    uint32_t unused17[2];
+    STRUCT ofm_region_r OFM_REGION;             // 0x087C
+    STRUCT kernel_width_m1_r KERNEL_WIDTH_M1;   // 0x0880
+    STRUCT kernel_height_m1_r KERNEL_HEIGHT_M1; // 0x0884
+    STRUCT kernel_stride_r KERNEL_STRIDE;       // 0x0888
+    STRUCT parallel_mode_r PARALLEL_MODE;       // 0x088C
+    STRUCT acc_format_r ACC_FORMAT;             // 0x0890
+    STRUCT activation_r ACTIVATION;             // 0x0894
+    STRUCT activation_min_r ACTIVATION_MIN;     // 0x0898
+    STRUCT activation_max_r ACTIVATION_MAX;     // 0x089C
+    STRUCT weight_region_r WEIGHT_REGION;       // 0x08A0
+    STRUCT scale_region_r SCALE_REGION;         // 0x08A4
+    uint32_t unused18[3];
+    STRUCT ab_start_r AB_START; // 0x08B4
+    uint32_t unused19[1];
+    STRUCT blockdep_r BLOCKDEP;               // 0x08BC
+    STRUCT dma0_src_region_r DMA0_SRC_REGION; // 0x08C0
+    STRUCT dma0_dst_region_r DMA0_DST_REGION; // 0x08C4
+    STRUCT dma0_size0_r DMA0_SIZE0;           // 0x08C8
+    STRUCT dma0_size1_r DMA0_SIZE1;           // 0x08CC
+    uint32_t unused20[12];
+    STRUCT ifm2_broadcast_r IFM2_BROADCAST; // 0x0900
+    STRUCT ifm2_scalar_r IFM2_SCALAR;       // 0x0904
+    uint32_t unused21[3];
+    STRUCT ifm2_precision_r IFM2_PRECISION; // 0x0914
+    uint32_t unused22[3];
+    STRUCT ifm2_zero_point_r IFM2_ZERO_POINT; // 0x0924
+    STRUCT ifm2_width0_m1_r IFM2_WIDTH0_M1;   // 0x0928
+    STRUCT ifm2_height0_m1_r IFM2_HEIGHT0_M1; // 0x092C
+    STRUCT ifm2_height1_m1_r IFM2_HEIGHT1_M1; // 0x0930
+    STRUCT ifm2_ib_start_r IFM2_IB_START;     // 0x0934
+    uint32_t unused23[1];
+    STRUCT ifm2_region_r IFM2_REGION; // 0x093C
+    uint32_t unused24[48];
+    STRUCT ifm_base0_r IFM_BASE0;       // 0x0A00
+    STRUCT ifm_base1_r IFM_BASE1;       // 0x0A08
+    STRUCT ifm_base2_r IFM_BASE2;       // 0x0A10
+    STRUCT ifm_base3_r IFM_BASE3;       // 0x0A18
+    STRUCT ifm_stride_x_r IFM_STRIDE_X; // 0x0A20
+    STRUCT ifm_stride_y_r IFM_STRIDE_Y; // 0x0A28
+    STRUCT ifm_stride_c_r IFM_STRIDE_C; // 0x0A30
+    uint32_t unused25[2];
+    STRUCT ofm_base0_r OFM_BASE0;       // 0x0A40
+    STRUCT ofm_base1_r OFM_BASE1;       // 0x0A48
+    STRUCT ofm_base2_r OFM_BASE2;       // 0x0A50
+    STRUCT ofm_base3_r OFM_BASE3;       // 0x0A58
+    STRUCT ofm_stride_x_r OFM_STRIDE_X; // 0x0A60
+    STRUCT ofm_stride_y_r OFM_STRIDE_Y; // 0x0A68
+    STRUCT ofm_stride_c_r OFM_STRIDE_C; // 0x0A70
+    uint32_t unused26[2];
+    STRUCT weight_base_r WEIGHT_BASE;     // 0x0A80
+    STRUCT weight_length_r WEIGHT_LENGTH; // 0x0A88
+    uint32_t unused27[1];
+    STRUCT scale_base_r SCALE_BASE;     // 0x0A90
+    STRUCT scale_length_r SCALE_LENGTH; // 0x0A98
+    uint32_t unused28[1];
+    STRUCT ofm_scale_r OFM_SCALE;             // 0x0AA0
+    STRUCT ofm_scale_shift_r OFM_SCALE_SHIFT; // 0x0AA4
+    STRUCT opa_scale_r OPA_SCALE;             // 0x0AA8
+    STRUCT opa_scale_shift_r OPA_SCALE_SHIFT; // 0x0AAC
+    STRUCT opb_scale_r OPB_SCALE;             // 0x0AB0
+    uint32_t unused29[3];
+    STRUCT dma0_src_r DMA0_SRC;     // 0x0AC0
+    STRUCT dma0_dst_r DMA0_DST;     // 0x0AC8
+    STRUCT dma0_len_r DMA0_LEN;     // 0x0AD0
+    STRUCT dma0_skip0_r DMA0_SKIP0; // 0x0AD8
+    STRUCT dma0_skip1_r DMA0_SKIP1; // 0x0AE0
+    uint32_t unused30[6];
+    STRUCT ifm2_base0_r IFM2_BASE0;       // 0x0B00
+    STRUCT ifm2_base1_r IFM2_BASE1;       // 0x0B08
+    STRUCT ifm2_base2_r IFM2_BASE2;       // 0x0B10
+    STRUCT ifm2_base3_r IFM2_BASE3;       // 0x0B18
+    STRUCT ifm2_stride_x_r IFM2_STRIDE_X; // 0x0B20
+    STRUCT ifm2_stride_y_r IFM2_STRIDE_Y; // 0x0B28
+    STRUCT ifm2_stride_c_r IFM2_STRIDE_C; // 0x0B30
+    uint32_t unused31[2];
+    STRUCT weight1_base_r WEIGHT1_BASE;     // 0x0B40
+    STRUCT weight1_length_r WEIGHT1_LENGTH; // 0x0B48
+    uint32_t unused32[1];
+    STRUCT scale1_base_r SCALE1_BASE;     // 0x0B50
+    STRUCT scale1_length_r SCALE1_LENGTH; // 0x0B58
+    uint32_t unused33[281];
+    STRUCT revision_r REVISION; // 0x0FC0
+    uint32_t unused34[3];
+    STRUCT pid4_r PID4; // 0x0FD0
+    STRUCT pid5_r PID5; // 0x0FD4
+    STRUCT pid6_r PID6; // 0x0FD8
+    STRUCT pid7_r PID7; // 0x0FDC
+    STRUCT pid0_r PID0; // 0x0FE0
+    STRUCT pid1_r PID1; // 0x0FE4
+    STRUCT pid2_r PID2; // 0x0FE8
+    STRUCT pid3_r PID3; // 0x0FEC
+    STRUCT cid0_r CID0; // 0x0FF0
+    STRUCT cid1_r CID1; // 0x0FF4
+    STRUCT cid2_r CID2; // 0x0FF8
+    STRUCT cid3_r CID3; // 0x0FFC
+
+#ifdef __cplusplus
+    enum class access_type_t : uint8_t
+    {
+        RW,
+        RO,
+        WO
+    };
+    NPU_REG()
+    {
+        reset();
+    }
+    void reset()
+    {
+        ID         = 268853249;
+        STATUS     = 8;
+        CMD        = 12;
+        RESET      = 0;
+        QBASE      = 0;
+        QREAD      = 0;
+        QCONFIG    = 0;
+        QSIZE      = 0;
+        PROT       = 0;
+        CONFIG     = 268435456;
+        LOCK       = 0;
+        REGIONCFG  = 0;
+        AXI_LIMIT0 = 0;
+        AXI_LIMIT1 = 0;
+        AXI_LIMIT2 = 0;
+        AXI_LIMIT3 = 0;
+        for (size_t i = 0; i < (sizeof(BASEP) / sizeof(BASEP[0])); ++i)
+            BASEP[i] = 0;
+        WD_STATUS          = 0;
+        MAC_STATUS         = 0;
+        AO_STATUS          = 0;
+        DMA_STATUS0        = 0;
+        DMA_STATUS1        = 0;
+        CLKFORCE           = 0;
+        DEBUG_ADDRESS      = 0;
+        DEBUG_MISC         = 0;
+        DEBUGCORE          = 0;
+        DEBUG_BLOCK        = 0;
+        PMCR               = 8192;
+        PMCNTENSET         = 0;
+        PMCNTENCLR         = 0;
+        PMOVSSET           = 0;
+        PMOVSCLR           = 0;
+        PMINTSET           = 0;
+        PMINTCLR           = 0;
+        PMCCNTR            = 0;
+        PMCCNTR_CFG        = 0;
+        PMCAXI_CHAN        = 0;
+        KERNEL_X           = 0;
+        KERNEL_Y           = 0;
+        KERNEL_W_M1        = 0;
+        KERNEL_H_M1        = 0;
+        OFM_CBLK_WIDTH_M1  = 0;
+        OFM_CBLK_HEIGHT_M1 = 0;
+        OFM_CBLK_DEPTH_M1  = 0;
+        IFM_CBLK_DEPTH_M1  = 0;
+        OFM_X              = 0;
+        OFM_Y              = 0;
+        OFM_Z              = 0;
+        IFM_Z              = 0;
+        PAD_TOP            = 0;
+        PAD_LEFT           = 0;
+        IFM_CBLK_WIDTH     = 0;
+        IFM_CBLK_HEIGHT    = 0;
+        DMA_IFM_SRC        = 0;
+        DMA_IFM_DST        = 0;
+        DMA_OFM_SRC        = 0;
+        DMA_OFM_DST        = 0;
+        DMA_WEIGHT_SRC     = 0;
+        DMA_CMD_SRC        = 0;
+        DMA_CMD_SIZE       = 0;
+        DMA_M2M_SRC        = 0;
+        DMA_M2M_DST        = 0;
+        CURRENT_QREAD      = 0;
+        DMA_SCALE_SRC      = 0;
+        CURRENT_BLOCK      = 0;
+        CURRENT_OP         = 0;
+        CURRENT_CMD        = 0;
+        for (size_t i = 0; i < (sizeof(PMEVCNTR) / sizeof(PMEVCNTR[0])); ++i)
+            PMEVCNTR[i] = 0;
+        for (size_t i = 0; i < (sizeof(PMEVTYPER) / sizeof(PMEVTYPER[0])); ++i)
+            PMEVTYPER[i] = 0;
+        for (size_t i = 0; i < (sizeof(SHARED_BUFFER) / sizeof(SHARED_BUFFER[0])); ++i)
+            SHARED_BUFFER[i] = 0;
+        IFM_PAD_TOP       = 0;
+        IFM_PAD_LEFT      = 0;
+        IFM_PAD_RIGHT     = 0;
+        IFM_PAD_BOTTOM    = 0;
+        IFM_DEPTH_M1      = 0;
+        IFM_PRECISION     = 0;
+        IFM_UPSCALE       = 0;
+        IFM_ZERO_POINT    = 0;
+        IFM_WIDTH0_M1     = 0;
+        IFM_HEIGHT0_M1    = 0;
+        IFM_HEIGHT1_M1    = 0;
+        IFM_IB_END        = 0;
+        IFM_REGION        = 0;
+        OFM_WIDTH_M1      = 0;
+        OFM_HEIGHT_M1     = 0;
+        OFM_DEPTH_M1      = 0;
+        OFM_PRECISION     = 0;
+        OFM_BLK_WIDTH_M1  = 0;
+        OFM_BLK_HEIGHT_M1 = 0;
+        OFM_BLK_DEPTH_M1  = 0;
+        OFM_ZERO_POINT    = 0;
+        OFM_WIDTH0_M1     = 0;
+        OFM_HEIGHT0_M1    = 0;
+        OFM_HEIGHT1_M1    = 0;
+        OFM_REGION        = 0;
+        KERNEL_WIDTH_M1   = 0;
+        KERNEL_HEIGHT_M1  = 0;
+        KERNEL_STRIDE     = 0;
+        PARALLEL_MODE     = 0;
+        ACC_FORMAT        = 0;
+        ACTIVATION        = 0;
+        ACTIVATION_MIN    = 0;
+        ACTIVATION_MAX    = 0;
+        WEIGHT_REGION     = 0;
+        SCALE_REGION      = 0;
+        AB_START          = 0;
+        BLOCKDEP          = 0;
+        DMA0_SRC_REGION   = 0;
+        DMA0_DST_REGION   = 0;
+        DMA0_SIZE0        = 0;
+        DMA0_SIZE1        = 0;
+        IFM2_BROADCAST    = 0;
+        IFM2_SCALAR       = 0;
+        IFM2_PRECISION    = 0;
+        IFM2_ZERO_POINT   = 0;
+        IFM2_WIDTH0_M1    = 0;
+        IFM2_HEIGHT0_M1   = 0;
+        IFM2_HEIGHT1_M1   = 0;
+        IFM2_IB_START     = 0;
+        IFM2_REGION       = 0;
+        IFM_BASE0         = 0;
+        IFM_BASE1         = 0;
+        IFM_BASE2         = 0;
+        IFM_BASE3         = 0;
+        IFM_STRIDE_X      = 0;
+        IFM_STRIDE_Y      = 0;
+        IFM_STRIDE_C      = 0;
+        OFM_BASE0         = 0;
+        OFM_BASE1         = 0;
+        OFM_BASE2         = 0;
+        OFM_BASE3         = 0;
+        OFM_STRIDE_X      = 0;
+        OFM_STRIDE_Y      = 0;
+        OFM_STRIDE_C      = 0;
+        WEIGHT_BASE       = 0;
+        WEIGHT_LENGTH     = 0;
+        SCALE_BASE        = 0;
+        SCALE_LENGTH      = 0;
+        OFM_SCALE         = 0;
+        OFM_SCALE_SHIFT   = 0;
+        OPA_SCALE         = 0;
+        OPA_SCALE_SHIFT   = 0;
+        OPB_SCALE         = 0;
+        DMA0_SRC          = 0;
+        DMA0_DST          = 0;
+        DMA0_LEN          = 0;
+        DMA0_SKIP0        = 0;
+        DMA0_SKIP1        = 0;
+        IFM2_BASE0        = 0;
+        IFM2_BASE1        = 0;
+        IFM2_BASE2        = 0;
+        IFM2_BASE3        = 0;
+        IFM2_STRIDE_X     = 0;
+        IFM2_STRIDE_Y     = 0;
+        IFM2_STRIDE_C     = 0;
+        WEIGHT1_BASE      = 0;
+        WEIGHT1_LENGTH    = 0;
+        SCALE1_BASE       = 0;
+        SCALE1_LENGTH     = 0;
+        REVISION          = 0;
+        PID4              = 4;
+        PID5              = 0;
+        PID6              = 0;
+        PID7              = 0;
+        PID0              = 129;
+        PID1              = 181;
+        PID2              = 11;
+        PID3              = 0;
+        CID0              = 13;
+        CID1              = 240;
+        CID2              = 5;
+        CID3              = 177;
+    }
+    uint32_t &operator[](const int addr_offset)
+    {
+        return reinterpret_cast<uint32_t *>(this)[addr_offset / 4];
+    }
+    access_type_t get_access_type(uint32_t offset)
+    {
+        switch (offset)
+        {
+        case 0:
+            return access_type_t::RO;
+        case 4:
+            return access_type_t::RO;
+        case 8:
+            return access_type_t::RW;
+        case 12:
+            return access_type_t::RW;
+        case 16:
+            return access_type_t::RW;
+        case 24:
+            return access_type_t::RO;
+        case 28:
+            return access_type_t::RW;
+        case 32:
+            return access_type_t::RW;
+        case 36:
+            return access_type_t::RO;
+        case 40:
+            return access_type_t::RO;
+        case 44:
+            return access_type_t::RW;
+        case 60:
+            return access_type_t::RW;
+        case 64:
+            return access_type_t::RW;
+        case 68:
+            return access_type_t::RW;
+        case 72:
+            return access_type_t::RW;
+        case 76:
+            return access_type_t::RW;
+        case 128:
+            return access_type_t::RW;
+        case 136:
+            return access_type_t::RW;
+        case 144:
+            return access_type_t::RW;
+        case 152:
+            return access_type_t::RW;
+        case 160:
+            return access_type_t::RW;
+        case 168:
+            return access_type_t::RW;
+        case 176:
+            return access_type_t::RW;
+        case 184:
+            return access_type_t::RW;
+        case 256:
+            return access_type_t::RO;
+        case 260:
+            return access_type_t::RO;
+        case 264:
+            return access_type_t::RO;
+        case 272:
+            return access_type_t::RO;
+        case 276:
+            return access_type_t::RO;
+        case 320:
+            return access_type_t::RW;
+        case 324:
+            return access_type_t::RW;
+        case 328:
+            return access_type_t::RW;
+        case 332:
+            return access_type_t::RW;
+        case 336:
+            return access_type_t::RW;
+        case 384:
+            return access_type_t::RW;
+        case 388:
+            return access_type_t::RW;
+        case 392:
+            return access_type_t::RW;
+        case 396:
+            return access_type_t::RW;
+        case 400:
+            return access_type_t::RW;
+        case 404:
+            return access_type_t::RW;
+        case 408:
+            return access_type_t::RW;
+        case 416:
+            return access_type_t::RW;
+        case 424:
+            return access_type_t::RW;
+        case 428:
+            return access_type_t::RW;
+        case 512:
+            return access_type_t::RO;
+        case 516:
+            return access_type_t::RO;
+        case 520:
+            return access_type_t::RO;
+        case 524:
+            return access_type_t::RO;
+        case 528:
+            return access_type_t::RO;
+        case 532:
+            return access_type_t::RO;
+        case 536:
+            return access_type_t::RO;
+        case 540:
+            return access_type_t::RO;
+        case 544:
+            return access_type_t::RO;
+        case 548:
+            return access_type_t::RO;
+        case 552:
+            return access_type_t::RO;
+        case 556:
+            return access_type_t::RO;
+        case 560:
+            return access_type_t::RO;
+        case 564:
+            return access_type_t::RO;
+        case 568:
+            return access_type_t::RO;
+        case 572:
+            return access_type_t::RO;
+        case 576:
+            return access_type_t::RO;
+        case 584:
+            return access_type_t::RO;
+        case 588:
+            return access_type_t::RO;
+        case 592:
+            return access_type_t::RO;
+        case 600:
+            return access_type_t::RO;
+        case 608:
+            return access_type_t::RO;
+        case 616:
+            return access_type_t::RO;
+        case 620:
+            return access_type_t::RO;
+        case 628:
+            return access_type_t::RO;
+        case 636:
+            return access_type_t::RO;
+        case 640:
+            return access_type_t::RO;
+        case 692:
+            return access_type_t::RO;
+        case 696:
+            return access_type_t::RO;
+        case 700:
+            return access_type_t::RO;
+        case 768:
+            return access_type_t::RW;
+        case 772:
+            return access_type_t::RW;
+        case 776:
+            return access_type_t::RW;
+        case 780:
+            return access_type_t::RW;
+        case 896:
+            return access_type_t::RW;
+        case 900:
+            return access_type_t::RW;
+        case 904:
+            return access_type_t::RW;
+        case 908:
+            return access_type_t::RW;
+        case 1024:
+            return access_type_t::RW;
+        case 1028:
+            return access_type_t::RW;
+        case 1032:
+            return access_type_t::RW;
+        case 1036:
+            return access_type_t::RW;
+        case 1040:
+            return access_type_t::RW;
+        case 1044:
+            return access_type_t::RW;
+        case 1048:
+            return access_type_t::RW;
+        case 1052:
+            return access_type_t::RW;
+        case 1056:
+            return access_type_t::RW;
+        case 1060:
+            return access_type_t::RW;
+        case 1064:
+            return access_type_t::RW;
+        case 1068:
+            return access_type_t::RW;
+        case 1072:
+            return access_type_t::RW;
+        case 1076:
+            return access_type_t::RW;
+        case 1080:
+            return access_type_t::RW;
+        case 1084:
+            return access_type_t::RW;
+        case 1088:
+            return access_type_t::RW;
+        case 1092:
+            return access_type_t::RW;
+        case 1096:
+            return access_type_t::RW;
+        case 1100:
+            return access_type_t::RW;
+        case 1104:
+            return access_type_t::RW;
+        case 1108:
+            return access_type_t::RW;
+        case 1112:
+            return access_type_t::RW;
+        case 1116:
+            return access_type_t::RW;
+        case 1120:
+            return access_type_t::RW;
+        case 1124:
+            return access_type_t::RW;
+        case 1128:
+            return access_type_t::RW;
+        case 1132:
+            return access_type_t::RW;
+        case 1136:
+            return access_type_t::RW;
+        case 1140:
+            return access_type_t::RW;
+        case 1144:
+            return access_type_t::RW;
+        case 1148:
+            return access_type_t::RW;
+        case 1152:
+            return access_type_t::RW;
+        case 1156:
+            return access_type_t::RW;
+        case 1160:
+            return access_type_t::RW;
+        case 1164:
+            return access_type_t::RW;
+        case 1168:
+            return access_type_t::RW;
+        case 1172:
+            return access_type_t::RW;
+        case 1176:
+            return access_type_t::RW;
+        case 1180:
+            return access_type_t::RW;
+        case 1184:
+            return access_type_t::RW;
+        case 1188:
+            return access_type_t::RW;
+        case 1192:
+            return access_type_t::RW;
+        case 1196:
+            return access_type_t::RW;
+        case 1200:
+            return access_type_t::RW;
+        case 1204:
+            return access_type_t::RW;
+        case 1208:
+            return access_type_t::RW;
+        case 1212:
+            return access_type_t::RW;
+        case 1216:
+            return access_type_t::RW;
+        case 1220:
+            return access_type_t::RW;
+        case 1224:
+            return access_type_t::RW;
+        case 1228:
+            return access_type_t::RW;
+        case 1232:
+            return access_type_t::RW;
+        case 1236:
+            return access_type_t::RW;
+        case 1240:
+            return access_type_t::RW;
+        case 1244:
+            return access_type_t::RW;
+        case 1248:
+            return access_type_t::RW;
+        case 1252:
+            return access_type_t::RW;
+        case 1256:
+            return access_type_t::RW;
+        case 1260:
+            return access_type_t::RW;
+        case 1264:
+            return access_type_t::RW;
+        case 1268:
+            return access_type_t::RW;
+        case 1272:
+            return access_type_t::RW;
+        case 1276:
+            return access_type_t::RW;
+        case 1280:
+            return access_type_t::RW;
+        case 1284:
+            return access_type_t::RW;
+        case 1288:
+            return access_type_t::RW;
+        case 1292:
+            return access_type_t::RW;
+        case 1296:
+            return access_type_t::RW;
+        case 1300:
+            return access_type_t::RW;
+        case 1304:
+            return access_type_t::RW;
+        case 1308:
+            return access_type_t::RW;
+        case 1312:
+            return access_type_t::RW;
+        case 1316:
+            return access_type_t::RW;
+        case 1320:
+            return access_type_t::RW;
+        case 1324:
+            return access_type_t::RW;
+        case 1328:
+            return access_type_t::RW;
+        case 1332:
+            return access_type_t::RW;
+        case 1336:
+            return access_type_t::RW;
+        case 1340:
+            return access_type_t::RW;
+        case 1344:
+            return access_type_t::RW;
+        case 1348:
+            return access_type_t::RW;
+        case 1352:
+            return access_type_t::RW;
+        case 1356:
+            return access_type_t::RW;
+        case 1360:
+            return access_type_t::RW;
+        case 1364:
+            return access_type_t::RW;
+        case 1368:
+            return access_type_t::RW;
+        case 1372:
+            return access_type_t::RW;
+        case 1376:
+            return access_type_t::RW;
+        case 1380:
+            return access_type_t::RW;
+        case 1384:
+            return access_type_t::RW;
+        case 1388:
+            return access_type_t::RW;
+        case 1392:
+            return access_type_t::RW;
+        case 1396:
+            return access_type_t::RW;
+        case 1400:
+            return access_type_t::RW;
+        case 1404:
+            return access_type_t::RW;
+        case 1408:
+            return access_type_t::RW;
+        case 1412:
+            return access_type_t::RW;
+        case 1416:
+            return access_type_t::RW;
+        case 1420:
+            return access_type_t::RW;
+        case 1424:
+            return access_type_t::RW;
+        case 1428:
+            return access_type_t::RW;
+        case 1432:
+            return access_type_t::RW;
+        case 1436:
+            return access_type_t::RW;
+        case 1440:
+            return access_type_t::RW;
+        case 1444:
+            return access_type_t::RW;
+        case 1448:
+            return access_type_t::RW;
+        case 1452:
+            return access_type_t::RW;
+        case 1456:
+            return access_type_t::RW;
+        case 1460:
+            return access_type_t::RW;
+        case 1464:
+            return access_type_t::RW;
+        case 1468:
+            return access_type_t::RW;
+        case 1472:
+            return access_type_t::RW;
+        case 1476:
+            return access_type_t::RW;
+        case 1480:
+            return access_type_t::RW;
+        case 1484:
+            return access_type_t::RW;
+        case 1488:
+            return access_type_t::RW;
+        case 1492:
+            return access_type_t::RW;
+        case 1496:
+            return access_type_t::RW;
+        case 1500:
+            return access_type_t::RW;
+        case 1504:
+            return access_type_t::RW;
+        case 1508:
+            return access_type_t::RW;
+        case 1512:
+            return access_type_t::RW;
+        case 1516:
+            return access_type_t::RW;
+        case 1520:
+            return access_type_t::RW;
+        case 1524:
+            return access_type_t::RW;
+        case 1528:
+            return access_type_t::RW;
+        case 1532:
+            return access_type_t::RW;
+        case 1536:
+            return access_type_t::RW;
+        case 1540:
+            return access_type_t::RW;
+        case 1544:
+            return access_type_t::RW;
+        case 1548:
+            return access_type_t::RW;
+        case 1552:
+            return access_type_t::RW;
+        case 1556:
+            return access_type_t::RW;
+        case 1560:
+            return access_type_t::RW;
+        case 1564:
+            return access_type_t::RW;
+        case 1568:
+            return access_type_t::RW;
+        case 1572:
+            return access_type_t::RW;
+        case 1576:
+            return access_type_t::RW;
+        case 1580:
+            return access_type_t::RW;
+        case 1584:
+            return access_type_t::RW;
+        case 1588:
+            return access_type_t::RW;
+        case 1592:
+            return access_type_t::RW;
+        case 1596:
+            return access_type_t::RW;
+        case 1600:
+            return access_type_t::RW;
+        case 1604:
+            return access_type_t::RW;
+        case 1608:
+            return access_type_t::RW;
+        case 1612:
+            return access_type_t::RW;
+        case 1616:
+            return access_type_t::RW;
+        case 1620:
+            return access_type_t::RW;
+        case 1624:
+            return access_type_t::RW;
+        case 1628:
+            return access_type_t::RW;
+        case 1632:
+            return access_type_t::RW;
+        case 1636:
+            return access_type_t::RW;
+        case 1640:
+            return access_type_t::RW;
+        case 1644:
+            return access_type_t::RW;
+        case 1648:
+            return access_type_t::RW;
+        case 1652:
+            return access_type_t::RW;
+        case 1656:
+            return access_type_t::RW;
+        case 1660:
+            return access_type_t::RW;
+        case 1664:
+            return access_type_t::RW;
+        case 1668:
+            return access_type_t::RW;
+        case 1672:
+            return access_type_t::RW;
+        case 1676:
+            return access_type_t::RW;
+        case 1680:
+            return access_type_t::RW;
+        case 1684:
+            return access_type_t::RW;
+        case 1688:
+            return access_type_t::RW;
+        case 1692:
+            return access_type_t::RW;
+        case 1696:
+            return access_type_t::RW;
+        case 1700:
+            return access_type_t::RW;
+        case 1704:
+            return access_type_t::RW;
+        case 1708:
+            return access_type_t::RW;
+        case 1712:
+            return access_type_t::RW;
+        case 1716:
+            return access_type_t::RW;
+        case 1720:
+            return access_type_t::RW;
+        case 1724:
+            return access_type_t::RW;
+        case 1728:
+            return access_type_t::RW;
+        case 1732:
+            return access_type_t::RW;
+        case 1736:
+            return access_type_t::RW;
+        case 1740:
+            return access_type_t::RW;
+        case 1744:
+            return access_type_t::RW;
+        case 1748:
+            return access_type_t::RW;
+        case 1752:
+            return access_type_t::RW;
+        case 1756:
+            return access_type_t::RW;
+        case 1760:
+            return access_type_t::RW;
+        case 1764:
+            return access_type_t::RW;
+        case 1768:
+            return access_type_t::RW;
+        case 1772:
+            return access_type_t::RW;
+        case 1776:
+            return access_type_t::RW;
+        case 1780:
+            return access_type_t::RW;
+        case 1784:
+            return access_type_t::RW;
+        case 1788:
+            return access_type_t::RW;
+        case 1792:
+            return access_type_t::RW;
+        case 1796:
+            return access_type_t::RW;
+        case 1800:
+            return access_type_t::RW;
+        case 1804:
+            return access_type_t::RW;
+        case 1808:
+            return access_type_t::RW;
+        case 1812:
+            return access_type_t::RW;
+        case 1816:
+            return access_type_t::RW;
+        case 1820:
+            return access_type_t::RW;
+        case 1824:
+            return access_type_t::RW;
+        case 1828:
+            return access_type_t::RW;
+        case 1832:
+            return access_type_t::RW;
+        case 1836:
+            return access_type_t::RW;
+        case 1840:
+            return access_type_t::RW;
+        case 1844:
+            return access_type_t::RW;
+        case 1848:
+            return access_type_t::RW;
+        case 1852:
+            return access_type_t::RW;
+        case 1856:
+            return access_type_t::RW;
+        case 1860:
+            return access_type_t::RW;
+        case 1864:
+            return access_type_t::RW;
+        case 1868:
+            return access_type_t::RW;
+        case 1872:
+            return access_type_t::RW;
+        case 1876:
+            return access_type_t::RW;
+        case 1880:
+            return access_type_t::RW;
+        case 1884:
+            return access_type_t::RW;
+        case 1888:
+            return access_type_t::RW;
+        case 1892:
+            return access_type_t::RW;
+        case 1896:
+            return access_type_t::RW;
+        case 1900:
+            return access_type_t::RW;
+        case 1904:
+            return access_type_t::RW;
+        case 1908:
+            return access_type_t::RW;
+        case 1912:
+            return access_type_t::RW;
+        case 1916:
+            return access_type_t::RW;
+        case 1920:
+            return access_type_t::RW;
+        case 1924:
+            return access_type_t::RW;
+        case 1928:
+            return access_type_t::RW;
+        case 1932:
+            return access_type_t::RW;
+        case 1936:
+            return access_type_t::RW;
+        case 1940:
+            return access_type_t::RW;
+        case 1944:
+            return access_type_t::RW;
+        case 1948:
+            return access_type_t::RW;
+        case 1952:
+            return access_type_t::RW;
+        case 1956:
+            return access_type_t::RW;
+        case 1960:
+            return access_type_t::RW;
+        case 1964:
+            return access_type_t::RW;
+        case 1968:
+            return access_type_t::RW;
+        case 1972:
+            return access_type_t::RW;
+        case 1976:
+            return access_type_t::RW;
+        case 1980:
+            return access_type_t::RW;
+        case 1984:
+            return access_type_t::RW;
+        case 1988:
+            return access_type_t::RW;
+        case 1992:
+            return access_type_t::RW;
+        case 1996:
+            return access_type_t::RW;
+        case 2000:
+            return access_type_t::RW;
+        case 2004:
+            return access_type_t::RW;
+        case 2008:
+            return access_type_t::RW;
+        case 2012:
+            return access_type_t::RW;
+        case 2016:
+            return access_type_t::RW;
+        case 2020:
+            return access_type_t::RW;
+        case 2024:
+            return access_type_t::RW;
+        case 2028:
+            return access_type_t::RW;
+        case 2032:
+            return access_type_t::RW;
+        case 2036:
+            return access_type_t::RW;
+        case 2040:
+            return access_type_t::RW;
+        case 2044:
+            return access_type_t::RW;
+        case 2048:
+            return access_type_t::RW;
+        case 2052:
+            return access_type_t::RW;
+        case 2056:
+            return access_type_t::RW;
+        case 2060:
+            return access_type_t::RW;
+        case 2064:
+            return access_type_t::RW;
+        case 2068:
+            return access_type_t::RW;
+        case 2076:
+            return access_type_t::RW;
+        case 2084:
+            return access_type_t::RW;
+        case 2088:
+            return access_type_t::RW;
+        case 2092:
+            return access_type_t::RW;
+        case 2096:
+            return access_type_t::RW;
+        case 2100:
+            return access_type_t::RW;
+        case 2108:
+            return access_type_t::RW;
+        case 2116:
+            return access_type_t::RW;
+        case 2120:
+            return access_type_t::RW;
+        case 2124:
+            return access_type_t::RW;
+        case 2128:
+            return access_type_t::RW;
+        case 2132:
+            return access_type_t::RW;
+        case 2136:
+            return access_type_t::RW;
+        case 2140:
+            return access_type_t::RW;
+        case 2144:
+            return access_type_t::RW;
+        case 2152:
+            return access_type_t::RW;
+        case 2156:
+            return access_type_t::RW;
+        case 2160:
+            return access_type_t::RW;
+        case 2172:
+            return access_type_t::RW;
+        case 2176:
+            return access_type_t::RW;
+        case 2180:
+            return access_type_t::RW;
+        case 2184:
+            return access_type_t::RW;
+        case 2188:
+            return access_type_t::RW;
+        case 2192:
+            return access_type_t::RW;
+        case 2196:
+            return access_type_t::RW;
+        case 2200:
+            return access_type_t::RW;
+        case 2204:
+            return access_type_t::RW;
+        case 2208:
+            return access_type_t::RW;
+        case 2212:
+            return access_type_t::RW;
+        case 2228:
+            return access_type_t::RW;
+        case 2236:
+            return access_type_t::RW;
+        case 2240:
+            return access_type_t::RW;
+        case 2244:
+            return access_type_t::RW;
+        case 2248:
+            return access_type_t::RW;
+        case 2252:
+            return access_type_t::RW;
+        case 2304:
+            return access_type_t::RW;
+        case 2308:
+            return access_type_t::RW;
+        case 2324:
+            return access_type_t::RW;
+        case 2340:
+            return access_type_t::RW;
+        case 2344:
+            return access_type_t::RW;
+        case 2348:
+            return access_type_t::RW;
+        case 2352:
+            return access_type_t::RW;
+        case 2356:
+            return access_type_t::RW;
+        case 2364:
+            return access_type_t::RW;
+        case 2560:
+            return access_type_t::RW;
+        case 2568:
+            return access_type_t::RW;
+        case 2576:
+            return access_type_t::RW;
+        case 2584:
+            return access_type_t::RW;
+        case 2592:
+            return access_type_t::RW;
+        case 2600:
+            return access_type_t::RW;
+        case 2608:
+            return access_type_t::RW;
+        case 2624:
+            return access_type_t::RW;
+        case 2632:
+            return access_type_t::RW;
+        case 2640:
+            return access_type_t::RW;
+        case 2648:
+            return access_type_t::RW;
+        case 2656:
+            return access_type_t::RW;
+        case 2664:
+            return access_type_t::RW;
+        case 2672:
+            return access_type_t::RW;
+        case 2688:
+            return access_type_t::RW;
+        case 2696:
+            return access_type_t::RW;
+        case 2704:
+            return access_type_t::RW;
+        case 2712:
+            return access_type_t::RW;
+        case 2720:
+            return access_type_t::RW;
+        case 2724:
+            return access_type_t::RW;
+        case 2728:
+            return access_type_t::RW;
+        case 2732:
+            return access_type_t::RW;
+        case 2736:
+            return access_type_t::RW;
+        case 2752:
+            return access_type_t::RW;
+        case 2760:
+            return access_type_t::RW;
+        case 2768:
+            return access_type_t::RW;
+        case 2776:
+            return access_type_t::RW;
+        case 2784:
+            return access_type_t::RW;
+        case 2816:
+            return access_type_t::RW;
+        case 2824:
+            return access_type_t::RW;
+        case 2832:
+            return access_type_t::RW;
+        case 2840:
+            return access_type_t::RW;
+        case 2848:
+            return access_type_t::RW;
+        case 2856:
+            return access_type_t::RW;
+        case 2864:
+            return access_type_t::RW;
+        case 2880:
+            return access_type_t::RW;
+        case 2888:
+            return access_type_t::RW;
+        case 2896:
+            return access_type_t::RW;
+        case 2904:
+            return access_type_t::RW;
+        case 4032:
+            return access_type_t::RO;
+        case 4048:
+            return access_type_t::RO;
+        case 4052:
+            return access_type_t::RO;
+        case 4056:
+            return access_type_t::RO;
+        case 4060:
+            return access_type_t::RO;
+        case 4064:
+            return access_type_t::RO;
+        case 4068:
+            return access_type_t::RO;
+        case 4072:
+            return access_type_t::RO;
+        case 4076:
+            return access_type_t::RO;
+        case 4080:
+            return access_type_t::RO;
+        case 4084:
+            return access_type_t::RO;
+        case 4088:
+            return access_type_t::RO;
+        case 4092:
+            return access_type_t::RO;
+        default:
+            return access_type_t::RO;
+        }
+    }
+#endif
+};
+
+#ifdef __cplusplus
+struct isa
+{
+#ifdef NPU_DISASSEMBLE
+    static int disassemble(const uint32_t *in,
+                           std::string &op,
+                           std::vector<std::pair<std::string, std::string>> &fields)
+    {
+        switch (*in & 0xffff)
+        {
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_STOP):
+        {
+            const npu_op_stop_t &v = *reinterpret_cast<const npu_op_stop_t *>(in);
+            op                     = "NPU_OP_STOP";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_IRQ):
+        {
+            const npu_op_irq_t &v = *reinterpret_cast<const npu_op_irq_t *>(in);
+            op                    = "NPU_OP_IRQ";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_CONV):
+        {
+            const npu_op_conv_t &v = *reinterpret_cast<const npu_op_conv_t *>(in);
+            op                     = "NPU_OP_CONV";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_DEPTHWISE):
+        {
+            const npu_op_depthwise_t &v = *reinterpret_cast<const npu_op_depthwise_t *>(in);
+            op                          = "NPU_OP_DEPTHWISE";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_POOL):
+        {
+            const npu_op_pool_t &v = *reinterpret_cast<const npu_op_pool_t *>(in);
+            op                     = "NPU_OP_POOL";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_ELEMENTWISE):
+        {
+            const npu_op_elementwise_t &v = *reinterpret_cast<const npu_op_elementwise_t *>(in);
+            op                            = "NPU_OP_ELEMENTWISE";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_DMA_START):
+        {
+            const npu_op_dma_start_t &v = *reinterpret_cast<const npu_op_dma_start_t *>(in);
+            op                          = "NPU_OP_DMA_START";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_DMA_WAIT):
+        {
+            const npu_op_dma_wait_t &v = *reinterpret_cast<const npu_op_dma_wait_t *>(in);
+            op                         = "NPU_OP_DMA_WAIT";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_KERNEL_WAIT):
+        {
+            const npu_op_kernel_wait_t &v = *reinterpret_cast<const npu_op_kernel_wait_t *>(in);
+            op                            = "NPU_OP_KERNEL_WAIT";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_PMU_MASK):
+        {
+            const npu_op_pmu_mask_t &v = *reinterpret_cast<const npu_op_pmu_mask_t *>(in);
+            op                         = "NPU_OP_PMU_MASK";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_PAD_TOP):
+        {
+            const npu_set_ifm_pad_top_t &v = *reinterpret_cast<const npu_set_ifm_pad_top_t *>(in);
+            op                             = "NPU_SET_IFM_PAD_TOP";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_PAD_LEFT):
+        {
+            const npu_set_ifm_pad_left_t &v = *reinterpret_cast<const npu_set_ifm_pad_left_t *>(in);
+            op                              = "NPU_SET_IFM_PAD_LEFT";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_PAD_RIGHT):
+        {
+            const npu_set_ifm_pad_right_t &v = *reinterpret_cast<const npu_set_ifm_pad_right_t *>(in);
+            op                               = "NPU_SET_IFM_PAD_RIGHT";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_PAD_BOTTOM):
+        {
+            const npu_set_ifm_pad_bottom_t &v = *reinterpret_cast<const npu_set_ifm_pad_bottom_t *>(in);
+            op                                = "NPU_SET_IFM_PAD_BOTTOM";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_DEPTH_M1):
+        {
+            const npu_set_ifm_depth_m1_t &v = *reinterpret_cast<const npu_set_ifm_depth_m1_t *>(in);
+            op                              = "NPU_SET_IFM_DEPTH_M1";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_PRECISION):
+        {
+            const npu_set_ifm_precision_t &v = *reinterpret_cast<const npu_set_ifm_precision_t *>(in);
+            op                               = "NPU_SET_IFM_PRECISION";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_UPSCALE):
+        {
+            const npu_set_ifm_upscale_t &v = *reinterpret_cast<const npu_set_ifm_upscale_t *>(in);
+            op                             = "NPU_SET_IFM_UPSCALE";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_ZERO_POINT):
+        {
+            const npu_set_ifm_zero_point_t &v = *reinterpret_cast<const npu_set_ifm_zero_point_t *>(in);
+            op                                = "NPU_SET_IFM_ZERO_POINT";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_WIDTH0_M1):
+        {
+            const npu_set_ifm_width0_m1_t &v = *reinterpret_cast<const npu_set_ifm_width0_m1_t *>(in);
+            op                               = "NPU_SET_IFM_WIDTH0_M1";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_HEIGHT0_M1):
+        {
+            const npu_set_ifm_height0_m1_t &v = *reinterpret_cast<const npu_set_ifm_height0_m1_t *>(in);
+            op                                = "NPU_SET_IFM_HEIGHT0_M1";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_HEIGHT1_M1):
+        {
+            const npu_set_ifm_height1_m1_t &v = *reinterpret_cast<const npu_set_ifm_height1_m1_t *>(in);
+            op                                = "NPU_SET_IFM_HEIGHT1_M1";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_IB_END):
+        {
+            const npu_set_ifm_ib_end_t &v = *reinterpret_cast<const npu_set_ifm_ib_end_t *>(in);
+            op                            = "NPU_SET_IFM_IB_END";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_REGION):
+        {
+            const npu_set_ifm_region_t &v = *reinterpret_cast<const npu_set_ifm_region_t *>(in);
+            op                            = "NPU_SET_IFM_REGION";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_WIDTH_M1):
+        {
+            const npu_set_ofm_width_m1_t &v = *reinterpret_cast<const npu_set_ofm_width_m1_t *>(in);
+            op                              = "NPU_SET_OFM_WIDTH_M1";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_HEIGHT_M1):
+        {
+            const npu_set_ofm_height_m1_t &v = *reinterpret_cast<const npu_set_ofm_height_m1_t *>(in);
+            op                               = "NPU_SET_OFM_HEIGHT_M1";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_DEPTH_M1):
+        {
+            const npu_set_ofm_depth_m1_t &v = *reinterpret_cast<const npu_set_ofm_depth_m1_t *>(in);
+            op                              = "NPU_SET_OFM_DEPTH_M1";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_PRECISION):
+        {
+            const npu_set_ofm_precision_t &v = *reinterpret_cast<const npu_set_ofm_precision_t *>(in);
+            op                               = "NPU_SET_OFM_PRECISION";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_BLK_WIDTH_M1):
+        {
+            const npu_set_ofm_blk_width_m1_t &v = *reinterpret_cast<const npu_set_ofm_blk_width_m1_t *>(in);
+            op                                  = "NPU_SET_OFM_BLK_WIDTH_M1";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_BLK_HEIGHT_M1):
+        {
+            const npu_set_ofm_blk_height_m1_t &v = *reinterpret_cast<const npu_set_ofm_blk_height_m1_t *>(in);
+            op                                   = "NPU_SET_OFM_BLK_HEIGHT_M1";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_BLK_DEPTH_M1):
+        {
+            const npu_set_ofm_blk_depth_m1_t &v = *reinterpret_cast<const npu_set_ofm_blk_depth_m1_t *>(in);
+            op                                  = "NPU_SET_OFM_BLK_DEPTH_M1";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_ZERO_POINT):
+        {
+            const npu_set_ofm_zero_point_t &v = *reinterpret_cast<const npu_set_ofm_zero_point_t *>(in);
+            op                                = "NPU_SET_OFM_ZERO_POINT";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_WIDTH0_M1):
+        {
+            const npu_set_ofm_width0_m1_t &v = *reinterpret_cast<const npu_set_ofm_width0_m1_t *>(in);
+            op                               = "NPU_SET_OFM_WIDTH0_M1";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_HEIGHT0_M1):
+        {
+            const npu_set_ofm_height0_m1_t &v = *reinterpret_cast<const npu_set_ofm_height0_m1_t *>(in);
+            op                                = "NPU_SET_OFM_HEIGHT0_M1";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_HEIGHT1_M1):
+        {
+            const npu_set_ofm_height1_m1_t &v = *reinterpret_cast<const npu_set_ofm_height1_m1_t *>(in);
+            op                                = "NPU_SET_OFM_HEIGHT1_M1";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_REGION):
+        {
+            const npu_set_ofm_region_t &v = *reinterpret_cast<const npu_set_ofm_region_t *>(in);
+            op                            = "NPU_SET_OFM_REGION";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_KERNEL_WIDTH_M1):
+        {
+            const npu_set_kernel_width_m1_t &v = *reinterpret_cast<const npu_set_kernel_width_m1_t *>(in);
+            op                                 = "NPU_SET_KERNEL_WIDTH_M1";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_KERNEL_HEIGHT_M1):
+        {
+            const npu_set_kernel_height_m1_t &v = *reinterpret_cast<const npu_set_kernel_height_m1_t *>(in);
+            op                                  = "NPU_SET_KERNEL_HEIGHT_M1";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_KERNEL_STRIDE):
+        {
+            const npu_set_kernel_stride_t &v = *reinterpret_cast<const npu_set_kernel_stride_t *>(in);
+            op                               = "NPU_SET_KERNEL_STRIDE";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_PARALLEL_MODE):
+        {
+            const npu_set_parallel_mode_t &v = *reinterpret_cast<const npu_set_parallel_mode_t *>(in);
+            op                               = "NPU_SET_PARALLEL_MODE";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_ACC_FORMAT):
+        {
+            const npu_set_acc_format_t &v = *reinterpret_cast<const npu_set_acc_format_t *>(in);
+            op                            = "NPU_SET_ACC_FORMAT";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_ACTIVATION):
+        {
+            const npu_set_activation_t &v = *reinterpret_cast<const npu_set_activation_t *>(in);
+            op                            = "NPU_SET_ACTIVATION";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_ACTIVATION_MIN):
+        {
+            const npu_set_activation_min_t &v = *reinterpret_cast<const npu_set_activation_min_t *>(in);
+            op                                = "NPU_SET_ACTIVATION_MIN";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_ACTIVATION_MAX):
+        {
+            const npu_set_activation_max_t &v = *reinterpret_cast<const npu_set_activation_max_t *>(in);
+            op                                = "NPU_SET_ACTIVATION_MAX";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_WEIGHT_REGION):
+        {
+            const npu_set_weight_region_t &v = *reinterpret_cast<const npu_set_weight_region_t *>(in);
+            op                               = "NPU_SET_WEIGHT_REGION";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_SCALE_REGION):
+        {
+            const npu_set_scale_region_t &v = *reinterpret_cast<const npu_set_scale_region_t *>(in);
+            op                              = "NPU_SET_SCALE_REGION";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_AB_START):
+        {
+            const npu_set_ab_start_t &v = *reinterpret_cast<const npu_set_ab_start_t *>(in);
+            op                          = "NPU_SET_AB_START";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_BLOCKDEP):
+        {
+            const npu_set_blockdep_t &v = *reinterpret_cast<const npu_set_blockdep_t *>(in);
+            op                          = "NPU_SET_BLOCKDEP";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_DMA0_SRC_REGION):
+        {
+            const npu_set_dma0_src_region_t &v = *reinterpret_cast<const npu_set_dma0_src_region_t *>(in);
+            op                                 = "NPU_SET_DMA0_SRC_REGION";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_DMA0_DST_REGION):
+        {
+            const npu_set_dma0_dst_region_t &v = *reinterpret_cast<const npu_set_dma0_dst_region_t *>(in);
+            op                                 = "NPU_SET_DMA0_DST_REGION";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_DMA0_SIZE0):
+        {
+            const npu_set_dma0_size0_t &v = *reinterpret_cast<const npu_set_dma0_size0_t *>(in);
+            op                            = "NPU_SET_DMA0_SIZE0";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_DMA0_SIZE1):
+        {
+            const npu_set_dma0_size1_t &v = *reinterpret_cast<const npu_set_dma0_size1_t *>(in);
+            op                            = "NPU_SET_DMA0_SIZE1";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_BROADCAST):
+        {
+            const npu_set_ifm2_broadcast_t &v = *reinterpret_cast<const npu_set_ifm2_broadcast_t *>(in);
+            op                                = "NPU_SET_IFM2_BROADCAST";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_SCALAR):
+        {
+            const npu_set_ifm2_scalar_t &v = *reinterpret_cast<const npu_set_ifm2_scalar_t *>(in);
+            op                             = "NPU_SET_IFM2_SCALAR";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_PRECISION):
+        {
+            const npu_set_ifm2_precision_t &v = *reinterpret_cast<const npu_set_ifm2_precision_t *>(in);
+            op                                = "NPU_SET_IFM2_PRECISION";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_ZERO_POINT):
+        {
+            const npu_set_ifm2_zero_point_t &v = *reinterpret_cast<const npu_set_ifm2_zero_point_t *>(in);
+            op                                 = "NPU_SET_IFM2_ZERO_POINT";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_WIDTH0_M1):
+        {
+            const npu_set_ifm2_width0_m1_t &v = *reinterpret_cast<const npu_set_ifm2_width0_m1_t *>(in);
+            op                                = "NPU_SET_IFM2_WIDTH0_M1";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_HEIGHT0_M1):
+        {
+            const npu_set_ifm2_height0_m1_t &v = *reinterpret_cast<const npu_set_ifm2_height0_m1_t *>(in);
+            op                                 = "NPU_SET_IFM2_HEIGHT0_M1";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_HEIGHT1_M1):
+        {
+            const npu_set_ifm2_height1_m1_t &v = *reinterpret_cast<const npu_set_ifm2_height1_m1_t *>(in);
+            op                                 = "NPU_SET_IFM2_HEIGHT1_M1";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_IB_START):
+        {
+            const npu_set_ifm2_ib_start_t &v = *reinterpret_cast<const npu_set_ifm2_ib_start_t *>(in);
+            op                               = "NPU_SET_IFM2_IB_START";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_REGION):
+        {
+            const npu_set_ifm2_region_t &v = *reinterpret_cast<const npu_set_ifm2_region_t *>(in);
+            op                             = "NPU_SET_IFM2_REGION";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_BASE0):
+        {
+            const npu_set_ifm_base0_t &v = *reinterpret_cast<const npu_set_ifm_base0_t *>(in);
+            op                           = "NPU_SET_IFM_BASE0";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_BASE1):
+        {
+            const npu_set_ifm_base1_t &v = *reinterpret_cast<const npu_set_ifm_base1_t *>(in);
+            op                           = "NPU_SET_IFM_BASE1";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_BASE2):
+        {
+            const npu_set_ifm_base2_t &v = *reinterpret_cast<const npu_set_ifm_base2_t *>(in);
+            op                           = "NPU_SET_IFM_BASE2";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_BASE3):
+        {
+            const npu_set_ifm_base3_t &v = *reinterpret_cast<const npu_set_ifm_base3_t *>(in);
+            op                           = "NPU_SET_IFM_BASE3";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_STRIDE_X):
+        {
+            const npu_set_ifm_stride_x_t &v = *reinterpret_cast<const npu_set_ifm_stride_x_t *>(in);
+            op                              = "NPU_SET_IFM_STRIDE_X";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_STRIDE_Y):
+        {
+            const npu_set_ifm_stride_y_t &v = *reinterpret_cast<const npu_set_ifm_stride_y_t *>(in);
+            op                              = "NPU_SET_IFM_STRIDE_Y";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_STRIDE_C):
+        {
+            const npu_set_ifm_stride_c_t &v = *reinterpret_cast<const npu_set_ifm_stride_c_t *>(in);
+            op                              = "NPU_SET_IFM_STRIDE_C";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_BASE0):
+        {
+            const npu_set_ofm_base0_t &v = *reinterpret_cast<const npu_set_ofm_base0_t *>(in);
+            op                           = "NPU_SET_OFM_BASE0";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_BASE1):
+        {
+            const npu_set_ofm_base1_t &v = *reinterpret_cast<const npu_set_ofm_base1_t *>(in);
+            op                           = "NPU_SET_OFM_BASE1";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_BASE2):
+        {
+            const npu_set_ofm_base2_t &v = *reinterpret_cast<const npu_set_ofm_base2_t *>(in);
+            op                           = "NPU_SET_OFM_BASE2";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_BASE3):
+        {
+            const npu_set_ofm_base3_t &v = *reinterpret_cast<const npu_set_ofm_base3_t *>(in);
+            op                           = "NPU_SET_OFM_BASE3";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_STRIDE_X):
+        {
+            const npu_set_ofm_stride_x_t &v = *reinterpret_cast<const npu_set_ofm_stride_x_t *>(in);
+            op                              = "NPU_SET_OFM_STRIDE_X";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_STRIDE_Y):
+        {
+            const npu_set_ofm_stride_y_t &v = *reinterpret_cast<const npu_set_ofm_stride_y_t *>(in);
+            op                              = "NPU_SET_OFM_STRIDE_Y";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_STRIDE_C):
+        {
+            const npu_set_ofm_stride_c_t &v = *reinterpret_cast<const npu_set_ofm_stride_c_t *>(in);
+            op                              = "NPU_SET_OFM_STRIDE_C";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_WEIGHT_BASE):
+        {
+            const npu_set_weight_base_t &v = *reinterpret_cast<const npu_set_weight_base_t *>(in);
+            op                             = "NPU_SET_WEIGHT_BASE";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_WEIGHT_LENGTH):
+        {
+            const npu_set_weight_length_t &v = *reinterpret_cast<const npu_set_weight_length_t *>(in);
+            op                               = "NPU_SET_WEIGHT_LENGTH";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_SCALE_BASE):
+        {
+            const npu_set_scale_base_t &v = *reinterpret_cast<const npu_set_scale_base_t *>(in);
+            op                            = "NPU_SET_SCALE_BASE";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_SCALE_LENGTH):
+        {
+            const npu_set_scale_length_t &v = *reinterpret_cast<const npu_set_scale_length_t *>(in);
+            op                              = "NPU_SET_SCALE_LENGTH";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_SCALE):
+        {
+            const npu_set_ofm_scale_t &v = *reinterpret_cast<const npu_set_ofm_scale_t *>(in);
+            op                           = "NPU_SET_OFM_SCALE";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OPA_SCALE):
+        {
+            const npu_set_opa_scale_t &v = *reinterpret_cast<const npu_set_opa_scale_t *>(in);
+            op                           = "NPU_SET_OPA_SCALE";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OPB_SCALE):
+        {
+            const npu_set_opb_scale_t &v = *reinterpret_cast<const npu_set_opb_scale_t *>(in);
+            op                           = "NPU_SET_OPB_SCALE";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_DMA0_SRC):
+        {
+            const npu_set_dma0_src_t &v = *reinterpret_cast<const npu_set_dma0_src_t *>(in);
+            op                          = "NPU_SET_DMA0_SRC";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_DMA0_DST):
+        {
+            const npu_set_dma0_dst_t &v = *reinterpret_cast<const npu_set_dma0_dst_t *>(in);
+            op                          = "NPU_SET_DMA0_DST";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_DMA0_LEN):
+        {
+            const npu_set_dma0_len_t &v = *reinterpret_cast<const npu_set_dma0_len_t *>(in);
+            op                          = "NPU_SET_DMA0_LEN";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_DMA0_SKIP0):
+        {
+            const npu_set_dma0_skip0_t &v = *reinterpret_cast<const npu_set_dma0_skip0_t *>(in);
+            op                            = "NPU_SET_DMA0_SKIP0";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_DMA0_SKIP1):
+        {
+            const npu_set_dma0_skip1_t &v = *reinterpret_cast<const npu_set_dma0_skip1_t *>(in);
+            op                            = "NPU_SET_DMA0_SKIP1";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_BASE0):
+        {
+            const npu_set_ifm2_base0_t &v = *reinterpret_cast<const npu_set_ifm2_base0_t *>(in);
+            op                            = "NPU_SET_IFM2_BASE0";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_BASE1):
+        {
+            const npu_set_ifm2_base1_t &v = *reinterpret_cast<const npu_set_ifm2_base1_t *>(in);
+            op                            = "NPU_SET_IFM2_BASE1";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_BASE2):
+        {
+            const npu_set_ifm2_base2_t &v = *reinterpret_cast<const npu_set_ifm2_base2_t *>(in);
+            op                            = "NPU_SET_IFM2_BASE2";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_BASE3):
+        {
+            const npu_set_ifm2_base3_t &v = *reinterpret_cast<const npu_set_ifm2_base3_t *>(in);
+            op                            = "NPU_SET_IFM2_BASE3";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_STRIDE_X):
+        {
+            const npu_set_ifm2_stride_x_t &v = *reinterpret_cast<const npu_set_ifm2_stride_x_t *>(in);
+            op                               = "NPU_SET_IFM2_STRIDE_X";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_STRIDE_Y):
+        {
+            const npu_set_ifm2_stride_y_t &v = *reinterpret_cast<const npu_set_ifm2_stride_y_t *>(in);
+            op                               = "NPU_SET_IFM2_STRIDE_Y";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_STRIDE_C):
+        {
+            const npu_set_ifm2_stride_c_t &v = *reinterpret_cast<const npu_set_ifm2_stride_c_t *>(in);
+            op                               = "NPU_SET_IFM2_STRIDE_C";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_WEIGHT1_BASE):
+        {
+            const npu_set_weight1_base_t &v = *reinterpret_cast<const npu_set_weight1_base_t *>(in);
+            op                              = "NPU_SET_WEIGHT1_BASE";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_WEIGHT1_LENGTH):
+        {
+            const npu_set_weight1_length_t &v = *reinterpret_cast<const npu_set_weight1_length_t *>(in);
+            op                                = "NPU_SET_WEIGHT1_LENGTH";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_SCALE1_BASE):
+        {
+            const npu_set_scale1_base_t &v = *reinterpret_cast<const npu_set_scale1_base_t *>(in);
+            op                             = "NPU_SET_SCALE1_BASE";
+            v.disassemble(fields);
+            break;
+        }
+        case (static_cast<uint32_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL) << 14) |
+            static_cast<uint32_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_SCALE1_LENGTH):
+        {
+            const npu_set_scale1_length_t &v = *reinterpret_cast<const npu_set_scale1_length_t *>(in);
+            op                               = "NPU_SET_SCALE1_LENGTH";
+            v.disassemble(fields);
+            break;
+        }
+        }
+        return (*in & (3 << 14)) != 0 ? 2 : 1;
+    }
+#endif
+#endif
+    // Signal the end of command stream
+    struct npu_op_stop_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t mask : 16;   //  Encoding for 16-bit mask value
+#ifdef __cplusplus
+      public:
+        npu_op_stop_t(uint32_t _mask) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_STOP)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            mask(static_cast<uint16_t>(_mask) & ((1U << 16) - 1))
+        {
+        }
+        CONSTEXPR npu_op_stop_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_STOP)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), mask(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_STOP) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_STOP);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_op_stop_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_op_stop_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_mask() const
+        {
+            return static_cast<uint32_t>(mask);
+        }
+        CONSTEXPR npu_op_stop_t &set_mask(uint32_t value)
+        {
+            mask = static_cast<uint16_t>(value) & ((1U << 16) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("mask", std::to_string(mask)));
+        }
+#endif
+#endif
+    };
+    // Raises an IRQ to the host
+    struct npu_op_irq_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t mask : 16;   //  Encoding for 16-bit mask value
+#ifdef __cplusplus
+      public:
+        npu_op_irq_t(uint32_t _mask) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_IRQ)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            mask(static_cast<uint16_t>(_mask) & ((1U << 16) - 1))
+        {
+        }
+        CONSTEXPR npu_op_irq_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_IRQ)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), mask(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_IRQ) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_IRQ);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_op_irq_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_op_irq_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_mask() const
+        {
+            return static_cast<uint32_t>(mask);
+        }
+        CONSTEXPR npu_op_irq_t &set_mask(uint32_t value)
+        {
+            mask = static_cast<uint16_t>(value) & ((1U << 16) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("mask", std::to_string(mask)));
+        }
+#endif
+#endif
+    };
+    // 2D convolution
+    struct npu_op_conv_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t reserved1 : 16;
+#ifdef __cplusplus
+      public:
+        CONSTEXPR npu_op_conv_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_CONV)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), reserved1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_CONV) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_CONV);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_op_conv_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_op_conv_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const {}
+#endif
+#endif
+    };
+    // Depth-wise 2D convolution
+    struct npu_op_depthwise_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t reserved1 : 16;
+#ifdef __cplusplus
+      public:
+        CONSTEXPR npu_op_depthwise_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_DEPTHWISE)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), reserved1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_DEPTHWISE) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_DEPTHWISE);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_op_depthwise_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_op_depthwise_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const {}
+#endif
+#endif
+    };
+    // Pooling
+    struct npu_op_pool_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;      //  control
+        uint32_t pooling_mode : 3; //  Pooling mode
+        uint32_t reserved1 : 13;
+#ifdef __cplusplus
+      public:
+        npu_op_pool_t(NPU_NAMESPACE::pooling_mode _pooling_mode) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_POOL)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            pooling_mode(static_cast<uint8_t>(_pooling_mode) & ((1U << 3) - 1)), reserved1(0)
+        {
+        }
+        CONSTEXPR npu_op_pool_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_POOL)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), pooling_mode(0), reserved1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_POOL) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_POOL);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_op_pool_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_op_pool_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::pooling_mode get_pooling_mode() const
+        {
+            return static_cast<NPU_NAMESPACE::pooling_mode>(pooling_mode);
+        }
+        CONSTEXPR npu_op_pool_t &set_pooling_mode(NPU_NAMESPACE::pooling_mode value)
+        {
+            pooling_mode = static_cast<uint8_t>(value) & ((1U << 3) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "pooling_mode",
+                (pooling_mode < (sizeof(pooling_mode_str) / sizeof(pooling_mode_str[0])) ?
+                     pooling_mode_str[pooling_mode] :
+                     "****")));
+        }
+#endif
+#endif
+    };
+    // Elementwise operation
+    struct npu_op_elementwise_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;          //  control
+        uint32_t elementwise_mode : 6; //  Elementwise mode
+        uint32_t reserved1 : 10;
+#ifdef __cplusplus
+      public:
+        npu_op_elementwise_t(NPU_NAMESPACE::elementwise_mode _elementwise_mode) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_ELEMENTWISE)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            elementwise_mode(static_cast<uint8_t>(_elementwise_mode) & ((1U << 6) - 1)), reserved1(0)
+        {
+        }
+        CONSTEXPR npu_op_elementwise_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_ELEMENTWISE)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), elementwise_mode(0), reserved1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_ELEMENTWISE) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_ELEMENTWISE);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_op_elementwise_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_op_elementwise_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::elementwise_mode get_elementwise_mode() const
+        {
+            return static_cast<NPU_NAMESPACE::elementwise_mode>(elementwise_mode);
+        }
+        CONSTEXPR npu_op_elementwise_t &set_elementwise_mode(NPU_NAMESPACE::elementwise_mode value)
+        {
+            elementwise_mode = static_cast<uint8_t>(value) & ((1U << 6) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "elementwise_mode",
+                (elementwise_mode < (sizeof(elementwise_mode_str) / sizeof(elementwise_mode_str[0])) ?
+                     elementwise_mode_str[elementwise_mode] :
+                     "****")));
+        }
+#endif
+#endif
+    };
+    // Queue new DMA for the given channel
+    struct npu_op_dma_start_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t reserved1 : 16;
+#ifdef __cplusplus
+      public:
+        CONSTEXPR npu_op_dma_start_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_DMA_START)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), reserved1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_DMA_START) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_DMA_START);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_op_dma_start_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_op_dma_start_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const {}
+#endif
+#endif
+    };
+    // Wait for the DMA channel to have k or fewer active descriptors outstanding
+    struct npu_op_dma_wait_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t k : 4;       //  Number of outstanding descriptors
+        uint32_t reserved1 : 12;
+#ifdef __cplusplus
+      public:
+        npu_op_dma_wait_t(uint32_t _k) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_DMA_WAIT)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            k(static_cast<uint8_t>(_k) & ((1U << 4) - 1)), reserved1(0)
+        {
+        }
+        CONSTEXPR npu_op_dma_wait_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_DMA_WAIT)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), k(0), reserved1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_DMA_WAIT) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_DMA_WAIT);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_op_dma_wait_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_op_dma_wait_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_k() const
+        {
+            return static_cast<uint32_t>(k);
+        }
+        CONSTEXPR npu_op_dma_wait_t &set_k(uint32_t value)
+        {
+            k = static_cast<uint8_t>(value) & ((1U << 4) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("k", std::to_string(k)));
+        }
+#endif
+#endif
+    };
+    // Wait for n or fewer kernel operations to be remaining
+    struct npu_op_kernel_wait_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t n : 2;       //  Number of kernel operations in range 0-3
+        uint32_t reserved1 : 14;
+#ifdef __cplusplus
+      public:
+        npu_op_kernel_wait_t(uint32_t _n) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_KERNEL_WAIT)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            n(static_cast<uint8_t>(_n) & ((1U << 2) - 1)), reserved1(0)
+        {
+        }
+        CONSTEXPR npu_op_kernel_wait_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_KERNEL_WAIT)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), n(0), reserved1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_KERNEL_WAIT) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_KERNEL_WAIT);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_op_kernel_wait_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_op_kernel_wait_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_n() const
+        {
+            return static_cast<uint32_t>(n);
+        }
+        CONSTEXPR npu_op_kernel_wait_t &set_n(uint32_t value)
+        {
+            n = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("n", std::to_string(n)));
+        }
+#endif
+#endif
+    };
+    // Enable or disable PMU counting (debug feature only)
+    struct npu_op_pmu_mask_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t enable : 1;  //  Enable or disable PMU mask
+        uint32_t reserved1 : 15;
+#ifdef __cplusplus
+      public:
+        npu_op_pmu_mask_t(uint32_t _enable) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_PMU_MASK)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            enable(static_cast<uint8_t>(_enable) & ((1U << 1) - 1)), reserved1(0)
+        {
+        }
+        CONSTEXPR npu_op_pmu_mask_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_PMU_MASK)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), enable(0), reserved1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_PMU_MASK) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_OP_PMU_MASK);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_op_pmu_mask_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_op_pmu_mask_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_enable() const
+        {
+            return static_cast<uint32_t>(enable);
+        }
+        CONSTEXPR npu_op_pmu_mask_t &set_enable(uint32_t value)
+        {
+            enable = static_cast<uint8_t>(value) & ((1U << 1) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("enable", std::to_string(enable)));
+        }
+#endif
+#endif
+    };
+    // IFM top pad
+    struct npu_set_ifm_pad_top_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t pad : 7;     //  IFM top pad
+        uint32_t reserved1 : 9;
+#ifdef __cplusplus
+      public:
+        npu_set_ifm_pad_top_t(uint32_t _pad) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_PAD_TOP)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            pad(static_cast<uint8_t>(_pad) & ((1U << 7) - 1)), reserved1(0)
+        {
+        }
+        CONSTEXPR npu_set_ifm_pad_top_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_PAD_TOP)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), pad(0), reserved1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_PAD_TOP) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_PAD_TOP);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ifm_pad_top_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ifm_pad_top_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_pad() const
+        {
+            return static_cast<uint32_t>(pad);
+        }
+        CONSTEXPR npu_set_ifm_pad_top_t &set_pad(uint32_t value)
+        {
+            pad = static_cast<uint8_t>(value) & ((1U << 7) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("pad", std::to_string(pad)));
+        }
+#endif
+#endif
+    };
+    // IFM left pad
+    struct npu_set_ifm_pad_left_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t pad : 7;     //  IFM left pad
+        uint32_t reserved1 : 9;
+#ifdef __cplusplus
+      public:
+        npu_set_ifm_pad_left_t(uint32_t _pad) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_PAD_LEFT)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            pad(static_cast<uint8_t>(_pad) & ((1U << 7) - 1)), reserved1(0)
+        {
+        }
+        CONSTEXPR npu_set_ifm_pad_left_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_PAD_LEFT)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), pad(0), reserved1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_PAD_LEFT) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_PAD_LEFT);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ifm_pad_left_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ifm_pad_left_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_pad() const
+        {
+            return static_cast<uint32_t>(pad);
+        }
+        CONSTEXPR npu_set_ifm_pad_left_t &set_pad(uint32_t value)
+        {
+            pad = static_cast<uint8_t>(value) & ((1U << 7) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("pad", std::to_string(pad)));
+        }
+#endif
+#endif
+    };
+    // IFM right pad
+    struct npu_set_ifm_pad_right_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t pad : 8;     //  IFM right pad. Max value is 128
+        uint32_t reserved1 : 8;
+#ifdef __cplusplus
+      public:
+        npu_set_ifm_pad_right_t(uint32_t _pad) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_PAD_RIGHT)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            pad(static_cast<uint8_t>(_pad) & ((1U << 8) - 1)), reserved1(0)
+        {
+        }
+        CONSTEXPR npu_set_ifm_pad_right_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_PAD_RIGHT)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), pad(0), reserved1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_PAD_RIGHT) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_PAD_RIGHT);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ifm_pad_right_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ifm_pad_right_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_pad() const
+        {
+            return static_cast<uint32_t>(pad);
+        }
+        CONSTEXPR npu_set_ifm_pad_right_t &set_pad(uint32_t value)
+        {
+            pad = static_cast<uint8_t>(value) & ((1U << 8) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("pad", std::to_string(pad)));
+        }
+#endif
+#endif
+    };
+    // IFM bottom pad
+    struct npu_set_ifm_pad_bottom_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t pad : 8;     //  IFM bottom pad. Max value is 128
+        uint32_t reserved1 : 8;
+#ifdef __cplusplus
+      public:
+        npu_set_ifm_pad_bottom_t(uint32_t _pad) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_PAD_BOTTOM)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            pad(static_cast<uint8_t>(_pad) & ((1U << 8) - 1)), reserved1(0)
+        {
+        }
+        CONSTEXPR npu_set_ifm_pad_bottom_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_PAD_BOTTOM)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), pad(0), reserved1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_PAD_BOTTOM) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_PAD_BOTTOM);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ifm_pad_bottom_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ifm_pad_bottom_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_pad() const
+        {
+            return static_cast<uint32_t>(pad);
+        }
+        CONSTEXPR npu_set_ifm_pad_bottom_t &set_pad(uint32_t value)
+        {
+            pad = static_cast<uint8_t>(value) & ((1U << 8) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("pad", std::to_string(pad)));
+        }
+#endif
+#endif
+    };
+    // Number of input channels for convolution
+    struct npu_set_ifm_depth_m1_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;   //  control
+        uint32_t depth_m1 : 16; //  Number of input channels for convolution
+#ifdef __cplusplus
+      public:
+        npu_set_ifm_depth_m1_t(uint32_t _depth_m1) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_DEPTH_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            depth_m1(static_cast<uint16_t>(_depth_m1) & ((1U << 16) - 1))
+        {
+        }
+        CONSTEXPR npu_set_ifm_depth_m1_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_DEPTH_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), depth_m1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_DEPTH_M1) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_DEPTH_M1);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ifm_depth_m1_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ifm_depth_m1_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_depth_m1() const
+        {
+            return static_cast<uint32_t>(depth_m1);
+        }
+        CONSTEXPR npu_set_ifm_depth_m1_t &set_depth_m1(uint32_t value)
+        {
+            depth_m1 = static_cast<uint16_t>(value) & ((1U << 16) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("depth_m1", std::to_string(depth_m1)));
+        }
+#endif
+#endif
+    };
+    // IFM Precision
+    struct npu_set_ifm_precision_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;         //  control
+        uint32_t activation_type : 1; //  IFM type
+        uint32_t reserved1 : 1;
+        uint32_t activation_precision : 2; //  IFM precision
+        uint32_t reserved2 : 2;
+        uint32_t activation_format : 2; //  IFM format
+        uint32_t scale_mode : 2;        //  IFM scale mode
+        uint32_t reserved3 : 4;
+        uint32_t round_mode : 2; //  IFM round mode
+#ifdef __cplusplus
+      public:
+        npu_set_ifm_precision_t(NPU_NAMESPACE::activation_type _activation_type,
+                                NPU_NAMESPACE::activation_precision _activation_precision,
+                                NPU_NAMESPACE::activation_format _activation_format,
+                                NPU_NAMESPACE::ifm_scale_mode _scale_mode,
+                                NPU_NAMESPACE::round_mode _round_mode) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_PRECISION)),
+            reserved0(0), control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            activation_type(static_cast<uint8_t>(_activation_type) & ((1U << 1) - 1)), reserved1(0),
+            activation_precision(static_cast<uint8_t>(_activation_precision) & ((1U << 2) - 1)), reserved2(0),
+            activation_format(static_cast<uint8_t>(_activation_format) & ((1U << 2) - 1)),
+            scale_mode(static_cast<uint8_t>(_scale_mode) & ((1U << 2) - 1)), reserved3(0),
+            round_mode(static_cast<uint8_t>(_round_mode) & ((1U << 2) - 1))
+        {
+        }
+        CONSTEXPR npu_set_ifm_precision_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_PRECISION)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), activation_type(0), reserved1(0),
+            activation_precision(0), reserved2(0), activation_format(0), scale_mode(0), reserved3(0), round_mode(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_PRECISION) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_PRECISION);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ifm_precision_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ifm_precision_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::activation_type get_activation_type() const
+        {
+            return static_cast<NPU_NAMESPACE::activation_type>(activation_type);
+        }
+        CONSTEXPR npu_set_ifm_precision_t &set_activation_type(NPU_NAMESPACE::activation_type value)
+        {
+            activation_type = static_cast<uint8_t>(value) & ((1U << 1) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::activation_precision get_activation_precision() const
+        {
+            return static_cast<NPU_NAMESPACE::activation_precision>(activation_precision);
+        }
+        CONSTEXPR npu_set_ifm_precision_t &set_activation_precision(NPU_NAMESPACE::activation_precision value)
+        {
+            activation_precision = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::activation_format get_activation_format() const
+        {
+            return static_cast<NPU_NAMESPACE::activation_format>(activation_format);
+        }
+        CONSTEXPR npu_set_ifm_precision_t &set_activation_format(NPU_NAMESPACE::activation_format value)
+        {
+            activation_format = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::ifm_scale_mode get_scale_mode() const
+        {
+            return static_cast<NPU_NAMESPACE::ifm_scale_mode>(scale_mode);
+        }
+        CONSTEXPR npu_set_ifm_precision_t &set_scale_mode(NPU_NAMESPACE::ifm_scale_mode value)
+        {
+            scale_mode = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::round_mode get_round_mode() const
+        {
+            return static_cast<NPU_NAMESPACE::round_mode>(round_mode);
+        }
+        CONSTEXPR npu_set_ifm_precision_t &set_round_mode(NPU_NAMESPACE::round_mode value)
+        {
+            round_mode = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "activation_type",
+                (activation_type < (sizeof(activation_type_str) / sizeof(activation_type_str[0])) ?
+                     activation_type_str[activation_type] :
+                     "****")));
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "activation_precision",
+                (activation_precision < (sizeof(activation_precision_str) / sizeof(activation_precision_str[0])) ?
+                     activation_precision_str[activation_precision] :
+                     "****")));
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "activation_format",
+                (activation_format < (sizeof(activation_format_str) / sizeof(activation_format_str[0])) ?
+                     activation_format_str[activation_format] :
+                     "****")));
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "scale_mode",
+                (scale_mode < (sizeof(ifm_scale_mode_str) / sizeof(ifm_scale_mode_str[0])) ?
+                     ifm_scale_mode_str[scale_mode] :
+                     "****")));
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "round_mode",
+                (round_mode < (sizeof(round_mode_str) / sizeof(round_mode_str[0])) ? round_mode_str[round_mode] :
+                                                                                     "****")));
+        }
+#endif
+#endif
+    };
+    // IFM upscale mode
+    struct npu_set_ifm_upscale_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t mode : 2;    //  IFM upscale mode
+        uint32_t reserved1 : 14;
+#ifdef __cplusplus
+      public:
+        npu_set_ifm_upscale_t(NPU_NAMESPACE::ifm_upscale_mode _mode) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_UPSCALE)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            mode(static_cast<uint8_t>(_mode) & ((1U << 2) - 1)), reserved1(0)
+        {
+        }
+        CONSTEXPR npu_set_ifm_upscale_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_UPSCALE)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), mode(0), reserved1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_UPSCALE) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_UPSCALE);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ifm_upscale_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ifm_upscale_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::ifm_upscale_mode get_mode() const
+        {
+            return static_cast<NPU_NAMESPACE::ifm_upscale_mode>(mode);
+        }
+        CONSTEXPR npu_set_ifm_upscale_t &set_mode(NPU_NAMESPACE::ifm_upscale_mode value)
+        {
+            mode = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "mode",
+                (mode < (sizeof(ifm_upscale_mode_str) / sizeof(ifm_upscale_mode_str[0])) ? ifm_upscale_mode_str[mode] :
+                                                                                           "****")));
+        }
+#endif
+#endif
+    };
+    // IFM zero point
+    struct npu_set_ifm_zero_point_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;     //  control
+        uint32_t zero_point : 16; //  Zero point offset
+#ifdef __cplusplus
+      public:
+        npu_set_ifm_zero_point_t(uint32_t _zero_point) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_ZERO_POINT)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            zero_point(static_cast<uint16_t>(_zero_point) & ((1U << 16) - 1))
+        {
+        }
+        CONSTEXPR npu_set_ifm_zero_point_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_ZERO_POINT)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), zero_point(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_ZERO_POINT) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_ZERO_POINT);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ifm_zero_point_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ifm_zero_point_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_zero_point() const
+        {
+            return static_cast<uint32_t>(zero_point);
+        }
+        CONSTEXPR npu_set_ifm_zero_point_t &set_zero_point(uint32_t value)
+        {
+            zero_point = static_cast<uint16_t>(value) & ((1U << 16) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("zero_point", std::to_string(zero_point)));
+        }
+#endif
+#endif
+    };
+    // IFM Tile 0 and tile 2 width
+    struct npu_set_ifm_width0_m1_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;   //  control
+        uint32_t width_m1 : 16; //  IFM Tile 0 and tile 2 width
+#ifdef __cplusplus
+      public:
+        npu_set_ifm_width0_m1_t(uint32_t _width_m1) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_WIDTH0_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            width_m1(static_cast<uint16_t>(_width_m1) & ((1U << 16) - 1))
+        {
+        }
+        CONSTEXPR npu_set_ifm_width0_m1_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_WIDTH0_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), width_m1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_WIDTH0_M1) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_WIDTH0_M1);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ifm_width0_m1_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ifm_width0_m1_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_width_m1() const
+        {
+            return static_cast<uint32_t>(width_m1);
+        }
+        CONSTEXPR npu_set_ifm_width0_m1_t &set_width_m1(uint32_t value)
+        {
+            width_m1 = static_cast<uint16_t>(value) & ((1U << 16) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("width_m1", std::to_string(width_m1)));
+        }
+#endif
+#endif
+    };
+    // IFM Tile 0 height
+    struct npu_set_ifm_height0_m1_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;    //  control
+        uint32_t height_m1 : 16; //  IFM Tile 0 height
+#ifdef __cplusplus
+      public:
+        npu_set_ifm_height0_m1_t(uint32_t _height_m1) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_HEIGHT0_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            height_m1(static_cast<uint16_t>(_height_m1) & ((1U << 16) - 1))
+        {
+        }
+        CONSTEXPR npu_set_ifm_height0_m1_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_HEIGHT0_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), height_m1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_HEIGHT0_M1) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_HEIGHT0_M1);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ifm_height0_m1_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ifm_height0_m1_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_height_m1() const
+        {
+            return static_cast<uint32_t>(height_m1);
+        }
+        CONSTEXPR npu_set_ifm_height0_m1_t &set_height_m1(uint32_t value)
+        {
+            height_m1 = static_cast<uint16_t>(value) & ((1U << 16) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("height_m1", std::to_string(height_m1)));
+        }
+#endif
+#endif
+    };
+    // IFM Tile 1 height
+    struct npu_set_ifm_height1_m1_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;    //  control
+        uint32_t height_m1 : 16; //  IFM Tile 1 height
+#ifdef __cplusplus
+      public:
+        npu_set_ifm_height1_m1_t(uint32_t _height_m1) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_HEIGHT1_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            height_m1(static_cast<uint16_t>(_height_m1) & ((1U << 16) - 1))
+        {
+        }
+        CONSTEXPR npu_set_ifm_height1_m1_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_HEIGHT1_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), height_m1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_HEIGHT1_M1) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_HEIGHT1_M1);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ifm_height1_m1_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ifm_height1_m1_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_height_m1() const
+        {
+            return static_cast<uint32_t>(height_m1);
+        }
+        CONSTEXPR npu_set_ifm_height1_m1_t &set_height_m1(uint32_t value)
+        {
+            height_m1 = static_cast<uint16_t>(value) & ((1U << 16) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("height_m1", std::to_string(height_m1)));
+        }
+#endif
+#endif
+    };
+    // End of IB0,IB1 buffers
+    struct npu_set_ifm_ib_end_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t ib_end : 6;  //  End of IB0,IB1 buffers in the SHRAM in KB units. Multiple of 2
+        uint32_t reserved1 : 10;
+#ifdef __cplusplus
+      public:
+        npu_set_ifm_ib_end_t(uint32_t _ib_end) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_IB_END)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            ib_end(static_cast<uint8_t>(_ib_end) & ((1U << 6) - 1)), reserved1(0)
+        {
+        }
+        CONSTEXPR npu_set_ifm_ib_end_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_IB_END)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), ib_end(0), reserved1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_IB_END) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_IB_END);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ifm_ib_end_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ifm_ib_end_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_ib_end() const
+        {
+            return static_cast<uint32_t>(ib_end);
+        }
+        CONSTEXPR npu_set_ifm_ib_end_t &set_ib_end(uint32_t value)
+        {
+            ib_end = static_cast<uint8_t>(value) & ((1U << 6) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("ib_end", std::to_string(ib_end)));
+        }
+#endif
+#endif
+    };
+    // Index n for IFM access
+    struct npu_set_ifm_region_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t region : 3;  //  Region number n
+        uint32_t reserved1 : 13;
+#ifdef __cplusplus
+      public:
+        npu_set_ifm_region_t(uint32_t _region) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_REGION)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            region(static_cast<uint8_t>(_region) & ((1U << 3) - 1)), reserved1(0)
+        {
+        }
+        CONSTEXPR npu_set_ifm_region_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_REGION)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), region(0), reserved1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_REGION) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM_REGION);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ifm_region_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ifm_region_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_region() const
+        {
+            return static_cast<uint32_t>(region);
+        }
+        CONSTEXPR npu_set_ifm_region_t &set_region(uint32_t value)
+        {
+            region = static_cast<uint8_t>(value) & ((1U << 3) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("region", std::to_string(region)));
+        }
+#endif
+#endif
+    };
+    // Output feature map width
+    struct npu_set_ofm_width_m1_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;   //  control
+        uint32_t width_m1 : 16; //  Output feature map width
+#ifdef __cplusplus
+      public:
+        npu_set_ofm_width_m1_t(uint32_t _width_m1) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_WIDTH_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            width_m1(static_cast<uint16_t>(_width_m1) & ((1U << 16) - 1))
+        {
+        }
+        CONSTEXPR npu_set_ofm_width_m1_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_WIDTH_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), width_m1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_WIDTH_M1) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_WIDTH_M1);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ofm_width_m1_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ofm_width_m1_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_width_m1() const
+        {
+            return static_cast<uint32_t>(width_m1);
+        }
+        CONSTEXPR npu_set_ofm_width_m1_t &set_width_m1(uint32_t value)
+        {
+            width_m1 = static_cast<uint16_t>(value) & ((1U << 16) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("width_m1", std::to_string(width_m1)));
+        }
+#endif
+#endif
+    };
+    // Output feature map height
+    struct npu_set_ofm_height_m1_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;    //  control
+        uint32_t height_m1 : 16; //  Output feature map height
+#ifdef __cplusplus
+      public:
+        npu_set_ofm_height_m1_t(uint32_t _height_m1) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_HEIGHT_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            height_m1(static_cast<uint16_t>(_height_m1) & ((1U << 16) - 1))
+        {
+        }
+        CONSTEXPR npu_set_ofm_height_m1_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_HEIGHT_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), height_m1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_HEIGHT_M1) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_HEIGHT_M1);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ofm_height_m1_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ofm_height_m1_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_height_m1() const
+        {
+            return static_cast<uint32_t>(height_m1);
+        }
+        CONSTEXPR npu_set_ofm_height_m1_t &set_height_m1(uint32_t value)
+        {
+            height_m1 = static_cast<uint16_t>(value) & ((1U << 16) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("height_m1", std::to_string(height_m1)));
+        }
+#endif
+#endif
+    };
+    // Output feature map depth
+    struct npu_set_ofm_depth_m1_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;   //  control
+        uint32_t depth_m1 : 16; //  Output feature map depth
+#ifdef __cplusplus
+      public:
+        npu_set_ofm_depth_m1_t(uint32_t _depth_m1) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_DEPTH_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            depth_m1(static_cast<uint16_t>(_depth_m1) & ((1U << 16) - 1))
+        {
+        }
+        CONSTEXPR npu_set_ofm_depth_m1_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_DEPTH_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), depth_m1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_DEPTH_M1) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_DEPTH_M1);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ofm_depth_m1_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ofm_depth_m1_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_depth_m1() const
+        {
+            return static_cast<uint32_t>(depth_m1);
+        }
+        CONSTEXPR npu_set_ofm_depth_m1_t &set_depth_m1(uint32_t value)
+        {
+            depth_m1 = static_cast<uint16_t>(value) & ((1U << 16) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("depth_m1", std::to_string(depth_m1)));
+        }
+#endif
+#endif
+    };
+    // OFM Precision
+    struct npu_set_ofm_precision_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;              //  control
+        uint32_t activation_type : 1;      //  OFM type
+        uint32_t activation_precision : 2; //  OFM precision
+        uint32_t reserved1 : 3;
+        uint32_t activation_format : 2; //  OFM format
+        uint32_t scale_mode : 1;        //  OFM scale mode
+        uint32_t reserved2 : 5;
+        uint32_t round_mode : 2; //  OFM round mode
+#ifdef __cplusplus
+      public:
+        npu_set_ofm_precision_t(NPU_NAMESPACE::activation_type _activation_type,
+                                NPU_NAMESPACE::activation_precision _activation_precision,
+                                NPU_NAMESPACE::activation_format _activation_format,
+                                NPU_NAMESPACE::ofm_scale_mode _scale_mode,
+                                NPU_NAMESPACE::round_mode _round_mode) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_PRECISION)),
+            reserved0(0), control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            activation_type(static_cast<uint8_t>(_activation_type) & ((1U << 1) - 1)),
+            activation_precision(static_cast<uint8_t>(_activation_precision) & ((1U << 2) - 1)), reserved1(0),
+            activation_format(static_cast<uint8_t>(_activation_format) & ((1U << 2) - 1)),
+            scale_mode(static_cast<uint8_t>(_scale_mode) & ((1U << 1) - 1)), reserved2(0),
+            round_mode(static_cast<uint8_t>(_round_mode) & ((1U << 2) - 1))
+        {
+        }
+        CONSTEXPR npu_set_ofm_precision_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_PRECISION)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), activation_type(0),
+            activation_precision(0), reserved1(0), activation_format(0), scale_mode(0), reserved2(0), round_mode(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_PRECISION) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_PRECISION);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ofm_precision_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ofm_precision_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::activation_type get_activation_type() const
+        {
+            return static_cast<NPU_NAMESPACE::activation_type>(activation_type);
+        }
+        CONSTEXPR npu_set_ofm_precision_t &set_activation_type(NPU_NAMESPACE::activation_type value)
+        {
+            activation_type = static_cast<uint8_t>(value) & ((1U << 1) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::activation_precision get_activation_precision() const
+        {
+            return static_cast<NPU_NAMESPACE::activation_precision>(activation_precision);
+        }
+        CONSTEXPR npu_set_ofm_precision_t &set_activation_precision(NPU_NAMESPACE::activation_precision value)
+        {
+            activation_precision = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::activation_format get_activation_format() const
+        {
+            return static_cast<NPU_NAMESPACE::activation_format>(activation_format);
+        }
+        CONSTEXPR npu_set_ofm_precision_t &set_activation_format(NPU_NAMESPACE::activation_format value)
+        {
+            activation_format = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::ofm_scale_mode get_scale_mode() const
+        {
+            return static_cast<NPU_NAMESPACE::ofm_scale_mode>(scale_mode);
+        }
+        CONSTEXPR npu_set_ofm_precision_t &set_scale_mode(NPU_NAMESPACE::ofm_scale_mode value)
+        {
+            scale_mode = static_cast<uint8_t>(value) & ((1U << 1) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::round_mode get_round_mode() const
+        {
+            return static_cast<NPU_NAMESPACE::round_mode>(round_mode);
+        }
+        CONSTEXPR npu_set_ofm_precision_t &set_round_mode(NPU_NAMESPACE::round_mode value)
+        {
+            round_mode = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "activation_type",
+                (activation_type < (sizeof(activation_type_str) / sizeof(activation_type_str[0])) ?
+                     activation_type_str[activation_type] :
+                     "****")));
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "activation_precision",
+                (activation_precision < (sizeof(activation_precision_str) / sizeof(activation_precision_str[0])) ?
+                     activation_precision_str[activation_precision] :
+                     "****")));
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "activation_format",
+                (activation_format < (sizeof(activation_format_str) / sizeof(activation_format_str[0])) ?
+                     activation_format_str[activation_format] :
+                     "****")));
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "scale_mode",
+                (scale_mode < (sizeof(ofm_scale_mode_str) / sizeof(ofm_scale_mode_str[0])) ?
+                     ofm_scale_mode_str[scale_mode] :
+                     "****")));
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "round_mode",
+                (round_mode < (sizeof(round_mode_str) / sizeof(round_mode_str[0])) ? round_mode_str[round_mode] :
+                                                                                     "****")));
+        }
+#endif
+#endif
+    };
+    // OFM block width
+    struct npu_set_ofm_blk_width_m1_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;  //  control
+        uint32_t width_m1 : 6; //  OFM block width
+        uint32_t reserved1 : 10;
+#ifdef __cplusplus
+      public:
+        npu_set_ofm_blk_width_m1_t(uint32_t _width_m1) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_BLK_WIDTH_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            width_m1(static_cast<uint8_t>(_width_m1) & ((1U << 6) - 1)), reserved1(0)
+        {
+        }
+        CONSTEXPR npu_set_ofm_blk_width_m1_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_BLK_WIDTH_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), width_m1(0), reserved1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_BLK_WIDTH_M1) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_BLK_WIDTH_M1);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ofm_blk_width_m1_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ofm_blk_width_m1_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_width_m1() const
+        {
+            return static_cast<uint32_t>(width_m1);
+        }
+        CONSTEXPR npu_set_ofm_blk_width_m1_t &set_width_m1(uint32_t value)
+        {
+            width_m1 = static_cast<uint8_t>(value) & ((1U << 6) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("width_m1", std::to_string(width_m1)));
+        }
+#endif
+#endif
+    };
+    // OFM block height
+    struct npu_set_ofm_blk_height_m1_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;   //  control
+        uint32_t height_m1 : 5; //  OFM block height
+        uint32_t reserved1 : 11;
+#ifdef __cplusplus
+      public:
+        npu_set_ofm_blk_height_m1_t(uint32_t _height_m1) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_BLK_HEIGHT_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            height_m1(static_cast<uint8_t>(_height_m1) & ((1U << 5) - 1)), reserved1(0)
+        {
+        }
+        CONSTEXPR npu_set_ofm_blk_height_m1_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_BLK_HEIGHT_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), height_m1(0), reserved1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_BLK_HEIGHT_M1) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_BLK_HEIGHT_M1);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ofm_blk_height_m1_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ofm_blk_height_m1_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_height_m1() const
+        {
+            return static_cast<uint32_t>(height_m1);
+        }
+        CONSTEXPR npu_set_ofm_blk_height_m1_t &set_height_m1(uint32_t value)
+        {
+            height_m1 = static_cast<uint8_t>(value) & ((1U << 5) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("height_m1", std::to_string(height_m1)));
+        }
+#endif
+#endif
+    };
+    // OFM block depth
+    struct npu_set_ofm_blk_depth_m1_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;  //  control
+        uint32_t depth_m1 : 7; //  OFM block depth
+        uint32_t reserved1 : 9;
+#ifdef __cplusplus
+      public:
+        npu_set_ofm_blk_depth_m1_t(uint32_t _depth_m1) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_BLK_DEPTH_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            depth_m1(static_cast<uint8_t>(_depth_m1) & ((1U << 7) - 1)), reserved1(0)
+        {
+        }
+        CONSTEXPR npu_set_ofm_blk_depth_m1_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_BLK_DEPTH_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), depth_m1(0), reserved1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_BLK_DEPTH_M1) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_BLK_DEPTH_M1);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ofm_blk_depth_m1_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ofm_blk_depth_m1_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_depth_m1() const
+        {
+            return static_cast<uint32_t>(depth_m1);
+        }
+        CONSTEXPR npu_set_ofm_blk_depth_m1_t &set_depth_m1(uint32_t value)
+        {
+            depth_m1 = static_cast<uint8_t>(value) & ((1U << 7) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("depth_m1", std::to_string(depth_m1)));
+        }
+#endif
+#endif
+    };
+    // OFM zero point
+    struct npu_set_ofm_zero_point_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;     //  control
+        uint32_t zero_point : 16; //  Zero point offset
+#ifdef __cplusplus
+      public:
+        npu_set_ofm_zero_point_t(uint32_t _zero_point) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_ZERO_POINT)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            zero_point(static_cast<uint16_t>(_zero_point) & ((1U << 16) - 1))
+        {
+        }
+        CONSTEXPR npu_set_ofm_zero_point_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_ZERO_POINT)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), zero_point(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_ZERO_POINT) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_ZERO_POINT);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ofm_zero_point_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ofm_zero_point_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_zero_point() const
+        {
+            return static_cast<uint32_t>(zero_point);
+        }
+        CONSTEXPR npu_set_ofm_zero_point_t &set_zero_point(uint32_t value)
+        {
+            zero_point = static_cast<uint16_t>(value) & ((1U << 16) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("zero_point", std::to_string(zero_point)));
+        }
+#endif
+#endif
+    };
+    // OFM Tile 0 and tile 2 width
+    struct npu_set_ofm_width0_m1_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;   //  control
+        uint32_t width_m1 : 16; //  OFM Tile 0 and tile 2 width
+#ifdef __cplusplus
+      public:
+        npu_set_ofm_width0_m1_t(uint32_t _width_m1) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_WIDTH0_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            width_m1(static_cast<uint16_t>(_width_m1) & ((1U << 16) - 1))
+        {
+        }
+        CONSTEXPR npu_set_ofm_width0_m1_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_WIDTH0_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), width_m1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_WIDTH0_M1) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_WIDTH0_M1);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ofm_width0_m1_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ofm_width0_m1_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_width_m1() const
+        {
+            return static_cast<uint32_t>(width_m1);
+        }
+        CONSTEXPR npu_set_ofm_width0_m1_t &set_width_m1(uint32_t value)
+        {
+            width_m1 = static_cast<uint16_t>(value) & ((1U << 16) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("width_m1", std::to_string(width_m1)));
+        }
+#endif
+#endif
+    };
+    // OFM Tile 0 height
+    struct npu_set_ofm_height0_m1_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;    //  control
+        uint32_t height_m1 : 16; //  OFM Tile 0 height
+#ifdef __cplusplus
+      public:
+        npu_set_ofm_height0_m1_t(uint32_t _height_m1) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_HEIGHT0_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            height_m1(static_cast<uint16_t>(_height_m1) & ((1U << 16) - 1))
+        {
+        }
+        CONSTEXPR npu_set_ofm_height0_m1_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_HEIGHT0_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), height_m1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_HEIGHT0_M1) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_HEIGHT0_M1);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ofm_height0_m1_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ofm_height0_m1_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_height_m1() const
+        {
+            return static_cast<uint32_t>(height_m1);
+        }
+        CONSTEXPR npu_set_ofm_height0_m1_t &set_height_m1(uint32_t value)
+        {
+            height_m1 = static_cast<uint16_t>(value) & ((1U << 16) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("height_m1", std::to_string(height_m1)));
+        }
+#endif
+#endif
+    };
+    // OFM Tile 1 height
+    struct npu_set_ofm_height1_m1_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;    //  control
+        uint32_t height_m1 : 16; //  OFM Tile 1 height
+#ifdef __cplusplus
+      public:
+        npu_set_ofm_height1_m1_t(uint32_t _height_m1) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_HEIGHT1_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            height_m1(static_cast<uint16_t>(_height_m1) & ((1U << 16) - 1))
+        {
+        }
+        CONSTEXPR npu_set_ofm_height1_m1_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_HEIGHT1_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), height_m1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_HEIGHT1_M1) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_HEIGHT1_M1);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ofm_height1_m1_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ofm_height1_m1_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_height_m1() const
+        {
+            return static_cast<uint32_t>(height_m1);
+        }
+        CONSTEXPR npu_set_ofm_height1_m1_t &set_height_m1(uint32_t value)
+        {
+            height_m1 = static_cast<uint16_t>(value) & ((1U << 16) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("height_m1", std::to_string(height_m1)));
+        }
+#endif
+#endif
+    };
+    // Index n for OFM access
+    struct npu_set_ofm_region_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t region : 3;  //  Index n for OFM access
+        uint32_t reserved1 : 13;
+#ifdef __cplusplus
+      public:
+        npu_set_ofm_region_t(uint32_t _region) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_REGION)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            region(static_cast<uint8_t>(_region) & ((1U << 3) - 1)), reserved1(0)
+        {
+        }
+        CONSTEXPR npu_set_ofm_region_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_REGION)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), region(0), reserved1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_REGION) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_OFM_REGION);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ofm_region_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ofm_region_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_region() const
+        {
+            return static_cast<uint32_t>(region);
+        }
+        CONSTEXPR npu_set_ofm_region_t &set_region(uint32_t value)
+        {
+            region = static_cast<uint8_t>(value) & ((1U << 3) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("region", std::to_string(region)));
+        }
+#endif
+#endif
+    };
+    // Kernel width
+    struct npu_set_kernel_width_m1_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;   //  control
+        uint32_t width_m1 : 16; //  Kernel width
+#ifdef __cplusplus
+      public:
+        npu_set_kernel_width_m1_t(uint32_t _width_m1) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_KERNEL_WIDTH_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            width_m1(static_cast<uint16_t>(_width_m1) & ((1U << 16) - 1))
+        {
+        }
+        CONSTEXPR npu_set_kernel_width_m1_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_KERNEL_WIDTH_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), width_m1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_KERNEL_WIDTH_M1) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_KERNEL_WIDTH_M1);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_kernel_width_m1_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_kernel_width_m1_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_width_m1() const
+        {
+            return static_cast<uint32_t>(width_m1);
+        }
+        CONSTEXPR npu_set_kernel_width_m1_t &set_width_m1(uint32_t value)
+        {
+            width_m1 = static_cast<uint16_t>(value) & ((1U << 16) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("width_m1", std::to_string(width_m1)));
+        }
+#endif
+#endif
+    };
+    // Kernel height
+    struct npu_set_kernel_height_m1_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;    //  control
+        uint32_t height_m1 : 16; //  Kernel height
+#ifdef __cplusplus
+      public:
+        npu_set_kernel_height_m1_t(uint32_t _height_m1) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_KERNEL_HEIGHT_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            height_m1(static_cast<uint16_t>(_height_m1) & ((1U << 16) - 1))
+        {
+        }
+        CONSTEXPR npu_set_kernel_height_m1_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_KERNEL_HEIGHT_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), height_m1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_KERNEL_HEIGHT_M1) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_KERNEL_HEIGHT_M1);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_kernel_height_m1_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_kernel_height_m1_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_height_m1() const
+        {
+            return static_cast<uint32_t>(height_m1);
+        }
+        CONSTEXPR npu_set_kernel_height_m1_t &set_height_m1(uint32_t value)
+        {
+            height_m1 = static_cast<uint16_t>(value) & ((1U << 16) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("height_m1", std::to_string(height_m1)));
+        }
+#endif
+#endif
+    };
+    // Kernel stride
+    struct npu_set_kernel_stride_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;       //  control
+        uint32_t stride_x_lsb : 1;  //  Stride x LSB. (kernel_x_stride - 1)[0]
+        uint32_t stride_y_lsb : 1;  //  Stride y LSB. (kernel_y_stride - 1)[0]
+        uint32_t weight_order : 1;  //  Weight ordering mode
+        uint32_t dilation_x : 1;    //  Kernel x dilation
+        uint32_t dilation_y : 1;    //  Kernel y dilation
+        uint32_t decomposition : 1; //  Kernel decomposition
+        uint32_t stride_x_msb : 1;  //  Stride x MSB. (kernel_x_stride - 1) >> 1
+        uint32_t reserved1 : 2;
+        uint32_t stride_y_msb : 1; //  Stride y MSB. (kernel_y_stride - 1) >> 1
+        uint32_t reserved2 : 6;
+#ifdef __cplusplus
+      public:
+        npu_set_kernel_stride_t(uint32_t _stride_x_lsb,
+                                uint32_t _stride_y_lsb,
+                                NPU_NAMESPACE::weight_order _weight_order,
+                                NPU_NAMESPACE::kernel_dilation _dilation_x,
+                                NPU_NAMESPACE::kernel_dilation _dilation_y,
+                                NPU_NAMESPACE::kernel_decomposition _decomposition,
+                                uint32_t _stride_x_msb,
+                                uint32_t _stride_y_msb) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_KERNEL_STRIDE)),
+            reserved0(0), control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            stride_x_lsb(static_cast<uint8_t>(_stride_x_lsb) & ((1U << 1) - 1)),
+            stride_y_lsb(static_cast<uint8_t>(_stride_y_lsb) & ((1U << 1) - 1)),
+            weight_order(static_cast<uint8_t>(_weight_order) & ((1U << 1) - 1)),
+            dilation_x(static_cast<uint8_t>(_dilation_x) & ((1U << 1) - 1)),
+            dilation_y(static_cast<uint8_t>(_dilation_y) & ((1U << 1) - 1)),
+            decomposition(static_cast<uint8_t>(_decomposition) & ((1U << 1) - 1)),
+            stride_x_msb(static_cast<uint8_t>(_stride_x_msb) & ((1U << 1) - 1)), reserved1(0),
+            stride_y_msb(static_cast<uint8_t>(_stride_y_msb) & ((1U << 1) - 1)), reserved2(0)
+        {
+        }
+        CONSTEXPR npu_set_kernel_stride_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_KERNEL_STRIDE)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), stride_x_lsb(0), stride_y_lsb(0),
+            weight_order(0), dilation_x(0), dilation_y(0), decomposition(0), stride_x_msb(0), reserved1(0),
+            stride_y_msb(0), reserved2(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_KERNEL_STRIDE) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_KERNEL_STRIDE);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_kernel_stride_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_kernel_stride_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_stride_x_lsb() const
+        {
+            return static_cast<uint32_t>(stride_x_lsb);
+        }
+        CONSTEXPR npu_set_kernel_stride_t &set_stride_x_lsb(uint32_t value)
+        {
+            stride_x_lsb = static_cast<uint8_t>(value) & ((1U << 1) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_stride_y_lsb() const
+        {
+            return static_cast<uint32_t>(stride_y_lsb);
+        }
+        CONSTEXPR npu_set_kernel_stride_t &set_stride_y_lsb(uint32_t value)
+        {
+            stride_y_lsb = static_cast<uint8_t>(value) & ((1U << 1) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::weight_order get_weight_order() const
+        {
+            return static_cast<NPU_NAMESPACE::weight_order>(weight_order);
+        }
+        CONSTEXPR npu_set_kernel_stride_t &set_weight_order(NPU_NAMESPACE::weight_order value)
+        {
+            weight_order = static_cast<uint8_t>(value) & ((1U << 1) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::kernel_dilation get_dilation_x() const
+        {
+            return static_cast<NPU_NAMESPACE::kernel_dilation>(dilation_x);
+        }
+        CONSTEXPR npu_set_kernel_stride_t &set_dilation_x(NPU_NAMESPACE::kernel_dilation value)
+        {
+            dilation_x = static_cast<uint8_t>(value) & ((1U << 1) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::kernel_dilation get_dilation_y() const
+        {
+            return static_cast<NPU_NAMESPACE::kernel_dilation>(dilation_y);
+        }
+        CONSTEXPR npu_set_kernel_stride_t &set_dilation_y(NPU_NAMESPACE::kernel_dilation value)
+        {
+            dilation_y = static_cast<uint8_t>(value) & ((1U << 1) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::kernel_decomposition get_decomposition() const
+        {
+            return static_cast<NPU_NAMESPACE::kernel_decomposition>(decomposition);
+        }
+        CONSTEXPR npu_set_kernel_stride_t &set_decomposition(NPU_NAMESPACE::kernel_decomposition value)
+        {
+            decomposition = static_cast<uint8_t>(value) & ((1U << 1) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_stride_x_msb() const
+        {
+            return static_cast<uint32_t>(stride_x_msb);
+        }
+        CONSTEXPR npu_set_kernel_stride_t &set_stride_x_msb(uint32_t value)
+        {
+            stride_x_msb = static_cast<uint8_t>(value) & ((1U << 1) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_stride_y_msb() const
+        {
+            return static_cast<uint32_t>(stride_y_msb);
+        }
+        CONSTEXPR npu_set_kernel_stride_t &set_stride_y_msb(uint32_t value)
+        {
+            stride_y_msb = static_cast<uint8_t>(value) & ((1U << 1) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("stride_x_lsb", std::to_string(stride_x_lsb)));
+            fields.push_back(std::make_pair<std::string, std::string>("stride_y_lsb", std::to_string(stride_y_lsb)));
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "weight_order",
+                (weight_order < (sizeof(weight_order_str) / sizeof(weight_order_str[0])) ?
+                     weight_order_str[weight_order] :
+                     "****")));
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "dilation_x",
+                (dilation_x < (sizeof(kernel_dilation_str) / sizeof(kernel_dilation_str[0])) ?
+                     kernel_dilation_str[dilation_x] :
+                     "****")));
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "dilation_y",
+                (dilation_y < (sizeof(kernel_dilation_str) / sizeof(kernel_dilation_str[0])) ?
+                     kernel_dilation_str[dilation_y] :
+                     "****")));
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "decomposition",
+                (decomposition < (sizeof(kernel_decomposition_str) / sizeof(kernel_decomposition_str[0])) ?
+                     kernel_decomposition_str[decomposition] :
+                     "****")));
+            fields.push_back(std::make_pair<std::string, std::string>("stride_x_msb", std::to_string(stride_x_msb)));
+            fields.push_back(std::make_pair<std::string, std::string>("stride_y_msb", std::to_string(stride_y_msb)));
+        }
+#endif
+#endif
+    };
+    // Multi-core parallel mode
+    struct npu_set_parallel_mode_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;       //  control
+        uint32_t parallel_mode : 1; //  Multi-core parallel mode
+        uint32_t reserved1 : 15;
+#ifdef __cplusplus
+      public:
+        npu_set_parallel_mode_t(NPU_NAMESPACE::parallel_mode _parallel_mode) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_PARALLEL_MODE)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            parallel_mode(static_cast<uint8_t>(_parallel_mode) & ((1U << 1) - 1)), reserved1(0)
+        {
+        }
+        CONSTEXPR npu_set_parallel_mode_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_PARALLEL_MODE)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), parallel_mode(0), reserved1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_PARALLEL_MODE) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_PARALLEL_MODE);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_parallel_mode_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_parallel_mode_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::parallel_mode get_parallel_mode() const
+        {
+            return static_cast<NPU_NAMESPACE::parallel_mode>(parallel_mode);
+        }
+        CONSTEXPR npu_set_parallel_mode_t &set_parallel_mode(NPU_NAMESPACE::parallel_mode value)
+        {
+            parallel_mode = static_cast<uint8_t>(value) & ((1U << 1) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "parallel_mode",
+                (parallel_mode < (sizeof(parallel_mode_str) / sizeof(parallel_mode_str[0])) ?
+                     parallel_mode_str[parallel_mode] :
+                     "****")));
+        }
+#endif
+#endif
+    };
+    // Accumulator format
+    struct npu_set_acc_format_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;    //  control
+        uint32_t acc_format : 2; //  Accumulator format
+        uint32_t reserved1 : 14;
+#ifdef __cplusplus
+      public:
+        npu_set_acc_format_t(NPU_NAMESPACE::acc_format _acc_format) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_ACC_FORMAT)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            acc_format(static_cast<uint8_t>(_acc_format) & ((1U << 2) - 1)), reserved1(0)
+        {
+        }
+        CONSTEXPR npu_set_acc_format_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_ACC_FORMAT)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), acc_format(0), reserved1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_ACC_FORMAT) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_ACC_FORMAT);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_acc_format_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_acc_format_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::acc_format get_acc_format() const
+        {
+            return static_cast<NPU_NAMESPACE::acc_format>(acc_format);
+        }
+        CONSTEXPR npu_set_acc_format_t &set_acc_format(NPU_NAMESPACE::acc_format value)
+        {
+            acc_format = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "acc_format",
+                (acc_format < (sizeof(acc_format_str) / sizeof(acc_format_str[0])) ? acc_format_str[acc_format] :
+                                                                                     "****")));
+        }
+#endif
+#endif
+    };
+    // Activation function and clip range
+    struct npu_set_activation_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;             //  control
+        uint32_t activation_function : 5; //  Activation function (before table lookup)
+        uint32_t reserved1 : 7;
+        uint32_t activation_clip_range : 3; //  Activation clip range. This must be set to 0 if table lookup is not used
+        uint32_t reserved2 : 1;
+#ifdef __cplusplus
+      public:
+        npu_set_activation_t(NPU_NAMESPACE::activation_function _activation_function,
+                             NPU_NAMESPACE::activation_clip_range _activation_clip_range) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_ACTIVATION)),
+            reserved0(0), control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            activation_function(static_cast<uint8_t>(_activation_function) & ((1U << 5) - 1)), reserved1(0),
+            activation_clip_range(static_cast<uint8_t>(_activation_clip_range) & ((1U << 3) - 1)), reserved2(0)
+        {
+        }
+        CONSTEXPR npu_set_activation_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_ACTIVATION)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), activation_function(0), reserved1(0),
+            activation_clip_range(0), reserved2(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_ACTIVATION) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_ACTIVATION);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_activation_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_activation_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::activation_function get_activation_function() const
+        {
+            return static_cast<NPU_NAMESPACE::activation_function>(activation_function);
+        }
+        CONSTEXPR npu_set_activation_t &set_activation_function(NPU_NAMESPACE::activation_function value)
+        {
+            activation_function = static_cast<uint8_t>(value) & ((1U << 5) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::activation_clip_range get_activation_clip_range() const
+        {
+            return static_cast<NPU_NAMESPACE::activation_clip_range>(activation_clip_range);
+        }
+        CONSTEXPR npu_set_activation_t &set_activation_clip_range(NPU_NAMESPACE::activation_clip_range value)
+        {
+            activation_clip_range = static_cast<uint8_t>(value) & ((1U << 3) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "activation_function",
+                (activation_function < (sizeof(activation_function_str) / sizeof(activation_function_str[0])) ?
+                     activation_function_str[activation_function] :
+                     "****")));
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "activation_clip_range",
+                (activation_clip_range < (sizeof(activation_clip_range_str) / sizeof(activation_clip_range_str[0])) ?
+                     activation_clip_range_str[activation_clip_range] :
+                     "****")));
+        }
+#endif
+#endif
+    };
+    // Lower bound clip
+    struct npu_set_activation_min_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;        //  control
+        uint32_t clip_boundary : 16; //  Clip boundary for OFM activations
+#ifdef __cplusplus
+      public:
+        npu_set_activation_min_t(uint32_t _clip_boundary) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_ACTIVATION_MIN)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            clip_boundary(static_cast<uint16_t>(_clip_boundary) & ((1U << 16) - 1))
+        {
+        }
+        CONSTEXPR npu_set_activation_min_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_ACTIVATION_MIN)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), clip_boundary(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_ACTIVATION_MIN) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_ACTIVATION_MIN);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_activation_min_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_activation_min_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_clip_boundary() const
+        {
+            return static_cast<uint32_t>(clip_boundary);
+        }
+        CONSTEXPR npu_set_activation_min_t &set_clip_boundary(uint32_t value)
+        {
+            clip_boundary = static_cast<uint16_t>(value) & ((1U << 16) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("clip_boundary", std::to_string(clip_boundary)));
+        }
+#endif
+#endif
+    };
+    // Upper bound clip
+    struct npu_set_activation_max_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;        //  control
+        uint32_t clip_boundary : 16; //  Clip boundary for OFM activations
+#ifdef __cplusplus
+      public:
+        npu_set_activation_max_t(uint32_t _clip_boundary) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_ACTIVATION_MAX)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            clip_boundary(static_cast<uint16_t>(_clip_boundary) & ((1U << 16) - 1))
+        {
+        }
+        CONSTEXPR npu_set_activation_max_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_ACTIVATION_MAX)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), clip_boundary(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_ACTIVATION_MAX) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_ACTIVATION_MAX);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_activation_max_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_activation_max_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_clip_boundary() const
+        {
+            return static_cast<uint32_t>(clip_boundary);
+        }
+        CONSTEXPR npu_set_activation_max_t &set_clip_boundary(uint32_t value)
+        {
+            clip_boundary = static_cast<uint16_t>(value) & ((1U << 16) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("clip_boundary", std::to_string(clip_boundary)));
+        }
+#endif
+#endif
+    };
+    // Index n for weight stream access
+    struct npu_set_weight_region_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t region : 3;  //  Index n for weight stream access
+        uint32_t reserved1 : 13;
+#ifdef __cplusplus
+      public:
+        npu_set_weight_region_t(uint32_t _region) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_WEIGHT_REGION)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            region(static_cast<uint8_t>(_region) & ((1U << 3) - 1)), reserved1(0)
+        {
+        }
+        CONSTEXPR npu_set_weight_region_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_WEIGHT_REGION)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), region(0), reserved1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_WEIGHT_REGION) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_WEIGHT_REGION);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_weight_region_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_weight_region_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_region() const
+        {
+            return static_cast<uint32_t>(region);
+        }
+        CONSTEXPR npu_set_weight_region_t &set_region(uint32_t value)
+        {
+            region = static_cast<uint8_t>(value) & ((1U << 3) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("region", std::to_string(region)));
+        }
+#endif
+#endif
+    };
+    // Index n for scale stream access
+    struct npu_set_scale_region_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t region : 3;  //  Index n for scale stream access
+        uint32_t reserved1 : 13;
+#ifdef __cplusplus
+      public:
+        npu_set_scale_region_t(uint32_t _region) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_SCALE_REGION)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            region(static_cast<uint8_t>(_region) & ((1U << 3) - 1)), reserved1(0)
+        {
+        }
+        CONSTEXPR npu_set_scale_region_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_SCALE_REGION)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), region(0), reserved1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_SCALE_REGION) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_SCALE_REGION);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_scale_region_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_scale_region_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_region() const
+        {
+            return static_cast<uint32_t>(region);
+        }
+        CONSTEXPR npu_set_scale_region_t &set_region(uint32_t value)
+        {
+            region = static_cast<uint8_t>(value) & ((1U << 3) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("region", std::to_string(region)));
+        }
+#endif
+#endif
+    };
+    // Start of ACC0,ACC1 buffers
+    struct npu_set_ab_start_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;  //  control
+        uint32_t ab_start : 6; //  Start of ACC0,ACC1 buffers in the SHRAM in KB units. Multiple of 2
+        uint32_t reserved1 : 10;
+#ifdef __cplusplus
+      public:
+        npu_set_ab_start_t(uint32_t _ab_start) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_AB_START)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            ab_start(static_cast<uint8_t>(_ab_start) & ((1U << 6) - 1)), reserved1(0)
+        {
+        }
+        CONSTEXPR npu_set_ab_start_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_AB_START)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), ab_start(0), reserved1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_AB_START) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_AB_START);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ab_start_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ab_start_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_ab_start() const
+        {
+            return static_cast<uint32_t>(ab_start);
+        }
+        CONSTEXPR npu_set_ab_start_t &set_ab_start(uint32_t value)
+        {
+            ab_start = static_cast<uint8_t>(value) & ((1U << 6) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("ab_start", std::to_string(ab_start)));
+        }
+#endif
+#endif
+    };
+    // Block number of blocks dependency
+    struct npu_set_blockdep_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;  //  control
+        uint32_t blockdep : 2; //  Block number of blocks dependency between kernel operations
+        uint32_t reserved1 : 14;
+#ifdef __cplusplus
+      public:
+        npu_set_blockdep_t(uint32_t _blockdep) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_BLOCKDEP)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            blockdep(static_cast<uint8_t>(_blockdep) & ((1U << 2) - 1)), reserved1(0)
+        {
+        }
+        CONSTEXPR npu_set_blockdep_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_BLOCKDEP)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), blockdep(0), reserved1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_BLOCKDEP) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_BLOCKDEP);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_blockdep_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_blockdep_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_blockdep() const
+        {
+            return static_cast<uint32_t>(blockdep);
+        }
+        CONSTEXPR npu_set_blockdep_t &set_blockdep(uint32_t value)
+        {
+            blockdep = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("blockdep", std::to_string(blockdep)));
+        }
+#endif
+#endif
+    };
+    // DMA0 source region
+    struct npu_set_dma0_src_region_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t region : 3;  //  Region number
+        uint32_t reserved1 : 5;
+        uint32_t region_mode : 1; //  Region mode
+        uint32_t stride_mode : 2; //  Stride mode
+        uint32_t reserved2 : 5;
+#ifdef __cplusplus
+      public:
+        npu_set_dma0_src_region_t(uint32_t _region,
+                                  NPU_NAMESPACE::dma_region_mode _region_mode,
+                                  NPU_NAMESPACE::dma_stride_mode _stride_mode) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_DMA0_SRC_REGION)),
+            reserved0(0), control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            region(static_cast<uint8_t>(_region) & ((1U << 3) - 1)), reserved1(0),
+            region_mode(static_cast<uint8_t>(_region_mode) & ((1U << 1) - 1)),
+            stride_mode(static_cast<uint8_t>(_stride_mode) & ((1U << 2) - 1)), reserved2(0)
+        {
+        }
+        CONSTEXPR npu_set_dma0_src_region_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_DMA0_SRC_REGION)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), region(0), reserved1(0), region_mode(0),
+            stride_mode(0), reserved2(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_DMA0_SRC_REGION) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_DMA0_SRC_REGION);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_dma0_src_region_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_dma0_src_region_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_region() const
+        {
+            return static_cast<uint32_t>(region);
+        }
+        CONSTEXPR npu_set_dma0_src_region_t &set_region(uint32_t value)
+        {
+            region = static_cast<uint8_t>(value) & ((1U << 3) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::dma_region_mode get_region_mode() const
+        {
+            return static_cast<NPU_NAMESPACE::dma_region_mode>(region_mode);
+        }
+        CONSTEXPR npu_set_dma0_src_region_t &set_region_mode(NPU_NAMESPACE::dma_region_mode value)
+        {
+            region_mode = static_cast<uint8_t>(value) & ((1U << 1) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::dma_stride_mode get_stride_mode() const
+        {
+            return static_cast<NPU_NAMESPACE::dma_stride_mode>(stride_mode);
+        }
+        CONSTEXPR npu_set_dma0_src_region_t &set_stride_mode(NPU_NAMESPACE::dma_stride_mode value)
+        {
+            stride_mode = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("region", std::to_string(region)));
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "region_mode",
+                (region_mode < (sizeof(dma_region_mode_str) / sizeof(dma_region_mode_str[0])) ?
+                     dma_region_mode_str[region_mode] :
+                     "****")));
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "stride_mode",
+                (stride_mode < (sizeof(dma_stride_mode_str) / sizeof(dma_stride_mode_str[0])) ?
+                     dma_stride_mode_str[stride_mode] :
+                     "****")));
+        }
+#endif
+#endif
+    };
+    // DMA0 destination region
+    struct npu_set_dma0_dst_region_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t region : 3; //  Region number if region_mode is region_mode_external. Else core mask to write to (bit k
+                             //  set for core k=0,1)
+        uint32_t reserved1 : 5;
+        uint32_t region_mode : 1; //  Region mode
+        uint32_t stride_mode : 2; //  Stride mode
+        uint32_t reserved2 : 5;
+#ifdef __cplusplus
+      public:
+        npu_set_dma0_dst_region_t(uint32_t _region,
+                                  NPU_NAMESPACE::dma_region_mode _region_mode,
+                                  NPU_NAMESPACE::dma_stride_mode _stride_mode) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_DMA0_DST_REGION)),
+            reserved0(0), control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            region(static_cast<uint8_t>(_region) & ((1U << 3) - 1)), reserved1(0),
+            region_mode(static_cast<uint8_t>(_region_mode) & ((1U << 1) - 1)),
+            stride_mode(static_cast<uint8_t>(_stride_mode) & ((1U << 2) - 1)), reserved2(0)
+        {
+        }
+        CONSTEXPR npu_set_dma0_dst_region_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_DMA0_DST_REGION)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), region(0), reserved1(0), region_mode(0),
+            stride_mode(0), reserved2(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_DMA0_DST_REGION) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_DMA0_DST_REGION);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_dma0_dst_region_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_dma0_dst_region_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_region() const
+        {
+            return static_cast<uint32_t>(region);
+        }
+        CONSTEXPR npu_set_dma0_dst_region_t &set_region(uint32_t value)
+        {
+            region = static_cast<uint8_t>(value) & ((1U << 3) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::dma_region_mode get_region_mode() const
+        {
+            return static_cast<NPU_NAMESPACE::dma_region_mode>(region_mode);
+        }
+        CONSTEXPR npu_set_dma0_dst_region_t &set_region_mode(NPU_NAMESPACE::dma_region_mode value)
+        {
+            region_mode = static_cast<uint8_t>(value) & ((1U << 1) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::dma_stride_mode get_stride_mode() const
+        {
+            return static_cast<NPU_NAMESPACE::dma_stride_mode>(stride_mode);
+        }
+        CONSTEXPR npu_set_dma0_dst_region_t &set_stride_mode(NPU_NAMESPACE::dma_stride_mode value)
+        {
+            stride_mode = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("region", std::to_string(region)));
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "region_mode",
+                (region_mode < (sizeof(dma_region_mode_str) / sizeof(dma_region_mode_str[0])) ?
+                     dma_region_mode_str[region_mode] :
+                     "****")));
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "stride_mode",
+                (stride_mode < (sizeof(dma_stride_mode_str) / sizeof(dma_stride_mode_str[0])) ?
+                     dma_stride_mode_str[stride_mode] :
+                     "****")));
+        }
+#endif
+#endif
+    };
+    // Size of second dimension for 2D/3D transfers
+    struct npu_set_dma0_size0_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t size : 16;   //  Size of second dimension for 2D/3D transfers
+#ifdef __cplusplus
+      public:
+        npu_set_dma0_size0_t(uint32_t _size) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_DMA0_SIZE0)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            size(static_cast<uint16_t>(_size) & ((1U << 16) - 1))
+        {
+        }
+        CONSTEXPR npu_set_dma0_size0_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_DMA0_SIZE0)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), size(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_DMA0_SIZE0) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_DMA0_SIZE0);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_dma0_size0_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_dma0_size0_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_size() const
+        {
+            return static_cast<uint32_t>(size);
+        }
+        CONSTEXPR npu_set_dma0_size0_t &set_size(uint32_t value)
+        {
+            size = static_cast<uint16_t>(value) & ((1U << 16) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("size", std::to_string(size)));
+        }
+#endif
+#endif
+    };
+    // Size of third dimension for 3D transfers
+    struct npu_set_dma0_size1_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t size : 16;   //  Size of third dimension for 3D transfers
+#ifdef __cplusplus
+      public:
+        npu_set_dma0_size1_t(uint32_t _size) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_DMA0_SIZE1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            size(static_cast<uint16_t>(_size) & ((1U << 16) - 1))
+        {
+        }
+        CONSTEXPR npu_set_dma0_size1_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_DMA0_SIZE1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), size(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_DMA0_SIZE1) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_DMA0_SIZE1);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_dma0_size1_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_dma0_size1_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_size() const
+        {
+            return static_cast<uint32_t>(size);
+        }
+        CONSTEXPR npu_set_dma0_size1_t &set_size(uint32_t value)
+        {
+            size = static_cast<uint16_t>(value) & ((1U << 16) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("size", std::to_string(size)));
+        }
+#endif
+#endif
+    };
+    // IFM2 broadcast configuration
+    struct npu_set_ifm2_broadcast_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t
+            broadcast_h : 1; //  Broadcast H dimension (if set then any accesses to IFM2 sets y=0 and IFM2 height=1)
+        uint32_t broadcast_w : 1; //  Broadcast W dimension (if set then any accesses to IFM2 sets x=0 and IFM2 width=1)
+        uint32_t broadcast_c : 1; //  Broadcast C dimension (if set then any accesses to IFM2 sets c=0 and IFM2 depth=1)
+        uint32_t reserved1 : 3;
+        uint32_t operand_order : 1;      //  Operand order
+        uint32_t broadcast_constant : 1; //  Broadcast constant given by NPU_SET_IFM2_SCALAR and so ignore BH, BW and BC
+        uint32_t reserved2 : 8;
+#ifdef __cplusplus
+      public:
+        npu_set_ifm2_broadcast_t(NPU_NAMESPACE::broadcast_mode _broadcast_h,
+                                 NPU_NAMESPACE::broadcast_mode _broadcast_w,
+                                 NPU_NAMESPACE::broadcast_mode _broadcast_c,
+                                 NPU_NAMESPACE::ifm2_operand_order _operand_order,
+                                 NPU_NAMESPACE::broadcast_mode _broadcast_constant) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_BROADCAST)),
+            reserved0(0), control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            broadcast_h(static_cast<uint8_t>(_broadcast_h) & ((1U << 1) - 1)),
+            broadcast_w(static_cast<uint8_t>(_broadcast_w) & ((1U << 1) - 1)),
+            broadcast_c(static_cast<uint8_t>(_broadcast_c) & ((1U << 1) - 1)), reserved1(0),
+            operand_order(static_cast<uint8_t>(_operand_order) & ((1U << 1) - 1)),
+            broadcast_constant(static_cast<uint8_t>(_broadcast_constant) & ((1U << 1) - 1)), reserved2(0)
+        {
+        }
+        CONSTEXPR npu_set_ifm2_broadcast_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_BROADCAST)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), broadcast_h(0), broadcast_w(0),
+            broadcast_c(0), reserved1(0), operand_order(0), broadcast_constant(0), reserved2(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_BROADCAST) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_BROADCAST);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ifm2_broadcast_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ifm2_broadcast_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::broadcast_mode get_broadcast_h() const
+        {
+            return static_cast<NPU_NAMESPACE::broadcast_mode>(broadcast_h);
+        }
+        CONSTEXPR npu_set_ifm2_broadcast_t &set_broadcast_h(NPU_NAMESPACE::broadcast_mode value)
+        {
+            broadcast_h = static_cast<uint8_t>(value) & ((1U << 1) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::broadcast_mode get_broadcast_w() const
+        {
+            return static_cast<NPU_NAMESPACE::broadcast_mode>(broadcast_w);
+        }
+        CONSTEXPR npu_set_ifm2_broadcast_t &set_broadcast_w(NPU_NAMESPACE::broadcast_mode value)
+        {
+            broadcast_w = static_cast<uint8_t>(value) & ((1U << 1) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::broadcast_mode get_broadcast_c() const
+        {
+            return static_cast<NPU_NAMESPACE::broadcast_mode>(broadcast_c);
+        }
+        CONSTEXPR npu_set_ifm2_broadcast_t &set_broadcast_c(NPU_NAMESPACE::broadcast_mode value)
+        {
+            broadcast_c = static_cast<uint8_t>(value) & ((1U << 1) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::ifm2_operand_order get_operand_order() const
+        {
+            return static_cast<NPU_NAMESPACE::ifm2_operand_order>(operand_order);
+        }
+        CONSTEXPR npu_set_ifm2_broadcast_t &set_operand_order(NPU_NAMESPACE::ifm2_operand_order value)
+        {
+            operand_order = static_cast<uint8_t>(value) & ((1U << 1) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::broadcast_mode get_broadcast_constant() const
+        {
+            return static_cast<NPU_NAMESPACE::broadcast_mode>(broadcast_constant);
+        }
+        CONSTEXPR npu_set_ifm2_broadcast_t &set_broadcast_constant(NPU_NAMESPACE::broadcast_mode value)
+        {
+            broadcast_constant = static_cast<uint8_t>(value) & ((1U << 1) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "broadcast_h",
+                (broadcast_h < (sizeof(broadcast_mode_str) / sizeof(broadcast_mode_str[0])) ?
+                     broadcast_mode_str[broadcast_h] :
+                     "****")));
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "broadcast_w",
+                (broadcast_w < (sizeof(broadcast_mode_str) / sizeof(broadcast_mode_str[0])) ?
+                     broadcast_mode_str[broadcast_w] :
+                     "****")));
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "broadcast_c",
+                (broadcast_c < (sizeof(broadcast_mode_str) / sizeof(broadcast_mode_str[0])) ?
+                     broadcast_mode_str[broadcast_c] :
+                     "****")));
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "operand_order",
+                (operand_order < (sizeof(ifm2_operand_order_str) / sizeof(ifm2_operand_order_str[0])) ?
+                     ifm2_operand_order_str[operand_order] :
+                     "****")));
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "broadcast_constant",
+                (broadcast_constant < (sizeof(broadcast_mode_str) / sizeof(broadcast_mode_str[0])) ?
+                     broadcast_mode_str[broadcast_constant] :
+                     "****")));
+        }
+#endif
+#endif
+    };
+    // IFM2 scalar value
+    struct npu_set_ifm2_scalar_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t scalar : 16; //  int16 or uint16 depending on ifm2_precision.type
+#ifdef __cplusplus
+      public:
+        npu_set_ifm2_scalar_t(uint32_t _scalar) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_SCALAR)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            scalar(static_cast<uint16_t>(_scalar) & ((1U << 16) - 1))
+        {
+        }
+        CONSTEXPR npu_set_ifm2_scalar_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_SCALAR)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), scalar(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_SCALAR) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_SCALAR);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ifm2_scalar_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ifm2_scalar_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_scalar() const
+        {
+            return static_cast<uint32_t>(scalar);
+        }
+        CONSTEXPR npu_set_ifm2_scalar_t &set_scalar(uint32_t value)
+        {
+            scalar = static_cast<uint16_t>(value) & ((1U << 16) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("scalar", std::to_string(scalar)));
+        }
+#endif
+#endif
+    };
+    // IFM2 Precision
+    struct npu_set_ifm2_precision_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;         //  control
+        uint32_t activation_type : 1; //  IFM type - MUST MATCH IFM
+        uint32_t reserved1 : 1;
+        uint32_t activation_precision : 2; //  IFM precision - MUST MATCH IFM
+        uint32_t reserved2 : 2;
+        uint32_t activation_format : 2; //  IFM format
+        uint32_t reserved3 : 8;
+#ifdef __cplusplus
+      public:
+        npu_set_ifm2_precision_t(NPU_NAMESPACE::activation_type _activation_type,
+                                 NPU_NAMESPACE::activation_precision _activation_precision,
+                                 NPU_NAMESPACE::activation_format _activation_format) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_PRECISION)),
+            reserved0(0), control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            activation_type(static_cast<uint8_t>(_activation_type) & ((1U << 1) - 1)), reserved1(0),
+            activation_precision(static_cast<uint8_t>(_activation_precision) & ((1U << 2) - 1)), reserved2(0),
+            activation_format(static_cast<uint8_t>(_activation_format) & ((1U << 2) - 1)), reserved3(0)
+        {
+        }
+        CONSTEXPR npu_set_ifm2_precision_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_PRECISION)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), activation_type(0), reserved1(0),
+            activation_precision(0), reserved2(0), activation_format(0), reserved3(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_PRECISION) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_PRECISION);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ifm2_precision_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ifm2_precision_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::activation_type get_activation_type() const
+        {
+            return static_cast<NPU_NAMESPACE::activation_type>(activation_type);
+        }
+        CONSTEXPR npu_set_ifm2_precision_t &set_activation_type(NPU_NAMESPACE::activation_type value)
+        {
+            activation_type = static_cast<uint8_t>(value) & ((1U << 1) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::activation_precision get_activation_precision() const
+        {
+            return static_cast<NPU_NAMESPACE::activation_precision>(activation_precision);
+        }
+        CONSTEXPR npu_set_ifm2_precision_t &set_activation_precision(NPU_NAMESPACE::activation_precision value)
+        {
+            activation_precision = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::activation_format get_activation_format() const
+        {
+            return static_cast<NPU_NAMESPACE::activation_format>(activation_format);
+        }
+        CONSTEXPR npu_set_ifm2_precision_t &set_activation_format(NPU_NAMESPACE::activation_format value)
+        {
+            activation_format = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "activation_type",
+                (activation_type < (sizeof(activation_type_str) / sizeof(activation_type_str[0])) ?
+                     activation_type_str[activation_type] :
+                     "****")));
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "activation_precision",
+                (activation_precision < (sizeof(activation_precision_str) / sizeof(activation_precision_str[0])) ?
+                     activation_precision_str[activation_precision] :
+                     "****")));
+            fields.push_back(std::make_pair<std::string, std::string>(
+                "activation_format",
+                (activation_format < (sizeof(activation_format_str) / sizeof(activation_format_str[0])) ?
+                     activation_format_str[activation_format] :
+                     "****")));
+        }
+#endif
+#endif
+    };
+    // IFM2 zero point
+    struct npu_set_ifm2_zero_point_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;     //  control
+        uint32_t zero_point : 16; //  Zero point offset
+#ifdef __cplusplus
+      public:
+        npu_set_ifm2_zero_point_t(uint32_t _zero_point) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_ZERO_POINT)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            zero_point(static_cast<uint16_t>(_zero_point) & ((1U << 16) - 1))
+        {
+        }
+        CONSTEXPR npu_set_ifm2_zero_point_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_ZERO_POINT)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), zero_point(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_ZERO_POINT) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_ZERO_POINT);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ifm2_zero_point_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ifm2_zero_point_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_zero_point() const
+        {
+            return static_cast<uint32_t>(zero_point);
+        }
+        CONSTEXPR npu_set_ifm2_zero_point_t &set_zero_point(uint32_t value)
+        {
+            zero_point = static_cast<uint16_t>(value) & ((1U << 16) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("zero_point", std::to_string(zero_point)));
+        }
+#endif
+#endif
+    };
+    // IFM2 Tile 0 and tile 2 width
+    struct npu_set_ifm2_width0_m1_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;   //  control
+        uint32_t width_m1 : 16; //  IFM2 Tile 0 and tile 2 width
+#ifdef __cplusplus
+      public:
+        npu_set_ifm2_width0_m1_t(uint32_t _width_m1) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_WIDTH0_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            width_m1(static_cast<uint16_t>(_width_m1) & ((1U << 16) - 1))
+        {
+        }
+        CONSTEXPR npu_set_ifm2_width0_m1_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_WIDTH0_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), width_m1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_WIDTH0_M1) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_WIDTH0_M1);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ifm2_width0_m1_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ifm2_width0_m1_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_width_m1() const
+        {
+            return static_cast<uint32_t>(width_m1);
+        }
+        CONSTEXPR npu_set_ifm2_width0_m1_t &set_width_m1(uint32_t value)
+        {
+            width_m1 = static_cast<uint16_t>(value) & ((1U << 16) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("width_m1", std::to_string(width_m1)));
+        }
+#endif
+#endif
+    };
+    // IFM2 Tile 0 height
+    struct npu_set_ifm2_height0_m1_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;    //  control
+        uint32_t height_m1 : 16; //  IFM2 Tile 0 height
+#ifdef __cplusplus
+      public:
+        npu_set_ifm2_height0_m1_t(uint32_t _height_m1) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_HEIGHT0_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            height_m1(static_cast<uint16_t>(_height_m1) & ((1U << 16) - 1))
+        {
+        }
+        CONSTEXPR npu_set_ifm2_height0_m1_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_HEIGHT0_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), height_m1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_HEIGHT0_M1) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_HEIGHT0_M1);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ifm2_height0_m1_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ifm2_height0_m1_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_height_m1() const
+        {
+            return static_cast<uint32_t>(height_m1);
+        }
+        CONSTEXPR npu_set_ifm2_height0_m1_t &set_height_m1(uint32_t value)
+        {
+            height_m1 = static_cast<uint16_t>(value) & ((1U << 16) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("height_m1", std::to_string(height_m1)));
+        }
+#endif
+#endif
+    };
+    // IFM2 Tile 1 height
+    struct npu_set_ifm2_height1_m1_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;    //  control
+        uint32_t height_m1 : 16; //  IFM2 Tile 1 height
+#ifdef __cplusplus
+      public:
+        npu_set_ifm2_height1_m1_t(uint32_t _height_m1) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_HEIGHT1_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            height_m1(static_cast<uint16_t>(_height_m1) & ((1U << 16) - 1))
+        {
+        }
+        CONSTEXPR npu_set_ifm2_height1_m1_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_HEIGHT1_M1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), height_m1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_HEIGHT1_M1) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_HEIGHT1_M1);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ifm2_height1_m1_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ifm2_height1_m1_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_height_m1() const
+        {
+            return static_cast<uint32_t>(height_m1);
+        }
+        CONSTEXPR npu_set_ifm2_height1_m1_t &set_height_m1(uint32_t value)
+        {
+            height_m1 = static_cast<uint16_t>(value) & ((1U << 16) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("height_m1", std::to_string(height_m1)));
+        }
+#endif
+#endif
+    };
+    // Start of IB0,IB1 buffers for IFM2
+    struct npu_set_ifm2_ib_start_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2;  //  control
+        uint32_t ib_start : 6; //  Start of IB0,IB1 buffers for IFM2 in the SHRAM in KB units. Multiple of 2
+        uint32_t reserved1 : 10;
+#ifdef __cplusplus
+      public:
+        npu_set_ifm2_ib_start_t(uint32_t _ib_start) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_IB_START)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            ib_start(static_cast<uint8_t>(_ib_start) & ((1U << 6) - 1)), reserved1(0)
+        {
+        }
+        CONSTEXPR npu_set_ifm2_ib_start_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_IB_START)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), ib_start(0), reserved1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_IB_START) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_IB_START);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ifm2_ib_start_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ifm2_ib_start_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_ib_start() const
+        {
+            return static_cast<uint32_t>(ib_start);
+        }
+        CONSTEXPR npu_set_ifm2_ib_start_t &set_ib_start(uint32_t value)
+        {
+            ib_start = static_cast<uint8_t>(value) & ((1U << 6) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("ib_start", std::to_string(ib_start)));
+        }
+#endif
+#endif
+    };
+    // Index n for IFM2 access
+    struct npu_set_ifm2_region_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t region : 3;  //  Index n for IFM2 access
+        uint32_t reserved1 : 13;
+#ifdef __cplusplus
+      public:
+        npu_set_ifm2_region_t(uint32_t _region) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_REGION)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)),
+            region(static_cast<uint8_t>(_region) & ((1U << 3) - 1)), reserved1(0)
+        {
+        }
+        CONSTEXPR npu_set_ifm2_region_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_REGION)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL)), region(0), reserved1(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_REGION) &&
+                   control == static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd0_opcode::NPU_SET_IFM2_REGION);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD0_CTRL);
+        }
+        operator uint32_t()
+        {
+            uint32_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd0_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd0_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ifm2_region_t &set_opcode(NPU_NAMESPACE::cmd0_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ifm2_region_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_region() const
+        {
+            return static_cast<uint32_t>(region);
+        }
+        CONSTEXPR npu_set_ifm2_region_t &set_region(uint32_t value)
+        {
+            region = static_cast<uint8_t>(value) & ((1U << 3) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("region", std::to_string(region)));
+        }
+#endif
+#endif
+    };
+    // IFM Tile 0 address
+    struct npu_set_ifm_base0_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t addr_hi : 8; //  address extension
+        uint32_t reserved1 : 8;
+        uint32_t addr_lo : 32; //  address offset
+#ifdef __cplusplus
+      public:
+        npu_set_ifm_base0_t(uint64_t _addr) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_BASE0)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)),
+            addr_hi(static_cast<uint8_t>((_addr >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+            reserved1(0),
+            addr_lo(static_cast<uint32_t>((_addr) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+        {
+        }
+        CONSTEXPR npu_set_ifm_base0_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_BASE0)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), addr_hi(0), reserved1(0), addr_lo(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_BASE0) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_BASE0);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR uint64_t get_addr() const
+        {
+            return (static_cast<uint64_t>(addr_hi) << 32) | addr_lo;
+        }
+        CONSTEXPR npu_set_ifm_base0_t &set_addr(uint64_t value)
+        {
+            addr_lo = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            addr_hi = static_cast<uint8_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            std::stringstream saddr;
+            saddr << std::hex << "0x" << get_addr();
+            fields.push_back(std::make_pair<std::string, std::string>("addr", saddr.str()));
+        }
+#endif
+#endif
+    };
+    // IFM Tile 1 address
+    struct npu_set_ifm_base1_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t addr_hi : 8; //  address extension
+        uint32_t reserved1 : 8;
+        uint32_t addr_lo : 32; //  address offset
+#ifdef __cplusplus
+      public:
+        npu_set_ifm_base1_t(uint64_t _addr) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_BASE1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)),
+            addr_hi(static_cast<uint8_t>((_addr >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+            reserved1(0),
+            addr_lo(static_cast<uint32_t>((_addr) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+        {
+        }
+        CONSTEXPR npu_set_ifm_base1_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_BASE1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), addr_hi(0), reserved1(0), addr_lo(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_BASE1) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_BASE1);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR uint64_t get_addr() const
+        {
+            return (static_cast<uint64_t>(addr_hi) << 32) | addr_lo;
+        }
+        CONSTEXPR npu_set_ifm_base1_t &set_addr(uint64_t value)
+        {
+            addr_lo = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            addr_hi = static_cast<uint8_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            std::stringstream saddr;
+            saddr << std::hex << "0x" << get_addr();
+            fields.push_back(std::make_pair<std::string, std::string>("addr", saddr.str()));
+        }
+#endif
+#endif
+    };
+    // IFM Tile 2 address
+    struct npu_set_ifm_base2_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t addr_hi : 8; //  address extension
+        uint32_t reserved1 : 8;
+        uint32_t addr_lo : 32; //  address offset
+#ifdef __cplusplus
+      public:
+        npu_set_ifm_base2_t(uint64_t _addr) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_BASE2)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)),
+            addr_hi(static_cast<uint8_t>((_addr >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+            reserved1(0),
+            addr_lo(static_cast<uint32_t>((_addr) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+        {
+        }
+        CONSTEXPR npu_set_ifm_base2_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_BASE2)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), addr_hi(0), reserved1(0), addr_lo(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_BASE2) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_BASE2);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR uint64_t get_addr() const
+        {
+            return (static_cast<uint64_t>(addr_hi) << 32) | addr_lo;
+        }
+        CONSTEXPR npu_set_ifm_base2_t &set_addr(uint64_t value)
+        {
+            addr_lo = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            addr_hi = static_cast<uint8_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            std::stringstream saddr;
+            saddr << std::hex << "0x" << get_addr();
+            fields.push_back(std::make_pair<std::string, std::string>("addr", saddr.str()));
+        }
+#endif
+#endif
+    };
+    // IFM Tile 3 address
+    struct npu_set_ifm_base3_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t addr_hi : 8; //  address extension
+        uint32_t reserved1 : 8;
+        uint32_t addr_lo : 32; //  address offset
+#ifdef __cplusplus
+      public:
+        npu_set_ifm_base3_t(uint64_t _addr) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_BASE3)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)),
+            addr_hi(static_cast<uint8_t>((_addr >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+            reserved1(0),
+            addr_lo(static_cast<uint32_t>((_addr) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+        {
+        }
+        CONSTEXPR npu_set_ifm_base3_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_BASE3)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), addr_hi(0), reserved1(0), addr_lo(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_BASE3) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_BASE3);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR uint64_t get_addr() const
+        {
+            return (static_cast<uint64_t>(addr_hi) << 32) | addr_lo;
+        }
+        CONSTEXPR npu_set_ifm_base3_t &set_addr(uint64_t value)
+        {
+            addr_lo = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            addr_hi = static_cast<uint8_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            std::stringstream saddr;
+            saddr << std::hex << "0x" << get_addr();
+            fields.push_back(std::make_pair<std::string, std::string>("addr", saddr.str()));
+        }
+#endif
+#endif
+    };
+    // IFM byte stride between horizontal values
+    struct npu_set_ifm_stride_x_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t addr_hi : 8; //  address extension
+        uint32_t reserved1 : 8;
+        uint32_t addr_lo : 32; //  address offset
+#ifdef __cplusplus
+      public:
+        npu_set_ifm_stride_x_t(uint64_t _addr) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_STRIDE_X)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)),
+            addr_hi(static_cast<uint8_t>((_addr >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+            reserved1(0),
+            addr_lo(static_cast<uint32_t>((_addr) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+        {
+        }
+        CONSTEXPR npu_set_ifm_stride_x_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_STRIDE_X)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), addr_hi(0), reserved1(0), addr_lo(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_STRIDE_X) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_STRIDE_X);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR uint64_t get_addr() const
+        {
+            return (static_cast<uint64_t>(addr_hi) << 32) | addr_lo;
+        }
+        CONSTEXPR npu_set_ifm_stride_x_t &set_addr(uint64_t value)
+        {
+            addr_lo = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            addr_hi = static_cast<uint8_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            std::stringstream saddr;
+            saddr << std::hex << "0x" << get_addr();
+            fields.push_back(std::make_pair<std::string, std::string>("addr", saddr.str()));
+        }
+#endif
+#endif
+    };
+    // IFM byte stride between vertical values
+    struct npu_set_ifm_stride_y_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t addr_hi : 8; //  address extension
+        uint32_t reserved1 : 8;
+        uint32_t addr_lo : 32; //  address offset
+#ifdef __cplusplus
+      public:
+        npu_set_ifm_stride_y_t(uint64_t _addr) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_STRIDE_Y)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)),
+            addr_hi(static_cast<uint8_t>((_addr >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+            reserved1(0),
+            addr_lo(static_cast<uint32_t>((_addr) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+        {
+        }
+        CONSTEXPR npu_set_ifm_stride_y_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_STRIDE_Y)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), addr_hi(0), reserved1(0), addr_lo(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_STRIDE_Y) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_STRIDE_Y);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR uint64_t get_addr() const
+        {
+            return (static_cast<uint64_t>(addr_hi) << 32) | addr_lo;
+        }
+        CONSTEXPR npu_set_ifm_stride_y_t &set_addr(uint64_t value)
+        {
+            addr_lo = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            addr_hi = static_cast<uint8_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            std::stringstream saddr;
+            saddr << std::hex << "0x" << get_addr();
+            fields.push_back(std::make_pair<std::string, std::string>("addr", saddr.str()));
+        }
+#endif
+#endif
+    };
+    // IFM byte stride between channel blocks (of 16 bytes each block)
+    struct npu_set_ifm_stride_c_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t addr_hi : 8; //  address extension
+        uint32_t reserved1 : 8;
+        uint32_t addr_lo : 32; //  address offset
+#ifdef __cplusplus
+      public:
+        npu_set_ifm_stride_c_t(uint64_t _addr) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_STRIDE_C)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)),
+            addr_hi(static_cast<uint8_t>((_addr >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+            reserved1(0),
+            addr_lo(static_cast<uint32_t>((_addr) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+        {
+        }
+        CONSTEXPR npu_set_ifm_stride_c_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_STRIDE_C)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), addr_hi(0), reserved1(0), addr_lo(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_STRIDE_C) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM_STRIDE_C);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR uint64_t get_addr() const
+        {
+            return (static_cast<uint64_t>(addr_hi) << 32) | addr_lo;
+        }
+        CONSTEXPR npu_set_ifm_stride_c_t &set_addr(uint64_t value)
+        {
+            addr_lo = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            addr_hi = static_cast<uint8_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            std::stringstream saddr;
+            saddr << std::hex << "0x" << get_addr();
+            fields.push_back(std::make_pair<std::string, std::string>("addr", saddr.str()));
+        }
+#endif
+#endif
+    };
+    // OFM Tile 0 address
+    struct npu_set_ofm_base0_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t addr_hi : 8; //  address extension
+        uint32_t reserved1 : 8;
+        uint32_t addr_lo : 32; //  address offset
+#ifdef __cplusplus
+      public:
+        npu_set_ofm_base0_t(uint64_t _addr) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_BASE0)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)),
+            addr_hi(static_cast<uint8_t>((_addr >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+            reserved1(0),
+            addr_lo(static_cast<uint32_t>((_addr) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+        {
+        }
+        CONSTEXPR npu_set_ofm_base0_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_BASE0)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), addr_hi(0), reserved1(0), addr_lo(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_BASE0) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_BASE0);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR uint64_t get_addr() const
+        {
+            return (static_cast<uint64_t>(addr_hi) << 32) | addr_lo;
+        }
+        CONSTEXPR npu_set_ofm_base0_t &set_addr(uint64_t value)
+        {
+            addr_lo = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            addr_hi = static_cast<uint8_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            std::stringstream saddr;
+            saddr << std::hex << "0x" << get_addr();
+            fields.push_back(std::make_pair<std::string, std::string>("addr", saddr.str()));
+        }
+#endif
+#endif
+    };
+    // OFM Tile 1 address
+    struct npu_set_ofm_base1_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t addr_hi : 8; //  address extension
+        uint32_t reserved1 : 8;
+        uint32_t addr_lo : 32; //  address offset
+#ifdef __cplusplus
+      public:
+        npu_set_ofm_base1_t(uint64_t _addr) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_BASE1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)),
+            addr_hi(static_cast<uint8_t>((_addr >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+            reserved1(0),
+            addr_lo(static_cast<uint32_t>((_addr) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+        {
+        }
+        CONSTEXPR npu_set_ofm_base1_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_BASE1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), addr_hi(0), reserved1(0), addr_lo(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_BASE1) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_BASE1);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR uint64_t get_addr() const
+        {
+            return (static_cast<uint64_t>(addr_hi) << 32) | addr_lo;
+        }
+        CONSTEXPR npu_set_ofm_base1_t &set_addr(uint64_t value)
+        {
+            addr_lo = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            addr_hi = static_cast<uint8_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            std::stringstream saddr;
+            saddr << std::hex << "0x" << get_addr();
+            fields.push_back(std::make_pair<std::string, std::string>("addr", saddr.str()));
+        }
+#endif
+#endif
+    };
+    // OFM Tile 2 address
+    struct npu_set_ofm_base2_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t addr_hi : 8; //  address extension
+        uint32_t reserved1 : 8;
+        uint32_t addr_lo : 32; //  address offset
+#ifdef __cplusplus
+      public:
+        npu_set_ofm_base2_t(uint64_t _addr) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_BASE2)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)),
+            addr_hi(static_cast<uint8_t>((_addr >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+            reserved1(0),
+            addr_lo(static_cast<uint32_t>((_addr) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+        {
+        }
+        CONSTEXPR npu_set_ofm_base2_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_BASE2)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), addr_hi(0), reserved1(0), addr_lo(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_BASE2) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_BASE2);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR uint64_t get_addr() const
+        {
+            return (static_cast<uint64_t>(addr_hi) << 32) | addr_lo;
+        }
+        CONSTEXPR npu_set_ofm_base2_t &set_addr(uint64_t value)
+        {
+            addr_lo = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            addr_hi = static_cast<uint8_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            std::stringstream saddr;
+            saddr << std::hex << "0x" << get_addr();
+            fields.push_back(std::make_pair<std::string, std::string>("addr", saddr.str()));
+        }
+#endif
+#endif
+    };
+    // OFM Tile 3 address
+    struct npu_set_ofm_base3_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t addr_hi : 8; //  address extension
+        uint32_t reserved1 : 8;
+        uint32_t addr_lo : 32; //  address offset
+#ifdef __cplusplus
+      public:
+        npu_set_ofm_base3_t(uint64_t _addr) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_BASE3)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)),
+            addr_hi(static_cast<uint8_t>((_addr >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+            reserved1(0),
+            addr_lo(static_cast<uint32_t>((_addr) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+        {
+        }
+        CONSTEXPR npu_set_ofm_base3_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_BASE3)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), addr_hi(0), reserved1(0), addr_lo(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_BASE3) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_BASE3);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR uint64_t get_addr() const
+        {
+            return (static_cast<uint64_t>(addr_hi) << 32) | addr_lo;
+        }
+        CONSTEXPR npu_set_ofm_base3_t &set_addr(uint64_t value)
+        {
+            addr_lo = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            addr_hi = static_cast<uint8_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            std::stringstream saddr;
+            saddr << std::hex << "0x" << get_addr();
+            fields.push_back(std::make_pair<std::string, std::string>("addr", saddr.str()));
+        }
+#endif
+#endif
+    };
+    // OFM byte stride between horizontal values
+    struct npu_set_ofm_stride_x_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t addr_hi : 8; //  address extension
+        uint32_t reserved1 : 8;
+        uint32_t addr_lo : 32; //  address offset
+#ifdef __cplusplus
+      public:
+        npu_set_ofm_stride_x_t(uint64_t _addr) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_STRIDE_X)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)),
+            addr_hi(static_cast<uint8_t>((_addr >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+            reserved1(0),
+            addr_lo(static_cast<uint32_t>((_addr) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+        {
+        }
+        CONSTEXPR npu_set_ofm_stride_x_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_STRIDE_X)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), addr_hi(0), reserved1(0), addr_lo(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_STRIDE_X) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_STRIDE_X);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR uint64_t get_addr() const
+        {
+            return (static_cast<uint64_t>(addr_hi) << 32) | addr_lo;
+        }
+        CONSTEXPR npu_set_ofm_stride_x_t &set_addr(uint64_t value)
+        {
+            addr_lo = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            addr_hi = static_cast<uint8_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            std::stringstream saddr;
+            saddr << std::hex << "0x" << get_addr();
+            fields.push_back(std::make_pair<std::string, std::string>("addr", saddr.str()));
+        }
+#endif
+#endif
+    };
+    // OFM byte stride between vertical values
+    struct npu_set_ofm_stride_y_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t addr_hi : 8; //  address extension
+        uint32_t reserved1 : 8;
+        uint32_t addr_lo : 32; //  address offset
+#ifdef __cplusplus
+      public:
+        npu_set_ofm_stride_y_t(uint64_t _addr) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_STRIDE_Y)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)),
+            addr_hi(static_cast<uint8_t>((_addr >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+            reserved1(0),
+            addr_lo(static_cast<uint32_t>((_addr) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+        {
+        }
+        CONSTEXPR npu_set_ofm_stride_y_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_STRIDE_Y)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), addr_hi(0), reserved1(0), addr_lo(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_STRIDE_Y) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_STRIDE_Y);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR uint64_t get_addr() const
+        {
+            return (static_cast<uint64_t>(addr_hi) << 32) | addr_lo;
+        }
+        CONSTEXPR npu_set_ofm_stride_y_t &set_addr(uint64_t value)
+        {
+            addr_lo = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            addr_hi = static_cast<uint8_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            std::stringstream saddr;
+            saddr << std::hex << "0x" << get_addr();
+            fields.push_back(std::make_pair<std::string, std::string>("addr", saddr.str()));
+        }
+#endif
+#endif
+    };
+    // OFM byte stride between channel blocks (of 16 bytes each block)
+    struct npu_set_ofm_stride_c_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t addr_hi : 8; //  address extension
+        uint32_t reserved1 : 8;
+        uint32_t addr_lo : 32; //  address offset
+#ifdef __cplusplus
+      public:
+        npu_set_ofm_stride_c_t(uint64_t _addr) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_STRIDE_C)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)),
+            addr_hi(static_cast<uint8_t>((_addr >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+            reserved1(0),
+            addr_lo(static_cast<uint32_t>((_addr) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+        {
+        }
+        CONSTEXPR npu_set_ofm_stride_c_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_STRIDE_C)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), addr_hi(0), reserved1(0), addr_lo(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_STRIDE_C) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_STRIDE_C);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR uint64_t get_addr() const
+        {
+            return (static_cast<uint64_t>(addr_hi) << 32) | addr_lo;
+        }
+        CONSTEXPR npu_set_ofm_stride_c_t &set_addr(uint64_t value)
+        {
+            addr_lo = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            addr_hi = static_cast<uint8_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            std::stringstream saddr;
+            saddr << std::hex << "0x" << get_addr();
+            fields.push_back(std::make_pair<std::string, std::string>("addr", saddr.str()));
+        }
+#endif
+#endif
+    };
+    // Weight stream byte offset in WEIGHT_REGION
+    struct npu_set_weight_base_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t addr_hi : 8; //  address extension
+        uint32_t reserved1 : 8;
+        uint32_t addr_lo : 32; //  address offset
+#ifdef __cplusplus
+      public:
+        npu_set_weight_base_t(uint64_t _addr) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_WEIGHT_BASE)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)),
+            addr_hi(static_cast<uint8_t>((_addr >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+            reserved1(0),
+            addr_lo(static_cast<uint32_t>((_addr) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+        {
+        }
+        CONSTEXPR npu_set_weight_base_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_WEIGHT_BASE)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), addr_hi(0), reserved1(0), addr_lo(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_WEIGHT_BASE) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_WEIGHT_BASE);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR uint64_t get_addr() const
+        {
+            return (static_cast<uint64_t>(addr_hi) << 32) | addr_lo;
+        }
+        CONSTEXPR npu_set_weight_base_t &set_addr(uint64_t value)
+        {
+            addr_lo = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            addr_hi = static_cast<uint8_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            std::stringstream saddr;
+            saddr << std::hex << "0x" << get_addr();
+            fields.push_back(std::make_pair<std::string, std::string>("addr", saddr.str()));
+        }
+#endif
+#endif
+    };
+    // Weight stream byte length
+    struct npu_set_weight_length_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t reserved1 : 16;
+        uint32_t length : 32; //  Weight stream byte length
+#ifdef __cplusplus
+      public:
+        npu_set_weight_length_t(uint32_t _length) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_WEIGHT_LENGTH)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0),
+            length(static_cast<uint32_t>(_length))
+        {
+        }
+        CONSTEXPR npu_set_weight_length_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_WEIGHT_LENGTH)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0), length(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_WEIGHT_LENGTH) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_WEIGHT_LENGTH);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd1_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd1_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_weight_length_t &set_opcode(NPU_NAMESPACE::cmd1_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_weight_length_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_length() const
+        {
+            return static_cast<uint32_t>(length);
+        }
+        CONSTEXPR npu_set_weight_length_t &set_length(uint32_t value)
+        {
+            length = static_cast<uint32_t>(value);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("length", std::to_string(length)));
+        }
+#endif
+#endif
+    };
+    // Scale and bias stream input byte offset from SCALE_REGION
+    struct npu_set_scale_base_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t addr_hi : 8; //  address extension
+        uint32_t reserved1 : 8;
+        uint32_t addr_lo : 32; //  address offset
+#ifdef __cplusplus
+      public:
+        npu_set_scale_base_t(uint64_t _addr) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_SCALE_BASE)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)),
+            addr_hi(static_cast<uint8_t>((_addr >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+            reserved1(0),
+            addr_lo(static_cast<uint32_t>((_addr) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+        {
+        }
+        CONSTEXPR npu_set_scale_base_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_SCALE_BASE)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), addr_hi(0), reserved1(0), addr_lo(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_SCALE_BASE) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_SCALE_BASE);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR uint64_t get_addr() const
+        {
+            return (static_cast<uint64_t>(addr_hi) << 32) | addr_lo;
+        }
+        CONSTEXPR npu_set_scale_base_t &set_addr(uint64_t value)
+        {
+            addr_lo = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            addr_hi = static_cast<uint8_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            std::stringstream saddr;
+            saddr << std::hex << "0x" << get_addr();
+            fields.push_back(std::make_pair<std::string, std::string>("addr", saddr.str()));
+        }
+#endif
+#endif
+    };
+    // Scale and bias stream input byte length
+    struct npu_set_scale_length_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t reserved1 : 16;
+        uint32_t length : 20; //  Scale and bias stream byte length
+        uint32_t reserved2 : 12;
+#ifdef __cplusplus
+      public:
+        npu_set_scale_length_t(uint32_t _length) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_SCALE_LENGTH)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0),
+            length(static_cast<uint32_t>(_length) & ((1U << 20) - 1)), reserved2(0)
+        {
+        }
+        CONSTEXPR npu_set_scale_length_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_SCALE_LENGTH)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0), length(0), reserved2(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_SCALE_LENGTH) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_SCALE_LENGTH);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd1_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd1_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_scale_length_t &set_opcode(NPU_NAMESPACE::cmd1_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_scale_length_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_length() const
+        {
+            return static_cast<uint32_t>(length);
+        }
+        CONSTEXPR npu_set_scale_length_t &set_length(uint32_t value)
+        {
+            length = static_cast<uint32_t>(value) & ((1U << 20) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("length", std::to_string(length)));
+        }
+#endif
+#endif
+    };
+    // OFM scale
+    struct npu_set_ofm_scale_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t shift : 6;   //  Shift
+        uint32_t reserved1 : 10;
+        uint32_t scale : 32; //  Scale. Not applied for 32-bit operations
+#ifdef __cplusplus
+      public:
+        npu_set_ofm_scale_t(uint32_t _shift, uint32_t _scale) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_SCALE)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)),
+            shift(static_cast<uint8_t>(_shift) & ((1U << 6) - 1)), reserved1(0), scale(static_cast<uint32_t>(_scale))
+        {
+        }
+        CONSTEXPR npu_set_ofm_scale_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_SCALE)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), shift(0), reserved1(0), scale(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_SCALE) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OFM_SCALE);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd1_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd1_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_ofm_scale_t &set_opcode(NPU_NAMESPACE::cmd1_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_ofm_scale_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_shift() const
+        {
+            return static_cast<uint32_t>(shift);
+        }
+        CONSTEXPR npu_set_ofm_scale_t &set_shift(uint32_t value)
+        {
+            shift = static_cast<uint8_t>(value) & ((1U << 6) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_scale() const
+        {
+            return static_cast<uint32_t>(scale);
+        }
+        CONSTEXPR npu_set_ofm_scale_t &set_scale(uint32_t value)
+        {
+            scale = static_cast<uint32_t>(value);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("shift", std::to_string(shift)));
+            fields.push_back(std::make_pair<std::string, std::string>("scale", std::to_string(scale)));
+        }
+#endif
+#endif
+    };
+    // Input operand A scale
+    struct npu_set_opa_scale_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t shift : 6;   //  Shift. Ignored if IFM scale mode is 0
+        uint32_t reserved1 : 10;
+        uint32_t scale : 32; //  Scale. 16-bit if IFM scale mode is 0
+#ifdef __cplusplus
+      public:
+        npu_set_opa_scale_t(uint32_t _shift, uint32_t _scale) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OPA_SCALE)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)),
+            shift(static_cast<uint8_t>(_shift) & ((1U << 6) - 1)), reserved1(0), scale(static_cast<uint32_t>(_scale))
+        {
+        }
+        CONSTEXPR npu_set_opa_scale_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OPA_SCALE)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), shift(0), reserved1(0), scale(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OPA_SCALE) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OPA_SCALE);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd1_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd1_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_opa_scale_t &set_opcode(NPU_NAMESPACE::cmd1_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_opa_scale_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_shift() const
+        {
+            return static_cast<uint32_t>(shift);
+        }
+        CONSTEXPR npu_set_opa_scale_t &set_shift(uint32_t value)
+        {
+            shift = static_cast<uint8_t>(value) & ((1U << 6) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_scale() const
+        {
+            return static_cast<uint32_t>(scale);
+        }
+        CONSTEXPR npu_set_opa_scale_t &set_scale(uint32_t value)
+        {
+            scale = static_cast<uint32_t>(value);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("shift", std::to_string(shift)));
+            fields.push_back(std::make_pair<std::string, std::string>("scale", std::to_string(scale)));
+        }
+#endif
+#endif
+    };
+    // Input operand B scale
+    struct npu_set_opb_scale_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t reserved1 : 16;
+        uint32_t scale : 16; //  Scale. Not used if IFM scale mode is 1 or 2
+        uint32_t reserved2 : 16;
+#ifdef __cplusplus
+      public:
+        npu_set_opb_scale_t(uint32_t _scale) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OPB_SCALE)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0),
+            scale(static_cast<uint16_t>(_scale) & ((1U << 16) - 1)), reserved2(0)
+        {
+        }
+        CONSTEXPR npu_set_opb_scale_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OPB_SCALE)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0), scale(0), reserved2(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OPB_SCALE) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_OPB_SCALE);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd1_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd1_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_opb_scale_t &set_opcode(NPU_NAMESPACE::cmd1_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_opb_scale_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_scale() const
+        {
+            return static_cast<uint32_t>(scale);
+        }
+        CONSTEXPR npu_set_opb_scale_t &set_scale(uint32_t value)
+        {
+            scale = static_cast<uint16_t>(value) & ((1U << 16) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("scale", std::to_string(scale)));
+        }
+#endif
+#endif
+    };
+    // DMA user channel 0 source byte offset from DMA0_SRC_REGION
+    struct npu_set_dma0_src_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t addr_hi : 8; //  address extension
+        uint32_t reserved1 : 8;
+        uint32_t addr_lo : 32; //  address offset
+#ifdef __cplusplus
+      public:
+        npu_set_dma0_src_t(uint64_t _addr) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_DMA0_SRC)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)),
+            addr_hi(static_cast<uint8_t>((_addr >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+            reserved1(0),
+            addr_lo(static_cast<uint32_t>((_addr) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+        {
+        }
+        CONSTEXPR npu_set_dma0_src_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_DMA0_SRC)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), addr_hi(0), reserved1(0), addr_lo(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_DMA0_SRC) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_DMA0_SRC);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR uint64_t get_addr() const
+        {
+            return (static_cast<uint64_t>(addr_hi) << 32) | addr_lo;
+        }
+        CONSTEXPR npu_set_dma0_src_t &set_addr(uint64_t value)
+        {
+            addr_lo = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            addr_hi = static_cast<uint8_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            std::stringstream saddr;
+            saddr << std::hex << "0x" << get_addr();
+            fields.push_back(std::make_pair<std::string, std::string>("addr", saddr.str()));
+        }
+#endif
+#endif
+    };
+    // DMA user channel 0 destination byte offset from DMA0_DST_REGION
+    struct npu_set_dma0_dst_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t addr_hi : 8; //  address extension
+        uint32_t reserved1 : 8;
+        uint32_t addr_lo : 32; //  address offset
+#ifdef __cplusplus
+      public:
+        npu_set_dma0_dst_t(uint64_t _addr) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_DMA0_DST)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)),
+            addr_hi(static_cast<uint8_t>((_addr >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+            reserved1(0),
+            addr_lo(static_cast<uint32_t>((_addr) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+        {
+        }
+        CONSTEXPR npu_set_dma0_dst_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_DMA0_DST)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), addr_hi(0), reserved1(0), addr_lo(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_DMA0_DST) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_DMA0_DST);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR uint64_t get_addr() const
+        {
+            return (static_cast<uint64_t>(addr_hi) << 32) | addr_lo;
+        }
+        CONSTEXPR npu_set_dma0_dst_t &set_addr(uint64_t value)
+        {
+            addr_lo = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            addr_hi = static_cast<uint8_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            std::stringstream saddr;
+            saddr << std::hex << "0x" << get_addr();
+            fields.push_back(std::make_pair<std::string, std::string>("addr", saddr.str()));
+        }
+#endif
+#endif
+    };
+    // DMA user channel 0 transfer length in bytes for 1D mode
+    struct npu_set_dma0_len_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t addr_hi : 8; //  address extension
+        uint32_t reserved1 : 8;
+        uint32_t addr_lo : 32; //  address offset
+#ifdef __cplusplus
+      public:
+        npu_set_dma0_len_t(uint64_t _addr) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_DMA0_LEN)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)),
+            addr_hi(static_cast<uint8_t>((_addr >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+            reserved1(0),
+            addr_lo(static_cast<uint32_t>((_addr) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+        {
+        }
+        CONSTEXPR npu_set_dma0_len_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_DMA0_LEN)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), addr_hi(0), reserved1(0), addr_lo(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_DMA0_LEN) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_DMA0_LEN);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR uint64_t get_addr() const
+        {
+            return (static_cast<uint64_t>(addr_hi) << 32) | addr_lo;
+        }
+        CONSTEXPR npu_set_dma0_len_t &set_addr(uint64_t value)
+        {
+            addr_lo = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            addr_hi = static_cast<uint8_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            std::stringstream saddr;
+            saddr << std::hex << "0x" << get_addr();
+            fields.push_back(std::make_pair<std::string, std::string>("addr", saddr.str()));
+        }
+#endif
+#endif
+    };
+    // byte distance to skip after each inner (1D) transfer (2D/3D mode) (any alignment)
+    struct npu_set_dma0_skip0_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t addr_hi : 8; //  address extension
+        uint32_t reserved1 : 8;
+        uint32_t addr_lo : 32; //  address offset
+#ifdef __cplusplus
+      public:
+        npu_set_dma0_skip0_t(uint64_t _addr) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_DMA0_SKIP0)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)),
+            addr_hi(static_cast<uint8_t>((_addr >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+            reserved1(0),
+            addr_lo(static_cast<uint32_t>((_addr) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+        {
+        }
+        CONSTEXPR npu_set_dma0_skip0_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_DMA0_SKIP0)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), addr_hi(0), reserved1(0), addr_lo(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_DMA0_SKIP0) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_DMA0_SKIP0);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR uint64_t get_addr() const
+        {
+            return (static_cast<uint64_t>(addr_hi) << 32) | addr_lo;
+        }
+        CONSTEXPR npu_set_dma0_skip0_t &set_addr(uint64_t value)
+        {
+            addr_lo = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            addr_hi = static_cast<uint8_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            std::stringstream saddr;
+            saddr << std::hex << "0x" << get_addr();
+            fields.push_back(std::make_pair<std::string, std::string>("addr", saddr.str()));
+        }
+#endif
+#endif
+    };
+    // byte distance to skip after each 2D transfer (3D mode) (any alignment)
+    struct npu_set_dma0_skip1_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t addr_hi : 8; //  address extension
+        uint32_t reserved1 : 8;
+        uint32_t addr_lo : 32; //  address offset
+#ifdef __cplusplus
+      public:
+        npu_set_dma0_skip1_t(uint64_t _addr) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_DMA0_SKIP1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)),
+            addr_hi(static_cast<uint8_t>((_addr >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+            reserved1(0),
+            addr_lo(static_cast<uint32_t>((_addr) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+        {
+        }
+        CONSTEXPR npu_set_dma0_skip1_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_DMA0_SKIP1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), addr_hi(0), reserved1(0), addr_lo(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_DMA0_SKIP1) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_DMA0_SKIP1);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR uint64_t get_addr() const
+        {
+            return (static_cast<uint64_t>(addr_hi) << 32) | addr_lo;
+        }
+        CONSTEXPR npu_set_dma0_skip1_t &set_addr(uint64_t value)
+        {
+            addr_lo = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            addr_hi = static_cast<uint8_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            std::stringstream saddr;
+            saddr << std::hex << "0x" << get_addr();
+            fields.push_back(std::make_pair<std::string, std::string>("addr", saddr.str()));
+        }
+#endif
+#endif
+    };
+    // IFM2 Tile 0 address
+    struct npu_set_ifm2_base0_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t addr_hi : 8; //  address extension
+        uint32_t reserved1 : 8;
+        uint32_t addr_lo : 32; //  address offset
+#ifdef __cplusplus
+      public:
+        npu_set_ifm2_base0_t(uint64_t _addr) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_BASE0)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)),
+            addr_hi(static_cast<uint8_t>((_addr >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+            reserved1(0),
+            addr_lo(static_cast<uint32_t>((_addr) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+        {
+        }
+        CONSTEXPR npu_set_ifm2_base0_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_BASE0)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), addr_hi(0), reserved1(0), addr_lo(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_BASE0) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_BASE0);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR uint64_t get_addr() const
+        {
+            return (static_cast<uint64_t>(addr_hi) << 32) | addr_lo;
+        }
+        CONSTEXPR npu_set_ifm2_base0_t &set_addr(uint64_t value)
+        {
+            addr_lo = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            addr_hi = static_cast<uint8_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            std::stringstream saddr;
+            saddr << std::hex << "0x" << get_addr();
+            fields.push_back(std::make_pair<std::string, std::string>("addr", saddr.str()));
+        }
+#endif
+#endif
+    };
+    // IFM2 Tile 1 address
+    struct npu_set_ifm2_base1_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t addr_hi : 8; //  address extension
+        uint32_t reserved1 : 8;
+        uint32_t addr_lo : 32; //  address offset
+#ifdef __cplusplus
+      public:
+        npu_set_ifm2_base1_t(uint64_t _addr) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_BASE1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)),
+            addr_hi(static_cast<uint8_t>((_addr >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+            reserved1(0),
+            addr_lo(static_cast<uint32_t>((_addr) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+        {
+        }
+        CONSTEXPR npu_set_ifm2_base1_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_BASE1)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), addr_hi(0), reserved1(0), addr_lo(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_BASE1) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_BASE1);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR uint64_t get_addr() const
+        {
+            return (static_cast<uint64_t>(addr_hi) << 32) | addr_lo;
+        }
+        CONSTEXPR npu_set_ifm2_base1_t &set_addr(uint64_t value)
+        {
+            addr_lo = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            addr_hi = static_cast<uint8_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            std::stringstream saddr;
+            saddr << std::hex << "0x" << get_addr();
+            fields.push_back(std::make_pair<std::string, std::string>("addr", saddr.str()));
+        }
+#endif
+#endif
+    };
+    // IFM2 Tile 2 address
+    struct npu_set_ifm2_base2_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t addr_hi : 8; //  address extension
+        uint32_t reserved1 : 8;
+        uint32_t addr_lo : 32; //  address offset
+#ifdef __cplusplus
+      public:
+        npu_set_ifm2_base2_t(uint64_t _addr) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_BASE2)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)),
+            addr_hi(static_cast<uint8_t>((_addr >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+            reserved1(0),
+            addr_lo(static_cast<uint32_t>((_addr) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+        {
+        }
+        CONSTEXPR npu_set_ifm2_base2_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_BASE2)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), addr_hi(0), reserved1(0), addr_lo(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_BASE2) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_BASE2);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR uint64_t get_addr() const
+        {
+            return (static_cast<uint64_t>(addr_hi) << 32) | addr_lo;
+        }
+        CONSTEXPR npu_set_ifm2_base2_t &set_addr(uint64_t value)
+        {
+            addr_lo = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            addr_hi = static_cast<uint8_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            std::stringstream saddr;
+            saddr << std::hex << "0x" << get_addr();
+            fields.push_back(std::make_pair<std::string, std::string>("addr", saddr.str()));
+        }
+#endif
+#endif
+    };
+    // IFM2 Tile 3 address
+    struct npu_set_ifm2_base3_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t addr_hi : 8; //  address extension
+        uint32_t reserved1 : 8;
+        uint32_t addr_lo : 32; //  address offset
+#ifdef __cplusplus
+      public:
+        npu_set_ifm2_base3_t(uint64_t _addr) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_BASE3)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)),
+            addr_hi(static_cast<uint8_t>((_addr >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+            reserved1(0),
+            addr_lo(static_cast<uint32_t>((_addr) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+        {
+        }
+        CONSTEXPR npu_set_ifm2_base3_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_BASE3)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), addr_hi(0), reserved1(0), addr_lo(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_BASE3) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_BASE3);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR uint64_t get_addr() const
+        {
+            return (static_cast<uint64_t>(addr_hi) << 32) | addr_lo;
+        }
+        CONSTEXPR npu_set_ifm2_base3_t &set_addr(uint64_t value)
+        {
+            addr_lo = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            addr_hi = static_cast<uint8_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            std::stringstream saddr;
+            saddr << std::hex << "0x" << get_addr();
+            fields.push_back(std::make_pair<std::string, std::string>("addr", saddr.str()));
+        }
+#endif
+#endif
+    };
+    // IFM2 byte stride between horizontal values
+    struct npu_set_ifm2_stride_x_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t addr_hi : 8; //  address extension
+        uint32_t reserved1 : 8;
+        uint32_t addr_lo : 32; //  address offset
+#ifdef __cplusplus
+      public:
+        npu_set_ifm2_stride_x_t(uint64_t _addr) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_STRIDE_X)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)),
+            addr_hi(static_cast<uint8_t>((_addr >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+            reserved1(0),
+            addr_lo(static_cast<uint32_t>((_addr) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+        {
+        }
+        CONSTEXPR npu_set_ifm2_stride_x_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_STRIDE_X)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), addr_hi(0), reserved1(0), addr_lo(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_STRIDE_X) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_STRIDE_X);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR uint64_t get_addr() const
+        {
+            return (static_cast<uint64_t>(addr_hi) << 32) | addr_lo;
+        }
+        CONSTEXPR npu_set_ifm2_stride_x_t &set_addr(uint64_t value)
+        {
+            addr_lo = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            addr_hi = static_cast<uint8_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            std::stringstream saddr;
+            saddr << std::hex << "0x" << get_addr();
+            fields.push_back(std::make_pair<std::string, std::string>("addr", saddr.str()));
+        }
+#endif
+#endif
+    };
+    // IFM2 byte stride between vertical values
+    struct npu_set_ifm2_stride_y_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t addr_hi : 8; //  address extension
+        uint32_t reserved1 : 8;
+        uint32_t addr_lo : 32; //  address offset
+#ifdef __cplusplus
+      public:
+        npu_set_ifm2_stride_y_t(uint64_t _addr) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_STRIDE_Y)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)),
+            addr_hi(static_cast<uint8_t>((_addr >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+            reserved1(0),
+            addr_lo(static_cast<uint32_t>((_addr) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+        {
+        }
+        CONSTEXPR npu_set_ifm2_stride_y_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_STRIDE_Y)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), addr_hi(0), reserved1(0), addr_lo(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_STRIDE_Y) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_STRIDE_Y);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR uint64_t get_addr() const
+        {
+            return (static_cast<uint64_t>(addr_hi) << 32) | addr_lo;
+        }
+        CONSTEXPR npu_set_ifm2_stride_y_t &set_addr(uint64_t value)
+        {
+            addr_lo = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            addr_hi = static_cast<uint8_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            std::stringstream saddr;
+            saddr << std::hex << "0x" << get_addr();
+            fields.push_back(std::make_pair<std::string, std::string>("addr", saddr.str()));
+        }
+#endif
+#endif
+    };
+    // IFM2 byte stride between channel blocks (of 16 bytes each block)
+    struct npu_set_ifm2_stride_c_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t addr_hi : 8; //  address extension
+        uint32_t reserved1 : 8;
+        uint32_t addr_lo : 32; //  address offset
+#ifdef __cplusplus
+      public:
+        npu_set_ifm2_stride_c_t(uint64_t _addr) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_STRIDE_C)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)),
+            addr_hi(static_cast<uint8_t>((_addr >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+            reserved1(0),
+            addr_lo(static_cast<uint32_t>((_addr) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+        {
+        }
+        CONSTEXPR npu_set_ifm2_stride_c_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_STRIDE_C)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), addr_hi(0), reserved1(0), addr_lo(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_STRIDE_C) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_IFM2_STRIDE_C);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR uint64_t get_addr() const
+        {
+            return (static_cast<uint64_t>(addr_hi) << 32) | addr_lo;
+        }
+        CONSTEXPR npu_set_ifm2_stride_c_t &set_addr(uint64_t value)
+        {
+            addr_lo = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            addr_hi = static_cast<uint8_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            std::stringstream saddr;
+            saddr << std::hex << "0x" << get_addr();
+            fields.push_back(std::make_pair<std::string, std::string>("addr", saddr.str()));
+        }
+#endif
+#endif
+    };
+    // Weight stream byte offset in WEIGHT_REGION for core 1
+    struct npu_set_weight1_base_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t addr_hi : 8; //  address extension
+        uint32_t reserved1 : 8;
+        uint32_t addr_lo : 32; //  address offset
+#ifdef __cplusplus
+      public:
+        npu_set_weight1_base_t(uint64_t _addr) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_WEIGHT1_BASE)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)),
+            addr_hi(static_cast<uint8_t>((_addr >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+            reserved1(0),
+            addr_lo(static_cast<uint32_t>((_addr) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+        {
+        }
+        CONSTEXPR npu_set_weight1_base_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_WEIGHT1_BASE)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), addr_hi(0), reserved1(0), addr_lo(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_WEIGHT1_BASE) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_WEIGHT1_BASE);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR uint64_t get_addr() const
+        {
+            return (static_cast<uint64_t>(addr_hi) << 32) | addr_lo;
+        }
+        CONSTEXPR npu_set_weight1_base_t &set_addr(uint64_t value)
+        {
+            addr_lo = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            addr_hi = static_cast<uint8_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            std::stringstream saddr;
+            saddr << std::hex << "0x" << get_addr();
+            fields.push_back(std::make_pair<std::string, std::string>("addr", saddr.str()));
+        }
+#endif
+#endif
+    };
+    // Weight stream byte length for core 1
+    struct npu_set_weight1_length_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t reserved1 : 16;
+        uint32_t length : 32; //  Weight stream byte length
+#ifdef __cplusplus
+      public:
+        npu_set_weight1_length_t(uint32_t _length) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_WEIGHT1_LENGTH)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0),
+            length(static_cast<uint32_t>(_length))
+        {
+        }
+        CONSTEXPR npu_set_weight1_length_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_WEIGHT1_LENGTH)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0), length(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_WEIGHT1_LENGTH) &&
+                   control >= 1 && control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_WEIGHT1_LENGTH);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd1_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd1_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_weight1_length_t &set_opcode(NPU_NAMESPACE::cmd1_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_weight1_length_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_length() const
+        {
+            return static_cast<uint32_t>(length);
+        }
+        CONSTEXPR npu_set_weight1_length_t &set_length(uint32_t value)
+        {
+            length = static_cast<uint32_t>(value);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("length", std::to_string(length)));
+        }
+#endif
+#endif
+    };
+    // Scale and bias stream input byte offset from SCALE_REGION for core 1
+    struct npu_set_scale1_base_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t addr_hi : 8; //  address extension
+        uint32_t reserved1 : 8;
+        uint32_t addr_lo : 32; //  address offset
+#ifdef __cplusplus
+      public:
+        npu_set_scale1_base_t(uint64_t _addr) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_SCALE1_BASE)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)),
+            addr_hi(static_cast<uint8_t>((_addr >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()))),
+            reserved1(0),
+            addr_lo(static_cast<uint32_t>((_addr) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max())))
+        {
+        }
+        CONSTEXPR npu_set_scale1_base_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_SCALE1_BASE)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), addr_hi(0), reserved1(0), addr_lo(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_SCALE1_BASE) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_SCALE1_BASE);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR uint64_t get_addr() const
+        {
+            return (static_cast<uint64_t>(addr_hi) << 32) | addr_lo;
+        }
+        CONSTEXPR npu_set_scale1_base_t &set_addr(uint64_t value)
+        {
+            addr_lo = static_cast<uint32_t>((value) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            addr_hi = static_cast<uint8_t>((value >> 32) & static_cast<uint64_t>(std::numeric_limits<uint64_t>::max()));
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            std::stringstream saddr;
+            saddr << std::hex << "0x" << get_addr();
+            fields.push_back(std::make_pair<std::string, std::string>("addr", saddr.str()));
+        }
+#endif
+#endif
+    };
+    // Scale and bias stream input byte length for core 1
+    struct npu_set_scale1_length_t
+    {
+#ifdef __cplusplus
+      private:
+#endif
+        uint32_t opcode : 10; //  opcode
+        uint32_t reserved0 : 4;
+        uint32_t control : 2; //  control
+        uint32_t reserved1 : 16;
+        uint32_t length : 20; //  Scale and bias stream byte length
+        uint32_t reserved2 : 12;
+#ifdef __cplusplus
+      public:
+        npu_set_scale1_length_t(uint32_t _length) :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_SCALE1_LENGTH)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0),
+            length(static_cast<uint32_t>(_length) & ((1U << 20) - 1)), reserved2(0)
+        {
+        }
+        CONSTEXPR npu_set_scale1_length_t() :
+            opcode(static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_SCALE1_LENGTH)), reserved0(0),
+            control(static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL)), reserved1(0), length(0), reserved2(0)
+        {
+        }
+        CONSTEXPR bool valid() const
+        {
+            return opcode == static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_SCALE1_LENGTH) && control >= 1 &&
+                   control <= 2;
+        }
+        CONSTEXPR void init()
+        {
+            opcode  = static_cast<uint16_t>(NPU_NAMESPACE::cmd1_opcode::NPU_SET_SCALE1_LENGTH);
+            control = static_cast<uint8_t>(NPU_NAMESPACE::cmd_ctrl::CMD1_CTRL);
+        }
+        operator uint64_t()
+        {
+            uint64_t word;
+            std::memcpy(&word, this, sizeof(word));
+            return word;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd1_opcode get_opcode() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd1_opcode>(opcode);
+        }
+        CONSTEXPR npu_set_scale1_length_t &set_opcode(NPU_NAMESPACE::cmd1_opcode value)
+        {
+            opcode = static_cast<uint16_t>(value) & ((1U << 10) - 1);
+            return *this;
+        }
+        CONSTEXPR NPU_NAMESPACE::cmd_ctrl get_control() const
+        {
+            return static_cast<NPU_NAMESPACE::cmd_ctrl>(control);
+        }
+        CONSTEXPR npu_set_scale1_length_t &set_control(NPU_NAMESPACE::cmd_ctrl value)
+        {
+            control = static_cast<uint8_t>(value) & ((1U << 2) - 1);
+            return *this;
+        }
+        CONSTEXPR uint32_t get_length() const
+        {
+            return static_cast<uint32_t>(length);
+        }
+        CONSTEXPR npu_set_scale1_length_t &set_length(uint32_t value)
+        {
+            length = static_cast<uint32_t>(value) & ((1U << 20) - 1);
+            return *this;
+        }
+#ifdef NPU_DISASSEMBLE
+        void disassemble(std::vector<std::pair<std::string, std::string>> &fields) const
+        {
+            fields.push_back(std::make_pair<std::string, std::string>("length", std::to_string(length)));
+        }
+#endif
+#endif
+    };
+#ifdef __cplusplus
+};
+#endif
+#define NPU_OP_STRUCTS                                                                                                 \
+    NPU_OP_(stop)                                                                                                      \
+    NPU_OP_(irq)                                                                                                       \
+    NPU_OP_(conv)                                                                                                      \
+    NPU_OP_(depthwise)                                                                                                 \
+    NPU_OP_(pool)                                                                                                      \
+    NPU_OP_(elementwise)                                                                                               \
+    NPU_OP_(dma_start)                                                                                                 \
+    NPU_OP_(dma_wait)                                                                                                  \
+    NPU_OP_(kernel_wait)                                                                                               \
+    NPU_OP_(pmu_mask)
+
+#define NPU_SET_STRUCTS                                                                                                \
+    NPU_SET_(ifm_pad_top)                                                                                              \
+    NPU_SET_(ifm_pad_left)                                                                                             \
+    NPU_SET_(ifm_pad_right)                                                                                            \
+    NPU_SET_(ifm_pad_bottom)                                                                                           \
+    NPU_SET_(ifm_depth_m1)                                                                                             \
+    NPU_SET_(ifm_precision)                                                                                            \
+    NPU_SET_(ifm_upscale)                                                                                              \
+    NPU_SET_(ifm_zero_point)                                                                                           \
+    NPU_SET_(ifm_width0_m1)                                                                                            \
+    NPU_SET_(ifm_height0_m1)                                                                                           \
+    NPU_SET_(ifm_height1_m1)                                                                                           \
+    NPU_SET_(ifm_ib_end)                                                                                               \
+    NPU_SET_(ifm_region)                                                                                               \
+    NPU_SET_(ofm_width_m1)                                                                                             \
+    NPU_SET_(ofm_height_m1)                                                                                            \
+    NPU_SET_(ofm_depth_m1)                                                                                             \
+    NPU_SET_(ofm_precision)                                                                                            \
+    NPU_SET_(ofm_blk_width_m1)                                                                                         \
+    NPU_SET_(ofm_blk_height_m1)                                                                                        \
+    NPU_SET_(ofm_blk_depth_m1)                                                                                         \
+    NPU_SET_(ofm_zero_point)                                                                                           \
+    NPU_SET_(ofm_width0_m1)                                                                                            \
+    NPU_SET_(ofm_height0_m1)                                                                                           \
+    NPU_SET_(ofm_height1_m1)                                                                                           \
+    NPU_SET_(ofm_region)                                                                                               \
+    NPU_SET_(kernel_width_m1)                                                                                          \
+    NPU_SET_(kernel_height_m1)                                                                                         \
+    NPU_SET_(kernel_stride)                                                                                            \
+    NPU_SET_(parallel_mode)                                                                                            \
+    NPU_SET_(acc_format)                                                                                               \
+    NPU_SET_(activation)                                                                                               \
+    NPU_SET_(activation_min)                                                                                           \
+    NPU_SET_(activation_max)                                                                                           \
+    NPU_SET_(weight_region)                                                                                            \
+    NPU_SET_(scale_region)                                                                                             \
+    NPU_SET_(ab_start)                                                                                                 \
+    NPU_SET_(blockdep)                                                                                                 \
+    NPU_SET_(dma0_src_region)                                                                                          \
+    NPU_SET_(dma0_dst_region)                                                                                          \
+    NPU_SET_(dma0_size0)                                                                                               \
+    NPU_SET_(dma0_size1)                                                                                               \
+    NPU_SET_(ifm2_broadcast)                                                                                           \
+    NPU_SET_(ifm2_scalar)                                                                                              \
+    NPU_SET_(ifm2_precision)                                                                                           \
+    NPU_SET_(ifm2_zero_point)                                                                                          \
+    NPU_SET_(ifm2_width0_m1)                                                                                           \
+    NPU_SET_(ifm2_height0_m1)                                                                                          \
+    NPU_SET_(ifm2_height1_m1)                                                                                          \
+    NPU_SET_(ifm2_ib_start)                                                                                            \
+    NPU_SET_(ifm2_region)                                                                                              \
+    NPU_SET_(ifm_base0)                                                                                                \
+    NPU_SET_(ifm_base1)                                                                                                \
+    NPU_SET_(ifm_base2)                                                                                                \
+    NPU_SET_(ifm_base3)                                                                                                \
+    NPU_SET_(ifm_stride_x)                                                                                             \
+    NPU_SET_(ifm_stride_y)                                                                                             \
+    NPU_SET_(ifm_stride_c)                                                                                             \
+    NPU_SET_(ofm_base0)                                                                                                \
+    NPU_SET_(ofm_base1)                                                                                                \
+    NPU_SET_(ofm_base2)                                                                                                \
+    NPU_SET_(ofm_base3)                                                                                                \
+    NPU_SET_(ofm_stride_x)                                                                                             \
+    NPU_SET_(ofm_stride_y)                                                                                             \
+    NPU_SET_(ofm_stride_c)                                                                                             \
+    NPU_SET_(weight_base)                                                                                              \
+    NPU_SET_(weight_length)                                                                                            \
+    NPU_SET_(scale_base)                                                                                               \
+    NPU_SET_(scale_length)                                                                                             \
+    NPU_SET_(ofm_scale)                                                                                                \
+    NPU_SET_(opa_scale)                                                                                                \
+    NPU_SET_(opb_scale)                                                                                                \
+    NPU_SET_(dma0_src)                                                                                                 \
+    NPU_SET_(dma0_dst)                                                                                                 \
+    NPU_SET_(dma0_len)                                                                                                 \
+    NPU_SET_(dma0_skip0)                                                                                               \
+    NPU_SET_(dma0_skip1)                                                                                               \
+    NPU_SET_(ifm2_base0)                                                                                               \
+    NPU_SET_(ifm2_base1)                                                                                               \
+    NPU_SET_(ifm2_base2)                                                                                               \
+    NPU_SET_(ifm2_base3)                                                                                               \
+    NPU_SET_(ifm2_stride_x)                                                                                            \
+    NPU_SET_(ifm2_stride_y)                                                                                            \
+    NPU_SET_(ifm2_stride_c)                                                                                            \
+    NPU_SET_(weight1_base)                                                                                             \
+    NPU_SET_(weight1_length)                                                                                           \
+    NPU_SET_(scale1_base)                                                                                              \
+    NPU_SET_(scale1_length)
+
+#define EXPAND_ACC_FORMAT(FUNC, SEP) FUNC(acc_format, I32) SEP FUNC(acc_format, I40) SEP FUNC(acc_format, F16)
+
+#define EXPAND_ACTIVATION_CLIP_RANGE(FUNC, SEP)                                                                        \
+    FUNC(activation_clip_range, OFM_PRECISION)                                                                         \
+    SEP FUNC(activation_clip_range, FORCE_UINT8) SEP FUNC(activation_clip_range, FORCE_INT8)                           \
+        SEP FUNC(activation_clip_range, FORCE_INT16)
+
+#define EXPAND_ACTIVATION_FORMAT(FUNC, SEP) FUNC(activation_format, NHWC) SEP FUNC(activation_format, NHCWB16)
+
+#define EXPAND_ACTIVATION_FUNCTION(FUNC, SEP)                                                                          \
+    FUNC(activation_function, RELU)                                                                                    \
+    SEP FUNC(activation_function, TANH) SEP FUNC(activation_function, SIGMOID) SEP FUNC(activation_function, TABLE_0)  \
+        SEP FUNC(activation_function, TABLE_1) SEP FUNC(activation_function, TABLE_2)                                  \
+            SEP FUNC(activation_function, TABLE_3) SEP FUNC(activation_function, TABLE_4)                              \
+                SEP FUNC(activation_function, TABLE_5) SEP FUNC(activation_function, TABLE_6)                          \
+                    SEP FUNC(activation_function, TABLE_7)
+
+#define EXPAND_ACTIVATION_PRECISION(FUNC, SEP)                                                                         \
+    FUNC(activation_precision, B8)                                                                                     \
+    SEP FUNC(activation_precision, B16) SEP FUNC(activation_precision, B32) SEP FUNC(activation_precision, B64)
+
+#define EXPAND_ACTIVATION_TYPE(FUNC, SEP) FUNC(activation_type, UNSIGNED) SEP FUNC(activation_type, SIGNED)
+
+#define EXPAND_AXI_MEM_ENCODING(FUNC, SEP)                                                                             \
+    FUNC(axi_mem_encoding, DEVICE_NON_BUFFERABLE)                                                                      \
+    SEP FUNC(axi_mem_encoding, DEVICE_BUFFERABLE) SEP FUNC(axi_mem_encoding, NORMAL_NON_CACHEABLE_NON_BUFFERABLE)      \
+        SEP FUNC(axi_mem_encoding, NORMAL_NON_CACHEABLE_BUFFERABLE)                                                    \
+            SEP FUNC(axi_mem_encoding, WRITE_THROUGH_NO_ALLOCATE)                                                      \
+                SEP FUNC(axi_mem_encoding, WRITE_THROUGH_READ_ALLOCATE)                                                \
+                    SEP FUNC(axi_mem_encoding, WRITE_THROUGH_WRITE_ALLOCATE)                                           \
+                        SEP FUNC(axi_mem_encoding, WRITE_THROUGH_READ_AND_WRITE_ALLOCATE)                              \
+                            SEP FUNC(axi_mem_encoding, WRITE_BACK_NO_ALLOCATE)                                         \
+                                SEP FUNC(axi_mem_encoding, WRITE_BACK_READ_ALLOCATE)                                   \
+                                    SEP FUNC(axi_mem_encoding, WRITE_BACK_WRITE_ALLOCATE)                              \
+                                        SEP FUNC(axi_mem_encoding, WRITE_BACK_READ_AND_WRITE_ALLOCATE)
+
+#define EXPAND_BROADCAST_MODE(FUNC, SEP) FUNC(broadcast_mode, DISABLE) SEP FUNC(broadcast_mode, ENABLE)
+
+#define EXPAND_CMD0_OPCODE(FUNC, SEP)                                                                                  \
+    FUNC(cmd0_opcode, NPU_OP_STOP)                                                                                     \
+    SEP FUNC(cmd0_opcode, NPU_OP_IRQ) SEP FUNC(cmd0_opcode, NPU_OP_CONV) SEP FUNC(                                     \
+        cmd0_opcode, NPU_OP_DEPTHWISE) SEP FUNC(cmd0_opcode, NPU_OP_POOL) SEP FUNC(cmd0_opcode, NPU_OP_ELEMENTWISE)    \
+        SEP FUNC(cmd0_opcode, NPU_OP_DMA_START) SEP FUNC(cmd0_opcode, NPU_OP_DMA_WAIT) SEP FUNC(                       \
+            cmd0_opcode, NPU_OP_KERNEL_WAIT) SEP FUNC(cmd0_opcode, NPU_OP_PMU_MASK) SEP FUNC(cmd0_opcode,              \
+                                                                                             NPU_SET_IFM_PAD_TOP)      \
+            SEP FUNC(cmd0_opcode, NPU_SET_IFM_PAD_LEFT) SEP FUNC(cmd0_opcode, NPU_SET_IFM_PAD_RIGHT) SEP FUNC(         \
+                cmd0_opcode, NPU_SET_IFM_PAD_BOTTOM) SEP FUNC(cmd0_opcode,                                             \
+                                                              NPU_SET_IFM_DEPTH_M1) SEP FUNC(cmd0_opcode,              \
+                                                                                             NPU_SET_IFM_PRECISION)    \
+                SEP FUNC(cmd0_opcode, NPU_SET_IFM_UPSCALE) SEP FUNC(cmd0_opcode, NPU_SET_IFM_ZERO_POINT) SEP FUNC(     \
+                    cmd0_opcode, NPU_SET_IFM_WIDTH0_M1) SEP FUNC(cmd0_opcode, NPU_SET_IFM_HEIGHT0_M1)                  \
+                    SEP FUNC(cmd0_opcode, NPU_SET_IFM_HEIGHT1_M1) SEP FUNC(cmd0_opcode, NPU_SET_IFM_IB_END) SEP FUNC(  \
+                        cmd0_opcode, NPU_SET_IFM_REGION) SEP FUNC(cmd0_opcode, NPU_SET_OFM_WIDTH_M1)                   \
+                        SEP FUNC(cmd0_opcode, NPU_SET_OFM_HEIGHT_M1) SEP FUNC(cmd0_opcode, NPU_SET_OFM_DEPTH_M1)       \
+                            SEP FUNC(cmd0_opcode, NPU_SET_OFM_PRECISION) SEP FUNC(                                     \
+                                cmd0_opcode, NPU_SET_OFM_BLK_WIDTH_M1) SEP FUNC(cmd0_opcode,                           \
+                                                                                NPU_SET_OFM_BLK_HEIGHT_M1)             \
+                                SEP FUNC(cmd0_opcode, NPU_SET_OFM_BLK_DEPTH_M1) SEP FUNC(                              \
+                                    cmd0_opcode, NPU_SET_OFM_ZERO_POINT) SEP FUNC(cmd0_opcode, NPU_SET_OFM_WIDTH0_M1)  \
+                                    SEP FUNC(cmd0_opcode, NPU_SET_OFM_HEIGHT0_M1) SEP FUNC(                            \
+                                        cmd0_opcode,                                                                   \
+                                        NPU_SET_OFM_HEIGHT1_M1) SEP FUNC(cmd0_opcode, NPU_SET_OFM_REGION)              \
+                                        SEP FUNC(cmd0_opcode, NPU_SET_KERNEL_WIDTH_M1) SEP FUNC(                       \
+                                            cmd0_opcode,                                                               \
+                                            NPU_SET_KERNEL_HEIGHT_M1) SEP FUNC(cmd0_opcode, NPU_SET_KERNEL_STRIDE)     \
+                                            SEP FUNC(cmd0_opcode, NPU_SET_PARALLEL_MODE) SEP FUNC(                     \
+                                                cmd0_opcode,                                                           \
+                                                NPU_SET_ACC_FORMAT) SEP FUNC(cmd0_opcode, NPU_SET_ACTIVATION)          \
+                                                SEP FUNC(cmd0_opcode,                                                  \
+                                                         NPU_SET_ACTIVATION_MIN) SEP FUNC(cmd0_opcode,                 \
+                                                                                          NPU_SET_ACTIVATION_MAX)      \
+                                                    SEP FUNC(cmd0_opcode, NPU_SET_WEIGHT_REGION) SEP FUNC(             \
+                                                        cmd0_opcode,                                                   \
+                                                        NPU_SET_SCALE_REGION) SEP FUNC(cmd0_opcode, NPU_SET_AB_START)  \
+                                                        SEP FUNC(cmd0_opcode, NPU_SET_BLOCKDEP)                        \
+                                                            SEP FUNC(cmd0_opcode, NPU_SET_DMA0_SRC_REGION) SEP FUNC(   \
+                                                                cmd0_opcode,                                           \
+                                                                NPU_SET_DMA0_DST_REGION) SEP FUNC(cmd0_opcode,         \
+                                                                                                  NPU_SET_DMA0_SIZE0)  \
+                                                                SEP FUNC(cmd0_opcode, NPU_SET_DMA0_SIZE1) SEP FUNC(    \
+                                                                    cmd0_opcode,                                       \
+                                                                    NPU_SET_IFM2_BROADCAST) SEP                        \
+                                                                    FUNC(cmd0_opcode, NPU_SET_IFM2_SCALAR) SEP FUNC(   \
+                                                                        cmd0_opcode,                                   \
+                                                                        NPU_SET_IFM2_PRECISION) SEP                    \
+                                                                        FUNC(cmd0_opcode, NPU_SET_IFM2_ZERO_POINT) SEP \
+                                                                            FUNC(cmd0_opcode,                          \
+                                                                                 NPU_SET_IFM2_WIDTH0_M1) SEP           \
+                                                                                FUNC(cmd0_opcode,                      \
+                                                                                     NPU_SET_IFM2_HEIGHT0_M1) SEP      \
+                                                                                    FUNC(cmd0_opcode,                  \
+                                                                                         NPU_SET_IFM2_HEIGHT1_M1)      \
+                                                                                        SEP FUNC(                      \
+                                                                                            cmd0_opcode,               \
+                                                                                            NPU_SET_IFM2_IB_START)     \
+                                                                                            SEP FUNC(                  \
+                                                                                                cmd0_opcode,           \
+                                                                                                NPU_SET_IFM2_REGION)
+
+#define EXPAND_CMD1_OPCODE(FUNC, SEP)                                                                                  \
+    FUNC(cmd1_opcode, NPU_SET_IFM_BASE0)                                                                               \
+    SEP FUNC(cmd1_opcode, NPU_SET_IFM_BASE1) SEP FUNC(cmd1_opcode, NPU_SET_IFM_BASE2)                                  \
+        SEP FUNC(cmd1_opcode, NPU_SET_IFM_BASE3) SEP FUNC(cmd1_opcode, NPU_SET_IFM_STRIDE_X)                           \
+            SEP FUNC(cmd1_opcode, NPU_SET_IFM_STRIDE_Y) SEP FUNC(cmd1_opcode, NPU_SET_IFM_STRIDE_C) SEP FUNC(          \
+                cmd1_opcode, NPU_SET_OFM_BASE0) SEP FUNC(cmd1_opcode, NPU_SET_OFM_BASE1)                               \
+                SEP FUNC(cmd1_opcode, NPU_SET_OFM_BASE2) SEP FUNC(cmd1_opcode, NPU_SET_OFM_BASE3) SEP FUNC(            \
+                    cmd1_opcode, NPU_SET_OFM_STRIDE_X) SEP FUNC(cmd1_opcode, NPU_SET_OFM_STRIDE_Y)                     \
+                    SEP FUNC(cmd1_opcode, NPU_SET_OFM_STRIDE_C) SEP FUNC(cmd1_opcode, NPU_SET_WEIGHT_BASE) SEP FUNC(   \
+                        cmd1_opcode, NPU_SET_WEIGHT_LENGTH) SEP FUNC(cmd1_opcode, NPU_SET_SCALE_BASE)                  \
+                        SEP FUNC(cmd1_opcode, NPU_SET_SCALE_LENGTH) SEP FUNC(cmd1_opcode, NPU_SET_OFM_SCALE)           \
+                            SEP FUNC(cmd1_opcode, NPU_SET_OPA_SCALE) SEP FUNC(cmd1_opcode, NPU_SET_OPB_SCALE)          \
+                                SEP FUNC(cmd1_opcode, NPU_SET_DMA0_SRC) SEP FUNC(cmd1_opcode, NPU_SET_DMA0_DST)        \
+                                    SEP FUNC(cmd1_opcode, NPU_SET_DMA0_LEN) SEP FUNC(cmd1_opcode, NPU_SET_DMA0_SKIP0)  \
+                                        SEP FUNC(cmd1_opcode, NPU_SET_DMA0_SKIP1) SEP FUNC(                            \
+                                            cmd1_opcode, NPU_SET_IFM2_BASE0) SEP FUNC(cmd1_opcode, NPU_SET_IFM2_BASE1) \
+                                            SEP FUNC(cmd1_opcode, NPU_SET_IFM2_BASE2) SEP FUNC(cmd1_opcode,            \
+                                                                                               NPU_SET_IFM2_BASE3)     \
+                                                SEP FUNC(cmd1_opcode, NPU_SET_IFM2_STRIDE_X)                           \
+                                                    SEP FUNC(cmd1_opcode, NPU_SET_IFM2_STRIDE_Y)                       \
+                                                        SEP FUNC(cmd1_opcode, NPU_SET_IFM2_STRIDE_C)                   \
+                                                            SEP FUNC(cmd1_opcode, NPU_SET_WEIGHT1_BASE)                \
+                                                                SEP FUNC(cmd1_opcode, NPU_SET_WEIGHT1_LENGTH)          \
+                                                                    SEP FUNC(cmd1_opcode, NPU_SET_SCALE1_BASE)         \
+                                                                        SEP FUNC(cmd1_opcode, NPU_SET_SCALE1_LENGTH)
+
+#define EXPAND_CMD_CTRL(FUNC, SEP) FUNC(cmd_ctrl, CMD0_CTRL) SEP FUNC(cmd_ctrl, CMD1_CTRL)
+
+#define EXPAND_CUSTOM_DMA(FUNC, SEP) FUNC(custom_dma, NOT_IMPLEMENTED) SEP FUNC(custom_dma, IMPLEMENTED)
+
+#define EXPAND_DMA_FAULT_SRC(FUNC, SEP) FUNC(dma_fault_src, AXI_M0) SEP FUNC(dma_fault_src, AXI_M1)
+
+#define EXPAND_DMA_REGION_MODE(FUNC, SEP) FUNC(dma_region_mode, EXTERNAL) SEP FUNC(dma_region_mode, INTERNAL)
+
+#define EXPAND_DMA_STRIDE_MODE(FUNC, SEP)                                                                              \
+    FUNC(dma_stride_mode, D1) SEP FUNC(dma_stride_mode, D2) SEP FUNC(dma_stride_mode, D3)
+
+#define EXPAND_ELEMENTWISE_MODE(FUNC, SEP)                                                                             \
+    FUNC(elementwise_mode, MUL)                                                                                        \
+    SEP FUNC(elementwise_mode, ADD) SEP FUNC(elementwise_mode, SUB) SEP FUNC(elementwise_mode, MIN)                    \
+        SEP FUNC(elementwise_mode, MAX) SEP FUNC(elementwise_mode, LRELU) SEP FUNC(elementwise_mode, ABS)              \
+            SEP FUNC(elementwise_mode, CLZ) SEP FUNC(elementwise_mode, SHR) SEP FUNC(elementwise_mode, SHL)
+
+#define EXPAND_FUNCTIONAL_SAFETY(FUNC, SEP)                                                                            \
+    FUNC(functional_safety, NOT_IMPLEMENTED) SEP FUNC(functional_safety, IMPLEMENTED)
+
+#define EXPAND_IFM2_OPERAND_ORDER(FUNC, SEP) FUNC(ifm2_operand_order, ORDER_B) SEP FUNC(ifm2_operand_order, ORDER_A)
+
+#define EXPAND_IFM_SCALE_MODE(FUNC, SEP)                                                                               \
+    FUNC(ifm_scale_mode, OPA_OPB_16) SEP FUNC(ifm_scale_mode, OPA_32) SEP FUNC(ifm_scale_mode, OPB_32)
+
+#define EXPAND_IFM_UPSCALE_MODE(FUNC, SEP)                                                                             \
+    FUNC(ifm_upscale_mode, NONE) SEP FUNC(ifm_upscale_mode, NEAREST) SEP FUNC(ifm_upscale_mode, ZEROS)
+
+#define EXPAND_KERNEL_DECOMPOSITION(FUNC, SEP) FUNC(kernel_decomposition, D8X8) SEP FUNC(kernel_decomposition, D4X4)
+
+#define EXPAND_KERNEL_DILATION(FUNC, SEP) FUNC(kernel_dilation, NONE) SEP FUNC(kernel_dilation, X2)
+
+#define EXPAND_MAX_BEATS(FUNC, SEP) FUNC(max_beats, B64) SEP FUNC(max_beats, B128) SEP FUNC(max_beats, B256)
+
+#define EXPAND_MEM_ATTR(FUNC, SEP)                                                                                     \
+    FUNC(mem_attr, AXI0_OUTSTANDING_COUNTER0)                                                                          \
+    SEP FUNC(mem_attr, AXI0_OUTSTANDING_COUNTER1) SEP FUNC(mem_attr, AXI1_OUTSTANDING_COUNTER2)                        \
+        SEP FUNC(mem_attr, AXI1_OUTSTANDING_COUNTER3)
+
+#define EXPAND_OFM_SCALE_MODE(FUNC, SEP) FUNC(ofm_scale_mode, PER_CHANNEL) SEP FUNC(ofm_scale_mode, GLOBAL)
+
+#define EXPAND_PARALLEL_MODE(FUNC, SEP) FUNC(parallel_mode, SINGLE_CORE) SEP FUNC(parallel_mode, DUAL_CORE_DEPTH)
+
+#define EXPAND_PMU_AXI_CHANNEL(FUNC, SEP)                                                                              \
+    FUNC(pmu_axi_channel, RD_CMD)                                                                                      \
+    SEP FUNC(pmu_axi_channel, RD_IFM) SEP FUNC(pmu_axi_channel, RD_WEIGHTS) SEP FUNC(pmu_axi_channel, RD_SCALE_BIAS)   \
+        SEP FUNC(pmu_axi_channel, RD_MEM2MEM) SEP FUNC(pmu_axi_channel, WR_OFM) SEP FUNC(pmu_axi_channel, WR_MEM2MEM)
+
+#define EXPAND_PMU_EVENT(FUNC, SEP)                                                                                                    \
+    FUNC(pmu_event, NO_EVENT)                                                                                                          \
+    SEP FUNC(pmu_event, CYCLE) SEP FUNC(pmu_event, NPU_IDLE) SEP FUNC(pmu_event, CC_STALLED_ON_BLOCKDEP) SEP FUNC(                     \
+        pmu_event, CC_STALLED_ON_SHRAM_RECONFIG) SEP FUNC(pmu_event, NPU_ACTIVE) SEP FUNC(pmu_event, MAC_ACTIVE)                       \
+        SEP FUNC(pmu_event, MAC_ACTIVE_8BIT) SEP FUNC(pmu_event, MAC_ACTIVE_16BIT) SEP FUNC(                                           \
+            pmu_event, MAC_DPU_ACTIVE) SEP FUNC(pmu_event, MAC_STALLED_BY_WD_ACC) SEP FUNC(pmu_event,                                  \
+                                                                                           MAC_STALLED_BY_WD)                          \
+            SEP FUNC(pmu_event, MAC_STALLED_BY_ACC) SEP FUNC(pmu_event, MAC_STALLED_BY_IB) SEP FUNC(                                   \
+                pmu_event,                                                                                                             \
+                MAC_ACTIVE_32BIT) SEP FUNC(pmu_event,                                                                                  \
+                                           MAC_STALLED_BY_INT_W) SEP FUNC(pmu_event,                                                   \
+                                                                          MAC_STALLED_BY_INT_ACC) SEP FUNC(pmu_event,                  \
+                                                                                                           AO_ACTIVE)                  \
+                SEP FUNC(pmu_event, AO_ACTIVE_8BIT) SEP FUNC(pmu_event, AO_ACTIVE_16BIT) SEP FUNC(                                     \
+                    pmu_event, AO_STALLED_BY_OFMP_OB) SEP FUNC(pmu_event, AO_STALLED_BY_OFMP) SEP                                      \
+                    FUNC(pmu_event, AO_STALLED_BY_OB) SEP FUNC(pmu_event, AO_STALLED_BY_ACC_IB) SEP FUNC(                              \
+                        pmu_event, AO_STALLED_BY_ACC) SEP FUNC(pmu_event, AO_STALLED_BY_IB) SEP                                        \
+                        FUNC(pmu_event, WD_ACTIVE) SEP FUNC(pmu_event, WD_STALLED) SEP FUNC(pmu_event, WD_STALLED_BY_WS) SEP FUNC(     \
+                            pmu_event, WD_STALLED_BY_WD_BUF) SEP FUNC(pmu_event,                                                       \
+                                                                      WD_PARSE_ACTIVE) SEP                                             \
+                            FUNC(pmu_event, WD_PARSE_STALLED) SEP FUNC(pmu_event, WD_PARSE_STALLED_IN) SEP FUNC(                       \
+                                pmu_event, WD_PARSE_STALLED_OUT) SEP FUNC(pmu_event,                                                   \
+                                                                          WD_TRANS_WS) SEP                                             \
+                                FUNC(pmu_event, WD_TRANS_WB) SEP FUNC(pmu_event, WD_TRANS_DW0) SEP FUNC(                               \
+                                    pmu_event, WD_TRANS_DW1) SEP FUNC(pmu_event,                                                       \
+                                                                      AXI0_RD_TRANS_ACCEPTED) SEP                                      \
+                                    FUNC(pmu_event, AXI0_RD_TRANS_COMPLETED) SEP FUNC(pmu_event, AXI0_RD_DATA_BEAT_RECEIVED) SEP FUNC( \
+                                        pmu_event, AXI0_RD_TRAN_REQ_STALLED) SEP FUNC(pmu_event,                                       \
+                                                                                      AXI0_WR_TRANS_ACCEPTED) SEP                      \
+                                        FUNC(pmu_event, AXI0_WR_TRANS_COMPLETED_M) SEP FUNC(                                           \
+                                            pmu_event, AXI0_WR_TRANS_COMPLETED_S) SEP                                                  \
+                                            FUNC(pmu_event, AXI0_WR_DATA_BEAT_WRITTEN) SEP FUNC(                                       \
+                                                pmu_event, AXI0_WR_TRAN_REQ_STALLED) SEP                                               \
+                                                FUNC(pmu_event, AXI0_WR_DATA_BEAT_STALLED) SEP FUNC(                                   \
+                                                    pmu_event,                                                                         \
+                                                    AXI0_ENABLED_CYCLES) SEP FUNC(pmu_event,                                           \
+                                                                                  AXI0_RD_STALL_LIMIT) SEP                             \
+                                                    FUNC(pmu_event, AXI0_WR_STALL_LIMIT) SEP FUNC(                                     \
+                                                        pmu_event,                                                                     \
+                                                        AXI_LATENCY_ANY) SEP FUNC(pmu_event,                                           \
+                                                                                  AXI_LATENCY_32) SEP                                  \
+                                                        FUNC(pmu_event,                                                                \
+                                                             AXI_LATENCY_64) SEP FUNC(pmu_event,                                       \
+                                                                                      AXI_LATENCY_128) SEP                             \
+                                                            FUNC(pmu_event, AXI_LATENCY_256) SEP FUNC(                                 \
+                                                                pmu_event,                                                             \
+                                                                AXI_LATENCY_512) SEP FUNC(pmu_event,                                   \
+                                                                                          AXI_LATENCY_1024) SEP                        \
+                                                                FUNC(pmu_event, ECC_DMA) SEP FUNC(                                     \
+                                                                    pmu_event,                                                         \
+                                                                    ECC_SB0) SEP FUNC(pmu_event,                                       \
+                                                                                      AXI1_RD_TRANS_ACCEPTED) SEP                      \
+                                                                    FUNC(pmu_event, AXI1_RD_TRANS_COMPLETED) SEP FUNC(                 \
+                                                                        pmu_event, AXI1_RD_DATA_BEAT_RECEIVED) SEP                     \
+                                                                        FUNC(pmu_event, AXI1_RD_TRAN_REQ_STALLED) SEP FUNC(            \
+                                                                            pmu_event, AXI1_WR_TRANS_ACCEPTED) SEP                     \
+                                                                            FUNC(pmu_event, AXI1_WR_TRANS_COMPLETED_M) SEP FUNC(       \
+                                                                                pmu_event,                                             \
+                                                                                AXI1_WR_TRANS_COMPLETED_S) SEP                         \
+                                                                                FUNC(pmu_event,                                        \
+                                                                                     AXI1_WR_DATA_BEAT_WRITTEN) SEP                    \
+                                                                                    FUNC(pmu_event,                                    \
+                                                                                         AXI1_WR_TRAN_REQ_STALLED) SEP                 \
+                                                                                        FUNC(                                          \
+                                                                                            pmu_event,                                 \
+                                                                                            AXI1_WR_DATA_BEAT_STALLED) SEP             \
+                                                                                            FUNC(                                      \
+                                                                                                pmu_event,                             \
+                                                                                                AXI1_ENABLED_CYCLES) SEP               \
+                                                                                                FUNC(                                  \
+                                                                                                    pmu_event,                         \
+                                                                                                    AXI1_RD_STALL_LIMIT) SEP           \
+                                                                                                    FUNC(                              \
+                                                                                                        pmu_event,                     \
+                                                                                                        AXI1_WR_STALL_LIMIT)           \
+                                                                                                        SEP FUNC(                      \
+                                                                                                            pmu_event,                 \
+                                                                                                            ECC_SB1)
+
+#define EXPAND_POOLING_MODE(FUNC, SEP)                                                                                 \
+    FUNC(pooling_mode, MAX) SEP FUNC(pooling_mode, AVERAGE) SEP FUNC(pooling_mode, REDUCE_SUM)
+
+#define EXPAND_PRIVILEGE_LEVEL(FUNC, SEP) FUNC(privilege_level, USER) SEP FUNC(privilege_level, PRIVILEGED)
+
+#define EXPAND_ROUND_MODE(FUNC, SEP) FUNC(round_mode, DBL) SEP FUNC(round_mode, TRUNCATE) SEP FUNC(round_mode, NATURAL)
+
+#define EXPAND_SECURITY_LEVEL(FUNC, SEP) FUNC(security_level, SECURE) SEP FUNC(security_level, NON_SECURE)
+
+#define EXPAND_STATE(FUNC, SEP) FUNC(state, STOPPED) SEP FUNC(state, RUNNING)
+
+#define EXPAND_WD_CORE_SLICE_STATE(FUNC, SEP)                                                                          \
+    FUNC(wd_core_slice_state, HEADER) SEP FUNC(wd_core_slice_state, PALETTE) SEP FUNC(wd_core_slice_state, WEIGHTS)
+
+#define EXPAND_WD_CTRL_STATE(FUNC, SEP)                                                                                \
+    FUNC(wd_ctrl_state, IDLE)                                                                                          \
+    SEP FUNC(wd_ctrl_state, DRAIN) SEP FUNC(wd_ctrl_state, OFD_INIT) SEP FUNC(wd_ctrl_state, OFD_RUN)
+
+#define EXPAND_WEIGHT_ORDER(FUNC, SEP) FUNC(weight_order, DEPTH_FIRST) SEP FUNC(weight_order, PART_KERNEL_FIRST)
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/src/ethosu_common.h b/src/ethosu_common.h
deleted file mode 100644
index 90cc6da..0000000
--- a/src/ethosu_common.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (c) 2019-2021 Arm Limited. All rights reserved.
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Licensed under the Apache License, Version 2.0 (the License); you may
- * not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an AS IS BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef ETHOSU_COMMON_H
-#define ETHOSU_COMMON_H
-
-/******************************************************************************
- * Includes
- ******************************************************************************/
-
-/******************************************************************************
- * Defines
- ******************************************************************************/
-
-#define UNUSED(x) ((void)x)
-
-#define MASK_0_31_BITS (0xFFFFFFFF)
-#define MASK_32_47_BITS (0xFFFF00000000)
-
-#endif // ETHOSU_COMMON_H
diff --git a/src/ethosu_device.h b/src/ethosu_device.h
new file mode 100644
index 0000000..2f41d5c
--- /dev/null
+++ b/src/ethosu_device.h
@@ -0,0 +1,137 @@
+/*
+ * Copyright (c) 2019-2021 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ETHOSU_DEVICE_H
+#define ETHOSU_DEVICE_H
+
+/******************************************************************************
+ * Includes
+ ******************************************************************************/
+#include "ethosu_types.h"
+
+#include <stdbool.h>
+#include <stdint.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/******************************************************************************
+ * Defines
+ ******************************************************************************/
+
+#ifndef ETHOSU_PMU_NCOUNTERS
+#define ETHOSU_PMU_NCOUNTERS 4
+#endif
+
+/******************************************************************************
+ * Types
+ ******************************************************************************/
+struct NPU_REG; // Forward declare, to be implemented by each device
+
+struct ethosu_device
+{
+    volatile struct NPU_REG *reg; // Register map
+    uint32_t secure;
+    uint32_t privileged;
+};
+
+/******************************************************************************
+ * Prototypes
+ ******************************************************************************/
+
+/**
+ * Initialize the device.
+ */
+struct ethosu_device *ethosu_dev_init(const void *base_address, uint32_t secure_enable, uint32_t privilege_enable);
+
+/**
+ * Deinitialize the device.
+ */
+void ethosu_dev_deinit(struct ethosu_device *dev);
+
+/**
+ * Initialize AXI settings for device.
+ */
+enum ethosu_error_codes ethosu_dev_axi_init(struct ethosu_device *dev);
+
+/**
+ * Execute a given command stream on NPU.
+ * \param[in] cmd_stream_ptr   Pointer to the command stream
+ * \param[in] cms_length       Command stream length
+ * \param[in] base_addr        Pointer to array of base addresses
+ *                             - 0: weight tensor
+ *                             - 1: scratch tensor
+ *                             - All input tensors
+ *                             - All output tensors
+ * \param[in] num_base_addr    Number of base addresses.
+ * \return                     \ref ethosu_error_codes
+ */
+enum ethosu_error_codes ethosu_dev_run_command_stream(struct ethosu_device *dev,
+                                                      const uint8_t *cmd_stream_ptr,
+                                                      uint32_t cms_length,
+                                                      const uint64_t *base_addr,
+                                                      int num_base_addr);
+
+/**
+ *  Interrupt handler on device layer
+ * \return                     true if NPU status is OK, otherwise false
+ */
+bool ethosu_dev_handle_interrupt(struct ethosu_device *dev);
+
+/**
+ * Get hardware information from NPU
+ * \param[out] hwinfo          Pointer to the hardware info struct to be filled in.
+ */
+void ethosu_dev_get_hw_info(struct ethosu_device *dev, struct ethosu_hw_info *hwinfo);
+
+/**
+ * Verify that requested security state and privilege mode are active
+ * \return                     32 bit status value
+ */
+bool ethosu_dev_verify_access_state(struct ethosu_device *dev);
+
+/**
+ * Performs a NPU soft reset and waits for the NPU to become ready
+ * \return                     \ref ethosu_error_codes
+ */
+enum ethosu_error_codes ethosu_dev_soft_reset(struct ethosu_device *dev);
+
+/**
+ * Enable/disable clock and power using clock/power q interface.
+ * \param[in] clock_q          Clock q ENABLE/DISABLE \ref clock_q_request.
+ * \param[in] power_q          Power q ENABLE/DISABLE \ref power_q_request.
+ * \return                     \ref ethosu_error_codes
+ */
+enum ethosu_error_codes ethosu_dev_set_clock_and_power(struct ethosu_device *dev,
+                                                       enum ethosu_clock_q_request clock_q,
+                                                       enum ethosu_power_q_request power_q);
+
+/**
+ * Verifies that optimizer parameters from model are compatible with the hardware
+ * \param[in] cfg              Config data from optimizer.
+ * \param[in] id               Id data from optimizer.
+ * \return                     true if parameters match with hardware, false otherwise.
+ */
+bool ethosu_dev_verify_optimizer_config(struct ethosu_device *dev, uint32_t cfg_in, uint32_t id_in);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // ETHOSU_DEVICE_H
diff --git a/src/ethosu_device_u55.c b/src/ethosu_device_u55.c
deleted file mode 100644
index 87add7e..0000000
--- a/src/ethosu_device_u55.c
+++ /dev/null
@@ -1,549 +0,0 @@
-/*
- * Copyright (c) 2019-2021 Arm Limited. All rights reserved.
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Licensed under the Apache License, Version 2.0 (the License); you may
- * not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an AS IS BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#include "ethosu55_interface.h"
-
-#include "ethosu_common.h"
-#include "ethosu_config.h"
-#include "ethosu_device.h"
-#include "ethosu_log.h"
-
-#include <assert.h>
-#include <stddef.h>
-#include <stdio.h>
-
-#define BASEP_OFFSET 4
-#define REG_OFFSET 4
-#define BYTES_1KB 1024
-
-#define ADDRESS_BITS 48
-#define ADDRESS_MASK ((1ull << ADDRESS_BITS) - 1)
-
-enum ethosu_error_codes ethosu_dev_init(struct ethosu_device *dev,
-                                        const void *base_address,
-                                        uint32_t secure_enable,
-                                        uint32_t privilege_enable)
-{
-    dev->base_address = (volatile uintptr_t)base_address;
-    dev->secure       = secure_enable;
-    dev->privileged   = privilege_enable;
-
-    ethosu_dev_save_pmu_config(dev);
-
-    return ETHOSU_SUCCESS;
-}
-
-enum ethosu_error_codes ethosu_dev_get_id(struct ethosu_device *dev, struct ethosu_id *id)
-{
-    struct id_r _id;
-
-    _id.word = ethosu_dev_read_reg(dev, NPU_REG_ID);
-
-    id->version_status = _id.version_status;
-    id->version_minor  = _id.version_minor;
-    id->version_major  = _id.version_major;
-    id->product_major  = _id.product_major;
-    id->arch_patch_rev = _id.arch_patch_rev;
-    id->arch_minor_rev = _id.arch_minor_rev;
-    id->arch_major_rev = _id.arch_major_rev;
-
-    return ETHOSU_SUCCESS;
-}
-
-enum ethosu_error_codes ethosu_dev_get_config(struct ethosu_device *dev, struct ethosu_config *config)
-{
-    struct config_r cfg = {0};
-
-    cfg.word = ethosu_dev_read_reg(dev, NPU_REG_CONFIG);
-
-    config->macs_per_cc        = cfg.macs_per_cc;
-    config->cmd_stream_version = cfg.cmd_stream_version;
-    config->shram_size         = cfg.shram_size;
-    config->custom_dma         = cfg.custom_dma;
-
-    return ETHOSU_SUCCESS;
-}
-
-enum ethosu_error_codes ethosu_dev_run_command_stream(struct ethosu_device *dev,
-                                                      const uint8_t *cmd_stream_ptr,
-                                                      uint32_t cms_length,
-                                                      const uint64_t *base_addr,
-                                                      int num_base_addr)
-{
-    assert(num_base_addr <= ETHOSU_BASEP_INDEXES);
-
-    uint64_t qbase = (uintptr_t)cmd_stream_ptr + BASE_POINTER_OFFSET;
-    assert(qbase <= ADDRESS_MASK);
-    LOG_DEBUG("QBASE=0x%016llx, QSIZE=%u, base_pointer_offset=0x%08x\n", qbase, cms_length, BASE_POINTER_OFFSET);
-
-    ethosu_dev_write_reg(dev, NPU_REG_QBASE0, qbase & 0xffffffff);
-    ethosu_dev_write_reg(dev, NPU_REG_QBASE1, qbase >> 32);
-    ethosu_dev_write_reg(dev, NPU_REG_QSIZE, cms_length);
-
-    for (int i = 0; i < num_base_addr; i++)
-    {
-        uint64_t addr = base_addr[i] + BASE_POINTER_OFFSET;
-        assert(addr <= ADDRESS_MASK);
-        LOG_DEBUG("BASEP%d=0x%016llx\n", i, addr);
-        ethosu_dev_write_reg(dev, NPU_REG_BASEP0 + (2 * i) * BASEP_OFFSET, addr & 0xffffffff);
-        ethosu_dev_write_reg(dev, NPU_REG_BASEP0 + (2 * i + 1) * BASEP_OFFSET, addr >> 32);
-    }
-
-    return ethosu_dev_set_command_run(dev);
-}
-
-enum ethosu_error_codes ethosu_dev_is_irq_raised(struct ethosu_device *dev, uint8_t *irq_raised)
-{
-    struct status_r status;
-
-    status.word = ethosu_dev_read_reg(dev, NPU_REG_STATUS);
-
-    if (status.irq_raised == 1)
-    {
-        *irq_raised = 1;
-    }
-    else
-    {
-        *irq_raised = 0;
-    }
-
-    return ETHOSU_SUCCESS;
-}
-
-enum ethosu_error_codes ethosu_dev_clear_irq_status(struct ethosu_device *dev)
-{
-    struct cmd_r oldcmd;
-    struct cmd_r cmd;
-
-    oldcmd.word = ethosu_dev_read_reg(dev, NPU_REG_CMD);
-
-    cmd.word           = 0;
-    cmd.clear_irq      = 1;
-    cmd.clock_q_enable = oldcmd.clock_q_enable;
-    cmd.power_q_enable = oldcmd.power_q_enable;
-    ethosu_dev_write_reg(dev, NPU_REG_CMD, cmd.word);
-    LOG_DEBUG("CMD=0x%08x\n", cmd.word);
-
-    return ETHOSU_SUCCESS;
-}
-
-enum ethosu_error_codes ethosu_dev_soft_reset(struct ethosu_device *dev)
-{
-    enum ethosu_error_codes return_code = ETHOSU_SUCCESS;
-    struct reset_r reset;
-    struct prot_r prot;
-
-    reset.word        = 0;
-    reset.pending_CPL = dev->privileged ? PRIVILEGE_LEVEL_PRIVILEGED : PRIVILEGE_LEVEL_USER;
-    reset.pending_CSL = dev->secure ? SECURITY_LEVEL_SECURE : SECURITY_LEVEL_NON_SECURE;
-
-    // Reset and set security level
-    LOG_INFO("Soft reset NPU\n");
-    ethosu_dev_write_reg(dev, NPU_REG_RESET, reset.word);
-
-    // Wait for reset to complete
-    return_code = ethosu_dev_wait_for_reset(dev);
-    if (return_code != ETHOSU_SUCCESS)
-    {
-        LOG_ERR("Soft reset timed out\n");
-        return return_code;
-    }
-
-    // Verify that NPU has switched security state and privilege level
-    prot.word = ethosu_dev_read_reg(dev, NPU_REG_PROT);
-    if (prot.active_CPL != reset.pending_CPL || prot.active_CSL != reset.pending_CSL)
-    {
-        LOG_ERR("Failed to switch security state and privilege level\n");
-        // Register access not permitted
-        return ETHOSU_GENERIC_FAILURE;
-    }
-
-    // Save the prot register
-    dev->proto = prot.word;
-
-    // Soft reset will clear the PMU configuration and counters. The shadow PMU counters
-    // are cleared by saving the PMU counters to ram, which will read back zeros.
-    // The PMU configuration will be restored in the invoke function after power save
-    // has been disabled.
-    ethosu_dev_save_pmu_counters(dev);
-
-    return return_code;
-}
-
-enum ethosu_error_codes ethosu_dev_wait_for_reset(struct ethosu_device *dev)
-{
-    struct status_r status;
-
-    // Wait until reset status indicates that reset has been completed
-    for (int i = 0; i < 100000; i++)
-    {
-        status.word = ethosu_dev_read_reg(dev, NPU_REG_STATUS);
-        if (0 == status.reset_status)
-        {
-            break;
-        }
-    }
-
-    if (1 == status.reset_status)
-    {
-        return ETHOSU_GENERIC_FAILURE;
-    }
-
-    return ETHOSU_SUCCESS;
-}
-
-enum ethosu_error_codes ethosu_dev_read_apb_reg(struct ethosu_device *dev,
-                                                uint32_t start_address,
-                                                uint16_t num_reg,
-                                                uint32_t *reg)
-{
-    uint32_t address = start_address;
-
-    assert((start_address + num_reg) < ID_REGISTERS_SIZE);
-
-    for (int i = 0; i < num_reg; i++)
-    {
-        reg[i] = ethosu_dev_read_reg(dev, address);
-        address += REG_OFFSET;
-    }
-
-    return ETHOSU_SUCCESS;
-}
-
-enum ethosu_error_codes ethosu_dev_set_qconfig(struct ethosu_device *dev, enum ethosu_memory_type memory_type)
-{
-    if (memory_type > ETHOSU_AXI1_OUTSTANDING_COUNTER3)
-    {
-        return ETHOSU_INVALID_PARAM;
-    }
-    ethosu_dev_write_reg(dev, NPU_REG_QCONFIG, memory_type);
-    LOG_DEBUG("QCONFIG=0x%08x\n", memory_type);
-
-    return ETHOSU_SUCCESS;
-}
-
-enum ethosu_error_codes ethosu_dev_set_regioncfg(struct ethosu_device *dev,
-                                                 uint8_t region,
-                                                 enum ethosu_memory_type memory_type)
-{
-    struct regioncfg_r regioncfg;
-
-    if (region > 7)
-    {
-        return ETHOSU_INVALID_PARAM;
-    }
-
-    regioncfg.word = ethosu_dev_read_reg(dev, NPU_REG_REGIONCFG);
-    regioncfg.word &= ~(0x3 << (2 * region));
-    regioncfg.word |= (memory_type & 0x3) << (2 * region);
-    ethosu_dev_write_reg(dev, NPU_REG_REGIONCFG, regioncfg.word);
-    LOG_DEBUG("REGIONCFG%u=0x%08x\n", region, regioncfg.word);
-
-    return ETHOSU_SUCCESS;
-}
-
-enum ethosu_error_codes ethosu_dev_set_axi_limit0(struct ethosu_device *dev,
-                                                  enum ethosu_axi_limit_beats max_beats,
-                                                  enum ethosu_axi_limit_mem_type memtype,
-                                                  uint8_t max_reads,
-                                                  uint8_t max_writes)
-{
-    struct axi_limit0_r axi_limit0;
-
-    axi_limit0.word                     = 0;
-    axi_limit0.max_beats                = max_beats;
-    axi_limit0.memtype                  = memtype;
-    axi_limit0.max_outstanding_read_m1  = max_reads - 1;
-    axi_limit0.max_outstanding_write_m1 = max_writes - 1;
-
-    ethosu_dev_write_reg(dev, NPU_REG_AXI_LIMIT0, axi_limit0.word);
-    LOG_DEBUG("AXI_LIMIT0=0x%08x\n", axi_limit0.word);
-
-    return ETHOSU_SUCCESS;
-}
-
-enum ethosu_error_codes ethosu_dev_set_axi_limit1(struct ethosu_device *dev,
-                                                  enum ethosu_axi_limit_beats max_beats,
-                                                  enum ethosu_axi_limit_mem_type memtype,
-                                                  uint8_t max_reads,
-                                                  uint8_t max_writes)
-{
-    struct axi_limit1_r axi_limit1;
-
-    axi_limit1.word                     = 0;
-    axi_limit1.max_beats                = max_beats;
-    axi_limit1.memtype                  = memtype;
-    axi_limit1.max_outstanding_read_m1  = max_reads - 1;
-    axi_limit1.max_outstanding_write_m1 = max_writes - 1;
-
-    ethosu_dev_write_reg(dev, NPU_REG_AXI_LIMIT1, axi_limit1.word);
-    LOG_DEBUG("AXI_LIMIT1=0x%08x\n", axi_limit1.word);
-
-    return ETHOSU_SUCCESS;
-}
-
-enum ethosu_error_codes ethosu_dev_set_axi_limit2(struct ethosu_device *dev,
-                                                  enum ethosu_axi_limit_beats max_beats,
-                                                  enum ethosu_axi_limit_mem_type memtype,
-                                                  uint8_t max_reads,
-                                                  uint8_t max_writes)
-{
-    struct axi_limit2_r axi_limit2;
-
-    axi_limit2.word                     = 0;
-    axi_limit2.max_beats                = max_beats;
-    axi_limit2.memtype                  = memtype;
-    axi_limit2.max_outstanding_read_m1  = max_reads - 1;
-    axi_limit2.max_outstanding_write_m1 = max_writes - 1;
-
-    ethosu_dev_write_reg(dev, NPU_REG_AXI_LIMIT2, axi_limit2.word);
-    LOG_DEBUG("AXI_LIMIT2=0x%08x\n", axi_limit2.word);
-
-    return ETHOSU_SUCCESS;
-}
-
-enum ethosu_error_codes ethosu_dev_set_axi_limit3(struct ethosu_device *dev,
-                                                  enum ethosu_axi_limit_beats max_beats,
-                                                  enum ethosu_axi_limit_mem_type memtype,
-                                                  uint8_t max_reads,
-                                                  uint8_t max_writes)
-{
-    struct axi_limit3_r axi_limit3;
-
-    axi_limit3.word                     = 0;
-    axi_limit3.max_beats                = max_beats;
-    axi_limit3.memtype                  = memtype;
-    axi_limit3.max_outstanding_read_m1  = max_reads - 1;
-    axi_limit3.max_outstanding_write_m1 = max_writes - 1;
-
-    ethosu_dev_write_reg(dev, NPU_REG_AXI_LIMIT3, axi_limit3.word);
-    LOG_DEBUG("AXI_LIMIT3=0x%08x\n", axi_limit3.word);
-
-    return ETHOSU_SUCCESS;
-}
-
-enum ethosu_error_codes ethosu_dev_get_revision(struct ethosu_device *dev, uint32_t *revision)
-{
-    *revision = ethosu_dev_read_reg(dev, NPU_REG_REVISION);
-
-    return ETHOSU_SUCCESS;
-}
-
-uint32_t ethosu_dev_get_qread(struct ethosu_device *dev)
-{
-    return ethosu_dev_read_reg(dev, NPU_REG_QREAD);
-}
-
-uint32_t ethosu_dev_get_status(struct ethosu_device *dev)
-{
-    return ethosu_dev_read_reg(dev, NPU_REG_STATUS);
-}
-
-enum ethosu_error_codes ethosu_dev_get_status_mask(struct ethosu_device *dev, uint16_t *status_mask)
-{
-    struct status_r status;
-
-    status.word  = ethosu_dev_read_reg(dev, NPU_REG_STATUS);
-    *status_mask = status.word & 0xFFFF;
-
-    return ETHOSU_SUCCESS;
-}
-
-enum ethosu_error_codes ethosu_dev_get_irq_history_mask(struct ethosu_device *dev, uint16_t *irq_history_mask)
-{
-    struct status_r status;
-
-    status.word       = ethosu_dev_read_reg(dev, NPU_REG_STATUS);
-    *irq_history_mask = status.irq_history_mask;
-
-    return ETHOSU_SUCCESS;
-}
-
-enum ethosu_error_codes ethosu_dev_clear_irq_history_mask(struct ethosu_device *dev, uint16_t irq_history_clear_mask)
-{
-    struct cmd_r oldcmd;
-    struct cmd_r cmd;
-
-    oldcmd.word = ethosu_dev_read_reg(dev, NPU_REG_CMD);
-
-    cmd.word              = 0;
-    cmd.clock_q_enable    = oldcmd.clock_q_enable;
-    cmd.power_q_enable    = oldcmd.power_q_enable;
-    cmd.clear_irq_history = irq_history_clear_mask;
-
-    ethosu_dev_write_reg(dev, NPU_REG_CMD, cmd.word);
-    LOG_DEBUG("CMD=0x%08x\n", cmd.word);
-
-    return ETHOSU_SUCCESS;
-}
-
-enum ethosu_error_codes ethosu_dev_set_command_run(struct ethosu_device *dev)
-{
-    struct cmd_r oldcmd;
-    struct cmd_r cmd;
-
-    oldcmd.word = ethosu_dev_read_reg(dev, NPU_REG_CMD);
-
-    cmd.word                        = 0;
-    cmd.transition_to_running_state = 1;
-    cmd.clock_q_enable              = oldcmd.clock_q_enable;
-    cmd.power_q_enable              = oldcmd.power_q_enable;
-
-    ethosu_dev_write_reg(dev, NPU_REG_CMD, cmd.word);
-    LOG_DEBUG("CMD=0x%08x\n", cmd.word);
-
-    return ETHOSU_SUCCESS;
-}
-
-enum ethosu_error_codes ethosu_dev_get_shram_data(struct ethosu_device *dev, int section, uint32_t *shram_p)
-{
-    int i            = 0;
-    uint32_t address = NPU_REG_SHARED_BUFFER0;
-
-    ethosu_dev_write_reg(dev, NPU_REG_DEBUG_ADDRESS, section * BYTES_1KB);
-
-    while (address <= NPU_REG_SHARED_BUFFER255)
-    {
-        shram_p[i] = ethosu_dev_read_reg(dev, address);
-        address += REG_OFFSET;
-        i++;
-    }
-
-    return ETHOSU_SUCCESS;
-}
-
-enum ethosu_error_codes ethosu_dev_set_clock_and_power(struct ethosu_device *dev,
-                                                       enum ethosu_clock_q_request clock_q,
-                                                       enum ethosu_power_q_request power_q)
-{
-    struct cmd_r cmd;
-
-    cmd.word           = 0;
-    cmd.clock_q_enable = clock_q;
-    cmd.power_q_enable = power_q;
-    ethosu_dev_write_reg(dev, NPU_REG_CMD, cmd.word);
-    LOG_DEBUG("CMD=0x%08x\n", cmd.word);
-
-    return ETHOSU_SUCCESS;
-}
-
-uint32_t ethosu_dev_read_reg(struct ethosu_device *dev, uint32_t address)
-{
-    assert(dev->base_address != 0);
-    assert(address % 4 == 0);
-
-    volatile uint32_t *reg = (volatile uint32_t *)(dev->base_address + address);
-    return *reg;
-}
-
-void ethosu_dev_write_reg(struct ethosu_device *dev, uint32_t address, uint32_t value)
-{
-    assert(dev->base_address != 0);
-    assert(address % 4 == 0);
-
-    volatile uint32_t *reg = (volatile uint32_t *)(dev->base_address + address);
-    *reg                   = value;
-}
-
-void ethosu_dev_write_reg_shadow(struct ethosu_device *dev, uint32_t address, uint32_t value, uint32_t *shadow)
-{
-    ethosu_dev_write_reg(dev, address, value);
-    *shadow = ethosu_dev_read_reg(dev, address);
-}
-
-enum ethosu_error_codes ethosu_dev_save_pmu_config(struct ethosu_device *dev)
-{
-    // Save the PMU control register
-    dev->pmcr = ethosu_dev_read_reg(dev, NPU_REG_PMCR);
-
-    // Save IRQ control
-    dev->pmint = ethosu_dev_read_reg(dev, NPU_REG_PMINTSET);
-
-    // Save the enabled events mask
-    dev->pmcnten = ethosu_dev_read_reg(dev, NPU_REG_PMCNTENSET);
-
-    // Save start and stop event
-    dev->pmccntr_cfg = ethosu_dev_read_reg(dev, NPU_REG_PMCCNTR_CFG);
-
-    // Save the event settings and counters
-    for (uint32_t i = 0; i < ETHOSU_PMU_NCOUNTERS; i++)
-    {
-        dev->pmu_evtypr[i] = ethosu_dev_read_reg(dev, NPU_REG_PMEVTYPER0 + i * sizeof(uint32_t));
-    }
-
-    return ETHOSU_SUCCESS;
-}
-
-enum ethosu_error_codes ethosu_dev_restore_pmu_config(struct ethosu_device *dev)
-{
-    // Restore PMU control register
-    ethosu_dev_write_reg(dev, NPU_REG_PMCR, dev->pmcr);
-
-    // Restore IRQ control
-    ethosu_dev_write_reg(dev, NPU_REG_PMINTSET, dev->pmint);
-
-    // Restore enabled event mask
-    ethosu_dev_write_reg(dev, NPU_REG_PMCNTENSET, dev->pmcnten);
-
-    // Restore start and stop event
-    ethosu_dev_write_reg(dev, NPU_REG_PMCCNTR_CFG, dev->pmccntr_cfg);
-
-    // Save the event settings and counters
-    for (uint32_t i = 0; i < ETHOSU_PMU_NCOUNTERS; i++)
-    {
-        ethosu_dev_write_reg(dev, NPU_REG_PMEVTYPER0 + i * sizeof(uint32_t), dev->pmu_evtypr[i]);
-    }
-
-    return ETHOSU_SUCCESS;
-}
-
-enum ethosu_error_codes ethosu_dev_save_pmu_counters(struct ethosu_device *dev)
-{
-    // Save the cycle counter
-    dev->pmccntr[0] = ethosu_dev_read_reg(dev, NPU_REG_PMCCNTR_LO);
-    dev->pmccntr[1] = ethosu_dev_read_reg(dev, NPU_REG_PMCCNTR_HI);
-
-    // Save the event settings and counters
-    for (uint32_t i = 0; i < ETHOSU_PMU_NCOUNTERS; i++)
-    {
-        dev->pmu_evcntr[i] = ethosu_dev_read_reg(dev, NPU_REG_PMEVCNTR0 + i * sizeof(uint32_t));
-    }
-
-    return ETHOSU_SUCCESS;
-}
-
-bool ethosu_dev_prot_has_changed(struct ethosu_device *dev)
-{
-    if (dev->proto != ethosu_dev_read_reg(dev, NPU_REG_PROT))
-    {
-        return true;
-    }
-
-    return false;
-}
-
-bool ethosu_dev_status_has_error(struct ethosu_device *dev)
-{
-    bool status_error = false;
-    struct status_r status;
-
-    status.word  = ethosu_dev_read_reg(dev, NPU_REG_STATUS);
-    status_error = ((1 == status.bus_status) || (1 == status.cmd_parse_error) || (1 == status.wd_fault) ||
-                    (1 == status.ecc_fault));
-
-    return status_error;
-}
diff --git a/src/ethosu_device_u55_u65.c b/src/ethosu_device_u55_u65.c
new file mode 100644
index 0000000..080bfe8
--- /dev/null
+++ b/src/ethosu_device_u55_u65.c
@@ -0,0 +1,353 @@
+/*
+ * Copyright (c) 2019-2021 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "ethosu_interface.h"
+
+#include "ethosu_config.h"
+#include "ethosu_device.h"
+#include "ethosu_log.h"
+
+#include <assert.h>
+#include <inttypes.h>
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#define BASEP_OFFSET 4
+
+#ifdef ETHOSU65
+#define ADDRESS_BITS 40
+#else
+#define ADDRESS_BITS 32
+#endif
+
+#define ADDRESS_MASK ((1ull << ADDRESS_BITS) - 1)
+
+#define NPU_CMD_PWR_CLK_MASK (0xC)
+
+struct ethosu_device *ethosu_dev_init(const void *base_address, uint32_t secure_enable, uint32_t privilege_enable)
+{
+    struct ethosu_device *dev = malloc(sizeof(struct ethosu_device));
+    if (!dev)
+    {
+        LOG_ERR("Failed to allocate memory for Ethos-U device\n");
+        return NULL;
+    }
+
+    dev->reg        = (volatile struct NPU_REG *)base_address;
+    dev->secure     = secure_enable;
+    dev->privileged = privilege_enable;
+
+    // Make sure the NPU is in a known state
+    if (ethosu_dev_soft_reset(dev) != ETHOSU_SUCCESS)
+    {
+        free(dev);
+        return NULL;
+    }
+
+    return dev;
+}
+
+void ethosu_dev_deinit(struct ethosu_device *dev)
+{
+    free(dev);
+}
+
+enum ethosu_error_codes ethosu_dev_axi_init(struct ethosu_device *dev)
+{
+    struct regioncfg_r rcfg = {0};
+    struct axi_limit0_r l0  = {0};
+    struct axi_limit1_r l1  = {0};
+    struct axi_limit2_r l2  = {0};
+    struct axi_limit3_r l3  = {0};
+
+    dev->reg->QCONFIG.word = NPU_QCONFIG;
+
+    rcfg.region0             = NPU_REGIONCFG_0;
+    rcfg.region1             = NPU_REGIONCFG_1;
+    rcfg.region2             = NPU_REGIONCFG_2;
+    rcfg.region3             = NPU_REGIONCFG_3;
+    rcfg.region4             = NPU_REGIONCFG_4;
+    rcfg.region5             = NPU_REGIONCFG_5;
+    rcfg.region6             = NPU_REGIONCFG_6;
+    rcfg.region7             = NPU_REGIONCFG_7;
+    dev->reg->REGIONCFG.word = rcfg.word;
+
+    l0.max_beats                = AXI_LIMIT0_MAX_BEATS_BYTES;
+    l0.memtype                  = AXI_LIMIT0_MEM_TYPE;
+    l0.max_outstanding_read_m1  = AXI_LIMIT0_MAX_OUTSTANDING_READS - 1;
+    l0.max_outstanding_write_m1 = AXI_LIMIT0_MAX_OUTSTANDING_WRITES - 1;
+
+    l1.max_beats                = AXI_LIMIT1_MAX_BEATS_BYTES;
+    l1.memtype                  = AXI_LIMIT1_MEM_TYPE;
+    l1.max_outstanding_read_m1  = AXI_LIMIT1_MAX_OUTSTANDING_READS - 1;
+    l1.max_outstanding_write_m1 = AXI_LIMIT1_MAX_OUTSTANDING_WRITES - 1;
+
+    l2.max_beats                = AXI_LIMIT2_MAX_BEATS_BYTES;
+    l2.memtype                  = AXI_LIMIT2_MEM_TYPE;
+    l2.max_outstanding_read_m1  = AXI_LIMIT2_MAX_OUTSTANDING_READS - 1;
+    l2.max_outstanding_write_m1 = AXI_LIMIT2_MAX_OUTSTANDING_WRITES - 1;
+
+    l3.max_beats                = AXI_LIMIT3_MAX_BEATS_BYTES;
+    l3.memtype                  = AXI_LIMIT3_MEM_TYPE;
+    l3.max_outstanding_read_m1  = AXI_LIMIT3_MAX_OUTSTANDING_READS - 1;
+    l3.max_outstanding_write_m1 = AXI_LIMIT3_MAX_OUTSTANDING_WRITES - 1;
+
+    dev->reg->AXI_LIMIT0.word = l0.word;
+    dev->reg->AXI_LIMIT1.word = l1.word;
+    dev->reg->AXI_LIMIT2.word = l2.word;
+    dev->reg->AXI_LIMIT3.word = l3.word;
+
+    return ETHOSU_SUCCESS;
+}
+
+enum ethosu_error_codes ethosu_dev_run_command_stream(struct ethosu_device *dev,
+                                                      const uint8_t *cmd_stream_ptr,
+                                                      uint32_t cms_length,
+                                                      const uint64_t *base_addr,
+                                                      int num_base_addr)
+{
+    assert(num_base_addr <= NPU_REG_BASEP_ARRLEN);
+
+    struct cmd_r cmd;
+    uint64_t qbase = (uintptr_t)cmd_stream_ptr + BASE_POINTER_OFFSET;
+    assert(qbase <= ADDRESS_MASK);
+    LOG_DEBUG("QBASE=0x%016llx, QSIZE=%u, base_pointer_offset=0x%08x\n", qbase, cms_length, BASE_POINTER_OFFSET);
+
+    dev->reg->QBASE.word[0] = qbase & 0xffffffff;
+#ifdef ETHOSU65
+    dev->reg->QBASE.word[1] = qbase >> 32;
+#endif
+    dev->reg->QSIZE.word = cms_length;
+
+    for (int i = 0; i < num_base_addr; i++)
+    {
+        uint64_t addr = base_addr[i] + BASE_POINTER_OFFSET;
+        assert(addr <= ADDRESS_MASK);
+        LOG_DEBUG("BASEP%d=0x%016llx\n", i, addr);
+        dev->reg->BASEP[i].word[0] = addr & 0xffffffff;
+#ifdef ETHOSU65
+        dev->reg->BASEP[i].word[1] = addr >> 32;
+#endif
+    }
+
+    cmd.word                        = dev->reg->CMD.word & NPU_CMD_PWR_CLK_MASK;
+    cmd.transition_to_running_state = 1;
+
+    dev->reg->CMD.word = cmd.word;
+    LOG_DEBUG("CMD=0x%08x\n", cmd.word);
+
+    return ETHOSU_SUCCESS;
+}
+
+bool ethosu_dev_handle_interrupt(struct ethosu_device *dev)
+{
+    struct cmd_r cmd;
+
+    // Clear interrupt
+    cmd.word           = dev->reg->CMD.word & NPU_CMD_PWR_CLK_MASK;
+    cmd.clear_irq      = 1;
+    dev->reg->CMD.word = cmd.word;
+
+    // If a fault has occured, the NPU needs to be reset
+    if (dev->reg->STATUS.bus_status || dev->reg->STATUS.cmd_parse_error || dev->reg->STATUS.wd_fault ||
+        dev->reg->STATUS.ecc_fault)
+    {
+        LOG_DEBUG("NPU fault. status=0x%08x, qread=%" PRIu32 "\n", dev->reg->STATUS.word, dev->reg->QREAD.word);
+        ethosu_dev_soft_reset(dev);
+        ethosu_dev_set_clock_and_power(dev, ETHOSU_CLOCK_Q_UNCHANGED, ETHOSU_POWER_Q_DISABLE);
+        return false;
+    }
+
+    // Verify that the cmd stream finished executing
+    return dev->reg->STATUS.cmd_end_reached ? true : false;
+}
+
+bool ethosu_dev_verify_access_state(struct ethosu_device *dev)
+{
+    if (dev->reg->PROT.active_CSL != (dev->secure ? SECURITY_LEVEL_SECURE : SECURITY_LEVEL_NON_SECURE) ||
+        dev->reg->PROT.active_CPL != (dev->privileged ? PRIVILEGE_LEVEL_PRIVILEGED : PRIVILEGE_LEVEL_USER))
+    {
+        return false;
+    }
+    return true;
+}
+
+enum ethosu_error_codes ethosu_dev_soft_reset(struct ethosu_device *dev)
+{
+    struct reset_r reset;
+
+    reset.word        = 0;
+    reset.pending_CPL = dev->privileged ? PRIVILEGE_LEVEL_PRIVILEGED : PRIVILEGE_LEVEL_USER;
+    reset.pending_CSL = dev->secure ? SECURITY_LEVEL_SECURE : SECURITY_LEVEL_NON_SECURE;
+
+    // Reset and set security level
+    LOG_INFO("Soft reset NPU\n");
+    dev->reg->RESET.word = reset.word;
+
+    // Wait until reset status indicates that reset has been completed
+    for (int i = 0; i < 100000 && dev->reg->STATUS.reset_status != 0; i++)
+    {
+    }
+
+    if (dev->reg->STATUS.reset_status != 0)
+    {
+        LOG_ERR("Soft reset timed out\n");
+        return ETHOSU_GENERIC_FAILURE;
+    }
+
+    // Verify that NPU has switched security state and privilege level
+    if (ethosu_dev_verify_access_state(dev) != true)
+    {
+        LOG_ERR("Failed to switch security state and privilege level\n");
+        return ETHOSU_GENERIC_FAILURE;
+    }
+
+    // Reinitialize AXI settings
+    ethosu_dev_axi_init(dev);
+
+    return ETHOSU_SUCCESS;
+}
+
+void ethosu_dev_get_hw_info(struct ethosu_device *dev, struct ethosu_hw_info *hwinfo)
+{
+    struct config_r cfg;
+    struct id_r id;
+
+    cfg.word = dev->reg->CONFIG.word;
+    id.word  = dev->reg->ID.word;
+
+    hwinfo->cfg.cmd_stream_version = cfg.cmd_stream_version;
+    hwinfo->cfg.custom_dma         = cfg.custom_dma;
+    hwinfo->cfg.macs_per_cc        = cfg.macs_per_cc;
+
+    hwinfo->version.arch_major_rev = id.arch_major_rev;
+    hwinfo->version.arch_minor_rev = id.arch_minor_rev;
+    hwinfo->version.arch_patch_rev = id.arch_patch_rev;
+    hwinfo->version.product_major  = id.product_major;
+    hwinfo->version.version_major  = id.version_major;
+    hwinfo->version.version_minor  = id.version_minor;
+    hwinfo->version.version_status = id.version_status;
+}
+
+enum ethosu_error_codes ethosu_dev_set_clock_and_power(struct ethosu_device *dev,
+                                                       enum ethosu_clock_q_request clock_q,
+                                                       enum ethosu_power_q_request power_q)
+{
+    struct cmd_r cmd = {0};
+    cmd.word         = dev->reg->CMD.word & NPU_CMD_PWR_CLK_MASK;
+
+    if (power_q != ETHOSU_POWER_Q_UNCHANGED)
+    {
+        cmd.power_q_enable = power_q == ETHOSU_POWER_Q_ENABLE ? 1 : 0;
+    }
+    if (clock_q != ETHOSU_CLOCK_Q_UNCHANGED)
+    {
+        cmd.clock_q_enable = clock_q == ETHOSU_CLOCK_Q_ENABLE ? 1 : 0;
+    }
+
+    dev->reg->CMD.word = cmd.word;
+    LOG_DEBUG("CMD=0x%08x\n", cmd.word);
+
+    return ETHOSU_SUCCESS;
+}
+
+bool ethosu_dev_verify_optimizer_config(struct ethosu_device *dev, uint32_t cfg_in, uint32_t id_in)
+{
+    struct config_r *opt_cfg = (struct config_r *)&cfg_in;
+    struct config_r hw_cfg;
+    struct id_r *opt_id = (struct id_r *)&id_in;
+    struct id_r hw_id;
+    bool ret = true;
+
+    hw_cfg.word = dev->reg->CONFIG.word;
+    hw_id.word  = dev->reg->ID.word;
+
+    LOG_INFO("Optimizer config cmd_stream_version: %" PRIu32 " macs_per_cc: %" PRIu32 " shram_size: %" PRIu32
+             " custom_dma: %" PRIu32 "\n",
+             opt_cfg->cmd_stream_version,
+             opt_cfg->macs_per_cc,
+             opt_cfg->shram_size,
+             opt_cfg->custom_dma);
+    LOG_INFO("Optimizer config Ethos-U version: %" PRIu32 ".%" PRIu32 ".%" PRIu32 "\n",
+             opt_id->arch_major_rev,
+             opt_id->arch_minor_rev,
+             opt_id->arch_patch_rev);
+
+    LOG_INFO("Ethos-U config cmd_stream_version: %" PRIu32 " macs_per_cc: %" PRIu32 " shram_size: %" PRIu32
+             " custom_dma: %" PRIu32 "\n",
+             hw_cfg.cmd_stream_version,
+             hw_cfg.macs_per_cc,
+             hw_cfg.shram_size,
+             hw_cfg.custom_dma);
+    LOG_INFO("Ethos-U version: %" PRIu32 ".%" PRIu32 ".%" PRIu32 "\n",
+             hw_id.arch_major_rev,
+             hw_id.arch_minor_rev,
+             hw_id.arch_patch_rev);
+
+    if (opt_cfg->word != hw_cfg.word)
+    {
+        if (hw_cfg.macs_per_cc != opt_cfg->macs_per_cc)
+        {
+            LOG_ERR("NPU config mismatch: npu.macs_per_cc=%" PRIu32 " optimizer.macs_per_cc=%" PRIu32 "\n",
+                    hw_cfg.macs_per_cc,
+                    opt_cfg->macs_per_cc);
+            ret = false;
+        }
+
+        if (hw_cfg.shram_size != opt_cfg->shram_size)
+        {
+            LOG_ERR("NPU config mismatch: npu.shram_size=%" PRIu32 " optimizer.shram_size=%" PRIu32 "\n",
+                    hw_cfg.shram_size,
+                    opt_cfg->shram_size);
+            ret = false;
+        }
+
+        if (hw_cfg.cmd_stream_version != opt_cfg->cmd_stream_version)
+        {
+            LOG_ERR("NPU config mismatch: npu.cmd_stream_version=%" PRIu32 " optimizer.cmd_stream_version=%" PRIu32
+                    "\n",
+                    hw_cfg.cmd_stream_version,
+                    opt_cfg->cmd_stream_version);
+            ret = false;
+        }
+
+        if (!hw_cfg.custom_dma && opt_cfg->custom_dma)
+        {
+            LOG_ERR("NPU config mismatch: npu.custom_dma=%" PRIu32 " optimizer.custom_dma=%" PRIu32 "\n",
+                    hw_cfg.custom_dma,
+                    opt_cfg->custom_dma);
+            ret = false;
+        }
+    }
+
+    if ((hw_id.arch_major_rev != opt_id->arch_major_rev) || (hw_id.arch_minor_rev < opt_id->arch_minor_rev))
+    {
+        LOG_ERR("NPU arch mismatch: npu.arch=%" PRIu32 ".%" PRIu32 ".%" PRIu32 " optimizer.arch=%" PRIu32 ".%" PRIu32
+                ".%" PRIu32 "\n",
+                hw_id.arch_major_rev,
+                hw_id.arch_minor_rev,
+                hw_id.arch_patch_rev,
+                opt_id->arch_major_rev,
+                opt_id->arch_minor_rev,
+                opt_id->arch_patch_rev);
+        ret = false;
+    }
+
+    return ret;
+}
diff --git a/src/ethosu_driver.c b/src/ethosu_driver.c
index 5cf7f39..b5e3973 100644
--- a/src/ethosu_driver.c
+++ b/src/ethosu_driver.c
@@ -21,7 +21,6 @@
  ******************************************************************************/
 
 #include "ethosu_driver.h"
-#include "ethosu_common.h"
 #include "ethosu_config.h"
 #include "ethosu_device.h"
 #include "ethosu_log.h"
@@ -38,19 +37,14 @@
  * Defines
  ******************************************************************************/
 
-#define MACS_PER_CYCLE_LOG2_MASK 0x000F
-#define SHRAM_SIZE_MASK 0xFF00
-#define SHRAM_SIZE_RIGHT_SHIFT 8
+#define UNUSED(x) ((void)x)
+
 #define BYTES_IN_32_BITS 4
-#define CUSTOM_OPTION_LENGTH_32_BIT_WORD 1
-#define DRIVER_ACTION_LENGTH_32_BIT_WORD 1
-#define OPTIMIZER_CONFIG_LENGTH_32_BIT_WORD 2
-#define ETHOSU_FOURCC ('1' << 24 | 'P' << 16 | 'O' << 8 | 'C') // "Custom Operator Payload 1"
-#define APB_START_ADDR_MASK 0x0FFF
-#define APB_NUM_REG_BIT_SHIFT 12
-#define BYTES_1KB 1024
-#define PRODUCT_MAJOR_ETHOSU55 (4)
 #define MASK_16_BYTE_ALIGN (0xF)
+#define OPTIMIZER_CONFIG_LENGTH_32_BIT_WORD 2
+#define DRIVER_ACTION_LENGTH_32_BIT_WORD 1
+#define ETHOSU_FOURCC ('1' << 24 | 'P' << 16 | 'O' << 8 | 'C') // "Custom Operator Payload 1"
+
 #define FAST_MEMORY_BASE_ADDR_INDEX 2
 
 /******************************************************************************
@@ -63,23 +57,18 @@
     RESERVED         = 0,
     OPTIMIZER_CONFIG = 1,
     COMMAND_STREAM   = 2,
-    READ_APB_REG     = 3,
-    DUMP_SHRAM       = 4,
     NOP              = 5,
 };
 
-// Custom data struct
-struct custom_data_s
+// Custom operator payload data struct
+struct cop_data_s
 {
     union
     {
         // Driver action data
         struct
         {
-            // Driver action command (valid values in DRIVER_ACTION_e)
-            uint8_t driver_action_command;
-
-            // reserved
+            uint8_t driver_action_command; // (valid values in DRIVER_ACTION_e)
             uint8_t reserved;
 
             // Driver action data
@@ -99,13 +88,6 @@
                     uint16_t length;
                 };
 
-                // DA_CMD_READAPB
-                struct
-                {
-                    uint16_t start_address : 12;
-                    uint16_t nbr_reg_minus1 : 4;
-                };
-
                 uint16_t driver_action_data;
             };
         };
@@ -117,34 +99,9 @@
 // optimizer config struct
 struct opt_cfg_s
 {
-    struct custom_data_s da_data;
-    union
-    {
-        struct
-        {
-            uint32_t macs_per_cc : 4;
-            uint32_t cmd_stream_version : 4;
-            uint32_t shram_size : 8;
-            uint32_t reserved0 : 11;
-            uint32_t custom_dma : 1;
-            uint32_t product : 4;
-        };
-        uint32_t npu_cfg;
-    };
-    union
-    {
-        struct
-        {
-            uint32_t version_status : 4;
-            uint32_t version_minor : 4;
-            uint32_t version_major : 4;
-            uint32_t product_major : 4;
-            uint32_t arch_patch_rev : 4;
-            uint32_t arch_minor_rev : 8;
-            uint32_t arch_major_rev : 4;
-        };
-        uint32_t ethosu_id;
-    };
+    struct cop_data_s da_data;
+    uint32_t cfg;
+    uint32_t id;
 };
 
 /******************************************************************************
@@ -201,6 +158,11 @@
     return NULL;
 }
 
+void __attribute__((weak)) ethosu_mutex_destroy(void *mutex)
+{
+    UNUSED(mutex);
+}
+
 void __attribute__((weak)) ethosu_mutex_lock(void *mutex)
 {
     UNUSED(mutex);
@@ -219,6 +181,11 @@
     return sem;
 }
 
+void __attribute__((weak)) ethosu_semaphore_destroy(void *sem)
+{
+    free((struct ethosu_semaphore_t *)sem);
+}
+
 // Baremetal simulation of waiting/sleeping for and then taking a semaphore using intrisics
 void __attribute__((weak)) ethosu_semaphore_take(void *sem)
 {
@@ -261,7 +228,7 @@
 {
     while (1)
     {
-        if (drv->irq_triggered || drv->abort_inference)
+        if (drv->irq_triggered)
         {
             drv->irq_triggered = false;
             break;
@@ -271,48 +238,13 @@
     }
 }
 
-static void npu_axi_init(struct ethosu_driver *drv)
-{
-    ethosu_dev_set_qconfig(&drv->dev, NPU_QCONFIG);
-
-    ethosu_dev_set_regioncfg(&drv->dev, 0, NPU_REGIONCFG_0);
-    ethosu_dev_set_regioncfg(&drv->dev, 1, NPU_REGIONCFG_1);
-    ethosu_dev_set_regioncfg(&drv->dev, 2, NPU_REGIONCFG_2);
-    ethosu_dev_set_regioncfg(&drv->dev, 3, NPU_REGIONCFG_3);
-    ethosu_dev_set_regioncfg(&drv->dev, 4, NPU_REGIONCFG_4);
-    ethosu_dev_set_regioncfg(&drv->dev, 5, NPU_REGIONCFG_5);
-    ethosu_dev_set_regioncfg(&drv->dev, 6, NPU_REGIONCFG_6);
-    ethosu_dev_set_regioncfg(&drv->dev, 7, NPU_REGIONCFG_7);
-
-    (void)ethosu_dev_set_axi_limit0(&drv->dev,
-                                    AXI_LIMIT0_MAX_BEATS_BYTES,
-                                    AXI_LIMIT0_MEM_TYPE,
-                                    AXI_LIMIT0_MAX_OUTSTANDING_READS,
-                                    AXI_LIMIT0_MAX_OUTSTANDING_WRITES);
-    (void)ethosu_dev_set_axi_limit1(&drv->dev,
-                                    AXI_LIMIT1_MAX_BEATS_BYTES,
-                                    AXI_LIMIT1_MEM_TYPE,
-                                    AXI_LIMIT1_MAX_OUTSTANDING_READS,
-                                    AXI_LIMIT1_MAX_OUTSTANDING_WRITES);
-    (void)ethosu_dev_set_axi_limit2(&drv->dev,
-                                    AXI_LIMIT2_MAX_BEATS_BYTES,
-                                    AXI_LIMIT2_MEM_TYPE,
-                                    AXI_LIMIT2_MAX_OUTSTANDING_READS,
-                                    AXI_LIMIT2_MAX_OUTSTANDING_WRITES);
-    (void)ethosu_dev_set_axi_limit3(&drv->dev,
-                                    AXI_LIMIT3_MAX_BEATS_BYTES,
-                                    AXI_LIMIT3_MEM_TYPE,
-                                    AXI_LIMIT3_MAX_OUTSTANDING_READS,
-                                    AXI_LIMIT3_MAX_OUTSTANDING_WRITES);
-}
-
 static void ethosu_register_driver(struct ethosu_driver *drv)
 {
     // Register driver as new HEAD of list
     drv->next          = registered_drivers;
     registered_drivers = drv;
 
-    LOG_INFO("New NPU driver registered (handle: 0x%p, NPU: 0x%x)\n", drv, drv->dev.base_address);
+    LOG_INFO("New NPU driver registered (handle: 0x%p, NPU: 0x%p)\n", drv, drv->dev->reg);
 }
 
 static int ethosu_deregister_driver(struct ethosu_driver *drv)
@@ -358,100 +290,18 @@
     return NULL;
 }
 
-static int ethosu_soft_reset_and_restore(struct ethosu_driver *drv)
+static int handle_optimizer_config(struct ethosu_driver *drv, struct opt_cfg_s *opt_cfg_p)
 {
+    LOG_INFO("Optimizer release nbr: %d patch: %d\n", opt_cfg_p->da_data.rel_nbr, opt_cfg_p->da_data.patch_nbr);
 
-    if (ETHOSU_SUCCESS != ethosu_dev_soft_reset(&drv->dev))
+    if (ethosu_dev_verify_optimizer_config(drv->dev, opt_cfg_p->cfg, opt_cfg_p->id) != true)
     {
         return -1;
     }
 
-    set_clock_and_power_request(drv, ETHOSU_INFERENCE_REQUEST, ETHOSU_CLOCK_Q_ENABLE, ETHOSU_POWER_Q_DISABLE);
-
-    npu_axi_init(drv);
-    ethosu_dev_restore_pmu_config(&drv->dev);
-
     return 0;
 }
 
-static int handle_optimizer_config(struct ethosu_driver *drv, struct opt_cfg_s *opt_cfg_p)
-{
-    struct ethosu_config cfg;
-    struct ethosu_id id;
-    int return_code = 0;
-
-    LOG_INFO("Optimizer release nbr: %d patch: %d\n", opt_cfg_p->da_data.rel_nbr, opt_cfg_p->da_data.patch_nbr);
-    LOG_INFO("Optimizer config cmd_stream_version: %d macs_per_cc: %d shram_size: %d custom_dma: %d\n",
-             opt_cfg_p->cmd_stream_version,
-             opt_cfg_p->macs_per_cc,
-             opt_cfg_p->shram_size,
-             opt_cfg_p->custom_dma);
-    LOG_INFO("Optimizer config Ethos-U version: %d.%d.%d\n",
-             opt_cfg_p->arch_major_rev,
-             opt_cfg_p->arch_minor_rev,
-             opt_cfg_p->arch_patch_rev);
-
-    (void)ethosu_dev_get_config(&drv->dev, &cfg);
-    (void)ethosu_dev_get_id(&drv->dev, &id);
-    LOG_INFO("Ethos-U config cmd_stream_version: %" PRIu32 " macs_per_cc: %" PRIu32 " shram_size: %" PRIu32
-             " custom_dma: %" PRIu32 "\n",
-             cfg.cmd_stream_version,
-             cfg.macs_per_cc,
-             cfg.shram_size,
-             cfg.custom_dma);
-    LOG_INFO("Ethos-U version: %" PRIu32 ".%" PRIu32 ".%" PRIu32 "\n",
-             id.arch_major_rev,
-             id.arch_minor_rev,
-             id.arch_patch_rev);
-
-    if ((cfg.macs_per_cc != opt_cfg_p->macs_per_cc) || (cfg.shram_size != opt_cfg_p->shram_size) ||
-        (cfg.cmd_stream_version != opt_cfg_p->cmd_stream_version) || (!cfg.custom_dma && opt_cfg_p->custom_dma))
-    {
-        if (cfg.macs_per_cc != opt_cfg_p->macs_per_cc)
-        {
-            LOG_ERR("NPU config mismatch: npu.macs_per_cc=%" PRIu32 " optimizer.macs_per_cc=%d\n",
-                    cfg.macs_per_cc,
-                    opt_cfg_p->macs_per_cc);
-        }
-        if (cfg.shram_size != opt_cfg_p->shram_size)
-        {
-            LOG_ERR("NPU config mismatch: npu.shram_size=%" PRIu32 " optimizer.shram_size=%d\n",
-                    cfg.shram_size,
-                    opt_cfg_p->shram_size);
-        }
-        if (cfg.cmd_stream_version != opt_cfg_p->cmd_stream_version)
-        {
-            LOG_ERR("NPU config mismatch: npu.cmd_stream_version=%" PRIu32 " optimizer.cmd_stream_version=%d\n",
-                    cfg.cmd_stream_version,
-                    opt_cfg_p->cmd_stream_version);
-        }
-        if (!cfg.custom_dma && opt_cfg_p->custom_dma)
-        {
-            LOG_ERR("NPU config mismatch: npu.custom_dma=%" PRIu32 " optimize.custom_dma=%d\n",
-                    cfg.custom_dma,
-                    opt_cfg_p->custom_dma);
-        }
-        return_code = -1;
-    }
-
-    if ((id.arch_major_rev != opt_cfg_p->arch_major_rev) || (id.arch_minor_rev < opt_cfg_p->arch_minor_rev))
-    {
-        LOG_ERR("NPU arch mismatch: npu.arch=%" PRIu32 ".%" PRIu32 ".%" PRIu32 " optimizer.arch=%d.%d.%d\n",
-                id.arch_major_rev,
-                id.arch_minor_rev,
-                id.arch_patch_rev,
-                opt_cfg_p->arch_major_rev,
-                opt_cfg_p->arch_minor_rev,
-                opt_cfg_p->arch_patch_rev);
-        return_code = -1;
-    }
-
-#if !defined(LOG_ENABLED)
-    UNUSED(opt_cfg_p);
-#endif
-    return return_code;
-}
-
 static int handle_command_stream(struct ethosu_driver *drv,
                                  const uint8_t *cmd_stream,
                                  const int cms_length,
@@ -459,7 +309,6 @@
                                  const size_t *base_addr_size,
                                  const int num_base_addr)
 {
-    uint32_t qread           = 0;
     uint32_t cms_bytes       = cms_length * BYTES_IN_32_BITS;
     ptrdiff_t cmd_stream_ptr = (ptrdiff_t)cmd_stream;
 
@@ -471,22 +320,17 @@
         return -1;
     }
 
-    bool base_addr_invalid = false;
+    // Verify 16 byte alignment for base address'
     for (int i = 0; i < num_base_addr; i++)
     {
         if (0 != (base_addr[i] & MASK_16_BYTE_ALIGN))
         {
             LOG_ERR("Base addr %d: 0x%llx not aligned to 16 bytes\n", i, base_addr[i]);
-            base_addr_invalid = true;
+            return -1;
         }
     }
 
-    if (base_addr_invalid)
-    {
-        return -1;
-    }
-
-    /* Flush the cache if available on our CPU.
+    /* Flush the cache if available on CPU.
      * The upcasting to uin32_t* is ok since the pointer never is dereferenced.
      * The base_addr_size is null if invoking from prior to invoke_V2, in that case
      * the whole cache is being flushed.
@@ -505,13 +349,15 @@
         ethosu_flush_dcache(NULL, 0);
     }
 
-    if (ETHOSU_SUCCESS != ethosu_dev_run_command_stream(&drv->dev, cmd_stream, cms_bytes, base_addr, num_base_addr))
+    // Execute the command stream
+    if (ETHOSU_SUCCESS != ethosu_dev_run_command_stream(drv->dev, cmd_stream, cms_bytes, base_addr, num_base_addr))
     {
         return -1;
     }
 
     wait_for_irq(drv);
 
+    // Check if any error occured
     if (drv->status_error)
     {
         return -1;
@@ -529,74 +375,6 @@
         ethosu_invalidate_dcache(NULL, 0);
     }
 
-    qread = ethosu_dev_get_qread(&drv->dev);
-    if (qread != cms_bytes)
-    {
-        LOG_WARN("IRQ received but qread (%" PRIu32 ") not at end of stream (%" PRIu32 ").\n", qread, cms_bytes);
-        return -1;
-    }
-
-    return 0;
-}
-
-static int read_apb_reg(struct ethosu_driver *drv, uint16_t da_data)
-{
-    uint32_t *reg_p;
-    uint32_t start_address = (uint32_t)(da_data & APB_START_ADDR_MASK);
-    uint16_t num_reg       = (da_data >> APB_NUM_REG_BIT_SHIFT) + 1;
-
-    reg_p = (uint32_t *)malloc(num_reg * sizeof(uint32_t));
-    if (reg_p == NULL)
-    {
-        LOG_ERR("Memory allocation failed\n");
-        return -1;
-    }
-
-    if (ETHOSU_SUCCESS == ethosu_dev_read_apb_reg(&drv->dev, start_address, num_reg, reg_p))
-    {
-        for (int i = 0; i < num_reg; i++)
-        {
-            LOG_INFO(
-                "NPU_REG ADDR 0x%04" PRIu32 " = 0x%08" PRIu32 "\n", (start_address + (i * BYTES_IN_32_BITS)), reg_p[i]);
-        }
-    }
-    else
-    {
-        free(reg_p);
-        return -1;
-    }
-
-    free(reg_p);
-    return 0;
-}
-
-static int dump_shram(struct ethosu_driver *drv)
-{
-    struct ethosu_config cfg;
-    uint32_t *shram_p;
-    (void)ethosu_dev_get_config(&drv->dev, &cfg);
-
-    LOG_INFO("dump_shram size = %" PRIu32 " KB\n", cfg.shram_size);
-
-    shram_p = (uint32_t *)malloc(BYTES_1KB);
-    if (shram_p == NULL)
-    {
-        LOG_ERR("Memory allocation failed for shram data\n");
-        return -1;
-    }
-
-    for (uint32_t i = 0; i < cfg.shram_size; i++)
-    {
-        ethosu_dev_get_shram_data(&drv->dev, i, (uint32_t *)shram_p);
-        // Output 1KB of SHRAM
-        LOG_INFO("***SHRAM SECTION %" PRIu32 "***\n", i);
-        for (int j = 0; j < (BYTES_1KB / BYTES_IN_32_BITS); j++)
-        {
-            LOG_INFO("[0x%04" PRIx32 "] %" PRIx32 "\n", (i * 1024 + j * 4), shram_p[j]);
-        }
-    }
-    free(shram_p);
-
     return 0;
 }
 
@@ -605,29 +383,13 @@
  ******************************************************************************/
 void __attribute__((weak)) ethosu_irq_handler(struct ethosu_driver *drv)
 {
-    uint8_t irq_raised = 0;
+    LOG_DEBUG("Got interrupt from Ethos-U\n");
 
-    LOG_DEBUG(
-        "Interrupt. status=0x%08x, qread=%d\n", ethosu_dev_get_status(&drv->dev), ethosu_dev_get_qread(&drv->dev));
-
-    // Verify that interrupt has been raised
-    (void)ethosu_dev_is_irq_raised(&drv->dev, &irq_raised);
-    assert(irq_raised == 1);
     drv->irq_triggered = true;
-
-    // Clear interrupt
-    (void)ethosu_dev_clear_irq_status(&drv->dev);
-
-    // Verify that interrupt has been successfully cleared
-    (void)ethosu_dev_is_irq_raised(&drv->dev, &irq_raised);
-    assert(irq_raised == 0);
-
-    if (ethosu_dev_status_has_error(&drv->dev))
+    if (!ethosu_dev_handle_interrupt(drv->dev))
     {
-        ethosu_soft_reset_and_restore(drv);
         drv->status_error = true;
     }
-
     ethosu_semaphore_give(drv->semaphore);
 }
 
@@ -642,8 +404,6 @@
                 uint32_t secure_enable,
                 uint32_t privilege_enable)
 {
-    int return_code = 0;
-
     LOG_INFO("Initializing NPU: base_address=%p, fast_memory=%p, fast_memory_size=%zu, secure=%" PRIu32
              ", privileged=%" PRIu32 "\n",
              base_address,
@@ -665,42 +425,41 @@
     drv->fast_memory      = (uint32_t)fast_memory;
     drv->fast_memory_size = fast_memory_size;
     drv->irq_triggered    = false;
-    drv->semaphore        = ethosu_semaphore_create();
 
-    if (ETHOSU_SUCCESS != ethosu_dev_init(&drv->dev, base_address, secure_enable, privilege_enable))
+    // Initialize the device and set requested security state and privilege mode
+    drv->dev = ethosu_dev_init(base_address, secure_enable, privilege_enable);
+
+    if (drv->dev == NULL)
     {
         LOG_ERR("Failed to initialize Ethos-U device\n");
         return -1;
     }
 
-    if (ETHOSU_SUCCESS !=
-        set_clock_and_power_request(drv, ETHOSU_INFERENCE_REQUEST, ETHOSU_CLOCK_Q_DISABLE, ETHOSU_POWER_Q_DISABLE))
+    // Power always ON requested
+    if (drv->dev_power_always_on)
     {
-        LOG_ERR("Failed to disable clock-q & power-q for Ethos-U\n");
-        return -1;
+        if (set_clock_and_power_request(drv, ETHOSU_INFERENCE_REQUEST, ETHOSU_CLOCK_Q_ENABLE, ETHOSU_POWER_Q_DISABLE) !=
+            ETHOSU_SUCCESS)
+        {
+            LOG_ERR("Failed to disable power-q for Ethos-U\n");
+            return -1;
+        }
     }
 
-    if (ETHOSU_SUCCESS != ethosu_dev_soft_reset(&drv->dev))
-    {
-        return -1;
-    }
-
-    if (ETHOSU_SUCCESS != ethosu_dev_wait_for_reset(&drv->dev))
-    {
-        LOG_ERR("Failed reset of Ethos-U\n");
-        return -1;
-    }
-
+    drv->semaphore    = ethosu_semaphore_create();
     drv->status_error = false;
 
     ethosu_register_driver(drv);
 
-    return return_code;
+    return 0;
 }
 
 void ethosu_deinit(struct ethosu_driver *drv)
 {
     ethosu_deregister_driver(drv);
+    ethosu_semaphore_destroy(drv->semaphore);
+    ethosu_dev_deinit(drv->dev);
+    drv->dev = NULL;
 }
 
 void ethosu_get_driver_version(struct ethosu_driver_version *ver)
@@ -714,9 +473,7 @@
 void ethosu_get_hw_info(struct ethosu_driver *drv, struct ethosu_hw_info *hw)
 {
     assert(hw != NULL);
-
-    (void)ethosu_dev_get_id(&drv->dev, &hw->version);
-    (void)ethosu_dev_get_config(&drv->dev, &hw->cfg);
+    ethosu_dev_get_hw_info(drv->dev, hw);
 }
 
 int ethosu_invoke(struct ethosu_driver *drv,
@@ -726,9 +483,9 @@
                   const size_t *base_addr_size,
                   const int num_base_addr)
 {
-    const struct custom_data_s *data_ptr = custom_data_ptr;
-    const struct custom_data_s *data_end = custom_data_ptr + custom_data_size;
-    int return_code                      = 0;
+    const struct cop_data_s *data_ptr = custom_data_ptr;
+    const struct cop_data_s *data_end = custom_data_ptr + custom_data_size;
+    int return_code                   = 0;
 
     // First word in custom_data_ptr should contain "Custom Operator Payload 1"
     if (data_ptr->word != ETHOSU_FOURCC)
@@ -762,21 +519,28 @@
         *fast_memory = drv->fast_memory;
     }
 
+    // NPU might have lost power and thus its settings and state
     if (!drv->dev_power_always_on)
     {
+        bool axi_reinit = true;
         // Only soft reset if security state or privilege level needs changing
-        if (ethosu_dev_prot_has_changed(&drv->dev))
+        if (ethosu_dev_verify_access_state(drv->dev) != true)
         {
-            if (ETHOSU_SUCCESS != ethosu_dev_soft_reset(&drv->dev))
+            if (ethosu_dev_soft_reset(drv->dev) != ETHOSU_SUCCESS)
             {
                 return -1;
             }
+            axi_reinit = false;
         }
 
-        drv->status_error = false;
+        // Set power ON during the inference
         set_clock_and_power_request(drv, ETHOSU_INFERENCE_REQUEST, ETHOSU_CLOCK_Q_ENABLE, ETHOSU_POWER_Q_DISABLE);
-        ethosu_dev_restore_pmu_config(&drv->dev);
-        npu_axi_init(drv);
+
+        // If a soft reset occured, AXI reinit has already been performed
+        if (axi_reinit)
+        {
+            ethosu_dev_axi_init(drv->dev);
+        }
     }
 
     drv->status_error = false;
@@ -796,39 +560,26 @@
             break;
         case COMMAND_STREAM:
             LOG_DEBUG("COMMAND_STREAM\n");
-            void *command_stream = (uint8_t *)(data_ptr) + sizeof(struct custom_data_s);
+            void *command_stream = (uint8_t *)(data_ptr) + sizeof(struct cop_data_s);
             int cms_length       = (data_ptr->reserved << 16) | data_ptr->length;
 
-            drv->abort_inference = false;
             // It is safe to clear this flag without atomic, because npu is not running.
             drv->irq_triggered = false;
 
             ret = handle_command_stream(drv, command_stream, cms_length, base_addr, base_addr_size, num_base_addr);
-
-            if (return_code == -1 && drv->abort_inference)
+            if (ret < 0)
             {
-                LOG_ERR("NPU timeout. qread=%" PRIu32 "\n", ethosu_dev_get_qread(&drv->dev));
-                dump_shram(drv);
+                LOG_ERR("Inference failed.\n");
             }
 
             data_ptr += DRIVER_ACTION_LENGTH_32_BIT_WORD + cms_length;
             break;
-        case READ_APB_REG:
-            LOG_DEBUG("READ_APB_REG\n");
-            ret = read_apb_reg(drv, data_ptr->driver_action_data);
-            data_ptr += DRIVER_ACTION_LENGTH_32_BIT_WORD;
-            break;
-        case DUMP_SHRAM:
-            LOG_DEBUG("DUMP_SHRAM\n");
-            ret = dump_shram(drv);
-            data_ptr += DRIVER_ACTION_LENGTH_32_BIT_WORD;
-            break;
         case NOP:
             LOG_DEBUG("NOP\n");
             data_ptr += DRIVER_ACTION_LENGTH_32_BIT_WORD;
             break;
         default:
-            LOG_ERR("UNSUPPORTED driver_action_command: %d \n", data_ptr->driver_action_command);
+            LOG_ERR("UNSUPPORTED driver_action_command: %d\n", data_ptr->driver_action_command);
             ret = -1;
             break;
         }
@@ -838,30 +589,33 @@
             break;
         }
     }
+
     ethosu_inference_end(drv, custom_data_ptr);
 
     if (!drv->status_error && !drv->dev_power_always_on)
     {
-        ethosu_dev_save_pmu_counters(&drv->dev);
         set_clock_and_power_request(drv, ETHOSU_INFERENCE_REQUEST, ETHOSU_CLOCK_Q_ENABLE, ETHOSU_POWER_Q_ENABLE);
     }
 
     return return_code;
 }
 
-void ethosu_abort(struct ethosu_driver *drv)
-{
-    drv->abort_inference = true;
-}
-
 void ethosu_set_power_mode(struct ethosu_driver *drv, bool always_on)
 {
     drv->dev_power_always_on = always_on;
 
-    if (always_on)
+    if (always_on && ethosu_dev_verify_access_state(drv->dev) == false)
     {
-        npu_axi_init(drv);
+        // Reset to enter correct security state/privilege mode
+        if (ethosu_dev_soft_reset(drv->dev) == false)
+        {
+            LOG_ERR("Failed to set power mode for Ethos-U\n");
+            return;
+        }
     }
+
+    ethosu_dev_set_clock_and_power(
+        drv->dev, ETHOSU_CLOCK_Q_UNCHANGED, always_on ? ETHOSU_POWER_Q_DISABLE : ETHOSU_POWER_Q_ENABLE);
 }
 
 struct ethosu_driver *ethosu_reserve_driver(void)
@@ -904,32 +658,52 @@
                                                     enum ethosu_clock_q_request clock_request,
                                                     enum ethosu_power_q_request power_request)
 {
-    // Set clock request bit for client
+    // Keep track of which client requests clock gating to be disabled
     if (clock_request == ETHOSU_CLOCK_Q_DISABLE)
     {
         drv->clock_request |= (1 << client);
     }
-    else
+    else if (clock_request == ETHOSU_CLOCK_Q_ENABLE) // Remove client from bitmask
     {
         drv->clock_request &= ~(1 << client);
     }
-    // Get current clock request (ENABLE if both PMU and INFERENCE asks for clock request, else DISABLE)
+
+    // Only enable clock gating when no client has asked for it to be disabled
     clock_request = drv->clock_request == 0 ? ETHOSU_CLOCK_Q_ENABLE : ETHOSU_CLOCK_Q_DISABLE;
 
-    // Set power request bit for client
+    // Keep track of which client requests power gating to be disabled
     if (power_request == ETHOSU_POWER_Q_DISABLE)
     {
         drv->power_request |= (1 << client);
     }
-    else
+    else if (power_request == ETHOSU_CLOCK_Q_ENABLE)
     {
         drv->power_request &= ~(1 << client);
     }
-    // Get current power request (ENABLE if both PMU and INFERENCE asks for power request, else DISABLE)
-    power_request = drv->power_request == 0 ? ETHOSU_POWER_Q_ENABLE : ETHOSU_POWER_Q_DISABLE;
 
+    // Override if power has been requested to be always on
+    if (drv->dev_power_always_on == true)
+    {
+        power_request = ETHOSU_POWER_Q_DISABLE;
+    }
+    else
+    {
+        // Only enable power gating when no client has asked for it to be disabled
+        power_request = drv->power_request == 0 ? ETHOSU_POWER_Q_ENABLE : ETHOSU_POWER_Q_DISABLE;
+    }
+
+    // Verify security state and privilege mode if power is requested to be on
+    if (power_request == ETHOSU_POWER_Q_DISABLE)
+    {
+        if (ethosu_dev_verify_access_state(drv->dev) == false)
+        {
+            if (ethosu_dev_soft_reset(drv->dev) != ETHOSU_SUCCESS)
+            {
+                LOG_ERR("Failed to set clock and power q channels for Ethos-U\n");
+                return ETHOSU_GENERIC_FAILURE;
+            }
+        }
+    }
     // Set clock and power
-    enum ethosu_error_codes ret = ethosu_dev_set_clock_and_power(&drv->dev, clock_request, power_request);
-
-    return ret;
+    return ethosu_dev_set_clock_and_power(drv->dev, clock_request, power_request);
 }
diff --git a/src/ethosu_interface.h b/src/ethosu_interface.h
new file mode 100644
index 0000000..2409cb4
--- /dev/null
+++ b/src/ethosu_interface.h
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2020-2021 Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+// clang-format off
+#ifndef ETHOSU_INTERFACE_WRAPPER_
+#define ETHOSU_INTERFACE_WRAPPER_
+
+#define xstr(a) str(a)
+#define str(a)  #a
+
+#define catm(a, b)  catm_(a, b)
+#define catm_(a, b) a##b
+
+#define ETHOSU_INTERFACE_FILE xstr(catm(ethos, ETHOSU_ARCH)_interface.h)
+
+#include ETHOSU_INTERFACE_FILE
+
+#endif // ETHOSU_INTERFACE_WRAPPER_
diff --git a/src/ethosu_pmu.c b/src/ethosu_pmu.c
index d1cd79c..8059010 100644
--- a/src/ethosu_pmu.c
+++ b/src/ethosu_pmu.c
@@ -20,9 +20,9 @@
  * Includes
  *****************************************************************************/
 
-#include "ethosu55_interface.h"
-#include "ethosu_common.h"
+#include "ethosu_device.h"
 #include "ethosu_driver.h"
+#include "ethosu_interface.h"
 #include "ethosu_log.h"
 #include "pmu_ethosu.h"
 
@@ -34,23 +34,23 @@
  * Defines
  *****************************************************************************/
 
+#define MASK_0_31_BITS (0xFFFFFFFF)
+#define MASK_32_47_BITS (0xFFFF00000000)
+
 #define COMMA ,
 #define SEMICOLON ;
 
 #define EVTYPE(A, name)                                                                                                \
-    case PMU_EVENT_TYPE_##name:                                                                                        \
+    case PMU_EVENT_##name:                                                                                             \
         return ETHOSU_PMU_##name
 
-#define EVID(A, name) (PMU_EVENT_TYPE_##name)
-
-#define NPU_REG_PMEVCNTR(x) (NPU_REG_PMEVCNTR0 + ((x) * sizeof(uint32_t)))
-#define NPU_REG_PMEVTYPER(x) (NPU_REG_PMEVTYPER0 + ((x) * sizeof(uint32_t)))
+#define EVID(A, name) (PMU_EVENT_##name)
 
 /*****************************************************************************
  * Variables
  *****************************************************************************/
 
-static const enum pmu_event_type eventbyid[] = {EXPAND_PMU_EVENT_TYPE(EVID, COMMA)};
+static const enum pmu_event eventbyid[] = {EXPAND_PMU_EVENT(EVID, COMMA)};
 
 /*****************************************************************************
  * Static functions
@@ -60,7 +60,7 @@
 {
     switch (id)
     {
-        EXPAND_PMU_EVENT_TYPE(EVTYPE, SEMICOLON);
+        EXPAND_PMU_EVENT(EVTYPE, SEMICOLON);
     default:
         LOG_ERR("Unknown PMU event id: 0x%" PRIx32 "\n", id);
     }
@@ -88,21 +88,17 @@
 void ETHOSU_PMU_Enable(struct ethosu_driver *drv)
 {
     LOG_DEBUG("Enable PMU\n");
-    struct pmcr_r pmcr;
-    pmcr.word   = drv->dev.pmcr;
-    pmcr.cnt_en = 1;
+    struct pmcr_r pmcr = {0};
+    pmcr.cnt_en        = 1;
     set_clock_and_power_request(drv, ETHOSU_PMU_REQUEST, ETHOSU_CLOCK_Q_DISABLE, ETHOSU_POWER_Q_DISABLE);
-    ethosu_dev_write_reg_shadow(&drv->dev, NPU_REG_PMCR, pmcr.word, &drv->dev.pmcr);
+    drv->dev->reg->PMCR.word = pmcr.word;
 }
 
 void ETHOSU_PMU_Disable(struct ethosu_driver *drv)
 {
     LOG_DEBUG("Disable PMU\n");
-    struct pmcr_r pmcr;
-    pmcr.word   = drv->dev.pmcr;
-    pmcr.cnt_en = 0;
     set_clock_and_power_request(drv, ETHOSU_PMU_REQUEST, ETHOSU_CLOCK_Q_ENABLE, ETHOSU_POWER_Q_ENABLE);
-    ethosu_dev_write_reg_shadow(&drv->dev, NPU_REG_PMCR, pmcr.word, &drv->dev.pmcr);
+    drv->dev->reg->PMCR.word = 0;
 }
 
 void ETHOSU_PMU_Set_EVTYPER(struct ethosu_driver *drv, uint32_t num, enum ethosu_pmu_event_type type)
@@ -110,13 +106,13 @@
     assert(num < ETHOSU_PMU_NCOUNTERS);
     uint32_t val = pmu_event_value(type);
     LOG_DEBUG("num=%u, type=%d, val=%u\n", num, type, val);
-    ethosu_dev_write_reg_shadow(&drv->dev, NPU_REG_PMEVTYPER(num), val, &drv->dev.pmu_evtypr[num]);
+    drv->dev->reg->PMEVTYPER[num].word = val;
 }
 
 enum ethosu_pmu_event_type ETHOSU_PMU_Get_EVTYPER(struct ethosu_driver *drv, uint32_t num)
 {
     assert(num < ETHOSU_PMU_NCOUNTERS);
-    uint32_t val                    = drv->dev.pmu_evtypr[num];
+    uint32_t val                    = drv->dev->reg->PMEVTYPER[num].word;
     enum ethosu_pmu_event_type type = pmu_event_type(val);
     LOG_DEBUG("num=%u, type=%d, val=%u\n", num, type, val);
     return type;
@@ -124,66 +120,48 @@
 
 void ETHOSU_PMU_CYCCNT_Reset(struct ethosu_driver *drv)
 {
-    LOG_DEBUG("Reset PMU\n");
+    LOG_DEBUG("Reset PMU cycle counter\n");
     struct pmcr_r pmcr;
-    pmcr.word          = drv->dev.pmcr;
-    pmcr.cycle_cnt_rst = 1;
-    ethosu_dev_write_reg_shadow(&drv->dev, NPU_REG_PMCR, pmcr.word, &drv->dev.pmcr);
-    drv->dev.pmccntr[0] = 0;
-    drv->dev.pmccntr[1] = 0;
+    pmcr.word                = drv->dev->reg->PMCR.word;
+    pmcr.cycle_cnt_rst       = 1;
+    drv->dev->reg->PMCR.word = pmcr.word;
 }
 
 void ETHOSU_PMU_EVCNTR_ALL_Reset(struct ethosu_driver *drv)
 {
     LOG_DEBUG("Reset all events\n");
     struct pmcr_r pmcr;
-    pmcr.word          = drv->dev.pmcr;
-    pmcr.event_cnt_rst = 1;
-    ethosu_dev_write_reg_shadow(&drv->dev, NPU_REG_PMCR, pmcr.word, &drv->dev.pmcr);
-
-    for (uint32_t i = 0; i < ETHOSU_PMU_NCOUNTERS; i++)
-    {
-        drv->dev.pmu_evcntr[i] = 0;
-    }
+    pmcr.word                = drv->dev->reg->PMCR.word;
+    pmcr.event_cnt_rst       = 1;
+    drv->dev->reg->PMCR.word = pmcr.word;
 }
 
 void ETHOSU_PMU_CNTR_Enable(struct ethosu_driver *drv, uint32_t mask)
 {
     LOG_DEBUG("mask=0x%08x\n", mask);
-    ethosu_dev_write_reg_shadow(&drv->dev, NPU_REG_PMCNTENSET, mask, &drv->dev.pmcnten);
+    drv->dev->reg->PMCNTENSET.word = mask;
 }
 
 void ETHOSU_PMU_CNTR_Disable(struct ethosu_driver *drv, uint32_t mask)
 {
     LOG_DEBUG("mask=0x%08x\n", mask);
-    ethosu_dev_write_reg_shadow(&drv->dev, NPU_REG_PMCNTENCLR, mask, &drv->dev.pmcnten);
+    drv->dev->reg->PMCNTENCLR.word = mask;
 }
 
 uint32_t ETHOSU_PMU_CNTR_Status(struct ethosu_driver *drv)
 {
-    LOG_DEBUG("mask=0x%08x\n", drv->dev.pmcnten);
-    return drv->dev.pmcnten;
+    uint32_t pmcntenset = drv->dev->reg->PMCNTENSET.word;
+    LOG_DEBUG("mask=0x%08x\n", pmcntenset);
+    return pmcntenset;
 }
 
 uint64_t ETHOSU_PMU_Get_CCNTR(struct ethosu_driver *drv)
 {
-    uint32_t val_lo = ethosu_dev_read_reg(&drv->dev, NPU_REG_PMCCNTR_LO);
-    uint32_t val_hi = ethosu_dev_read_reg(&drv->dev, NPU_REG_PMCCNTR_HI);
+    uint32_t val_lo = drv->dev->reg->PMCCNTR.CYCLE_CNT_LO;
+    uint32_t val_hi = drv->dev->reg->PMCCNTR.CYCLE_CNT_HI;
     uint64_t val    = ((uint64_t)val_hi << 32) | val_lo;
-    uint64_t shadow = ((uint64_t)drv->dev.pmccntr[1] << 32) | drv->dev.pmccntr[0];
 
-    LOG_DEBUG("val=%" PRIu64 ", shadow=%" PRIu64 "\n", val, shadow);
-
-    // Return the shadow variable in case the NPU was powered off and lost the cycle count
-    if (shadow > val)
-    {
-        return shadow;
-    }
-
-    // Update the shadow variable
-    drv->dev.pmccntr[0] = val_lo;
-    drv->dev.pmccntr[1] = val_hi;
-
+    LOG_DEBUG("val=%" PRIu64 "\n", val);
     return val;
 }
 
@@ -198,8 +176,8 @@
         ETHOSU_PMU_CNTR_Disable(drv, ETHOSU_PMU_CCNT_Msk);
     }
 
-    ethosu_dev_write_reg_shadow(&drv->dev, NPU_REG_PMCCNTR_LO, val & MASK_0_31_BITS, &drv->dev.pmccntr[0]);
-    ethosu_dev_write_reg_shadow(&drv->dev, NPU_REG_PMCCNTR_HI, (val & MASK_32_47_BITS) >> 32, &drv->dev.pmccntr[1]);
+    drv->dev->reg->PMCCNTR.CYCLE_CNT_LO = val & MASK_0_31_BITS;
+    drv->dev->reg->PMCCNTR.CYCLE_CNT_HI = (val & MASK_32_47_BITS) >> 32;
 
     if (active)
     {
@@ -210,17 +188,8 @@
 uint32_t ETHOSU_PMU_Get_EVCNTR(struct ethosu_driver *drv, uint32_t num)
 {
     assert(num < ETHOSU_PMU_NCOUNTERS);
-    uint32_t val = ethosu_dev_read_reg(&drv->dev, NPU_REG_PMEVCNTR(num));
-    LOG_DEBUG("num=%u, val=%u, shadow=%u\n", num, val, drv->dev.pmu_evcntr[num]);
-
-    // Return the shadow variable in case the NPU was powered off and lost the event count
-    if (drv->dev.pmu_evcntr[num] > val)
-    {
-        return drv->dev.pmu_evcntr[num];
-    }
-
-    // Update the shadow variable
-    drv->dev.pmu_evcntr[num] = val;
+    uint32_t val = drv->dev->reg->PMEVCNTR[num].word;
+    LOG_DEBUG("num=%u, val=%u\n", num, val);
 
     return val;
 }
@@ -229,37 +198,38 @@
 {
     assert(num < ETHOSU_PMU_NCOUNTERS);
     LOG_DEBUG("num=%u, val=%u\n", num, val);
-    ethosu_dev_write_reg(&drv->dev, NPU_REG_PMEVCNTR(num), val);
+    drv->dev->reg->PMEVCNTR[num].word = val;
 }
 
 uint32_t ETHOSU_PMU_Get_CNTR_OVS(struct ethosu_driver *drv)
 {
     LOG_DEBUG("");
-    return ethosu_dev_read_reg(&drv->dev, NPU_REG_PMOVSSET);
+    return drv->dev->reg->PMOVSSET.word;
 }
 
 void ETHOSU_PMU_Set_CNTR_OVS(struct ethosu_driver *drv, uint32_t mask)
 {
     LOG_DEBUG("");
-    ethosu_dev_write_reg(&drv->dev, NPU_REG_PMOVSCLR, mask);
+    drv->dev->reg->PMOVSCLR.word = mask;
 }
 
 void ETHOSU_PMU_Set_CNTR_IRQ_Enable(struct ethosu_driver *drv, uint32_t mask)
 {
     LOG_DEBUG("mask=0x%08x\n", mask);
-    ethosu_dev_write_reg_shadow(&drv->dev, NPU_REG_PMINTSET, mask, &drv->dev.pmint);
+    drv->dev->reg->PMINTSET.word = mask;
 }
 
 void ETHOSU_PMU_Set_CNTR_IRQ_Disable(struct ethosu_driver *drv, uint32_t mask)
 {
     LOG_DEBUG("mask=0x%08x\n", mask);
-    ethosu_dev_write_reg_shadow(&drv->dev, NPU_REG_PMINTCLR, mask, &drv->dev.pmint);
+    drv->dev->reg->PMINTCLR.word = mask;
 }
 
 uint32_t ETHOSU_PMU_Get_IRQ_Enable(struct ethosu_driver *drv)
 {
-    LOG_DEBUG("mask=0x%08x\n", drv->dev.pmint);
-    return drv->dev.pmint;
+    uint32_t pmint = drv->dev->reg->PMINTSET.word;
+    LOG_DEBUG("mask=0x%08x\n", pmint);
+    return pmint;
 }
 
 void ETHOSU_PMU_CNTR_Increment(struct ethosu_driver *drv, uint32_t mask)
@@ -273,17 +243,17 @@
     // Increment cycle counter
     if (mask & ETHOSU_PMU_CCNT_Msk)
     {
-        uint64_t val = ETHOSU_PMU_Get_CCNTR(drv) + 1;
-        ethosu_dev_write_reg_shadow(&drv->dev, NPU_REG_PMCCNTR_LO, val & MASK_0_31_BITS, &drv->dev.pmccntr[0]);
-        ethosu_dev_write_reg_shadow(&drv->dev, NPU_REG_PMCCNTR_HI, (val & MASK_32_47_BITS) >> 32, &drv->dev.pmccntr[1]);
+        uint64_t val                        = ETHOSU_PMU_Get_CCNTR(drv) + 1;
+        drv->dev->reg->PMCCNTR.CYCLE_CNT_LO = val & MASK_0_31_BITS;
+        drv->dev->reg->PMCCNTR.CYCLE_CNT_HI = (val & MASK_32_47_BITS) >> 32;
     }
 
     for (int i = 0; i < ETHOSU_PMU_NCOUNTERS; i++)
     {
         if (mask & (1 << i))
         {
-            uint32_t val = ETHOSU_PMU_Get_EVCNTR(drv, i);
-            ethosu_dev_write_reg_shadow(&drv->dev, NPU_REG_PMEVCNTR(i), val + 1, &drv->dev.pmu_evcntr[i]);
+            uint32_t val                    = ETHOSU_PMU_Get_EVCNTR(drv, i);
+            drv->dev->reg->PMEVCNTR[i].word = val + 1;
         }
     }
 
@@ -296,9 +266,9 @@
     LOG_DEBUG("start_event=%u\n", start_event);
     uint32_t val = pmu_event_value(start_event);
     struct pmccntr_cfg_r cfg;
-    cfg.word                = drv->dev.pmccntr_cfg;
-    cfg.CYCLE_CNT_CFG_START = val;
-    ethosu_dev_write_reg_shadow(&drv->dev, NPU_REG_PMCCNTR_CFG, cfg.word, &drv->dev.pmccntr_cfg);
+    cfg.word                        = drv->dev->reg->PMCCNTR_CFG.word;
+    cfg.CYCLE_CNT_CFG_START         = val;
+    drv->dev->reg->PMCCNTR_CFG.word = cfg.word;
 }
 
 void ETHOSU_PMU_PMCCNTR_CFG_Set_Stop_Event(struct ethosu_driver *drv, enum ethosu_pmu_event_type stop_event)
@@ -306,7 +276,7 @@
     LOG_DEBUG("stop_event=%u\n", stop_event);
     uint32_t val = pmu_event_value(stop_event);
     struct pmccntr_cfg_r cfg;
-    cfg.word               = drv->dev.pmccntr_cfg;
-    cfg.CYCLE_CNT_CFG_STOP = val;
-    ethosu_dev_write_reg_shadow(&drv->dev, NPU_REG_PMCCNTR_CFG, cfg.word, &drv->dev.pmccntr_cfg);
-}
\ No newline at end of file
+    cfg.word                        = drv->dev->reg->PMCCNTR_CFG.word;
+    cfg.CYCLE_CNT_CFG_STOP          = val;
+    drv->dev->reg->PMCCNTR_CFG.word = cfg.word;
+}
