From 3d55d6a5e18edb0e2087b51842c1a2d6d7094d64 Mon Sep 17 00:00:00 2001 From: Philip Wiese Date: Thu, 13 Nov 2025 18:12:02 +0100 Subject: [PATCH 01/49] Extend Dockerflow with GAP9 Support - Enable pulling from private GitLab repo - Improve caching for pip, apt and cargo - Fix cMake version - Remove problematic pip installation in favor of apt package - Add ZSH an Oh My ZSH - Add package dependencies for GAP9 SDK - Remove unused files from the container - Fix banshee package problems --- Container/Dockerfile.deeploy | 83 +++++++++-- Container/Dockerfile.toolchain | 57 +++++--- Container/Makefile | 10 +- Container/amd64.list | 8 + Makefile | 37 +++++ toolchain/banshee.patch | 25 ++-- toolchain/gap9-sdk.patch | 260 +++++++++++++++++++++++++++++++++ 7 files changed, 436 insertions(+), 44 deletions(-) create mode 100644 Container/amd64.list create mode 100644 toolchain/gap9-sdk.patch diff --git a/Container/Dockerfile.deeploy b/Container/Dockerfile.deeploy index 68f64748cc..229ea1e45f 100644 --- a/Container/Dockerfile.deeploy +++ b/Container/Dockerfile.deeploy @@ -16,6 +16,7 @@ ENV DEBIAN_FRONTEND=noninteractive ENV TZ=Etc/UTC ENV PATH="/root/.cargo/bin:/app/bender:${PATH}" ENV LLVM_INSTALL_DIR=/app/install/llvm +ENV GAP_RISCV_GCC_TOOLCHAIN=/app/install/gcc/gap9 WORKDIR /app @@ -24,9 +25,14 @@ COPY toolchain/*.patch toolchain/ COPY Makefile ./ COPY requirements-dev.txt ./ +# Install SSH keys to access private repositories +RUN mkdir -p -m 0700 ~/.ssh && ssh-keyscan iis-git.ee.ethz.ch >> ~/.ssh/known_hosts + # Compile emulators # WIESEP: We need to already clean up some space, otherwise the GitHub runners run out of disk space RUN --mount=type=cache,target=/ccache \ + --mount=type=cache,target=/root/.cache/pip \ + --mount=type=cache,target=/root/.cargo/registry \ ccache -z && \ make pulp-sdk chimera-sdk qemu mempool banshee xtensor && \ make gvsoc && \ @@ -52,10 +58,19 @@ elif [ "$TARGETPLATFORM" = "linux/arm64" ]; then \ cp /app/bender /bin; \ fi -# Compile Snitch Runtime +# Compile Snitch Runtime and GAP9 SDK without ccache wrapping ENV CC="gcc" ENV CXX="g++" + +RUN --mount=type=ssh \ + --mount=type=cache,target=/ccache \ + --mount=type=cache,target=/root/.cache/pip \ + ccache -z && \ + make gap9-sdk && \ + ccache -s + RUN --mount=type=cache,target=/ccache \ + --mount=type=cache,target=/root/.cache/pip \ ccache -z && \ make snitch_runtime && \ ccache -s @@ -68,11 +83,13 @@ FROM ubuntu:22.04 AS deeploy ARG TARGETPLATFORM ARG DEBIAN_FRONTEND=noninteractive +ARG CMAKE_VERSION=3.31.1 ENV TZ=Etc/UTC # Export symbols necessary for Deeploy's build flow ENV CMAKE=/usr/bin/cmake ENV PULP_SDK_HOME=/app/install/pulp-sdk +ENV GAP_SDK_HOME=/app/install/gap9-sdk ENV SNITCH_HOME=/app/install/snitch_cluster ENV CHIMERA_SDK_HOME=/app/install/chimera-sdk ENV LLVM_INSTALL_DIR=/app/install/llvm @@ -80,15 +97,23 @@ ENV GVSOC_INSTALL_DIR=/app/install/gvsoc ENV SOFTHIER_INSTALL_DIR=/app/install/softhier ENV MINIMALLOC_INSTALL_DIR=/app/install/minimalloc ENV MEMPOOL_HOME=/app/install/mempool +ENV GAP_RISCV_GCC_TOOLCHAIN=/app/install/gcc/gap9 ENV PATH=/root/.cargo/bin:/app/install/qemu/bin:/app/install/banshee:$PATH +ENV LANG=C.UTF-8 +ENV LC_ALL=C.UTF-8 WORKDIR /app COPY pyproject.toml ./ +COPY Container/amd64.list ./ # Install dependencies -RUN mkdir -p /root/.cargo/bin/ && \ +RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ + --mount=type=cache,target=/var/lib/apt,sharing=locked \ + --mount=type=cache,target=/root/.cache/pip \ + mkdir -p /root/.cargo/bin/ && \ apt-get update && \ + apt-get upgrade -y && \ apt-get install -y git-lfs \ wget \ ccache \ @@ -97,32 +122,62 @@ RUN mkdir -p /root/.cargo/bin/ && \ libpixman-1-dev \ libsdl2-dev \ python-is-python3 \ + python3 \ python3.10-venv \ python3.10-distutils \ - gcc && \ - curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py && \ - python get-pip.py && \ - rm get-pip.py && \ + python3-pip \ + zsh \ + nano \ + sudo \ + gdb-multiarch \ + device-tree-compiler \ + libsndfile1-dev && \ pip install nvidia-pyindex && \ + pip install --upgrade pip setuptools wheel && \ pip install toml-to-requirements && \ toml-to-req --toml-file pyproject.toml && \ - pip install -r requirements.txt + pip install -r requirements.txt && \ + rm requirements.txt pyproject.toml + +# # Install Oh My ZSH +RUN sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended && \ + sed -i 's/ZSH_THEME="robbyrussell"/ZSH_THEME="cypher"/' ~/.zshrc + +# Install AMD64 libraries on ARM64 for GCC GAP9 compiler support +RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ + --mount=type=cache,target=/var/lib/apt,sharing=locked \ +<traces.new_trace(itf_name, &this->trace, vp::DEBUG); ++ + top->new_master_port("sfu_irq", &this->irq); ++ top->new_master_port("sfu_pdm_out_0", &this->irq); ++ top->new_master_port("sfu_pdm_out_1", &this->irq); ++ top->new_master_port("sfu_pdm_out_2", &this->irq); ++ top->new_master_port("sfu_pdm_out_3", &this->irq); ++ top->new_master_port("sfu_pdm_out_4", &this->irq); ++ top->new_master_port("sfu_pdm_out_5", &this->irq); ++ ++ top->new_master_port("sfu_pdm_in_0", &this->irq); ++ top->new_master_port("sfu_pdm_in_1", &this->irq); ++ top->new_master_port("sfu_pdm_in_2", &this->irq); ++ top->new_master_port("sfu_pdm_in_3", &this->irq); ++ top->new_master_port("sfu_pdm_in_4", &this->irq); ++ top->new_master_port("sfu_pdm_in_5", &this->irq); ++ top->new_master_port("sfu_pdm_in_6", &this->irq); ++ top->new_master_port("sfu_pdm_in_7", &this->irq); ++ top->new_master_port("sfu_pdm_in_8", &this->irq); ++ top->new_master_port("sfu_pdm_in_9", &this->irq); ++ top->new_master_port("sfu_pdm_in_10", &this->irq); ++ top->new_master_port("sfu_pdm_in_11", &this->irq); ++ ++ top->new_master_port("sfu_ws_in_0", &this->irq); ++ top->new_master_port("sfu_ws_in_1", &this->irq); ++ top->new_master_port("sfu_ws_in_2", &this->irq); ++ ++ ++ // top->new_slave_port("sfu_stream_in_ready_0", &this->in); ++ // top->new_slave_port("sfu_stream_in_ready_1", &this->in); ++ // top->new_slave_port("sfu_stream_in_ready_2", &this->in); ++ // top->new_slave_port("sfu_stream_in_ready_3", &this->in); ++ // top->new_slave_port("sfu_stream_in_ready_4", &this->in); ++ // top->new_slave_port("sfu_stream_in_ready_5", &this->in); ++ // top->new_slave_port("sfu_stream_in_ready_6", &this->in); ++ // top->new_slave_port("sfu_stream_in_ready_7", &this->in); ++ // top->new_slave_port("sfu_stream_in_ready_8", &this->in); ++ // top->new_slave_port("sfu_stream_in_ready_9", &this->in); ++ // top->new_slave_port("sfu_stream_in_ready_10", &this->in); ++ // top->new_slave_port("sfu_stream_in_ready_11", &this->in); ++ // top->new_slave_port("sfu_stream_in_ready_12", &this->in); ++ // top->new_slave_port("sfu_stream_in_ready_13", &this->in); ++ // top->new_slave_port("sfu_stream_in_ready_14", &this->in); ++ // top->new_slave_port("sfu_stream_in_ready_15", &this->in); ++ // top->new_slave_port("sfu_stream_out_data_0", &this->in); ++ // top->new_slave_port("sfu_stream_out_data_1", &this->in); ++ // top->new_slave_port("sfu_stream_out_data_2", &this->in); ++ // top->new_slave_port("sfu_stream_out_data_3", &this->in); ++ // top->new_slave_port("sfu_stream_out_data_4", &this->in); ++ // top->new_slave_port("sfu_stream_out_data_5", &this->in); ++ // top->new_slave_port("sfu_stream_out_data_6", &this->in); ++ // top->new_slave_port("sfu_stream_out_data_7", &this->in); ++ // top->new_slave_port("sfu_stream_out_data_8", &this->in); ++ // top->new_slave_port("sfu_stream_out_data_9", &this->in); ++ // top->new_slave_port("sfu_stream_out_data_10", &this->in); ++ // top->new_slave_port("sfu_stream_out_data_11", &this->in); ++ // top->new_slave_port("sfu_stream_out_data_12", &this->in); ++ // top->new_slave_port("sfu_stream_out_data_13", &this->in); ++ // top->new_slave_port("sfu_stream_out_data_14", &this->in); ++ // top->new_slave_port("sfu_stream_out_data_15", &this->in); ++ ++ top->new_master_port("sfu_stream_in_data_0", &this->irq); ++ top->new_master_port("sfu_stream_in_data_1", &this->irq); ++ top->new_master_port("sfu_stream_in_data_2", &this->irq); ++ top->new_master_port("sfu_stream_in_data_3", &this->irq); ++ top->new_master_port("sfu_stream_in_data_4", &this->irq); ++ top->new_master_port("sfu_stream_in_data_5", &this->irq); ++ top->new_master_port("sfu_stream_in_data_6", &this->irq); ++ top->new_master_port("sfu_stream_in_data_7", &this->irq); ++ top->new_master_port("sfu_stream_in_data_8", &this->irq); ++ top->new_master_port("sfu_stream_in_data_9", &this->irq); ++ top->new_master_port("sfu_stream_in_data_10", &this->irq); ++ top->new_master_port("sfu_stream_in_data_11", &this->irq); ++ top->new_master_port("sfu_stream_in_data_12", &this->irq); ++ top->new_master_port("sfu_stream_in_data_13", &this->irq); ++ top->new_master_port("sfu_stream_in_data_14", &this->irq); ++ top->new_master_port("sfu_stream_in_data_15", &this->irq); ++ top->new_master_port("sfu_stream_out_ready_0", &this->irq); ++ top->new_master_port("sfu_stream_out_ready_1", &this->irq); ++ top->new_master_port("sfu_stream_out_ready_2", &this->irq); ++ top->new_master_port("sfu_stream_out_ready_3", &this->irq); ++ top->new_master_port("sfu_stream_out_ready_4", &this->irq); ++ top->new_master_port("sfu_stream_out_ready_5", &this->irq); ++ top->new_master_port("sfu_stream_out_ready_6", &this->irq); ++ top->new_master_port("sfu_stream_out_ready_7", &this->irq); ++ top->new_master_port("sfu_stream_out_ready_8", &this->irq); ++ top->new_master_port("sfu_stream_out_ready_9", &this->irq); ++ top->new_master_port("sfu_stream_out_ready_10", &this->irq); ++ top->new_master_port("sfu_stream_out_ready_11", &this->irq); ++ top->new_master_port("sfu_stream_out_ready_12", &this->irq); ++ top->new_master_port("sfu_stream_out_ready_13", &this->irq); ++ top->new_master_port("sfu_stream_out_ready_14", &this->irq); ++ top->new_master_port("sfu_stream_out_ready_15", &this->irq); + } +- ++ + + vp::IoReqStatus Sfu_periph_empty::custom_req(vp::IoReq *req, uint64_t offset) + { +diff --git a/install_python_deps.sh b/install_python_deps.sh +index 89d9d66d5..3b55961c6 100755 +--- a/install_python_deps.sh ++++ b/install_python_deps.sh +@@ -60,7 +60,7 @@ then + pip3 install -r tools/nntool/tests/requirements.txt + fi + +- pip3 install -r tools/audio-framework/requirements.txt ++# pip3 install -r tools/audio-framework/requirements.txt + pip3 install -r utils/gapy_v2/requirements.txt + pip3 install -r doc/requirements.txt + fi From 8ae3fef61536bf498473564660528c8977a5e679 Mon Sep 17 00:00:00 2001 From: Philip Wiese Date: Wed, 12 Nov 2025 23:38:04 +0100 Subject: [PATCH 02/49] Improve speed of LLVM cloning --- Makefile | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index a9f26bc126..e253be546f 100644 --- a/Makefile +++ b/Makefile @@ -90,9 +90,11 @@ emulators: snitch_runtime pulp-sdk qemu banshee mempool ${TOOLCHAIN_DIR}/llvm-project: cd ${TOOLCHAIN_DIR} && \ - git clone https://github.com/pulp-platform/llvm-project.git \ - -b main && \ - cd ${TOOLCHAIN_DIR}/llvm-project && git checkout ${LLVM_COMMIT_HASH} && \ + git init llvm-project && \ + cd ${TOOLCHAIN_DIR}/llvm-project && \ + git remote add origin https://github.com/pulp-platform/llvm-project.git && \ + git fetch --depth=1 origin ${LLVM_COMMIT_HASH} && \ + git checkout ${LLVM_COMMIT_HASH} && \ git submodule update --init --recursive ${LLVM_INSTALL_DIR}: ${TOOLCHAIN_DIR}/llvm-project From 6acde80ae92fc21870bc0c2aaaabed7d515a7046 Mon Sep 17 00:00:00 2001 From: Philip Wiese Date: Thu, 13 Nov 2025 18:03:22 +0100 Subject: [PATCH 03/49] Initial GAP9 Support --- CMakeLists.txt | 42 +++- Deeploy/Targets/GAP9/Platform.py | 143 ++++++++++++ .../GAP9/Templates/AllocateTemplate.py | 69 ++++++ .../Targets/GAP9/Templates/FreeTemplate.py | 22 ++ Deeploy/Targets/GAP9/Templates/__init__.py | 5 + Deeploy/Targets/GAP9/__init__.py | 5 + DeeployTest/CMakeLists.txt | 15 ++ DeeployTest/Platforms/GAP9/CMakeLists.txt | 26 +++ DeeployTest/Platforms/GAP9/inc/CycleCounter.h | 22 ++ DeeployTest/Platforms/GAP9/sdk.config | 28 +++ DeeployTest/Platforms/GAP9/src/CycleCounter.c | 19 ++ DeeployTest/Platforms/GAP9/src/deeploytest.c | 193 ++++++++++++++++ DeeployTest/testRunner_gap9.py | 34 +++ DeeployTest/testRunner_tiled_gap9.py | 24 ++ DeeployTest/testUtils/platformMapping.py | 11 +- DeeployTest/testUtils/testRunner.py | 15 +- TargetLibraries/GAP9/CMakeLists.txt | 30 +++ TargetLibraries/GAP9/inc/DeeployGAP9Math.h | 27 +++ TargetLibraries/GAP9/inc/dory_dma.h | 41 ++++ TargetLibraries/GAP9/inc/dory_mem.h | 28 +++ TargetLibraries/GAP9/inc/mchan.h | 140 ++++++++++++ TargetLibraries/GAP9/src/Util.c | 30 +++ TargetLibraries/GAP9/src/dory_dma.c | 214 ++++++++++++++++++ TargetLibraries/GAP9/src/dory_mem.c | 176 ++++++++++++++ TargetLibraries/Generic/src/BatchNorm_fp32.c | 4 + cmake/simulation.cmake | 7 +- 26 files changed, 1360 insertions(+), 10 deletions(-) create mode 100644 Deeploy/Targets/GAP9/Platform.py create mode 100644 Deeploy/Targets/GAP9/Templates/AllocateTemplate.py create mode 100644 Deeploy/Targets/GAP9/Templates/FreeTemplate.py create mode 100644 Deeploy/Targets/GAP9/Templates/__init__.py create mode 100644 Deeploy/Targets/GAP9/__init__.py create mode 100644 DeeployTest/Platforms/GAP9/CMakeLists.txt create mode 100644 DeeployTest/Platforms/GAP9/inc/CycleCounter.h create mode 100644 DeeployTest/Platforms/GAP9/sdk.config create mode 100644 DeeployTest/Platforms/GAP9/src/CycleCounter.c create mode 100644 DeeployTest/Platforms/GAP9/src/deeploytest.c create mode 100644 DeeployTest/testRunner_gap9.py create mode 100644 DeeployTest/testRunner_tiled_gap9.py create mode 100644 TargetLibraries/GAP9/CMakeLists.txt create mode 100644 TargetLibraries/GAP9/inc/DeeployGAP9Math.h create mode 100644 TargetLibraries/GAP9/inc/dory_dma.h create mode 100644 TargetLibraries/GAP9/inc/dory_mem.h create mode 100644 TargetLibraries/GAP9/inc/mchan.h create mode 100644 TargetLibraries/GAP9/src/Util.c create mode 100644 TargetLibraries/GAP9/src/dory_dma.c create mode 100644 TargetLibraries/GAP9/src/dory_mem.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 70dec13084..5880216fec 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: Apache-2.0 -cmake_minimum_required(VERSION 3.12) +cmake_minimum_required(VERSION 3.19) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) @@ -14,13 +14,14 @@ set(CMAKE_C_COMPILER_LAUNCHER "ccache") set(CMAKE_CXX_COMPILER_LAUNCHER "ccache") set(CMAKE_EXPORT_COMPILE_COMMANDS TRUE) +set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) if(TOOLCHAIN STREQUAL GCC) set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE) endif() -set(platform MemPool CACHE STRING "Platform (MemPool, SoftHier, QEMU, Siracusa, Siracusa_w_neureka, PULP-Open, Generic, Snitch)") -set_property(CACHE platform PROPERTY STRINGS MemPool SoftHier QEMU Siracusa Siracusa_w_neureka PULP-Open Generic Snitch) +set(platform MemPool CACHE STRING "Platform (MemPool, SoftHier, QEMU, Siracusa, Siracusa_w_neureka, PULP-Open, GAP9, Generic, Snitch)") +set_property(CACHE platform PROPERTY STRINGS MemPool SoftHier QEMU Siracusa Siracusa_w_neureka PULP-Open GAP9 Generic Snitch) if(platform STREQUAL MemPool) message(STATUS "Building for platform 'MemPool'") @@ -32,6 +33,12 @@ elseif(platform STREQUAL Siracusa_w_neureka) message(STATUS "Building for platform 'Siracusa_w_neureka'") elseif(platform STREQUAL PULPOpen) message(STATUS "Building for platform 'PULP-Open'") +elseif(platform STREQUAL GAP9) + message(STATUS "Building for platform 'GAP9'") + # set( CMAKE_MESSAGE_LOG_LEVEL "DEBUG" ) + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) + set(ENV{KCONFIG_CONFIG} DeeployTest/Platforms/GAP9/sdk.config) + include($ENV{GAP_SDK_HOME}/utils/cmake/setup.cmake) elseif(platform STREQUAL Generic) message(STATUS "Building for platform 'Generic'") elseif(platform STREQUAL Snitch) @@ -46,9 +53,14 @@ endif() # Import useful functions / macros include(${CMAKE_CURRENT_LIST_DIR}/cmake/Util.cmake) -include(${CMAKE_CURRENT_LIST_DIR}/cmake/common.cmake) +# Only if not GAP9 +if(NOT platform STREQUAL GAP9) + include(${CMAKE_CURRENT_LIST_DIR}/cmake/common.cmake) +endif() include(${CMAKE_CURRENT_LIST_DIR}/cmake/simulation.cmake) +add_library(deeploylib INTERFACE) + message(STATUS "============================= Project Configuration ============================") message(STATUS "[Deeploy] platform = " ${platform}) message(STATUS "[Deeploy] use_dma = " ${use_dma}) @@ -211,6 +223,28 @@ if(platform STREQUAL Siracusa OR platform STREQUAL Siracusa_w_neureka OR platfor endif() +if(platform STREQUAL GAP9) + project(${TESTNAME} LANGUAGES C ASM) + + add_compile_options( + -Wno-error=unknown-pragmas + ) + + add_compile_definitions( + DEEPLOY_GAP9_PLATFORM + ) + + add_subdirectory(TargetLibraries/Generic) + add_subdirectory(TargetLibraries/GAP9) + target_include_directories(deeploygap9 PUBLIC TargetLibraries/Generic/inc) + + add_subdirectory(DeeployTest) + target_link_libraries(deeploylib INTERFACE deeploybasic deeploygap9) + + setupos(${TESTNAME}) + +endif() + if(platform STREQUAL Snitch) if(TOOLCHAIN STREQUAL LLVM) diff --git a/Deeploy/Targets/GAP9/Platform.py b/Deeploy/Targets/GAP9/Platform.py new file mode 100644 index 0000000000..633b225754 --- /dev/null +++ b/Deeploy/Targets/GAP9/Platform.py @@ -0,0 +1,143 @@ +# SPDX-FileCopyrightText: 2025 ETH Zurich and University of Bologna +# +# SPDX-License-Identifier: Apache-2.0 + +import numpy as np +import onnx_graphsurgeon as gs + +from Deeploy.DeeployTypes import ConstantBuffer, DeploymentEngine, DeploymentPlatform, NetworkContext, NodeTemplate, \ + StructBuffer, TransientBuffer, VariableBuffer +from Deeploy.MemoryLevelExtension.MemoryLevels import MemoryHierarchy, MemoryLevel +from Deeploy.MemoryLevelExtension.NetworkDeployers.MemoryLevelDeployer import MemoryPlatform, MemoryPlatformWrapper +from Deeploy.Targets.GAP9.Templates import AllocateTemplate, FreeTemplate +from Deeploy.Targets.Generic.Templates import AllocateTemplate as BasicAllocateTemplate +from Deeploy.Targets.PULPOpen.Platform import PULPMapping + + +class GAP9VariableBuffer(VariableBuffer): + + initTemplate = AllocateTemplate.gap9L2InitTemplate + # allocTemplate = AllocateTemplate.gap9L2AllocateTemplate + # deallocTemplate = FreeTemplate.gap9L2LocalTemplate + + allocTemplate = AllocateTemplate.gap9GenericAllocate + deallocTemplate = FreeTemplate.gap9GenericFree + + def _bufferRepresentation(self): + + if hasattr(self, "_memoryLevel"): + memoryLevel = self._memoryLevel + else: + memoryLevel = None + + return { + "type": self._instance, + "name": self.name, + "size": int(np.prod(self.shape)), + "_memoryLevel": memoryLevel + } + + +class GAP9TransientBuffer(TransientBuffer): + + initTemplate = AllocateTemplate.gap9L2InitTemplate + allocTemplate = AllocateTemplate.gap9GenericAllocate + deallocTemplate = FreeTemplate.gap9GenericFree + + # allocTemplate = AllocateTemplate.gap9L2AllocateTemplate + # deallocTemplate = FreeTemplate.gap9L2GlobalTemplate + + def _bufferRepresentation(self): + + if hasattr(self, "_memoryLevel"): + memoryLevel = self._memoryLevel + else: + memoryLevel = None + + return {"type": self._type, "name": self.name, "size": self.size, "_memoryLevel": memoryLevel} + + +class GAP9ConstantBuffer(ConstantBuffer): + + initTemplate = AllocateTemplate.gap9GenericGlobalInitTemplate + allocTemplate = AllocateTemplate.gap9L2GlobalAllocateTemplate + deallocTemplate = FreeTemplate.gap9L2GlobalTemplate + + def _bufferRepresentation(self): + operatorRepresentation = super()._bufferRepresentation() + + if hasattr(self, "_memoryLevel"): + memoryLevel = self._memoryLevel + else: + memoryLevel = None + + operatorRepresentation["_memoryLevel"] = memoryLevel + + return operatorRepresentation + + +class GAP9StructBuffer(StructBuffer): + + initTemplate = BasicAllocateTemplate.referenceStructInitTemplate + allocTemplate = BasicAllocateTemplate.referenceStructAllocateTemplate + deallocTemplate = NodeTemplate("") + + +# SCHEREMO: stdint is included before pulp_nn_kernels.h because it is supposed to be included in there, but isn't... +_includeList = [ + "pmsis.h", + "DeeployGAP9Math.h", +] + + +class GAP9ClusterEngine(DeploymentEngine): + + def __init__(self, name: str, Mapping = PULPMapping, initCode = "", includeList = _includeList) -> None: + super().__init__(name, Mapping, initCode, includeList) + + +class GAP9Platform(DeploymentPlatform): + + def __init__(self, + engines = [GAP9ClusterEngine("GAP9Cluster")], + variableBuffer = GAP9VariableBuffer, + constantBuffer = GAP9ConstantBuffer, + structBuffer = GAP9StructBuffer, + transientBuffer = GAP9TransientBuffer) -> None: + super().__init__(engines, variableBuffer, constantBuffer, structBuffer, transientBuffer) + + +class MemoryGAP9Platform(MemoryPlatform): + + untiledOps = ["add"] + + def __init__(self, + memoryHierarchy: MemoryHierarchy, + defaultTargetMemoryLevel: MemoryLevel, + engines = [GAP9ClusterEngine("GAP9Cluster")], + variableBuffer = GAP9VariableBuffer, + constantBuffer = GAP9ConstantBuffer, + structBuffer = GAP9StructBuffer, + transientBuffer = GAP9TransientBuffer) -> None: + super().__init__(memoryHierarchy, defaultTargetMemoryLevel, engines, variableBuffer, constantBuffer, + structBuffer, transientBuffer) + + def getTargetMemoryLevel(self, node: gs.Node, tensorName: str, ctxt: NetworkContext) -> str: + if node.op in self.untiledOps: + return ctxt.lookup(tensorName)._memoryLevel + return super().getTargetMemoryLevel(node, tensorName, ctxt) + + +class MemoryGAP9PlatformWrapper(MemoryPlatformWrapper): + + untiledOps = ["add"] + + def __init__(self, platform: GAP9Platform, memoryHierarchy: MemoryHierarchy, defaultTargetMemoryLevel: MemoryLevel): + assert isinstance(platform, GAP9Platform), \ + f"Given platform is not an instance of GAP9Platform. Platform type: {type(platform).__name__}" + super().__init__(platform, memoryHierarchy, defaultTargetMemoryLevel) + + def getTargetMemoryLevel(self, node: gs.Node, tensorName: str, ctxt: NetworkContext) -> str: + if node.op in self.untiledOps: + return ctxt.lookup(tensorName)._memoryLevel + return super().getTargetMemoryLevel(node, tensorName, ctxt) diff --git a/Deeploy/Targets/GAP9/Templates/AllocateTemplate.py b/Deeploy/Targets/GAP9/Templates/AllocateTemplate.py new file mode 100644 index 0000000000..32a3e40c37 --- /dev/null +++ b/Deeploy/Targets/GAP9/Templates/AllocateTemplate.py @@ -0,0 +1,69 @@ +# SPDX-FileCopyrightText: 2025 ETH Zurich and University of Bologna +# +# SPDX-License-Identifier: Apache-2.0 + +from Deeploy.DeeployTypes import NodeTemplate + +gap9L2InitTemplate = NodeTemplate("${type.typeName} ${name};\n") + +gap9L1InitTemplate = NodeTemplate("${type.typeName} ${name};\n") +#gap9L2AllocateTemplate = NodeTemplate("${name} = (${type.typeName}) pi_l2_malloc(${type.referencedType.typeWidth//8} * ${size});\n") +gap9L2AllocateTemplate = NodeTemplate( + "${name} = (${type.typeName}) pi_l2_malloc(sizeof(${type.referencedType.typeName}) * ${size});\n") + +gap9L1AllocateTemplate = NodeTemplate( + "${name} = (${type.typeName}) pi_l1_malloc((void *) 0, sizeof(${type.referencedType.typeName}) * ${size});\n") + +gap9L2GlobalInitTemplate = NodeTemplate( + "static PI_L2 ${type.referencedType.typeName} ${name}[${size}] = {${values}};\n") + +gap9L1GlobalInitTemplate = NodeTemplate( + "static PI_L1 ${type.referencedType.typeName} ${name}[${size}] = {${values}};\n") + +#gap9L2GlobalInitTemplate = NodeTemplate("static const ${type} ${name}[${size}];\n") +gap9L2GlobalAllocateTemplate = NodeTemplate("") + +gap9L1GlobalAllocateTemplate = NodeTemplate("") + +gap9L2StructInitTemplate = NodeTemplate("""static PI_L2 ${type.typeName} ${name}; +""") +#static const ${type}* ${name} = &${name}_UL; + +gap9L2StructAllocateTemplate = NodeTemplate(""" % for key, value in structDict.items(): + ${name}.${key} = ${value}; +% endfor """) + +gap9GenericStructInitTemplate = NodeTemplate(""" +% if _memoryLevel == "L1": +static PI_L1 ${type.typeName} ${name};\n +% elif _memoryLevel == "L2" or _memoryLevel is None: +static PI_L2 ${type.typeName} ${name};\n +% elif _memoryLevel == "L3": +// ${name} is allocated in L3 \n +% endif +""") + +gap9GenericGlobalInitTemplate = NodeTemplate(""" +% if _memoryLevel == "L1": +static PI_L1 ${type.referencedType.typeName} ${name}[${size}] = {${values}};\n +% elif _memoryLevel == "L2" or _memoryLevel is None: +static PI_L2 ${type.referencedType.typeName} ${name}[${size}] = {${values}};\n +% elif _memoryLevel == "L3": +// ${name} is allocated in L3 \n +static PI_L2 ${type.referencedType.typeName}* ${name}; +% endif +""") + +gap9GenericAllocate = NodeTemplate(""" +% if _memoryLevel == "L1": +${name} = (${type.typeName}) pi_l1_malloc((void *) 0, sizeof(${type.referencedType.typeName}) * ${size});\n +% elif _memoryLevel == "L2" or _memoryLevel is None: +${name} = (${type.typeName}) pi_l2_malloc(sizeof(${type.referencedType.typeName}) * ${size});\n +% elif _memoryLevel == "L3": +${name} = (${type.typeName}) cl_ram_malloc(sizeof(${type.referencedType.typeName}) * ${size});\n +% else: +//COMPILER BLOCK - MEMORYLEVEL ${_memoryLevel} NOT FOUND \n +${name} = (${type.typeName}) pi_l2_malloc(sizeof(${type.referencedType.typeName}) * ${size});\n +// ${name} with size ${size} allocated in L2! +% endif +""") diff --git a/Deeploy/Targets/GAP9/Templates/FreeTemplate.py b/Deeploy/Targets/GAP9/Templates/FreeTemplate.py new file mode 100644 index 0000000000..185b330b16 --- /dev/null +++ b/Deeploy/Targets/GAP9/Templates/FreeTemplate.py @@ -0,0 +1,22 @@ +# SPDX-FileCopyrightText: 2025 ETH Zurich and University of Bologna +# +# SPDX-License-Identifier: Apache-2.0 + +from Deeploy.DeeployTypes import NodeTemplate + +gap9L2LocalTemplate = NodeTemplate("pi_l2_free(${name}, sizeof(${type.referencedType.typeName}) * ${size});") +gap9L2GlobalTemplate = NodeTemplate("pi_l2_free(${name}, sizeof(${type.referencedType.typeName}) * ${size});") +gap9L1FreeTemplate = NodeTemplate("pi_l1_malloc_free(${name}, sizeof(${type.referencedType.typeName}) * ${size});\n") +gap9L1GlobalFreeTemplate = NodeTemplate("") + +gap9GenericFree = NodeTemplate(""" +% if _memoryLevel == "L1": +pi_l1_malloc_free(${name}, sizeof(${type.referencedType.typeName}) * ${size}); +% elif _memoryLevel == "L2" or _memoryLevel is None: +pi_l2_free(${name}, sizeof(${type.referencedType.typeName}) * ${size}); +% elif _memoryLevel == "L3": +cl_ram_free(${name}, sizeof(${type.referencedType.typeName}) * ${size}); +% else: +//COMPILER BLOCK - MEMORYLEVEL ${_memoryLevel} NOT FOUND \n +% endif +""") diff --git a/Deeploy/Targets/GAP9/Templates/__init__.py b/Deeploy/Targets/GAP9/Templates/__init__.py new file mode 100644 index 0000000000..9cd8ddcb2e --- /dev/null +++ b/Deeploy/Targets/GAP9/Templates/__init__.py @@ -0,0 +1,5 @@ +# SPDX-FileCopyrightText: 2025 ETH Zurich and University of Bologna +# +# SPDX-License-Identifier: Apache-2.0 + +from . import * diff --git a/Deeploy/Targets/GAP9/__init__.py b/Deeploy/Targets/GAP9/__init__.py new file mode 100644 index 0000000000..9cd8ddcb2e --- /dev/null +++ b/Deeploy/Targets/GAP9/__init__.py @@ -0,0 +1,5 @@ +# SPDX-FileCopyrightText: 2025 ETH Zurich and University of Bologna +# +# SPDX-License-Identifier: Apache-2.0 + +from . import * diff --git a/DeeployTest/CMakeLists.txt b/DeeployTest/CMakeLists.txt index 0634b4ba0f..4e7fe40fc8 100644 --- a/DeeployTest/CMakeLists.txt +++ b/DeeployTest/CMakeLists.txt @@ -50,5 +50,20 @@ elseif(DEEPLOY_ARCH STREQUAL SNITCH) add_subdirectory(Platforms/Snitch) elseif(DEEPLOY_ARCH STREQUAL CHIMERA) add_subdirectory(Platforms/Chimera) +elseif(platform STREQUAL GAP9) + file(GLOB_RECURSE HEXLIST + "${GENERATED_SOURCE}/hex/**" + ) + + list(APPEND GVSOC_EXTRA_FLAGS --target-property=boot.flash_device=mram --target-property=boot.mode=flash) + + if (NOT HEXLIST) + target_compile_options(network PUBLIC -DNOFLASH) + else() + gvsoc_flags_add_files_to_hyperflash(GVSOC_HEX_HYPERFLASH_FLAGS HEXLIST) + list(APPEND GVSOC_EXTRA_FLAGS ${GVSOC_HEX_HYPERFLASH_FLAGS}) + endif() + + add_subdirectory(Platforms/GAP9) endif() diff --git a/DeeployTest/Platforms/GAP9/CMakeLists.txt b/DeeployTest/Platforms/GAP9/CMakeLists.txt new file mode 100644 index 0000000000..ec79db2a5d --- /dev/null +++ b/DeeployTest/Platforms/GAP9/CMakeLists.txt @@ -0,0 +1,26 @@ +# SPDX-FileCopyrightText: 2025 ETH Zurich and University of Bologna +# +# SPDX-License-Identifier: Apache-2.0 + +set(ProjectId ${TESTNAME}) + +# set($ENV{KCONFIG_CONFIG} ${CMAKE_CURRENT_LIST_DIR}/sdk.config) +# set(${SDKCONFIG_DIR} ${CMAKE_CURRENT_LIST_DIR}) + + +set(${SDKCONFIG_FILE} ${CMAKE_CURRENT_LIST_DIR}/sdk.config) + +file(GLOB_RECURSE SOURCES + src/CycleCounter.c + src/deeploytest.c +) + +add_deeploy_executable(${ProjectId} EXCLUDE_FROM_ALL ${SOURCES}) +# add_executable(${ProjectId} ${SOURCES}) +target_include_directories(${ProjectId} PRIVATE ${CMAKE_CURRENT_LIST_DIR}/inc) + +target_link_libraries(${ProjectId} PRIVATE network deeploylib) +target_compile_options(${ProjectId} INTERFACE network) +add_gvsoc_emulation(${ProjectId} "gap9.evk") + +link_compile_dump(${TESTNAME}) diff --git a/DeeployTest/Platforms/GAP9/inc/CycleCounter.h b/DeeployTest/Platforms/GAP9/inc/CycleCounter.h new file mode 100644 index 0000000000..e4720af1f1 --- /dev/null +++ b/DeeployTest/Platforms/GAP9/inc/CycleCounter.h @@ -0,0 +1,22 @@ +/* + * SPDX-FileCopyrightText: 2025 ETH Zurich and University of Bologna + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#ifndef CYCLECOUNTER +#define CYCLECOUNTER + +// Resets the internal cycle counter to zero +void ResetTimer(void); + +// Starts the internal cycle counter +void StartTimer(void); + +// Stops the internal cycle counter +void StopTimer(void); + +// Returns the current number of cycles according to the internal cycle counter +unsigned int getCycles(void); + +#endif diff --git a/DeeployTest/Platforms/GAP9/sdk.config b/DeeployTest/Platforms/GAP9/sdk.config new file mode 100644 index 0000000000..16695a4acc --- /dev/null +++ b/DeeployTest/Platforms/GAP9/sdk.config @@ -0,0 +1,28 @@ +# SPDX-FileCopyrightText: 2025 ETH Zurich and University of Bologna +# +# SPDX-License-Identifier: Apache-2.0 + +CONFIG_BOARD_GAP9MOD_V1_0_B=y +CONFIG_BOARD_GAP9EVK_V1_3=y + +CONFIG_DRIVER_CLUSTER=y +CONFIG_DRIVER_CLUSTER_CONF_PROPERTY_ICACHE_CONF=0x7FF + +CONFIG_DRIVER_TYPE_FLASH=y +CONFIG_DRIVER_TYPE_RAM=y + +# CONFIG_DRIVER_MRAM=y +CONFIG_DRIVER_READFS=y +# CONFIG_READFS_FLASH_TYPE_MRAM=y + +# CONFIG_DRIVER_APS256XXN=y +# CONFIG_DRIVER_RAM_API=y + +CONFIG_ENABLE_LIBMATH=y + +# OS float printf +CONFIG_IO_PRINTF_FLOAT_ENABLE=y +CONFIG_IO_PRINTF_FLOAT_EXPONENT_ENABLE=y + +CONFIG_PLATFORM_GVSOC=y +# CONFIG_DRIVER_CLUSTERDECOMPRESSOR=n \ No newline at end of file diff --git a/DeeployTest/Platforms/GAP9/src/CycleCounter.c b/DeeployTest/Platforms/GAP9/src/CycleCounter.c new file mode 100644 index 0000000000..820ea05028 --- /dev/null +++ b/DeeployTest/Platforms/GAP9/src/CycleCounter.c @@ -0,0 +1,19 @@ +/* + * SPDX-FileCopyrightText: 2025 ETH Zurich and University of Bologna + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "CycleCounter.h" +#include "pmsis.h" + +void ResetTimer() { + pi_perf_conf(1 << PI_PERF_CYCLES); + pi_perf_reset(); +} + +void StartTimer() { pi_perf_start(); } + +void StopTimer() { pi_perf_stop(); } + +unsigned int getCycles() { return pi_perf_read(PI_PERF_CYCLES); } diff --git a/DeeployTest/Platforms/GAP9/src/deeploytest.c b/DeeployTest/Platforms/GAP9/src/deeploytest.c new file mode 100644 index 0000000000..e44455d741 --- /dev/null +++ b/DeeployTest/Platforms/GAP9/src/deeploytest.c @@ -0,0 +1,193 @@ +/* + * SPDX-FileCopyrightText: 2025 ETH Zurich and University of Bologna + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include + +#include "CycleCounter.h" +#include "Network.h" +#include "dory_mem.h" +#include "pmsis.h" +#include "testinputs.h" +#include "testoutputs.h" + +#define MAINSTACKSIZE 8000 +#define SLAVESTACKSIZE 3800 + +struct pi_device cluster_dev; + +typedef struct { + void *expected; + void *actual; + int num_elements; + int output_buf_index; + int *err_count; +} FloatCompareArgs; + +void CompareFloatOnCluster(void *args) { + + if (pi_core_id() == 0) { + FloatCompareArgs *compare_args = (FloatCompareArgs *)args; + float *expected = (float *)compare_args->expected; + float *actual = (float *)compare_args->actual; + int num_elements = compare_args->num_elements; + int output_buf_index = compare_args->output_buf_index; + int *err_count = compare_args->err_count; + + int local_err_count = 0; + + for (int i = 0; i < num_elements; i++) { + float expected_val = expected[i]; + float actual_val = actual[i]; + float diff = expected_val - actual_val; + + if ((diff < -1e-4) || (diff > 1e-4) || isnan(diff)) { + local_err_count += 1; + + printf("Expected: %10.6f ", expected_val); + printf("Actual: %10.6f ", actual_val); + printf("Diff: %10.6f at Index %12u in Output %u\r\n", diff, i, + output_buf_index); + } + } + + *err_count = local_err_count; + } +} + +void CL_CompareFloat(void *arg) { + pi_cl_team_fork(NUM_CORES, CompareFloatOnCluster, arg); +} + +void PE_RunNetwork(void *arg) { +#ifndef CI + uint32_t core_id = pi_core_id(), cluster_id = pi_cluster_id(); + printf("[%d %d] Run Network!\n", cluster_id, core_id); +#endif + RunNetwork(pi_core_id(), NUM_CORES); +} + +void CL_RunNetwork(void *arg) { + pi_cl_team_fork(NUM_CORES, PE_RunNetwork, NULL); +} + +void PE_InitNetwork(void *arg) { +#ifndef CI + uint32_t core_id = pi_core_id(), cluster_id = pi_cluster_id(); + printf("[%d %d] Init Network!\n", cluster_id, core_id); +#endif + + InitNetwork(pi_core_id(), NUM_CORES); +} + +int main(void) { +#ifndef CI + uint32_t core_id = pi_core_id(), cluster_id = pi_cluster_id(); + printf("[%d %d] Hello World!\n", cluster_id, core_id); +#endif + struct pi_cluster_conf conf; + + pi_cluster_conf_init(&conf); + conf.id = 0; + pi_open_from_conf(&cluster_dev, &conf); + if (pi_cluster_open(&cluster_dev)) + return -1; + + mem_init(); +#ifndef NOFLASH + open_fs(); +#endif + + printf("Intializing\r\n"); + + struct pi_cluster_task cluster_task; + + pi_cluster_task(&cluster_task, PE_InitNetwork, NULL); + cluster_task.slave_stack_size = SLAVESTACKSIZE; + pi_cluster_send_task_to_cl(&cluster_dev, &cluster_task); + +#ifndef CI + printf("Initialized\r\n"); +#endif + for (uint32_t buf = 0; buf < DeeployNetwork_num_inputs; buf++) { + if ((uint32_t)DeeployNetwork_inputs[buf] >= 0x10000000) { + memcpy(DeeployNetwork_inputs[buf], testInputVector[buf], + DeeployNetwork_inputs_bytes[buf]); + } + } + +#ifndef CI + printf("Input copied\r\n"); +#endif + + pi_cluster_task(&cluster_task, CL_RunNetwork, NULL); + cluster_task.slave_stack_size = SLAVESTACKSIZE; + ResetTimer(); + StartTimer(); + pi_cluster_send_task_to_cl(&cluster_dev, &cluster_task); + StopTimer(); + +#ifndef CI + printf("Output:\r\n"); +#endif + + uint32_t tot_err, tot_tested; + tot_err = 0; + tot_tested = 0; + void *compbuf; + FloatCompareArgs float_compare_args; + uint32_t float_error_count = 0; + + for (uint32_t buf = 0; buf < DeeployNetwork_num_outputs; buf++) { + tot_tested += DeeployNetwork_outputs_bytes[buf] / sizeof(OUTPUTTYPE); + + if ((uint32_t)DeeployNetwork_outputs[buf] < 0x1000000) { + compbuf = pi_l2_malloc(DeeployNetwork_outputs_bytes[buf]); + ram_read(compbuf, DeeployNetwork_outputs[buf], + DeeployNetwork_outputs_bytes[buf]); + } else { + compbuf = DeeployNetwork_outputs[buf]; + } + + if (ISOUTPUTFLOAT) { + float_error_count = 0; + float_compare_args.expected = testOutputVector[buf]; + float_compare_args.actual = compbuf; + float_compare_args.num_elements = + DeeployNetwork_outputs_bytes[buf] / sizeof(float); + float_compare_args.output_buf_index = buf; + float_compare_args.err_count = (int *)&float_error_count; + + pi_cluster_task(&cluster_task, CL_CompareFloat, &float_compare_args); + cluster_task.slave_stack_size = SLAVESTACKSIZE; + pi_cluster_send_task_to_cl(&cluster_dev, &cluster_task); + + tot_err += float_error_count; + } else { + + for (uint32_t i = 0; + i < DeeployNetwork_outputs_bytes[buf] / sizeof(OUTPUTTYPE); i++) { + OUTPUTTYPE expected = ((OUTPUTTYPE *)testOutputVector[buf])[i]; + OUTPUTTYPE actual = ((OUTPUTTYPE *)compbuf)[i]; + OUTPUTTYPE diff = expected - actual; + + if (diff) { + tot_err += 1; + printf("Expected: %4d ", expected); + printf("Actual: %4d ", actual); + printf("Diff: %4d at Index %12u in Output %u\r\n", diff, i, buf); + } + } + } + if ((uint32_t)DeeployNetwork_outputs[buf] < 0x1000000) { + pi_l2_free(compbuf, DeeployNetwork_outputs_bytes[buf]); + } + } + + printf("Runtime: %u cycles\r\n", getCycles()); + printf("Errors: %u out of %u \r\n", tot_err, tot_tested); + + return 0; +} \ No newline at end of file diff --git a/DeeployTest/testRunner_gap9.py b/DeeployTest/testRunner_gap9.py new file mode 100644 index 0000000000..9335bdbad8 --- /dev/null +++ b/DeeployTest/testRunner_gap9.py @@ -0,0 +1,34 @@ +# SPDX-FileCopyrightText: 2025 ETH Zurich and University of Bologna +# +# SPDX-License-Identifier: Apache-2.0 + +from testUtils.testRunner import TestRunner, TestRunnerArgumentParser + +if __name__ == "__main__": + + parser = TestRunnerArgumentParser( + tiling_arguments = False, description = "Deeploy Code Generation Utility for the GAP9 Platform (no Tiling).") + + parser.add_argument('--cores', + metavar = '', + dest = 'cores', + type = int, + default = 8, + help = 'Set number of cluster cores') + + parser.add_argument('--profileUntiled', + action = 'store_true', + dest = 'profileUntiled', + default = False, + help = 'Profile Untiled') + + # Set default GVSOC install dir + for action in parser._actions: + if action.dest == 'gvsoc_install_dir': + action.default = "${GAP_SDK_HOME}/install/workstation" + args = parser.parse_args() + + testRunner = TestRunner(platform = "GAP9", simulator = "gvsoc", tiling = False, argument_parser = parser) + + testRunner.cmake_args += f" -D NUM_CORES={args.cores}" + testRunner.run() diff --git a/DeeployTest/testRunner_tiled_gap9.py b/DeeployTest/testRunner_tiled_gap9.py new file mode 100644 index 0000000000..c1bd72528a --- /dev/null +++ b/DeeployTest/testRunner_tiled_gap9.py @@ -0,0 +1,24 @@ +# SPDX-FileCopyrightText: 2025 ETH Zurich and University of Bologna +# +# SPDX-License-Identifier: Apache-2.0 + +from testUtils.testRunner import TestRunner, TestRunnerArgumentParser + +if __name__ == "__main__": + + parser = TestRunnerArgumentParser(tiling_arguments = True, + description = "Deeploy Code Generation Utility for the GAP9 Platform (Tiling).") + + parser.add_argument('--cores', + metavar = '', + dest = 'cores', + type = int, + default = 8, + help = 'Set number of cluster cores') + + args = parser.parse_args() + + testRunner = TestRunner(platform = "GAP9", simulator = "gvsoc", tiling = True, argument_parser = parser) + + testRunner.cmake_args += f" -D NUM_CORES={args.cores}" + testRunner.run() diff --git a/DeeployTest/testUtils/platformMapping.py b/DeeployTest/testUtils/platformMapping.py index 48c5777905..f107ab2e93 100644 --- a/DeeployTest/testUtils/platformMapping.py +++ b/DeeployTest/testUtils/platformMapping.py @@ -14,6 +14,7 @@ from Deeploy.Targets.Chimera.Platform import ChimeraOptimizer, ChimeraPlatform from Deeploy.Targets.CortexM.Deployer import CMSISDeployer from Deeploy.Targets.CortexM.Platform import CMSISOptimizer, CMSISPlatform +from Deeploy.Targets.GAP9.Platform import GAP9Platform, MemoryGAP9Platform, MemoryGAP9PlatformWrapper from Deeploy.Targets.Generic.Deployer import GenericDeployer from Deeploy.Targets.Generic.Platform import GenericOptimizer, GenericPlatform from Deeploy.Targets.MemPool.Deployer import MemPoolDeployer @@ -29,7 +30,7 @@ from Deeploy.Targets.SoftHier.Platform import SoftHierOptimizer, SoftHierPlatform _SIGNPROP_PLATFORMS = ["Apollo3", "Apollo4", "QEMU-ARM", "Generic", "MemPool", "SoftHier"] -_NONSIGNPROP_PLATFORMS = ["Siracusa", "Siracusa_w_neureka", "PULPOpen", "Snitch", "Chimera"] +_NONSIGNPROP_PLATFORMS = ["Siracusa", "Siracusa_w_neureka", "PULPOpen", "Snitch", "Chimera", "GAP9"] _PLATFORMS = _SIGNPROP_PLATFORMS + _NONSIGNPROP_PLATFORMS @@ -59,6 +60,9 @@ def mapPlatform(platformName: str) -> Tuple[DeploymentPlatform, bool]: elif platformName == "Siracusa" or platformName == "PULPOpen": Platform = PULPPlatform() + elif platformName == "GAP9": + Platform = GAP9Platform() + elif platformName == "Siracusa_w_neureka": Platform = NeurekaPlatform() @@ -85,6 +89,8 @@ def setupMemoryPlatform(platform: DeploymentPlatform, memoryHierarchy: MemoryHie weightMemoryLevel = memoryHierarchy.memoryLevels["WeightMemory_SRAM"] \ if "WeightMemory_SRAM" in memoryHierarchy.memoryLevels else None return MemoryNeurekaPlatformWrapper(platform, memoryHierarchy, defaultTargetMemoryLevel, weightMemoryLevel) + if isinstance(platform, GAP9Platform): + return MemoryGAP9PlatformWrapper(platform, memoryHierarchy, defaultTargetMemoryLevel) else: return MemoryPlatformWrapper(platform, memoryHierarchy, defaultTargetMemoryLevel) @@ -200,7 +206,8 @@ def mapDeployer(platform: DeploymentPlatform, default_channels_first = default_channels_first, deeployStateDir = deeployStateDir) - elif isinstance(platform, (PULPPlatform, MemoryPULPPlatform, MemoryPULPPlatformWrapper)): + elif isinstance(platform, (PULPPlatform, MemoryPULPPlatform, MemoryPULPPlatformWrapper, GAP9Platform, + MemoryGAP9Platform, MemoryGAP9PlatformWrapper)): if loweringOptimizer is None: loweringOptimizer = PULPOptimizer diff --git a/DeeployTest/testUtils/testRunner.py b/DeeployTest/testUtils/testRunner.py index a3329ebf73..e479467c0d 100644 --- a/DeeployTest/testUtils/testRunner.py +++ b/DeeployTest/testUtils/testRunner.py @@ -160,6 +160,12 @@ def __init__(self, tiling_arguments: bool, description = None): type = str, default = os.environ.get('LLVM_INSTALL_DIR'), help = 'Pick compiler install dir\n') + self.add_argument('--gvsoc_install_dir', + metavar = '', + dest = 'gvsoc_install_dir', + type = str, + default = os.environ.get('GVSOC_INSTALL_DIR'), + help = 'Pick gvsoc install dir\n') self.add_argument('--input-type-map', nargs = '*', default = [], @@ -306,7 +312,9 @@ def __init__(self, self._dir_gen_root = f'TEST_{platform.upper()}' assert self._args.toolchain_install_dir is not None, f"Environment variable LLVM_INSTALL_DIR is not set" + assert self._args.gvsoc_install_dir is not None, f"Environment variable GVSOC_INSTALL_DIR is not set" self._dir_toolchain = os.path.normpath(self._args.toolchain_install_dir) + self._dir_gvsoc = os.path.normpath(self._args.gvsoc_install_dir) self._dir_build = f"{self._dir_gen_root}/build" self._dir_gen, self._dir_test, self._name_test = getPaths(self._args.dir, self._dir_gen_root) @@ -367,7 +375,7 @@ def configure_cmake_project(self): else: self.cmake_args += " -D gvsoc_simulation=OFF" - command = f"$CMAKE -D TOOLCHAIN={self._args.toolchain} -D TOOLCHAIN_INSTALL_DIR={self._dir_toolchain} -D GENERATED_SOURCE={self._dir_gen} -D platform={self._platform} {self.cmake_args} -B {self._dir_build} -D TESTNAME={self._name_test} .." + command = f"$CMAKE -D TOOLCHAIN={self._args.toolchain} -D GVSOC_INSTALL_DIR={self._dir_gvsoc} -D TOOLCHAIN_INSTALL_DIR={self._dir_toolchain} -D GENERATED_SOURCE={self._dir_gen} -D platform={self._platform} {self.cmake_args} -B {self._dir_build} -D TESTNAME={self._name_test} .." if self._args.verbose >= 3: command = "VERBOSE=1 " + command @@ -384,6 +392,11 @@ def build_binary(self): if self._args.verbose >= 3: command = "VERBOSE=1 " + command + if self._platform == 'GAP9': + command += f" --build {self._dir_build} --target {self._name_test} image" + else: + command += f" --build {self._dir_build} --target {self._name_test}" + log.debug(f"[TestRunner] Building Command: {command}") err = os.system(command) diff --git a/TargetLibraries/GAP9/CMakeLists.txt b/TargetLibraries/GAP9/CMakeLists.txt new file mode 100644 index 0000000000..a39df465f6 --- /dev/null +++ b/TargetLibraries/GAP9/CMakeLists.txt @@ -0,0 +1,30 @@ +# SPDX-FileCopyrightText: 2025 ETH Zurich and University of Bologna +# +# SPDX-License-Identifier: Apache-2.0 + +file(GLOB_RECURSE SOURCES + "src/**" +) + +if(NOT DEFINED ENV{GAP_SDK_HOME}) + message(FATAL_ERROR "Environment variable GAP_SDK_HOME not set.") +endif() + +add_deeploy_library(deeploygap9 STATIC ${SOURCES}) +target_include_directories(deeploygap9 + PUBLIC + ${CMAKE_CURRENT_LIST_DIR}/inc +) + +target_compile_options(deeploygap9 PUBLIC + -DNUM_CORES=${NUM_CORES} + ) + +target_compile_options(deeploygap9 PRIVATE + -Wno-implicit-function-declaration + -Wno-implicit-int-conversion + -Wno-sign-conversion + -Wno-sign-compare +) + +target_link_libraries(deeploygap9 PUBLIC pmsis) diff --git a/TargetLibraries/GAP9/inc/DeeployGAP9Math.h b/TargetLibraries/GAP9/inc/DeeployGAP9Math.h new file mode 100644 index 0000000000..0efa74c72e --- /dev/null +++ b/TargetLibraries/GAP9/inc/DeeployGAP9Math.h @@ -0,0 +1,27 @@ +/* + * SPDX-FileCopyrightText: 2021 ETH Zurich and University of Bologna + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#ifndef __DEEPLOY_MATH_HEADER_ +#define __DEEPLOY_MATH_HEADER_ + +#include +#include +#include +#include +#include + +#define BEGIN_SINGLE_CORE if (pi_core_id() == 8 || pi_core_id() == 0) { +#define END_SINGLE_CORE } +#define SINGLE_CORE if (pi_core_id() == 8 || pi_core_id() == 0) + +#include "DeeployBasicMath.h" + +#include "dory_dma.h" +#include "dory_mem.h" + +#include "pmsis.h" + +#endif // __DEEPLOY_MATH_HEADER_ diff --git a/TargetLibraries/GAP9/inc/dory_dma.h b/TargetLibraries/GAP9/inc/dory_dma.h new file mode 100644 index 0000000000..99ab242558 --- /dev/null +++ b/TargetLibraries/GAP9/inc/dory_dma.h @@ -0,0 +1,41 @@ +/* + * SPDX-FileCopyrightText: 2020 ETH Zurich and University of Bologna + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#ifndef _DORY_DMA_H +#define _DORY_DMA_H + +typedef struct { + void *ext; + void *loc; + unsigned short hwc_to_chw; + unsigned short stride_2d; + unsigned short number_of_2d_copies; + unsigned short stride_1d; + unsigned short number_of_1d_copies; + unsigned int length_1d_copy; + unsigned int mchan_cmd; + int dir; // 0 l1->l2, 1 l2->l1 + int tid; +} DMA_copy; + +void dory_dma_memcpy_hwc_to_chw(DMA_copy *copy); + +void dory_dma_memcpy_1d_async(DMA_copy *copy); + +void dory_dma_memcpy_2d_async(DMA_copy *copy); + +void dory_dma_memcpy_3d_async(DMA_copy *copy); + +void dory_dma_memcpy_async(DMA_copy *copy); + +void dory_dma_memcpy_mindims_async(DMA_copy *copy); + +void dory_dma_free(DMA_copy *copy); + +void dory_dma_barrier(DMA_copy *copy); + +int dory_dma_allocate(); +#endif diff --git a/TargetLibraries/GAP9/inc/dory_mem.h b/TargetLibraries/GAP9/inc/dory_mem.h new file mode 100644 index 0000000000..ccd36a37d6 --- /dev/null +++ b/TargetLibraries/GAP9/inc/dory_mem.h @@ -0,0 +1,28 @@ +/* + * SPDX-FileCopyrightText: 2020 ETH Zurich and University of Bologna + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#ifndef __MEM_H__ +#define __MEM_H__ + +#include + +extern struct pi_device ram; + +void open_fs(); +void mem_init(); +struct pi_device *get_ram_ptr(); +void *ram_malloc(size_t size); +void ram_free(void *ptr, size_t size); +void ram_read(void *dest, void *src, size_t size); +void ram_write(void *dest, void *src, size_t size); +void *cl_ram_malloc(size_t size); +void cl_ram_free(void *ptr, size_t size); +void cl_ram_read(void *dest, void *src, size_t size); +void cl_ram_write(void *dest, void *src, size_t size); +size_t load_file_to_ram(const void *dest, const char *filename); +size_t load_file_to_local(const void *dest, const char *filename); + +#endif // __MEM_H__ diff --git a/TargetLibraries/GAP9/inc/mchan.h b/TargetLibraries/GAP9/inc/mchan.h new file mode 100644 index 0000000000..085f20b2f2 --- /dev/null +++ b/TargetLibraries/GAP9/inc/mchan.h @@ -0,0 +1,140 @@ +/* + * SPDX-FileCopyrightText: 2024 ETH Zurich and University of Bologna + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#ifndef _MCHAN_H +#define _MCHAN_H + +// Requires to have MCHAN_BASE_ADDR, MCHAN_EVENT defined outside of header +#ifndef MCHAN_BASE_ADDR +#error "[mchan.h] MCHAN_BASE_ADDR not defined!" +#endif + +#if !defined(MCHAN_EVENT) && !defined(MCHAN_POLLED) +#error "[mchan.h] Nor MCHAN_EVENT nor MCHAN_POLLED defined!" +#endif + +#if defined(MCHAN_EVENT) && !defined(MCHAN_EVENT_BIT) +#error \ + "[mchan.h] MCHAN_EVENT_BIT should be defined when using events as signalization!" +#endif + +#include "pmsis.h" + +#define MCHAN_CMD_OFFSET 0 +#define MCHAN_STATUS_OFFSET 4 + +#define MCHAN_CMD_ADDR (MCHAN_BASE_ADDR + MCHAN_CMD_OFFSET) +#define MCHAN_STATUS_ADDR (MCHAN_BASE_ADDR + MCHAN_STATUS_OFFSET) + +#define READ_REG(addr) (*(volatile int *)(addr)) +#define WRITE_REG(addr, value) \ + do { \ + *(volatile int *)(addr) = (int)value; \ + } while (0) + +#define MCHAN_READ_CMD() READ_REG(MCHAN_CMD_ADDR) +#define MCHAN_WRITE_CMD(value) WRITE_REG(MCHAN_CMD_ADDR, value) + +#define MCHAN_READ_STATUS() READ_REG(MCHAN_STATUS_ADDR) +#define MCHAN_WRITE_STATUS(value) WRITE_REG(MCHAN_STATUS_ADDR, value) + +// MCHAN version 7 has 1 more bit for the transfer length, so all the flag +// offsets are shifted by 1. Also, LOC (TCDM) striding is not supported in v6. +#if MCHAN_VERSION == 7 +#define MCHAN_TRANSFER_LEN_SIZE (17) +#else +#define MCHAN_TRANSFER_LEN_SIZE (16) +#endif + +#define MCHAN_CMD_FLAG_DIRECTION_LOC2EXT (0 << (MCHAN_TRANSFER_LEN_SIZE + 0)) +#define MCHAN_CMD_FLAG_DIRECTION_EXT2LOC (1 << (MCHAN_TRANSFER_LEN_SIZE + 0)) +#define MCHAN_CMD_FLAG_INCREMENTAL (1 << (MCHAN_TRANSFER_LEN_SIZE + 1)) +#define MCHAN_CMD_FLAG_2D_TRANSFER_EXTERNAL (1 << (MCHAN_TRANSFER_LEN_SIZE + 2)) +#define MCHAN_CMD_FLAG_EVENT_ENABLE (1 << (MCHAN_TRANSFER_LEN_SIZE + 3)) +#define MCHAN_CMD_FLAG_INTERRUPT_ENABLE (1 << (MCHAN_TRANSFER_LEN_SIZE + 4)) +#define MCHAN_CMD_FLAG_BROADCAST_FINISH (1 << (MCHAN_TRANSFER_LEN_SIZE + 5)) +#if MCHAN_VERSION == 7 +#define MCHAN_CMD_FLAG_2D_TRANSFER_LOCAL \ + (1 << (MCHAN_TRANSFER_LEN_SIZE + 6)) // can only be used with MCHAN v7 +#endif +#define MCHAN_CMD_SHIFT_DIRECTION MCHAN_TRANSFER_LEN_SIZE + +#define MCHAN_CMD(len, dir, inc, loc_2d, ext_2d, int_en, event_en, broadcast) \ + (len | dir | inc | loc_2d | ext_2d | broadcast | int_en | event_en) + +typedef enum { + MCHAN_DMA_TRANSFER_DIRECTION_EXT2LOC = MCHAN_CMD_FLAG_DIRECTION_EXT2LOC, + MCHAN_DMA_TRANSFER_DIRECTION_LOC2EXT = MCHAN_CMD_FLAG_DIRECTION_LOC2EXT +} mchan_dma_transfer_direction_e; + +typedef struct { + int cmd; + int size; + + void *loc; + int loc_size_1d; + int loc_stride_1d; + + void *ext; + int ext_size_1d; + int ext_stride_1d; +} mchan_transfer_t; + +static int mchan_transfer_get_id() { return MCHAN_READ_CMD(); } + +static void mchan_transfer_push_1d(mchan_transfer_t trans) { + MCHAN_WRITE_CMD(trans.cmd); + MCHAN_WRITE_CMD(trans.loc); + MCHAN_WRITE_CMD(trans.ext); +} + +static void mchan_transfer_push_2d(mchan_transfer_t trans) { + MCHAN_WRITE_CMD(trans.cmd); + MCHAN_WRITE_CMD(trans.loc); + MCHAN_WRITE_CMD(trans.ext); +// MCHAN version 7 takes 2D "count" (length of 1D transfers) and stride in 2 +// steps, v7 takes it in 1 step with the stride shifted to the upper 16 bits. +#if MCHAN_VERSION == 7 + MCHAN_WRITE_CMD(trans.ext_size_1d); + MCHAN_WRITE_CMD(trans.ext_stride_1d); +#else + MCHAN_WRITE_CMD(trans.ext_size_1d | (trans.ext_stride_1d << 16)); +#endif +} + +static void mchan_transfer_push(mchan_transfer_t trans) { + MCHAN_WRITE_CMD(trans.cmd); + MCHAN_WRITE_CMD(trans.loc); + MCHAN_WRITE_CMD(trans.ext); + + if (trans.ext_size_1d < trans.size) { + MCHAN_WRITE_CMD(trans.ext_size_1d); + MCHAN_WRITE_CMD(trans.ext_stride_1d); + } + + if (trans.loc_size_1d < trans.size) { + MCHAN_WRITE_CMD(trans.loc_size_1d); + MCHAN_WRITE_CMD(trans.loc_stride_1d); + } +} + +static void mchan_transfer_free(int tid) { MCHAN_WRITE_STATUS(1 << tid); } + +static int mchan_transfer_busy(int tid) { + return MCHAN_READ_STATUS() & (1 << tid); +} + +static void mchan_transfer_wait(int tid) { +#if defined(MCHAN_EVENT) + while (mchan_transfer_busy(tid)) + eu_evt_maskWaitAndClr(1 << MCHAN_EVENT_BIT); +#elif defined(MCHAN_POLLED) + while (mchan_transfer_busy(tid)) + ; +#endif +} + +#endif diff --git a/TargetLibraries/GAP9/src/Util.c b/TargetLibraries/GAP9/src/Util.c new file mode 100644 index 0000000000..453ea9d21f --- /dev/null +++ b/TargetLibraries/GAP9/src/Util.c @@ -0,0 +1,30 @@ +/* + * SPDX-FileCopyrightText: 2025 ETH Zurich and University of Bologna + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "DeeployGAP9Math.h" +#include +#include +#include + +// Overwrite weak function from DeeployBasicLibs +int deeploy_log(const char *__restrict fmt, ...) { + va_list args; + va_start(args, fmt); + int ret; + +#if defined(AM_PART_APOLLO4B) | defined(DAM_PART_APOLLO3) + ret = am_util_stdio_vprintf(fmt, args); +#else + ret = vprintf(fmt, args); +#endif + + va_end(args); + return ret; +} + +void *deeploy_malloc(const size_t size) { return malloc(size); } + +void deeploy_free(void *const ptr) { free(ptr); } diff --git a/TargetLibraries/GAP9/src/dory_dma.c b/TargetLibraries/GAP9/src/dory_dma.c new file mode 100644 index 0000000000..9bcd41d83c --- /dev/null +++ b/TargetLibraries/GAP9/src/dory_dma.c @@ -0,0 +1,214 @@ +/* + * SPDX-FileCopyrightText: 2020 ETH Zurich and University of Bologna + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "dory_dma.h" + +#define log2(x) __builtin_pulp_fl1(x) + +#include "pmsis.h" + +#ifndef MCHAN_BASE_ADDR +#define MCHAN_BASE_ADDR \ + (CLUSTER_PERIPHERALS_ADDR + CLUSTER_MCHAN_OFFSET) // CLUSTER_MCHAN_ADDR +#endif +#define MCHAN_EVENT +// #define MCHAN_POLLED +#ifdef MCHAN_EVENT +#define MCHAN_EVENT_BIT (CLUSTER_IRQ_DMA0) // 8 +#endif +#include "mchan.h" + +#if defined(MCHAN_POLLED) +#define MCHAN_FLAGS (MCHAN_CMD_FLAG_INCREMENTAL) +#elif defined(MCHAN_EVENT) +#define MCHAN_FLAGS (MCHAN_CMD_FLAG_EVENT_ENABLE | MCHAN_CMD_FLAG_INCREMENTAL) +#elif defined(MCHAN_INTERRUPT) +#define MCHAN_FLAGS \ + (MCHAN_CMD_FLAG_INTERRUPT_ENABLE | MCHAN_CMD_FLAG_INCREMENTAL) +#endif + +#define MCHAN_FLAGS_1D (MCHAN_FLAGS) +#define MCHAN_FLAGS_2D (MCHAN_FLAGS | MCHAN_CMD_FLAG_2D_TRANSFER_EXTERNAL) + +#define MIN(a, b) ((a) < (b) ? (a) : (b)) + +void dory_dma_memcpy_hwc_to_chw(DMA_copy *copy) { + int core_id = pi_core_id(); + int Log2Core = log2(log2(NUM_CORES)); + int number_of_copies_per_core = + (copy->length_1d_copy >> Log2Core) + + ((copy->length_1d_copy & (NUM_CORES - 1)) != 0); + int start_pixel, stop_pixel; // "pixel" is a misnomer; the CHANNELS are + // divided between the cores + // this function assumes that a DW tile is always as wide as the complete + // feature map (this is enforced by DORY's tiler) + start_pixel = MIN(number_of_copies_per_core * core_id, copy->length_1d_copy); + stop_pixel = + MIN(start_pixel + number_of_copies_per_core, copy->length_1d_copy); + void *ext = copy->ext + start_pixel; + void *loc = copy->loc + copy->number_of_1d_copies * + copy->number_of_2d_copies * start_pixel; + const int size_2d = copy->number_of_1d_copies * copy->number_of_2d_copies; + + for (int i = start_pixel; i < stop_pixel; i++) { + mchan_transfer_t trans = {.cmd = size_2d | + copy->dir << MCHAN_CMD_SHIFT_DIRECTION | + MCHAN_FLAGS_2D, + .size = size_2d, + .ext = ext, + .loc = loc, + .ext_size_1d = 1, // one byte at a time... + .ext_stride_1d = copy->stride_1d}; + mchan_transfer_push_2d(trans); +#ifdef ALWAYS_BLOCK_DMA_TRANSFERS // needed on GAP8 board + dory_dma_barrier(copy); +#endif + ext += 1; // next channel + loc += copy->number_of_1d_copies * copy->number_of_2d_copies; + } +} + +void dory_dma_memcpy_1d_async(DMA_copy *copy) { + if (pi_core_id() == 0) { + mchan_transfer_t trans = { + .cmd = copy->length_1d_copy * copy->number_of_1d_copies * + copy->number_of_2d_copies | + (copy->dir << MCHAN_CMD_SHIFT_DIRECTION) | MCHAN_FLAGS_1D, + .size = copy->length_1d_copy * copy->number_of_1d_copies * + copy->number_of_2d_copies, + .ext = copy->ext, + .loc = copy->loc}; + mchan_transfer_push_1d(trans); + } +} + +void dory_dma_memcpy_2d_async(DMA_copy *copy) { + if (pi_core_id() == 0) { + const int size_2d = copy->number_of_1d_copies * copy->length_1d_copy * + copy->number_of_2d_copies; + const int stride = + (copy->number_of_2d_copies == 1) ? copy->stride_1d : copy->stride_2d; + const int size_1d = (copy->number_of_2d_copies == 1) + ? copy->length_1d_copy + : copy->length_1d_copy * copy->number_of_1d_copies; + + mchan_transfer_t trans = {.cmd = size_2d | + copy->dir << MCHAN_CMD_SHIFT_DIRECTION | + MCHAN_FLAGS_2D, + .size = size_2d, + .ext = copy->ext, + .loc = copy->loc, + .ext_size_1d = size_1d, + .ext_stride_1d = stride}; + mchan_transfer_push_2d(trans); + } +} + +void dory_dma_memcpy_3d_async(DMA_copy *copy) { + int core_id = pi_core_id(); + if (core_id == 0) { + int Log2Core = log2(1); + int number_of_2d_copies_per_core = (copy->number_of_2d_copies >> Log2Core) + + ((copy->number_of_2d_copies & (0)) != 0); + int start_pixel, stop_pixel; + start_pixel = + MIN(number_of_2d_copies_per_core * core_id, copy->number_of_2d_copies); + stop_pixel = MIN(start_pixel + number_of_2d_copies_per_core, + copy->number_of_2d_copies); + void *ext = copy->ext + copy->stride_2d * start_pixel; + void *loc = copy->loc + + copy->length_1d_copy * copy->number_of_1d_copies * start_pixel; + const int size_2d = copy->number_of_1d_copies * copy->length_1d_copy; + + for (int i = start_pixel; i < stop_pixel; i++) { + mchan_transfer_t trans = {.cmd = size_2d | + copy->dir << MCHAN_CMD_SHIFT_DIRECTION | + MCHAN_FLAGS_2D, + .size = size_2d, + .ext = ext, + .loc = loc, + .ext_size_1d = copy->length_1d_copy, + .ext_stride_1d = copy->stride_1d}; + mchan_transfer_push_2d(trans); +#ifdef ALWAYS_BLOCK_DMA_TRANSFERS // needed on GAP8 board + // dory_dma_barrier(copy); +#endif + loc += size_2d; + ext += copy->stride_2d; + } + } +} + +void dory_dma_memcpy_async(DMA_copy *copy) { + if (copy->hwc_to_chw == 1) { + dory_dma_memcpy_hwc_to_chw(copy); + } else if ((copy->number_of_2d_copies == 1 && + copy->number_of_1d_copies == 1) || + (copy->stride_1d == copy->length_1d_copy && + copy->number_of_1d_copies * copy->length_1d_copy == + copy->stride_2d) || + (copy->number_of_2d_copies == 1 && + copy->length_1d_copy == copy->stride_1d)) { + dory_dma_memcpy_1d_async(copy); + } else if ((copy->number_of_2d_copies == 1) || + (copy->length_1d_copy == copy->stride_1d)) { // wrong! + dory_dma_memcpy_2d_async(copy); + } else { + dory_dma_memcpy_3d_async(copy); + } +} + +void dory_dma_memcpy_1d_mindims_async(DMA_copy *copy) { + mchan_transfer_t trans = { + .cmd = copy->mchan_cmd, .ext = copy->ext, .loc = copy->loc}; + mchan_transfer_push_1d(trans); +} + +void dory_dma_memcpy_2d_mindims_async(DMA_copy *copy) { + mchan_transfer_t trans = {.cmd = copy->mchan_cmd, + .ext = copy->ext, + .loc = copy->loc, + .ext_size_1d = copy->length_1d_copy, + .ext_stride_1d = copy->stride_1d}; + mchan_transfer_push_2d(trans); +} + +void dory_dma_memcpy_3d_mindims_async(DMA_copy *copy) { + void *ext = copy->ext; + void *loc = copy->loc; + const int length_2d_copy = + copy->mchan_cmd & ((1 << MCHAN_TRANSFER_LEN_SIZE) - 1); + + for (int i = 0; i < copy->number_of_2d_copies; i++) { + mchan_transfer_t trans = {.cmd = copy->mchan_cmd, + .ext = ext, + .loc = loc, + .ext_size_1d = copy->length_1d_copy, + .ext_stride_1d = copy->stride_1d}; + mchan_transfer_push_2d(trans); + loc += length_2d_copy; + ext += copy->stride_2d; +#ifdef ALWAYS_BLOCK_DMA_TRANSFERS // needed on GAP8 board + // dory_dma_barrier(copy); +#endif + } +} + +void dory_dma_memcpy_mindims_async(DMA_copy *copy) { + if (copy->number_of_2d_copies == 1 && copy->number_of_1d_copies == 1) { + dory_dma_memcpy_1d_mindims_async(copy); + } else if (copy->number_of_2d_copies == 1) { + dory_dma_memcpy_2d_mindims_async(copy); + } else { + dory_dma_memcpy_3d_mindims_async(copy); + } +} + +void dory_dma_free(DMA_copy *copy) { mchan_transfer_free(copy->tid); } + +void dory_dma_barrier(DMA_copy *copy) { mchan_transfer_wait(copy->tid); } + +int dory_dma_allocate() { return mchan_transfer_get_id(); } diff --git a/TargetLibraries/GAP9/src/dory_mem.c b/TargetLibraries/GAP9/src/dory_mem.c new file mode 100644 index 0000000000..7564d2ee8d --- /dev/null +++ b/TargetLibraries/GAP9/src/dory_mem.c @@ -0,0 +1,176 @@ +/* + * SPDX-FileCopyrightText: 2023 ETH Zurich and University of Bologna + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "dory_mem.h" +#include "bsp/bsp.h" +// #include "bsp/flash.h" +#include "bsp/fs.h" +#include "bsp/fs/readfs.h" +// #include "bsp/ram.h" +#include "pmsis.h" + +#ifdef USE_HYPERFLASH +#include "bsp/flash/hyperflash.h" +typedef struct pi_hyperflash_conf flash_conf_t; +#define flash_conf_init(conf) pi_hyperflash_conf_init(conf) +#elif defined USE_SPIFLASH +#include "bsp/flash/spiflash.h" +typedef struct pi_spiflash_conf flash_conf_t; +#define flash_conf_init(conf) pi_spiflash_conf_init(conf) +#elif defined USE_MRAM +typedef struct pi_mram_conf flash_conf_t; +#define flash_conf_init(conf) pi_mram_conf_init(conf) +#else +typedef struct pi_default_flash_conf flash_conf_t; +#define flash_conf_init(conf) pi_default_flash_conf_init(conf) +#endif + +#ifdef USE_HYPERRAM +#include "bsp/ram/hyperram.h" +typedef struct pi_hyperram_conf ram_conf_t; +#define ram_conf_init(conf) pi_hyperram_conf_init(conf) +#else +typedef struct pi_default_ram_conf ram_conf_t; +#define ram_conf_init(conf) pi_default_ram_conf_init(conf) +#endif + +#define BUFFER_SIZE 2048 // 128 +static uint8_t buffer[BUFFER_SIZE]; + +static struct pi_device flash; +static flash_conf_t flash_conf; + +static struct pi_device fs; +static struct pi_readfs_conf fs_conf; + +struct pi_device ram; +static ram_conf_t ram_conf; + +void open_fs() { + // SCHEREMO: Fix FS + // Open filesystem on flash. + pi_readfs_conf_init(&fs_conf); + fs_conf.fs.flash = &flash; + pi_open_from_conf(&fs, &fs_conf); + if (pi_fs_mount(&fs)) { + printf("ERROR: Cannot mount filesystem! Exiting...\n"); + pmsis_exit(-2); + } +} + +void mem_init() { + flash_conf_init(&flash_conf); + pi_open_from_conf(&flash, &flash_conf); + if (pi_flash_open(&flash)) { + printf("ERROR: Cannot open flash! Exiting...\n"); + pmsis_exit(-1); + } + + ram_conf_init(&ram_conf); + pi_open_from_conf(&ram, &ram_conf); + if (pi_ram_open(&ram)) { + printf("ERROR: Cannot open ram! Exiting...\n"); + pmsis_exit(-3); + } +} + +struct pi_device *get_ram_ptr() { return &ram; } + +void *ram_malloc(size_t size) { + void *ptr = NULL; + pi_ram_alloc(&ram, (uint32_t *)&ptr, size); + return ptr; +} + +void ram_free(void *ptr, size_t size) { + pi_ram_free(&ram, (uint32_t)ptr, size); +} + +void ram_read(void *dest, void *src, const size_t size) { + pi_ram_read(&ram, (uint32_t)src, dest, size); +} + +void ram_write(void *dest, void *src, const size_t size) { + pi_ram_write(&ram, (uint32_t)dest, src, size); +} + +void *cl_ram_malloc(size_t size) { + uint32_t addr; + pi_cl_ram_alloc_req_t req; + pi_cl_ram_alloc(&ram, size, &req); + pi_cl_ram_alloc_wait(&req, &addr); + return (void *)addr; +} + +void cl_ram_free(void *ptr, size_t size) { + pi_cl_ram_free_req_t req; + pi_cl_ram_free(&ram, (uint32_t)ptr, size, &req); + pi_cl_ram_free_wait(&req); +} + +void cl_ram_read(void *dest, void *src, const size_t size) { + pi_cl_ram_req_t req; + pi_cl_ram_read(&ram, (uint32_t)src, dest, size, &req); + pi_cl_ram_read_wait(&req); +} + +void cl_ram_write(void *dest, void *src, const size_t size) { + pi_cl_ram_req_t req; + pi_cl_ram_write(&ram, (uint32_t)dest, src, size, &req); + pi_cl_ram_write_wait(&req); +} + +size_t load_file_to_ram(const void *dest, const char *filename) { + pi_fs_file_t *fd = pi_fs_open(&fs, filename, 0); + if (fd == NULL) { + printf("ERROR: Cannot open file %s! Exiting...", filename); + pmsis_exit(-4); + } + + size_t size = fd->size; + size_t load_size = 0; + size_t remaining_size = size; + + size_t offset = 0; + do { + + remaining_size = size - offset; + load_size = BUFFER_SIZE < remaining_size ? BUFFER_SIZE : remaining_size; + + pi_cl_fs_req_t req; + pi_cl_fs_read(fd, buffer, load_size, &req); + pi_cl_fs_wait(&req); + cl_ram_write(dest + offset, buffer, load_size); + offset += load_size; + } while (offset < size); + + return offset; +} + +size_t load_file_to_local(const void *dest, const char *filename) { + pi_fs_file_t *fd = pi_fs_open(&fs, filename, 0); + if (fd == NULL) { + printf("ERROR: Cannot open file %s! Exiting...", filename); + pmsis_exit(-4); + } + + const size_t size = fd->size; + size_t remaining_size = size; + size_t offset = 0; + pi_cl_fs_req_t req; + + while (offset < size) { + remaining_size = size - offset; + size_t load_size = + BUFFER_SIZE < remaining_size ? BUFFER_SIZE : remaining_size; + pi_cl_fs_read(fd, buffer, load_size, &req); + pi_cl_fs_wait(&req); + memcpy(dest + offset, buffer, load_size); + offset += load_size; + } + + return offset; +} diff --git a/TargetLibraries/Generic/src/BatchNorm_fp32.c b/TargetLibraries/Generic/src/BatchNorm_fp32.c index 9b30a30207..d12f89a293 100644 --- a/TargetLibraries/Generic/src/BatchNorm_fp32.c +++ b/TargetLibraries/Generic/src/BatchNorm_fp32.c @@ -4,6 +4,10 @@ #include "DeeployBasicMath.h" +#ifdef DEEPLOY_GAP9_PLATFORM +#include +#endif + void BatchNorm_fp32(const float32_t *input, const float32_t *gamma, const float32_t *beta, const float32_t *mean, const float32_t *var, float32_t *output, int N, int C, diff --git a/cmake/simulation.cmake b/cmake/simulation.cmake index 756da8d282..d3d87ab311 100644 --- a/cmake/simulation.cmake +++ b/cmake/simulation.cmake @@ -73,19 +73,20 @@ endfunction() # binary on the gvsoc simulator. To give extra flags to the gvsoc command, set # the GVSOC_EXTRA_FLAGS variable. macro(add_gvsoc_emulation name target) - if(NOT DEFINED ENV{GVSOC_INSTALL_DIR}) + if(NOT DEFINED GVSOC_INSTALL_DIR) message(FATAL_ERROR "Environment variable GVSOC_INSTALL_DIR not set") endif() set(GVSOC_WORKDIR ${CMAKE_BINARY_DIR}/gvsoc_workdir) make_directory(${GVSOC_WORKDIR}) - set(GVSOC_EXECUTABLE "$ENV{GVSOC_INSTALL_DIR}/bin/gvsoc") + set(GVSOC_EXECUTABLE "${GVSOC_INSTALL_DIR}/bin/gvsoc") set(GVSOC_BINARY "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${name}") add_custom_target(gvsoc_${name} DEPENDS ${name} + WORKING_DIRECTORY ${GVSOC_WORKDIR} + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_BINARY_DIR}/*.bin ${GVSOC_WORKDIR}/ || true COMMAND ${GVSOC_EXECUTABLE} --target=${target} --binary ${GVSOC_BINARY} --work-dir=${GVSOC_WORKDIR} ${GVSOC_EXTRA_FLAGS} image flash run COMMENT "Simulating deeploytest ${name} with gvsoc for the target ${target}" POST_BUILD USES_TERMINAL - VERBATIM ) endmacro() From a7ac74eb875da05e037cd90a4d33d1bd29d65301 Mon Sep 17 00:00:00 2001 From: Philip Wiese Date: Thu, 13 Nov 2025 17:58:26 +0100 Subject: [PATCH 04/49] Minor cleanup --- DeeployTest/testUtils/testRunner.py | 5 ++--- cmake/common.cmake | 5 ----- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/DeeployTest/testUtils/testRunner.py b/DeeployTest/testUtils/testRunner.py index e479467c0d..0ac696afe8 100644 --- a/DeeployTest/testUtils/testRunner.py +++ b/DeeployTest/testUtils/testRunner.py @@ -378,7 +378,7 @@ def configure_cmake_project(self): command = f"$CMAKE -D TOOLCHAIN={self._args.toolchain} -D GVSOC_INSTALL_DIR={self._dir_gvsoc} -D TOOLCHAIN_INSTALL_DIR={self._dir_toolchain} -D GENERATED_SOURCE={self._dir_gen} -D platform={self._platform} {self.cmake_args} -B {self._dir_build} -D TESTNAME={self._name_test} .." if self._args.verbose >= 3: - command = "VERBOSE=1 " + command + command = "VERBOSE=1 " + command + " --log-level debug" log.debug(f"[TestRunner] Cmake Command: {command}") @@ -387,8 +387,7 @@ def configure_cmake_project(self): raise RuntimeError(f"Configuring cMake project failed on {self._dir_test}") def build_binary(self): - command = f"$CMAKE --build {self._dir_build} --target {self._name_test}" - + command = "$CMAKE" if self._args.verbose >= 3: command = "VERBOSE=1 " + command diff --git a/cmake/common.cmake b/cmake/common.cmake index 18437219d5..9d1aaba7d2 100644 --- a/cmake/common.cmake +++ b/cmake/common.cmake @@ -2,17 +2,12 @@ # # SPDX-License-Identifier: Apache-2.0 -set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) -set(CMAKE_EXPORT_COMPILE_COMMANDS TRUE) - set(use_dma 1 CACHE STRING "Enable DMA trasfers") add_compile_definitions( USE_DMA=${use_dma} ) -add_library(deeploylib INTERFACE) - add_compile_options( -std=gnu99 From f916db82b939d0aa191912e948bb0bb2d1a1dfc2 Mon Sep 17 00:00:00 2001 From: Philip Wiese Date: Thu, 13 Nov 2025 17:58:31 +0100 Subject: [PATCH 05/49] Update Readme --- GAP9.md | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 2 ++ 2 files changed, 59 insertions(+) create mode 100644 GAP9.md diff --git a/GAP9.md b/GAP9.md new file mode 100644 index 0000000000..e216af23c3 --- /dev/null +++ b/GAP9.md @@ -0,0 +1,57 @@ +## Using Deeploy with GAP9 + +> ⚠️ **IMPORTANT NOTE** +> This is a work in progress. The GAP9 support in Deeploy is experimental and may not be fully functional. + +To use Deeploy with GAP9, a custom Docker container is required because the official Deeploy Docker image does yet not include the necessary SDKs and dependencies for GAP9 development, because they are not publicly available. + +### Build The Docker Container + +To use SSH keys for accessing private repositories during the Docker build process, you need to start the SSH agent and add your SSH private key before running the Docker build command. You can do this by executing the following commands in your terminal: +```sh +cd Container +eval $(ssh-agent) + +# Add your SSH private key to the agent +ssh-add ~/.ssh/id_ed25519 +``` + +To build a local version of the Deeploy Docker image with GAP9 support using the upstream toolchain image, run: +```sh +# Build the Deeploy image with the upstream toolchain image +make deeploy DEEPOY_IMAGE=deeploy:gap9 +``` + +Or, to build both the toolchain and Deeploy images locally, use: +```sh +# To build the toolchain container +make toolchain TOOLCHAIN_IMAGE=deeploy-toolchain:gap9 DEEPOY_IMAGE=deeploy:gap9 + +# To build the Deeploy container with the local toolchain image +make deeploy TOOLCHAIN_IMAGE=deeploy-toolchain:gap9 DEEPOY_IMAGE=deeploy:gap9 +``` + +### Use The Docker Container +Then you can create and start the container in interactive mode with: + +```sh +docker run -it --name deeploy_gap9 -v $(pwd):/app/Deeploy deeploy:gap9 +``` + +Before running the test, you need to set some environment variables: +```sh +source /app/install/gap9-sdk/.gap9-venv/bin/activate +source /app/install/gap9-sdk/configs/gap9_evk_audio.sh +``` +Install Deeploy inside the container in editable mode: + +```sh +cd /app/Deeploy +pip install -e . --extra-index-url=https://pypi.ngc.nvidia.com +``` + +```sh +cd /app/Deeploy/DeeployTest +python testRunner_gap9.py -t Tests/testMatMul +python testRunner_tiled_gap9.py -t Tests/testMatMul +``` \ No newline at end of file diff --git a/README.md b/README.md index d27b935b2f..8fba6dab49 100644 --- a/README.md +++ b/README.md @@ -65,6 +65,8 @@ python testRunner_softhier.py -t Tests/Adder --toolchain=GCC python testRunner_chimera.py -t Tests/Adder ``` +For the experimental support of GAP9, please refer to the [GAP9.md](GAP9.md) file. + To restart and connect to the container, run: ``` docker start -i deeploy_main From 3cd6e29efcb5296a07443d86a5847a36754f7074 Mon Sep 17 00:00:00 2001 From: Run Wang <52746141+SamanthaWangdl@users.noreply.github.com> Date: Fri, 14 Nov 2025 20:10:18 +0000 Subject: [PATCH 06/49] [GAP9] Fix DeeployTest.c nested team fork issue --- DeeployTest/Platforms/GAP9/src/deeploytest.c | 29 ++++++-------------- DeeployTest/testUtils/codeGenerate.py | 3 ++ 2 files changed, 12 insertions(+), 20 deletions(-) diff --git a/DeeployTest/Platforms/GAP9/src/deeploytest.c b/DeeployTest/Platforms/GAP9/src/deeploytest.c index e44455d741..465e529c77 100644 --- a/DeeployTest/Platforms/GAP9/src/deeploytest.c +++ b/DeeployTest/Platforms/GAP9/src/deeploytest.c @@ -13,7 +13,7 @@ #include "testinputs.h" #include "testoutputs.h" -#define MAINSTACKSIZE 8000 +// RW: Remove MAINSTACKSIZE because gap9-sdk does not use it #define SLAVESTACKSIZE 3800 struct pi_device cluster_dev; @@ -61,25 +61,14 @@ void CL_CompareFloat(void *arg) { pi_cl_team_fork(NUM_CORES, CompareFloatOnCluster, arg); } -void PE_RunNetwork(void *arg) { -#ifndef CI - uint32_t core_id = pi_core_id(), cluster_id = pi_cluster_id(); - printf("[%d %d] Run Network!\n", cluster_id, core_id); -#endif - RunNetwork(pi_core_id(), NUM_CORES); -} - -void CL_RunNetwork(void *arg) { - pi_cl_team_fork(NUM_CORES, PE_RunNetwork, NULL); +void InitNetworkWrapper(void *args) { + (void)args; + InitNetwork(pi_core_id(), pi_cl_cluster_nb_cores()); } -void PE_InitNetwork(void *arg) { -#ifndef CI - uint32_t core_id = pi_core_id(), cluster_id = pi_cluster_id(); - printf("[%d %d] Init Network!\n", cluster_id, core_id); -#endif - - InitNetwork(pi_core_id(), NUM_CORES); +void RunNetworkWrapper(void *args) { + (void)args; + RunNetwork(pi_core_id(), pi_cl_cluster_nb_cores()); } int main(void) { @@ -104,7 +93,7 @@ int main(void) { struct pi_cluster_task cluster_task; - pi_cluster_task(&cluster_task, PE_InitNetwork, NULL); + pi_cluster_task(&cluster_task, InitNetworkWrapper, NULL); cluster_task.slave_stack_size = SLAVESTACKSIZE; pi_cluster_send_task_to_cl(&cluster_dev, &cluster_task); @@ -122,7 +111,7 @@ int main(void) { printf("Input copied\r\n"); #endif - pi_cluster_task(&cluster_task, CL_RunNetwork, NULL); + pi_cluster_task(&cluster_task, RunNetworkWrapper, NULL); cluster_task.slave_stack_size = SLAVESTACKSIZE; ResetTimer(); StartTimer(); diff --git a/DeeployTest/testUtils/codeGenerate.py b/DeeployTest/testUtils/codeGenerate.py index 878bc42014..370d138a5a 100644 --- a/DeeployTest/testUtils/codeGenerate.py +++ b/DeeployTest/testUtils/codeGenerate.py @@ -191,6 +191,9 @@ def generateTestNetworkImplementation(deployer: NetworkDeployer, verbosityCfg: C } void InitNetwork(__attribute__((unused)) uint32_t core_id, __attribute__((unused)) uint32_t numThreads){ + #ifndef CI + printf("[%d %d] Init Network!\\n", pi_cluster_id(), pi_core_id()); + #endif """ retStr += deployer.generateEngineInitializationCode() retStr += deployer.generateBufferAllocationCode() From 9ca45956d52d5aa8dfacbc4f56920b7395726584 Mon Sep 17 00:00:00 2001 From: Run Wang <52746141+SamanthaWangdl@users.noreply.github.com> Date: Fri, 14 Nov 2025 20:20:55 +0000 Subject: [PATCH 07/49] [GAP9]Fix GCC segmentation fault in Transpose template syntax --- Deeploy/Targets/PULPOpen/Templates/TransposeTemplate.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Deeploy/Targets/PULPOpen/Templates/TransposeTemplate.py b/Deeploy/Targets/PULPOpen/Templates/TransposeTemplate.py index 65c2285e24..64143a9dd6 100644 --- a/Deeploy/Targets/PULPOpen/Templates/TransposeTemplate.py +++ b/Deeploy/Targets/PULPOpen/Templates/TransposeTemplate.py @@ -93,10 +93,13 @@ def alignToContext(self, ctxt: NetworkContext, referenceTemplate = PULPTransposeTemplate(""" // Transpose ${data_in_shape} -> ${data_out_shape} (Name: ${nodeName}, Op: ${nodeOp}) ${tileHeader} +// RW: GCC Segmentation fault +${data_in_type.referencedType.typeName} (*src)${shapeStr} = (${data_in_type.referencedType.typeName} (*)${shapeStr})<%text>${data_in}; +${data_in_type.referencedType.typeName} (*dst)${outShapeStr} = (${data_in_type.referencedType.typeName} (*)${outShapeStr})<%text>${data_out}; % for idx, i in enumerate(perm): ${forLoops[idx]} % endfor -((${data_in_type.referencedType.typeName} (*)${outShapeStr})<%text>${data_out})${outAccessStr} = ((${data_in_type.referencedType.typeName} (*)${shapeStr})<%text>${data_in})${accessStr}; +dst${outAccessStr} = src${accessStr}; % for idx, i in enumerate(perm): } % endfor From 7e779912f36e96d352a6a371a3683f9edb05ddc5 Mon Sep 17 00:00:00 2001 From: Run Wang <52746141+SamanthaWangdl@users.noreply.github.com> Date: Sat, 15 Nov 2025 11:53:53 +0000 Subject: [PATCH 08/49] [GAP9] Link PULP-NN --- CMakeLists.txt | 5 ++--- Deeploy/Targets/GAP9/Platform.py | 1 + DeeployTest/Platforms/GAP9/CMakeLists.txt | 8 ++++++++ TargetLibraries/GAP9/CMakeLists.txt | 12 ++++++++++++ 4 files changed, 23 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5880216fec..d19feef2c0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -235,14 +235,13 @@ if(platform STREQUAL GAP9) ) add_subdirectory(TargetLibraries/Generic) + add_subdirectory(DeeployTest) + setupos(${TESTNAME}) add_subdirectory(TargetLibraries/GAP9) target_include_directories(deeploygap9 PUBLIC TargetLibraries/Generic/inc) - add_subdirectory(DeeployTest) target_link_libraries(deeploylib INTERFACE deeploybasic deeploygap9) - setupos(${TESTNAME}) - endif() if(platform STREQUAL Snitch) diff --git a/Deeploy/Targets/GAP9/Platform.py b/Deeploy/Targets/GAP9/Platform.py index 633b225754..dd24c94de2 100644 --- a/Deeploy/Targets/GAP9/Platform.py +++ b/Deeploy/Targets/GAP9/Platform.py @@ -87,6 +87,7 @@ class GAP9StructBuffer(StructBuffer): _includeList = [ "pmsis.h", "DeeployGAP9Math.h", + "pulp_nn_kernels.h" ] diff --git a/DeeployTest/Platforms/GAP9/CMakeLists.txt b/DeeployTest/Platforms/GAP9/CMakeLists.txt index ec79db2a5d..b1d32659f6 100644 --- a/DeeployTest/Platforms/GAP9/CMakeLists.txt +++ b/DeeployTest/Platforms/GAP9/CMakeLists.txt @@ -23,4 +23,12 @@ target_link_libraries(${ProjectId} PRIVATE network deeploylib) target_compile_options(${ProjectId} INTERFACE network) add_gvsoc_emulation(${ProjectId} "gap9.evk") +# RW: Waive sign comparison warnings from pulp_nn_utils.h +target_compile_options(network PRIVATE + -Wno-sign-compare + -Wno-pointer-sign + -Wno-unknown-pragmas + -Wno-error + ) + link_compile_dump(${TESTNAME}) diff --git a/TargetLibraries/GAP9/CMakeLists.txt b/TargetLibraries/GAP9/CMakeLists.txt index a39df465f6..7e9809af63 100644 --- a/TargetLibraries/GAP9/CMakeLists.txt +++ b/TargetLibraries/GAP9/CMakeLists.txt @@ -28,3 +28,15 @@ target_compile_options(deeploygap9 PRIVATE ) target_link_libraries(deeploygap9 PUBLIC pmsis) + +#RW: Link PULP-NN +#RW: Set PULP-NN version and bitwidth for pulp-nn-mixed +set(PULPNNVERSION XPULPV2) +set(PULPNNBITWIDTH 32) +add_compile_definitions(NUM_CORES=${NUM_CORES}) +add_subdirectory(third_party/pulp-nn-mixed) + +#RW: GCC not recognizing -Wno-typedef-redefinition +target_compile_options(pulp-nn-mixed PRIVATE -Wno-error) +target_link_libraries(deeploygap9 PUBLIC pulp-nn-mixed) + From 294d83af740f8f9fffe6bb3cb021ada1782f9087 Mon Sep 17 00:00:00 2001 From: Run Wang <52746141+SamanthaWangdl@users.noreply.github.com> Date: Sat, 15 Nov 2025 13:28:30 +0000 Subject: [PATCH 09/49] [GAP9] OpRepre n_cores Missing --- Deeploy/Targets/GAP9/Platform.py | 3 ++- Deeploy/Targets/PULPOpen/Deployer.py | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Deeploy/Targets/GAP9/Platform.py b/Deeploy/Targets/GAP9/Platform.py index dd24c94de2..346f631e8a 100644 --- a/Deeploy/Targets/GAP9/Platform.py +++ b/Deeploy/Targets/GAP9/Platform.py @@ -93,8 +93,9 @@ class GAP9StructBuffer(StructBuffer): class GAP9ClusterEngine(DeploymentEngine): - def __init__(self, name: str, Mapping = PULPMapping, initCode = "", includeList = _includeList) -> None: + def __init__(self, name: str, Mapping = PULPMapping, initCode = "", includeList = _includeList, n_cores: int = 8) -> None: super().__init__(name, Mapping, initCode, includeList) + self.n_cores = n_cores class GAP9Platform(DeploymentPlatform): diff --git a/Deeploy/Targets/PULPOpen/Deployer.py b/Deeploy/Targets/PULPOpen/Deployer.py index bceea01f4d..4162c4e9a2 100644 --- a/Deeploy/Targets/PULPOpen/Deployer.py +++ b/Deeploy/Targets/PULPOpen/Deployer.py @@ -15,6 +15,7 @@ from Deeploy.DeeployTypes import ConstantBuffer, DeploymentPlatform, NodeTemplate, TopologyOptimizer, VariableBuffer from Deeploy.Targets.Generic.TopologyOptimizationPasses.Passes import ReshapeConstOptPass, TransposeConstOptPass, \ TransposeMergePass, TransposeNoPermOptPass, TransposeSplitPass +from Deeploy.Targets.GAP9.Platform import GAP9ClusterEngine from Deeploy.Targets.PULPOpen.Platform import PULPClusterEngine from Deeploy.Targets.PULPOpen.TopologyOptimizationPasses.Passes import RQAddTransposeSquashPass @@ -69,7 +70,7 @@ def annotateNCores(self) -> None: node = layer.node engine = self._selectEngine(node) opRepr = layer.mapper.parser.operatorRepresentation - if isinstance(engine, PULPClusterEngine): + if isinstance(engine, (PULPClusterEngine, GAP9ClusterEngine)): opRepr["n_cores"] = engine.n_cores def bind(self) -> bool: From 4946ed50900e09b4cb1fa134eff3ffc89068dfc0 Mon Sep 17 00:00:00 2001 From: Run Wang <52746141+SamanthaWangdl@users.noreply.github.com> Date: Sat, 15 Nov 2025 15:32:01 +0000 Subject: [PATCH 10/49] [GAP9] LInk Math and PULP Kernels --- TargetLibraries/GAP9/CMakeLists.txt | 14 ++++++++++++-- TargetLibraries/PULPOpen/src/DWConvolution_fp32.c | 1 + TargetLibraries/PULPOpen/src/GELU.c | 1 + TargetLibraries/PULPOpen/src/Layernorm.c | 2 ++ TargetLibraries/PULPOpen/src/Softmax.c | 1 + 5 files changed, 17 insertions(+), 2 deletions(-) diff --git a/TargetLibraries/GAP9/CMakeLists.txt b/TargetLibraries/GAP9/CMakeLists.txt index 7e9809af63..947096f6bf 100644 --- a/TargetLibraries/GAP9/CMakeLists.txt +++ b/TargetLibraries/GAP9/CMakeLists.txt @@ -6,6 +6,11 @@ file(GLOB_RECURSE SOURCES "src/**" ) +# RW: Include PULPOpen sources but exclude dory_mem related files +file(GLOB_RECURSE PULPOPEN_SOURCES "../PULPOpen/src/**") +list(FILTER PULPOPEN_SOURCES EXCLUDE REGEX ".*dory_mem.*") +list(APPEND SOURCES ${PULPOPEN_SOURCES}) + if(NOT DEFINED ENV{GAP_SDK_HOME}) message(FATAL_ERROR "Environment variable GAP_SDK_HOME not set.") endif() @@ -14,6 +19,7 @@ add_deeploy_library(deeploygap9 STATIC ${SOURCES}) target_include_directories(deeploygap9 PUBLIC ${CMAKE_CURRENT_LIST_DIR}/inc + ${CMAKE_CURRENT_LIST_DIR}/../PULPOpen/inc ) target_compile_options(deeploygap9 PUBLIC @@ -22,9 +28,11 @@ target_compile_options(deeploygap9 PUBLIC target_compile_options(deeploygap9 PRIVATE -Wno-implicit-function-declaration - -Wno-implicit-int-conversion -Wno-sign-conversion -Wno-sign-compare + -Wno-type-limits + -Wno-attributes + -Wno-incompatible-pointer-types ) target_link_libraries(deeploygap9 PUBLIC pmsis) @@ -36,7 +44,9 @@ set(PULPNNBITWIDTH 32) add_compile_definitions(NUM_CORES=${NUM_CORES}) add_subdirectory(third_party/pulp-nn-mixed) -#RW: GCC not recognizing -Wno-typedef-redefinition +#RW: GCC not recognizing -Wno-typedef-redefinition defined in PULP-NN CMakelist target_compile_options(pulp-nn-mixed PRIVATE -Wno-error) target_link_libraries(deeploygap9 PUBLIC pulp-nn-mixed) +target_link_libraries(deeploygap9 PUBLIC m) + diff --git a/TargetLibraries/PULPOpen/src/DWConvolution_fp32.c b/TargetLibraries/PULPOpen/src/DWConvolution_fp32.c index b0a06c66eb..1ec352346e 100644 --- a/TargetLibraries/PULPOpen/src/DWConvolution_fp32.c +++ b/TargetLibraries/PULPOpen/src/DWConvolution_fp32.c @@ -6,6 +6,7 @@ #include "DeeployPULPMath.h" #include "pmsis.h" +#include void PULP_DW_Conv2d_Im2Col_fp32_fp32_fp32_HWC( const float32_t *__restrict__ pSrcA, uint32_t H, uint32_t W, uint32_t C, diff --git a/TargetLibraries/PULPOpen/src/GELU.c b/TargetLibraries/PULPOpen/src/GELU.c index 281d4674d0..62093d58eb 100644 --- a/TargetLibraries/PULPOpen/src/GELU.c +++ b/TargetLibraries/PULPOpen/src/GELU.c @@ -7,6 +7,7 @@ #include "pmsis.h" #include "DeeployPULPMath.h" +#include #define M_PI 3.14159265358979323846 diff --git a/TargetLibraries/PULPOpen/src/Layernorm.c b/TargetLibraries/PULPOpen/src/Layernorm.c index f8387ab5e2..73d1bbab58 100644 --- a/TargetLibraries/PULPOpen/src/Layernorm.c +++ b/TargetLibraries/PULPOpen/src/Layernorm.c @@ -8,6 +8,8 @@ #include "DeeployPULPMath.h" +#include + void PULP_Layernorm_fp32_fp32(float32_t *data_in, float32_t *data_out, float32_t *scale, float32_t *bias, float32_t epsilon, uint32_t size, diff --git a/TargetLibraries/PULPOpen/src/Softmax.c b/TargetLibraries/PULPOpen/src/Softmax.c index 3fd60111fe..00678be825 100644 --- a/TargetLibraries/PULPOpen/src/Softmax.c +++ b/TargetLibraries/PULPOpen/src/Softmax.c @@ -6,6 +6,7 @@ #include "DeeployPULPMath.h" #include "pmsis.h" +#include void PULPSoftmax_u8_u8(uint8_t *data_in, uint8_t *data_out, uint32_t *lastDimBuffer, uint32_t size, From a08b6fd95f04aadb443b94e3cab7a9881e16b555 Mon Sep 17 00:00:00 2001 From: Run Wang <52746141+SamanthaWangdl@users.noreply.github.com> Date: Mon, 17 Nov 2025 17:01:05 +0000 Subject: [PATCH 11/49] [GAP9] Replace MCHAN DMA with cl_dma.h API and Decouple deployer form PULPOpen --- Deeploy/Targets/GAP9/Bindings.py | 403 +++++++++++++++++++++++ Deeploy/Targets/GAP9/DMA/ClDma.py | 85 +++++ Deeploy/Targets/GAP9/DMA/__init__.py | 3 + Deeploy/Targets/GAP9/Deployer.py | 58 ++++ Deeploy/Targets/GAP9/Platform.py | 153 ++++++++- Deeploy/Targets/GAP9/Tiler.py | 166 ++++++++++ DeeployTest/testUtils/platformMapping.py | 21 +- 7 files changed, 883 insertions(+), 6 deletions(-) create mode 100644 Deeploy/Targets/GAP9/Bindings.py create mode 100644 Deeploy/Targets/GAP9/DMA/ClDma.py create mode 100644 Deeploy/Targets/GAP9/DMA/__init__.py create mode 100644 Deeploy/Targets/GAP9/Deployer.py create mode 100644 Deeploy/Targets/GAP9/Tiler.py diff --git a/Deeploy/Targets/GAP9/Bindings.py b/Deeploy/Targets/GAP9/Bindings.py new file mode 100644 index 0000000000..6bb2053024 --- /dev/null +++ b/Deeploy/Targets/GAP9/Bindings.py @@ -0,0 +1,403 @@ +# SPDX-FileCopyrightText: 2025 ETH Zurich and University of Bologna +# +# SPDX-License-Identifier: Apache-2.0 + +""" +GAP9-specific bindings using cl_dma.h API instead of low-level MCHAN. + +This module provides GAP9-specific DMA and code transformations that use +the PMSIS standard cl_dma API for better portability and cleaner code. +""" + +import itertools + +from Deeploy.AbstractDataTypes import PointerClass +from Deeploy.CommonExtensions.DataTypes import FloatDataTypes, IntegerDataTypes, SignedIntegerDataTypes, float32_t, \ + int8_t, int32_t, int64_t, uint8_t +from Deeploy.DeeployTypes import CodeTransformation, NodeBinding +from Deeploy.FutureExtension.Bindings.AutoFutureBinding import AutoFutureBinding +from Deeploy.CommonExtensions.CodeTransformationPasses.MemoryAllocation import ArgumentStructGeneration, \ + MemoryManagementGeneration, MemoryPassthroughGeneration +from Deeploy.FutureExtension.CodeTransformationPasses.FutureCodeTransformation import FutureGeneration +from Deeploy.TilingExtension.CodeTransformationPasses.TilingVariableReplacement import TilingVariableReplacement, \ + TilingVariableReplacementUpdate +from Deeploy.Targets.PULPOpen.CodeTransformationPasses.PULPClusterSynch import PULPSynchCoresPass +from Deeploy.Targets.PULPOpen.CodeTransformationPasses.PULPClusterTiling import PULPClusterTiling +from Deeploy.Targets.PULPOpen.CodeTransformationPasses.PULPL3Tiling import PULPL3Tiling +from Deeploy.Targets.PULPOpen.CodeTransformationPasses.PULPProfileUntiled import PULPProfileUntiled +from Deeploy.Targets.PULPOpen.DMA.L3Dma import l3DmaHack +from Deeploy.Targets.PULPOpen.Bindings import TilingCallClosure, ForkClosure, \ + MemoryAwareFunctionCallClosure, L3MemoryAwareFunctionCallClosure, MemoryAwareForkTransformer +from Deeploy.Targets.PULPOpen.DataTypes import PULPDMAFuture +from Deeploy.Targets.GAP9.DMA.ClDma import ClDma + +# Import templates from PULPOpen and Generic +from Deeploy.Targets.Generic.Templates import AddTemplate, ConcatTemplate, DequantTemplate, FloatReduceMeanTemplate, \ + FloatReduceSumTemplate, GatherTemplate, QuantTemplate, RQSiGELUTemplate, SliceTemplate, iHardswishTemplate +from Deeploy.Targets.Generic.TypeCheckers import AddChecker, ConcatChecker, ConvChecker, DequantChecker, \ + GatherChecker, GELUChecker, GEMMChecker, HardswishChecker, LayerNormChecker, MatMulChecker, MulChecker, \ + QuantChecker, ReduceMeanChecker, ReluChecker, ReshapeChecker, RQAddChecker, RQHardswishChecker, SGDChecker, \ + SliceChecker, SoftmaxChecker, SoftmaxCrossEntropyLossChecker, TransposeChecker +from Deeploy.Targets.PULPOpen.Templates import ConvTemplate, DMASliceTemplate, FloatAddTemplate, FloatConvTemplate, \ + FloatGELUTemplate, FloatGemmTemplate, FloatLayernormTemplate, FloatMatMulTemplate, FloatMaxPoolTemplate, \ + FloatMulTemplate, FloatReluTemplate, FloatSoftmaxTemplate, GEMMTemplate, MatrixVectorTemplate, MaxPool2DTemplate, \ + MulTemplate, ReduceMeanTemplate, RequantShiftTemplate, ReshapeTemplate, RQAddTemplate, RQSiHardswishTemplate, \ + SGDTemplate, SoftmaxCrossEntropyLossTemplate, TallGEMMTemplate, TransposeTemplate, UniformRequantShiftTemplate, \ + iRMSNormTemplate, iSoftmaxTemplate +from Deeploy.Targets.PULPOpen.TypeCheckers import PULPConvChecker, PULPLinearChecker, PULPMaxPoolChecker, \ + PULPRequantShiftChecker + + +# GAP9-specific transformer using cl_dma.h API +GAP9Transformer = CodeTransformation([ + TilingVariableReplacement("L1"), + TilingCallClosure(writeback = False), + PULPSynchCoresPass(), + ForkClosure(writeback = False, generateStruct = True), + TilingVariableReplacementUpdate("L1"), + PULPClusterTiling("L2", "L1", ClDma()), # Use ClDma instead of MchanDma + ArgumentStructGeneration(), + MemoryManagementGeneration("L1"), + TilingVariableReplacement("L2"), + MemoryAwareFunctionCallClosure(writeback = False, generateStruct = True), + PULPL3Tiling("L3", "L2", l3DmaHack), + PULPProfileUntiled(), + ArgumentStructGeneration(), + L3MemoryAwareFunctionCallClosure(writeback = False), + MemoryManagementGeneration("L2"), + MemoryManagementGeneration("L3.*"), + MemoryManagementGeneration(), +]) + +# GAP9-specific cluster transformer using cl_dma.h API +GAP9ClusterTransformer = CodeTransformation([ + TilingVariableReplacement("L1"), + TilingCallClosure(writeback = False, generateStruct = True), + TilingVariableReplacementUpdate("L1"), + PULPClusterTiling("L2", "L1", ClDma()), # Use ClDma instead of MchanDma + ArgumentStructGeneration(), + MemoryManagementGeneration("L1"), + TilingVariableReplacement("L2"), + MemoryAwareFunctionCallClosure(writeback = False, generateStruct = True), + PULPL3Tiling("L3", "L2", l3DmaHack), + PULPProfileUntiled(), + ArgumentStructGeneration(), + L3MemoryAwareFunctionCallClosure(writeback = False), + MemoryManagementGeneration("L2"), + MemoryManagementGeneration("L3.*"), + MemoryManagementGeneration(), +]) + +# Simple transformer for non-tiling cases +GAP9SimpleTransformer = CodeTransformation([ + MemoryManagementGeneration("L2"), + MemoryManagementGeneration("L3.*"), + MemoryManagementGeneration(), +]) + +# Skip transformer (no DMA operations) +GAP9SkipTransformer = CodeTransformation( + [ArgumentStructGeneration(), + MemoryPassthroughGeneration("L.*"), + MemoryPassthroughGeneration(), + FutureGeneration()]) + + +# =============================================================================== +# GAP9-specific bindings using ClDma instead of MchanDma +# All bindings below use GAP9Transformer or GAP9ClusterTransformer +# =============================================================================== + +GAP9DMASliceBindings = [ + AutoFutureBinding( + SliceChecker([ + PointerClass(type), + PointerClass(uint8_t), + PointerClass(uint8_t), + PointerClass(uint8_t), + PointerClass(uint8_t) + ], [PULPDMAFuture(underlyingType = type)]), DMASliceTemplate.referenceTemplate, MemoryAwareForkTransformer) + for type in IntegerDataTypes +] + +GAP9SliceBindings = [ + NodeBinding( + SliceChecker([ + PointerClass(type), + PointerClass(uint8_t), + PointerClass(uint8_t), + PointerClass(uint8_t), + PointerClass(uint8_t) + ], [PointerClass(type)]), SliceTemplate.referenceTemplate, GAP9Transformer) for type in FloatDataTypes +] + +GAP9ReshapeBindings = [ + NodeBinding(ReshapeChecker([PointerClass(type), PointerClass(int64_t)], [PointerClass(type)]), + ReshapeTemplate.referenceTemplate, GAP9SkipTransformer) for type in IntegerDataTypes + FloatDataTypes +] + +GAP9RQAddBindings = [ + NodeBinding(RQAddChecker([PointerClass(_type), PointerClass(_type2)], [PointerClass(_type3)]), + RQAddTemplate.referenceTemplate, GAP9Transformer) + for _type in [int8_t, uint8_t] + for _type2 in [int8_t, uint8_t] + for _type3 in [int8_t, uint8_t] +] + +GAP9AddBindings = [ + NodeBinding(AddChecker([PointerClass(type1), PointerClass(type2)], [PointerClass(int32_t)]), + AddTemplate.referenceTemplate, GAP9Transformer) + for type1 in IntegerDataTypes + for type2 in IntegerDataTypes +] + [ + NodeBinding(AddChecker([PointerClass(float32_t), PointerClass(float32_t)], [PointerClass(float32_t)]), + FloatAddTemplate.referenceTemplate, GAP9Transformer) +] + +GAP9RQSConv2DBindings = [ + NodeBinding( + PULPConvChecker([ + PointerClass(type1), + PointerClass(int8_t), + PointerClass(int32_t), + PointerClass(int32_t), + PointerClass(int32_t) + ], [PointerClass(type2)]), ConvTemplate.PULPConv2D_8_Template, GAP9Transformer) + for type1, type2 in zip([int8_t, int8_t, uint8_t, uint8_t], [int8_t, uint8_t, int8_t, uint8_t]) +] + +GAP9RQSDWConv2DBindings = [ + NodeBinding( + PULPConvChecker([ + PointerClass(type1), + PointerClass(int8_t), + PointerClass(int32_t), + PointerClass(int32_t), + PointerClass(int32_t) + ], [PointerClass(type2)]), ConvTemplate.PULPDWConv2D_8_Template, GAP9Transformer) + for type1, type2 in zip([int8_t, int8_t, uint8_t, uint8_t], [int8_t, uint8_t, int8_t, uint8_t]) +] + +GAP9RQSGEMM_8_Binding = [ + NodeBinding( + PULPLinearChecker([PointerClass(type1), + PointerClass(int8_t), + PointerClass(int32_t), + PointerClass(int32_t)], [PointerClass(type2)]), GEMMTemplate.PULPGEMM_8_Template, + GAP9Transformer) for type1, type2 in zip([int8_t, uint8_t, int8_t, uint8_t], [int8_t, uint8_t, uint8_t, int8_t]) +] + +GAP9FloatGEMMBindings = [ + NodeBinding( + GEMMChecker([PointerClass(float32_t), PointerClass(float32_t), + PointerClass(float32_t)], [PointerClass(float32_t)]), FloatGemmTemplate.referenceTemplate, + GAP9Transformer) +] + +GAP9FloatConv2DBindings = [ + NodeBinding( + ConvChecker([PointerClass(float32_t), PointerClass(float32_t), + PointerClass(float32_t)], [PointerClass(float32_t)]), FloatConvTemplate.reference2DIm2ColTemplate, + GAP9Transformer) +] + +GAP9FloatDWConv2DBindings = [ + NodeBinding( + ConvChecker( + [PointerClass(float_type), PointerClass(float_type), + PointerClass(float_type)], [PointerClass(float_type)]), FloatConvTemplate.referenceDW2DIm2ColTemplate, + GAP9Transformer) for float_type in FloatDataTypes +] + +GAP9RQSMatrixVecBindings = [ + NodeBinding( + PULPLinearChecker([PointerClass(type1), + PointerClass(int8_t), + PointerClass(int32_t), + PointerClass(int32_t)], [PointerClass(type2)]), MatrixVectorTemplate.referenceTemplate, + GAP9Transformer) for type1, type2 in zip([int8_t], [int8_t]) +] + +GAP9RQSTallGEMMBindings = [ + NodeBinding( + PULPLinearChecker([PointerClass(type1), + PointerClass(int8_t), + PointerClass(int32_t), + PointerClass(int32_t)], [PointerClass(type2)]), TallGEMMTemplate.referenceTemplate, + GAP9Transformer) for type1, type2 in zip([int8_t], [int8_t]) +] + +GAP9RQSGEMMBindings = GAP9RQSGEMM_8_Binding + +GAP9MaxPool2DBindings = [ + NodeBinding(PULPMaxPoolChecker([PointerClass(type)], [PointerClass(type)]), + MaxPool2DTemplate.PULPMaxPool2D_8_Template, GAP9Transformer) for type in [int8_t, uint8_t] +] + [ + NodeBinding(PULPMaxPoolChecker([PointerClass(float32_t)], [PointerClass(float32_t)]), + FloatMaxPoolTemplate.referenceTemplate, GAP9Transformer) +] + +GAP9Conv1DBinding = NodeBinding( + PULPConvChecker( + [PointerClass(int8_t), PointerClass(int8_t), + PointerClass(int32_t), + PointerClass(int32_t)], [PointerClass(int8_t)]), ConvTemplate.PULPConv1D_8_Template, GAP9Transformer) + +GAP9DWConv1DBinding = NodeBinding( + PULPConvChecker( + [PointerClass(int8_t), PointerClass(int8_t), + PointerClass(int32_t), + PointerClass(int32_t)], [PointerClass(int8_t)]), ConvTemplate.PULPDWConv1D_8_Template, GAP9Transformer) + +GAP9MatMulBindings = [ + NodeBinding(MatMulChecker([PointerClass(int8_t), PointerClass(int8_t)], [PointerClass(int32_t)]), + GEMMTemplate.PULPMM_8_Template, GAP9ClusterTransformer) +] + [ + NodeBinding(MatMulChecker([PointerClass(float32_t), PointerClass(float32_t)], [PointerClass(float32_t)]), + FloatMatMulTemplate.referenceTemplate, GAP9Transformer) +] + +GAP9ReduceMeanBindings = [ + NodeBinding(ReduceMeanChecker([PointerClass(type)], [PointerClass(type)]), ReduceMeanTemplate.referenceTemplate, + GAP9ClusterTransformer) for type in IntegerDataTypes +] + [ + NodeBinding(ReduceMeanChecker([PointerClass(float_type), PointerClass(integer_type)], [PointerClass(float_type)]), + FloatReduceMeanTemplate.referenceTemplate, GAP9ClusterTransformer) + for integer_type in SignedIntegerDataTypes + for float_type in FloatDataTypes +] + +GAP9ReduceSumBindings = [ + NodeBinding(ReduceMeanChecker([PointerClass(float32_t)], [PointerClass(float32_t)]), + FloatReduceSumTemplate.referenceTemplate, GAP9ClusterTransformer) +] + +GAP9UniformRQSBindings = [ + NodeBinding( + PULPRequantShiftChecker([PointerClass(type), PointerClass(int32_t), + PointerClass(int32_t)], [PointerClass(int8_t)]), + UniformRequantShiftTemplate.referenceTemplate, GAP9Transformer) for type in IntegerDataTypes +] + +GAP9RQSBindings = [ + NodeBinding( + PULPRequantShiftChecker([PointerClass(type), PointerClass(int32_t), + PointerClass(int32_t)], [PointerClass(int8_t)]), + RequantShiftTemplate.referenceTemplate, GAP9Transformer) for type in IntegerDataTypes +] + [ + NodeBinding( + PULPRequantShiftChecker([PointerClass(type), PointerClass(int32_t), + PointerClass(int32_t)], [PointerClass(uint8_t)]), + RequantShiftTemplate.referenceTemplate, GAP9Transformer) for type in IntegerDataTypes +] + +GAP9SoftmaxBindings = [ + NodeBinding(SoftmaxChecker([PointerClass(_type)], [PointerClass(uint8_t)]), iSoftmaxTemplate.referenceTemplate, + GAP9Transformer) for _type in [int8_t, uint8_t] +] + [ + NodeBinding(SoftmaxChecker([PointerClass(float32_t)], [PointerClass(float32_t)]), + FloatSoftmaxTemplate.referenceTemplate, GAP9Transformer) +] + +GAP9SoftmaxGradBindings = [ + NodeBinding(SoftmaxChecker([PointerClass(float32_t), PointerClass(float32_t)], [PointerClass(float32_t)]), + FloatSoftmaxTemplate.referenceGradientTemplate, GAP9Transformer) +] + +GAP9SoftmaxCrossEntropyLossBindings = [ + NodeBinding( + SoftmaxCrossEntropyLossChecker([PointerClass(float32_t), PointerClass(type)], [PointerClass(float32_t)]), + SoftmaxCrossEntropyLossTemplate.referenceTemplate, GAP9Transformer) for type in IntegerDataTypes +] + +GAP9SoftmaxCrossEntropyLossGradBindings = [ + NodeBinding( + SoftmaxCrossEntropyLossChecker([PointerClass(float32_t), PointerClass(type)], [PointerClass(float32_t)]), + SoftmaxCrossEntropyLossTemplate.referenceGradientTemplate, GAP9Transformer) for type in IntegerDataTypes +] + +GAP9SGDBindings = [ + NodeBinding(SGDChecker([PointerClass(float32_t), PointerClass(float32_t)], [PointerClass(float32_t)]), + SGDTemplate.referenceTemplate, GAP9Transformer) +] + +GAP9TransposeBindings = [ + NodeBinding(TransposeChecker([PointerClass(type)], [PointerClass(type)]), TransposeTemplate.referenceTemplate, + GAP9Transformer) for type in IntegerDataTypes +] + [ + NodeBinding(TransposeChecker([PointerClass(float32_t)], [PointerClass(float32_t)]), + TransposeTemplate.referenceTemplate, GAP9Transformer) +] + +GAP9ConcatBindings = [ + NodeBinding(ConcatChecker([PointerClass(type), PointerClass(type)], [PointerClass(type)]), + ConcatTemplate.referenceTemplate, GAP9ClusterTransformer) for type in IntegerDataTypes +] + +GAP9iRMSNormBindings = [ + NodeBinding(LayerNormChecker([PointerClass(int8_t), PointerClass(int32_t)], [PointerClass(int8_t)]), + iRMSNormTemplate.referenceTemplate, GAP9Transformer) +] + +GAP9iHardswishBindings = [ + NodeBinding(HardswishChecker([PointerClass(int8_t)], [PointerClass(int32_t)]), iHardswishTemplate.referenceTemplate, + GAP9ClusterTransformer) +] + +GAP9RQSiHardswishBindings = [ + NodeBinding( + RQHardswishChecker([PointerClass(int8_t), + PointerClass(int32_t), + PointerClass(int32_t), + PointerClass(int32_t)], [PointerClass(int8_t)]), RQSiHardswishTemplate.referenceTemplate, + GAP9Transformer) +] + +GAP9iRQSGELUBindings = [ + NodeBinding( + GELUChecker([PointerClass(int8_t), + PointerClass(int32_t), + PointerClass(int32_t), + PointerClass(int32_t)], [PointerClass(int8_t)]), RQSiGELUTemplate.referenceTemplate, + GAP9ClusterTransformer) +] + +GAP9MulBindings = [ + NodeBinding(MulChecker([PointerClass(typeA), PointerClass(typeB)], [PointerClass(int32_t)]), + MulTemplate.referenceTemplate, GAP9Transformer) + for typeA, typeB in itertools.product(SignedIntegerDataTypes, SignedIntegerDataTypes) +] + [ + NodeBinding(MulChecker([PointerClass(float32_t), PointerClass(float32_t)], [PointerClass(float32_t)]), + FloatMulTemplate.referenceTemplate, GAP9Transformer) +] + +GAP9ReluBinding = NodeBinding(ReluChecker([PointerClass(float32_t)], [PointerClass(float32_t)]), + FloatReluTemplate.referenceTemplate, GAP9Transformer) + +GAP9LayernormBinding = NodeBinding( + LayerNormChecker( + [PointerClass(float32_t), PointerClass(float32_t), + PointerClass(float32_t)], [PointerClass(float32_t)]), FloatLayernormTemplate.referenceTemplate, + GAP9Transformer) + +GAP9FloatGELUBinding = NodeBinding( + GELUChecker([PointerClass(float32_t), PointerClass(float32_t)], [PointerClass(float32_t)]), + FloatGELUTemplate.referenceTemplate, GAP9Transformer) + +GAP9GatherBindings = [ + NodeBinding(GatherChecker([PointerClass(float32_t), PointerClass(type)], [PointerClass(float32_t)]), + GatherTemplate.referenceTemplate, GAP9Transformer) for type in IntegerDataTypes +] + +GAP9QuantBindings = [ + NodeBinding(QuantChecker([PointerClass(float32_t)], [PointerClass(int8_t)]), QuantTemplate.referenceTemplate, + GAP9Transformer), +] + +GAP9DequantBindings = [ + NodeBinding(DequantChecker([PointerClass(int8_t)], [PointerClass(float32_t)]), DequantTemplate.referenceTemplate, + GAP9Transformer), +] + [ + NodeBinding(DequantChecker([PointerClass(int32_t)], [PointerClass(float32_t)]), DequantTemplate.referenceTemplate, + GAP9Transformer), +] diff --git a/Deeploy/Targets/GAP9/DMA/ClDma.py b/Deeploy/Targets/GAP9/DMA/ClDma.py new file mode 100644 index 0000000000..b96796affa --- /dev/null +++ b/Deeploy/Targets/GAP9/DMA/ClDma.py @@ -0,0 +1,85 @@ +# SPDX-FileCopyrightText: 2025 ETH Zurich and University of Bologna +# +# SPDX-License-Identifier: Apache-2.0 + +import math +from typing import Dict, Tuple + +from Deeploy.DeeployTypes import NetworkContext, NodeTemplate, OperatorRepresentation, VariableBuffer +from Deeploy.TilingExtension.AsyncDma import AsyncDma, PerTensorWaitingStrategy, DmaDirection, Future + + +class ClDmaFuture(Future): + """ + Future implementation for GAP9's cl_dma.h API. + Uses pi_cl_dma_cmd_t structure to track DMA transfers. + """ + + _initTemplate = NodeTemplate("pi_cl_dma_cmd_t ${name};") + + _deinitTemplate = NodeTemplate("") + + _allocTemplate = NodeTemplate("") # SDK handles allocation automatically + + _waitTemplate = NodeTemplate("pi_cl_dma_cmd_wait(&${name});") + + +class ClDma(AsyncDma): + """ + GAP9 Cluster DMA implementation using cl_dma.h high-level API. + + This uses the PMSIS standard API (pi_cl_dma_cmd) instead of low-level MCHAN. + Benefits: + - Higher abstraction level + - Better portability + - Automatic resource management + - Cleaner API + """ + + _transferTemplates = { + 1: NodeTemplate("pi_cl_dma_cmd(${ext}, ${loc}, ${size}, ${dir}, &${future});"), + 2: NodeTemplate("pi_cl_dma_cmd_2d(${ext}, ${loc}, ${size}, ${stride}, ${length}, ${dir}, &${future});"), + } + _waitingStrategy = PerTensorWaitingStrategy(ClDmaFuture) + + def __init__(self, transferTemplates: Dict[int, NodeTemplate] = _transferTemplates) -> None: + super().__init__(transferTemplates) + + def checkTransfer(self, ctxt: NetworkContext, externalBuffer: VariableBuffer, localBuffer: VariableBuffer, + shape: Tuple[int, ...], strideExt: Tuple[int, ...], strideLoc: Tuple[int, ...], + direction: DmaDirection) -> None: + super().checkTransfer(ctxt, externalBuffer, localBuffer, shape, strideExt, strideLoc, direction) + + transferRank = len(shape) + # GAP9 cl_dma requires contiguous transfers for innermost dimension + assert strideExt[ + -1] == 1, "GAP9 cl_dma supports only contiguous transfers of the innermost dimension for external memory" + if transferRank == 1: + assert strideLoc[0] == 1, "GAP9 cl_dma supports only contiguous transfers for local memory" + else: + assert strideLoc[0] == shape[1] and strideLoc[ + 1] == 1, "GAP9 cl_dma supports only contiguous transfers for local memory" + + def transferOpRepr(self, externalBuffer: VariableBuffer, localBuffer: VariableBuffer, shape: Tuple[int, ...], + strideExt: Tuple[int, ...], strideLoc: Tuple[int, ...], direction: DmaDirection, + future: Future) -> OperatorRepresentation: + operatorRepresentation = super().transferOpRepr(externalBuffer, localBuffer, shape, strideExt, strideLoc, + direction, future) + + transferRank = len(shape) + + # Use cl_dma API direction enum: PI_CL_DMA_DIR_EXT2LOC (1) or PI_CL_DMA_DIR_LOC2EXT (0) + operatorRepresentation["dir"] = "PI_CL_DMA_DIR_EXT2LOC" if direction == "ExternalToLocal" else "PI_CL_DMA_DIR_LOC2EXT" + + # Total transfer size in bytes (shape already contains byte counts from the framework) + transferSize = math.prod(shape) + operatorRepresentation["size"] = transferSize + + # For 2D transfers, add stride and length parameters (already in bytes) + if transferRank == 2: + # stride: bytes to add to go to next line (row stride in external memory) + operatorRepresentation["stride"] = strideExt[0] + # length: bytes per line (number of bytes after which DMA switches to next line) + operatorRepresentation["length"] = shape[1] + + return operatorRepresentation diff --git a/Deeploy/Targets/GAP9/DMA/__init__.py b/Deeploy/Targets/GAP9/DMA/__init__.py new file mode 100644 index 0000000000..4694b67df5 --- /dev/null +++ b/Deeploy/Targets/GAP9/DMA/__init__.py @@ -0,0 +1,3 @@ +# SPDX-FileCopyrightText: 2025 ETH Zurich and University of Bologna +# +# SPDX-License-Identifier: Apache-2.0 diff --git a/Deeploy/Targets/GAP9/Deployer.py b/Deeploy/Targets/GAP9/Deployer.py new file mode 100644 index 0000000000..49bd885e5a --- /dev/null +++ b/Deeploy/Targets/GAP9/Deployer.py @@ -0,0 +1,58 @@ +# SPDX-FileCopyrightText: 2025 ETH Zurich and University of Bologna +# +# SPDX-License-Identifier: Apache-2.0 + +""" +GAP9-specific deployer that uses cl_dma.h API. + +This deployer extends PULPDeployer to use GAP9-specific DMA (ClDma) via +the GAP9Bindings transformers. +""" + +from typing import Callable, Dict, List, Type + +import numpy as np +import onnx_graphsurgeon as gs + +from Deeploy.AbstractDataTypes import Pointer +from Deeploy.DeeployTypes import DeploymentPlatform, TopologyOptimizer +from Deeploy.Targets.PULPOpen.Deployer import PULPDeployer +from Deeploy.Targets.GAP9.Bindings import GAP9Transformer, GAP9ClusterTransformer, GAP9SimpleTransformer + + +class GAP9Deployer(PULPDeployer): + """ + GAP9-specific deployer using cl_dma.h API. + + This deployer uses GAP9-specific transformers that employ ClDma (cl_dma.h) + instead of the low-level MCHAN API used by PULPDeployer. + + The key difference is in the DMA implementation: + - PULP: Uses MchanDma (low-level MCHAN hardware API) + - GAP9: Uses ClDma (PMSIS cl_dma.h high-level API) + """ + + def __init__(self, + graph: gs.Graph, + deploymentPlatform: DeploymentPlatform, + inputTypes: Dict[str, Type[Pointer]], + loweringOptimizer: TopologyOptimizer, + scheduler: Callable = lambda x: x, + name: str = 'DeeployNetwork', + default_channels_first = False, + deeployStateDir: str = "DeeployStateDir", + inputOffsets = {}): + super().__init__(graph, + deploymentPlatform, + inputTypes, + loweringOptimizer, + scheduler, + name, + default_channels_first = default_channels_first, + deeployStateDir = deeployStateDir, + inputOffsets = inputOffsets) + + # Override transformers to use GAP9-specific ones with ClDma + self.Transformer = GAP9Transformer + self.ClusterTransformer = GAP9ClusterTransformer + self.SimpleTransformer = GAP9SimpleTransformer diff --git a/Deeploy/Targets/GAP9/Platform.py b/Deeploy/Targets/GAP9/Platform.py index 346f631e8a..697b8010ba 100644 --- a/Deeploy/Targets/GAP9/Platform.py +++ b/Deeploy/Targets/GAP9/Platform.py @@ -5,13 +5,158 @@ import numpy as np import onnx_graphsurgeon as gs -from Deeploy.DeeployTypes import ConstantBuffer, DeploymentEngine, DeploymentPlatform, NetworkContext, NodeTemplate, \ - StructBuffer, TransientBuffer, VariableBuffer +from Deeploy.DeeployTypes import ConstantBuffer, DeploymentEngine, DeploymentPlatform, NetworkContext, NodeMapper, \ + NodeTemplate, StructBuffer, TransientBuffer, VariableBuffer from Deeploy.MemoryLevelExtension.MemoryLevels import MemoryHierarchy, MemoryLevel from Deeploy.MemoryLevelExtension.NetworkDeployers.MemoryLevelDeployer import MemoryPlatform, MemoryPlatformWrapper from Deeploy.Targets.GAP9.Templates import AllocateTemplate, FreeTemplate from Deeploy.Targets.Generic.Templates import AllocateTemplate as BasicAllocateTemplate -from Deeploy.Targets.PULPOpen.Platform import PULPMapping +from Deeploy.Targets.Generic.Bindings import BasicGEMMBindings, BasicPad1DBindings, BasicPad2DBindings, \ + BasicRQIntegerDivBinding +from Deeploy.Targets.Generic.Layers import AddLayer, ConcatLayer, ConvLayer, GatherLayer, GELULayer, GEMMLayer, \ + LayerNormLayer, MatMulLayer, MaxPoolLayer, MulLayer, PadLayer, QuantLayer, ReduceMeanLayer, ReduceSumLayer, \ + ReluLayer, RequantShiftLayer, ReshapeLayer, RQIntegerDivLayer, RQSiGELULayer, RQSiHardswishLayer, SGDLayer, \ + SliceLayer, SoftmaxCrossEntropyLossGradLayer, SoftmaxCrossEntropyLossLayer, SoftmaxGradLayer, SoftmaxLayer, \ + TransposeLayer, iHardswishLayer, iRMSNormLayer +from Deeploy.Targets.Generic.Parsers import AddParser, ConcatParser, DequantParser, FlattenParser, GatherParser, \ + GELUParser, GEMMParser, LayerNormParser, MatMulParser, MaxPool2DParser, MulParser, Pad1DParser, Pad2DParser, \ + QuantParser, ReduceMeanParser, ReduceSumParser, ReluParser, RequantShiftParser, ReshapeParser, RQAddParser, \ + RQIntegerDivParser, RQSiGELUParser, RQSiHardswishParser, SGDParser, SliceParser, \ + SoftmaxCrossEntropyLossGradParser, SoftmaxCrossEntropyLossParser, SoftmaxGradParser, SoftmaxParser, \ + TransposeParser, UniformRequantShiftParser, UnsqueezeParser, iHardswishParser, iRMSNormParser, iSoftmaxParser +from Deeploy.Targets.PULPOpen.Bindings import BasicDequantBindings, BasicQuantBindings, PULPConv1DBinding, \ + PULPDMASliceBindings, PULPDWConv1DBinding, PULPFloatDWConv2DBindings, PULPReduceMeanBindings, PULPSliceBindings +from Deeploy.Targets.PULPOpen.Layers import PULPRQSConvLayer, PULPRQSGEMMLayer +from Deeploy.Targets.PULPOpen.Parsers import PULPConv1DParser, PULPConv2DParser, PULPDWConv1DParser, \ + PULPDWConv2DParser, PULPFPConv2DParser, PULPFPDWConv2DParser, PULPGEMMParser, PULPMatrixVecParser, \ + PULPTallGEMMParser + +# Import GAP9-specific tiler bindings +from Deeploy.Targets.GAP9.Tiler import ( + GAP9AddTilingReadyBindings, + GAP9ConcatTilingReadyBindings, + GAP9Conv2DTilingReadyBindings, + GAP9FlattenTilingReadyBindings, + GAP9FPGELUTilingReadyBindings, + GAP9FPGEMMTilingReadyBindings, + GAP9GatherTilingReadyBindings, + GAP9iHardswishTilingReadyBindings, + GAP9iRMSNormTilingReadyBindings, + GAP9iRQSGELUTilingReadyBindings, + GAP9LayernormTilingReadyBindings, + GAP9MatMulTilingReadyBindings, + GAP9MaxPool2DTilingReadyBindings, + GAP9MulTilingReadyBindings, + GAP9ReduceSumTilingReadyBindings, + GAP9ReluTilingReadyBindings, + GAP9RQAddTilingReadyBindings, + GAP9RQSConv2DTilingReadyBindings, + GAP9RQSDWConv2DTilingReadyBindings, + GAP9RQSGEMMTilingReadyBindings, + GAP9RQSiHardswishTilingReadyBindings, + GAP9RQSMatrixVecTilingReadyBindings, + GAP9RQSTallGEMMTilingReadyBindings, + GAP9RQSTilingReadyBindings, + GAP9SGDTilingReadyBindings, + GAP9SoftmaxCrossEntropyGradTilingReadyBindings, + GAP9SoftmaxCrossEntropyTilingReadyBindings, + GAP9SoftmaxGradTilingReadyBindings, + GAP9SoftmaxTilingReadyBindings, + GAP9TransposeTilingReadyBindings, + GAP9UniformRQSTilingReadyBindings, +) + +# Create GAP9-specific NodeMappers +GAP9_RQAddMapper = NodeMapper(RQAddParser(), GAP9RQAddTilingReadyBindings) +GAP9_AddMapper = NodeMapper(AddParser(), GAP9AddTilingReadyBindings) +GAP9_FlattenMapper = NodeMapper(FlattenParser(), GAP9FlattenTilingReadyBindings) +GAP9_GELUMapper = NodeMapper(GELUParser(), GAP9FPGELUTilingReadyBindings) +GAP9_GatherMapper = NodeMapper(GatherParser(), GAP9GatherTilingReadyBindings) +GAP9_MulMapper = NodeMapper(MulParser(), GAP9MulTilingReadyBindings) +GAP9_Pad1DMapper = NodeMapper(Pad1DParser(), BasicPad1DBindings) +GAP9_Pad2DMapper = NodeMapper(Pad2DParser(), BasicPad2DBindings) +GAP9_ReshapeMapper = NodeMapper(ReshapeParser(), GAP9FlattenTilingReadyBindings) +GAP9_TransposeMapper = NodeMapper(TransposeParser(), GAP9TransposeTilingReadyBindings) +GAP9_UnsqueezeMapper = NodeMapper(UnsqueezeParser(), GAP9FlattenTilingReadyBindings) +GAP9_RequantShiftMapper = NodeMapper(RequantShiftParser(), GAP9RQSTilingReadyBindings) +GAP9_UniformRequantShiftMapper = NodeMapper(UniformRequantShiftParser(), GAP9UniformRQSTilingReadyBindings) +GAP9_ReduceMeanMapper = NodeMapper(ReduceMeanParser(), PULPReduceMeanBindings) +GAP9_ReduceSumMapper = NodeMapper(ReduceSumParser(), GAP9ReduceSumTilingReadyBindings) +GAP9_MatMulMapper = NodeMapper(MatMulParser(), GAP9MatMulTilingReadyBindings) +GAP9_RQIntegerDivMapper = NodeMapper(RQIntegerDivParser(), [BasicRQIntegerDivBinding]) +GAP9_RQGELU_int8_Mapper = NodeMapper(RQSiGELUParser(), GAP9iRQSGELUTilingReadyBindings) +GAP9_Conv1DMapper = NodeMapper(PULPConv1DParser(), [PULPConv1DBinding]) +GAP9_DWConv1DMapper = NodeMapper(PULPDWConv1DParser(), [PULPDWConv1DBinding]) +GAP9_FPConv2DMapper = NodeMapper(PULPFPConv2DParser(), GAP9Conv2DTilingReadyBindings) +GAP9_Conv2DMapper = NodeMapper(PULPConv2DParser(), GAP9RQSConv2DTilingReadyBindings) +GAP9_FPDWConv2DMapper = NodeMapper(PULPFPDWConv2DParser(), PULPFloatDWConv2DBindings) +GAP9_DWConv2DMapper = NodeMapper(PULPDWConv2DParser(), GAP9RQSDWConv2DTilingReadyBindings) +GAP9_GEMMMapper = NodeMapper(PULPGEMMParser(), GAP9RQSGEMMTilingReadyBindings) +GAP9_FloatGEMMMapper = NodeMapper(GEMMParser(), GAP9FPGEMMTilingReadyBindings) +GAP9_MatrixVecMapper = NodeMapper(PULPMatrixVecParser(), GAP9RQSMatrixVecTilingReadyBindings) +GAP9_TallGEMMMapper = NodeMapper(PULPTallGEMMParser(), GAP9RQSTallGEMMTilingReadyBindings) +GAP9_MaxPool2DMapper = NodeMapper(MaxPool2DParser(), GAP9MaxPool2DTilingReadyBindings) +GAP9_LayerNormMapper = NodeMapper(LayerNormParser(), GAP9LayernormTilingReadyBindings) +GAP9_ReluMapper = NodeMapper(ReluParser(), GAP9ReluTilingReadyBindings) +GAP9_SoftmaxMapper = NodeMapper(SoftmaxParser(), GAP9SoftmaxTilingReadyBindings) +GAP9_SoftmaxGradMapper = NodeMapper(SoftmaxGradParser(), GAP9SoftmaxGradTilingReadyBindings) +GAP9_Softmax_int8_Mapper = NodeMapper(iSoftmaxParser(), GAP9SoftmaxTilingReadyBindings) +GAP9_ConcatMapper = NodeMapper(ConcatParser(), GAP9ConcatTilingReadyBindings) +GAP9_DMASliceMapper = NodeMapper(SliceParser(), PULPDMASliceBindings) +GAP9_SliceMapper = NodeMapper(SliceParser(), PULPSliceBindings) +GAP9_iRMSNormMapper = NodeMapper(iRMSNormParser(), GAP9iRMSNormTilingReadyBindings) +GAP9_iHardswishMapper = NodeMapper(iHardswishParser(), GAP9iHardswishTilingReadyBindings) +GAP9_RQSiHardswishMapper = NodeMapper(RQSiHardswishParser(), GAP9RQSiHardswishTilingReadyBindings) +GAP9_SoftmaxCrossEntropyLossMapper = NodeMapper(SoftmaxCrossEntropyLossParser(), + GAP9SoftmaxCrossEntropyTilingReadyBindings) +GAP9_SoftmaxCrossEntropyLossGradMapper = NodeMapper(SoftmaxCrossEntropyLossGradParser(), + GAP9SoftmaxCrossEntropyGradTilingReadyBindings) +GAP9_SGDMapper = NodeMapper(SGDParser(), GAP9SGDTilingReadyBindings) +GAP9_QuantMapper = NodeMapper(QuantParser(), BasicQuantBindings) +GAP9_DequantMapper = NodeMapper(DequantParser(), BasicDequantBindings) +GAP9_GEMMDequantMapper = NodeMapper(PULPGEMMParser(), BasicGEMMBindings) + +# GAP9-specific mapping using ClDma +GAP9Mapping = { + 'Conv': ConvLayer([GAP9_FPConv2DMapper, GAP9_FPDWConv2DMapper]), + 'RequantizedConv': PULPRQSConvLayer([GAP9_Conv2DMapper, GAP9_DWConv2DMapper, GAP9_Conv1DMapper, GAP9_DWConv1DMapper]), + 'RequantizedGemm': PULPRQSGEMMLayer([GAP9_MatrixVecMapper, GAP9_TallGEMMMapper, GAP9_GEMMMapper]), + 'Gemm': GEMMLayer([GAP9_FloatGEMMMapper, GAP9_GEMMDequantMapper]), + 'Gelu': GELULayer([GAP9_GELUMapper]), + 'LayerNormalization': LayerNormLayer([GAP9_LayerNormMapper]), + 'MaxPool': MaxPoolLayer([GAP9_MaxPool2DMapper]), + 'RequantizediGELU': RQSiGELULayer([GAP9_RQGELU_int8_Mapper]), + 'RQIntegerDiv': RQIntegerDivLayer([GAP9_RQIntegerDivMapper]), + 'MatMul': MatMulLayer([GAP9_MatMulMapper]), + 'IntegerMean': ReduceMeanLayer([GAP9_ReduceMeanMapper]), + 'iSoftmax': SoftmaxLayer([GAP9_Softmax_int8_Mapper]), + 'Softmax': SoftmaxLayer([GAP9_SoftmaxMapper]), + 'ReduceMean': ReduceMeanLayer([GAP9_ReduceMeanMapper]), + 'ReduceSum': ReduceSumLayer([GAP9_ReduceSumMapper]), + 'RequantShift': RequantShiftLayer([GAP9_UniformRequantShiftMapper, GAP9_RequantShiftMapper]), + 'Add': AddLayer([GAP9_AddMapper]), + 'Flatten': ReshapeLayer([GAP9_FlattenMapper]), + 'Gather': GatherLayer([GAP9_GatherMapper]), + 'Mul': MulLayer([GAP9_MulMapper]), + 'Pad': PadLayer([GAP9_Pad1DMapper, GAP9_Pad2DMapper]), + 'Relu': ReluLayer([GAP9_ReluMapper]), + 'Reshape': ReshapeLayer([GAP9_ReshapeMapper]), + 'Squeeze': ReshapeLayer([GAP9_UnsqueezeMapper]), + 'Transpose': TransposeLayer([GAP9_TransposeMapper]), + 'Unsqueeze': ReshapeLayer([GAP9_UnsqueezeMapper]), + 'Slice': SliceLayer([GAP9_SliceMapper, GAP9_DMASliceMapper]), + 'RequantizedAdd': AddLayer([GAP9_RQAddMapper]), + 'Concat': ConcatLayer([GAP9_ConcatMapper]), + 'iRMSNorm': iRMSNormLayer([GAP9_iRMSNormMapper]), + 'iHardswish': iHardswishLayer([GAP9_iHardswishMapper]), + 'RequantizediHardswish': RQSiHardswishLayer([GAP9_RQSiHardswishMapper]), + 'Quant': QuantLayer([GAP9_QuantMapper]), + 'Dequant': QuantLayer([GAP9_DequantMapper]), + 'SoftmaxGrad': SoftmaxGradLayer([GAP9_SoftmaxGradMapper]), + 'SoftmaxCrossEntropyLoss': SoftmaxCrossEntropyLossLayer([GAP9_SoftmaxCrossEntropyLossMapper]), + 'SoftmaxCrossEntropyLossGrad': SoftmaxCrossEntropyLossGradLayer([GAP9_SoftmaxCrossEntropyLossGradMapper]), + 'SGD': SGDLayer([GAP9_SGDMapper]) +} class GAP9VariableBuffer(VariableBuffer): @@ -93,7 +238,7 @@ class GAP9StructBuffer(StructBuffer): class GAP9ClusterEngine(DeploymentEngine): - def __init__(self, name: str, Mapping = PULPMapping, initCode = "", includeList = _includeList, n_cores: int = 8) -> None: + def __init__(self, name: str, Mapping = GAP9Mapping, initCode = "", includeList = _includeList, n_cores: int = 8) -> None: super().__init__(name, Mapping, initCode, includeList) self.n_cores = n_cores diff --git a/Deeploy/Targets/GAP9/Tiler.py b/Deeploy/Targets/GAP9/Tiler.py new file mode 100644 index 0000000000..73d3958ae9 --- /dev/null +++ b/Deeploy/Targets/GAP9/Tiler.py @@ -0,0 +1,166 @@ +# SPDX-FileCopyrightText: 2025 ETH Zurich and University of Bologna +# +# SPDX-License-Identifier: Apache-2.0 + +""" +GAP9-specific tiler bindings using ClDma instead of MchanDma. + +This module creates GAP9-specific tiling ready bindings that use ClDma +instead of the low-level MCHAN API. +""" + +import copy + +from Deeploy.Targets.Generic.TileConstraints.AddTileConstraint import AddTileConstraint +from Deeploy.Targets.Generic.TileConstraints.ConcatTileConstraint import ConcatTileConstraint +from Deeploy.Targets.Generic.TileConstraints.iHardswishTileConstraint import iHardswishTileConstraint +from Deeploy.Targets.Generic.TileConstraints.iRMSNormTileConstraint import iRMSNormTileConstraint +from Deeploy.Targets.Generic.TileConstraints.MulTileConstraint import MulTileConstraint +from Deeploy.Targets.Generic.TileConstraints.NOPTileConstraint import NOPTileConstraint +from Deeploy.Targets.Generic.TileConstraints.RQSiGELUTileConstraint import RQSiGELUTileConstraint +from Deeploy.Targets.Generic.TileConstraints.RQSiHardswishTileConstraint import RQSiHardswishTileConstraint +from Deeploy.Targets.Generic.TileConstraints.TransposeTileConstraint import TransposeTileConstraint +from Deeploy.Targets.Generic.TileConstraints.UnaryTileConstraint import UnaryTileConstraint +from Deeploy.Targets.Generic.TileConstraints.UntiledTileConstraint import UntiledTileConstraint +from Deeploy.Targets.GAP9.Bindings import ( + GAP9AddBindings, + GAP9ConcatBindings, + GAP9FloatConv2DBindings, + GAP9FloatGELUBinding, + GAP9FloatGEMMBindings, + GAP9GatherBindings, + GAP9iHardswishBindings, + GAP9iRMSNormBindings, + GAP9iRQSGELUBindings, + GAP9LayernormBinding, + GAP9MatMulBindings, + GAP9MaxPool2DBindings, + GAP9MulBindings, + GAP9ReduceSumBindings, + GAP9ReluBinding, + GAP9ReshapeBindings, + GAP9RQAddBindings, + GAP9RQSBindings, + GAP9RQSConv2DBindings, + GAP9RQSDWConv2DBindings, + GAP9RQSGEMMBindings, + GAP9RQSiHardswishBindings, + GAP9RQSMatrixVecBindings, + GAP9RQSTallGEMMBindings, + GAP9SGDBindings, + GAP9SoftmaxBindings, + GAP9SoftmaxCrossEntropyLossBindings, + GAP9SoftmaxCrossEntropyLossGradBindings, + GAP9SoftmaxGradBindings, + GAP9TransposeBindings, + GAP9UniformRQSBindings, +) +from Deeploy.Targets.PULPOpen.TileConstraints.ConvTileConstraint import Conv2DTileConstraint, RQConv2DTileConstraint +from Deeploy.Targets.PULPOpen.TileConstraints.DWConvTileConstraint import DWConv2DTileConstraint +from Deeploy.Targets.PULPOpen.TileConstraints.GatherTileConstraint import GatherTileConstraint +from Deeploy.Targets.PULPOpen.TileConstraints.GEMMTileConstraint import FloatGEMMTileConstraint, GEMMTileConstraint +from Deeploy.Targets.PULPOpen.TileConstraints.iSoftmaxTileConstraint import iSoftmaxTileConstraint +from Deeploy.Targets.PULPOpen.TileConstraints.LayernormTileConstraint import LayernormTileConstraint +from Deeploy.Targets.PULPOpen.TileConstraints.MatMulTileConstraint import MatMulTileConstraint +from Deeploy.Targets.PULPOpen.TileConstraints.MaxPoolTileConstraint import MaxPoolCTileConstraint +from Deeploy.Targets.PULPOpen.TileConstraints.RequantShiftTileConstraint import RequantShiftTileConstraint +from Deeploy.Targets.PULPOpen.TileConstraints.SGDTileConstraint import SGDTileConstraint +from Deeploy.Targets.PULPOpen.TileConstraints.SoftmaxCrossEntropyTileConstraint import \ + SoftmaxCrossEntropyGradTileConstraint, SoftmaxCrossEntropyTileConstraint +from Deeploy.TilingExtension.TilerExtension import TilingReadyNodeBindings + +# GAP9-specific tiling ready bindings using ClDma +GAP9RQSConv2DTilingReadyBindings = TilingReadyNodeBindings(nodeBindings = GAP9RQSConv2DBindings, + tileConstraint = RQConv2DTileConstraint()) + +GAP9RQSDWConv2DTilingReadyBindings = TilingReadyNodeBindings(nodeBindings = GAP9RQSDWConv2DBindings, + tileConstraint = DWConv2DTileConstraint()) + +GAP9Conv2DTilingReadyBindings = TilingReadyNodeBindings(nodeBindings = GAP9FloatConv2DBindings, + tileConstraint = Conv2DTileConstraint()) + +GAP9RQSGEMMTilingReadyBindings = TilingReadyNodeBindings(nodeBindings = GAP9RQSGEMMBindings, + tileConstraint = GEMMTileConstraint()) + +GAP9FPGEMMTilingReadyBindings = TilingReadyNodeBindings(nodeBindings = GAP9FloatGEMMBindings, + tileConstraint = FloatGEMMTileConstraint()) + +GAP9RQSMatrixVecTilingReadyBindings = TilingReadyNodeBindings(nodeBindings = GAP9RQSMatrixVecBindings, + tileConstraint = GEMMTileConstraint()) + +GAP9RQSTallGEMMTilingReadyBindings = TilingReadyNodeBindings(nodeBindings = GAP9RQSTallGEMMBindings, + tileConstraint = GEMMTileConstraint()) + +GAP9MatMulTilingReadyBindings = TilingReadyNodeBindings(nodeBindings = GAP9MatMulBindings, + tileConstraint = MatMulTileConstraint()) + +GAP9RQAddTilingReadyBindings = TilingReadyNodeBindings(nodeBindings = GAP9RQAddBindings, + tileConstraint = AddTileConstraint()) + +GAP9iHardswishTilingReadyBindings = TilingReadyNodeBindings(nodeBindings = GAP9iHardswishBindings, + tileConstraint = iHardswishTileConstraint()) + +GAP9RQSiHardswishTilingReadyBindings = TilingReadyNodeBindings(nodeBindings = GAP9RQSiHardswishBindings, + tileConstraint = RQSiHardswishTileConstraint()) + +_GAP9FlattenBindings = copy.deepcopy(GAP9ReshapeBindings) + +GAP9FlattenTilingReadyBindings = TilingReadyNodeBindings(nodeBindings = _GAP9FlattenBindings, + tileConstraint = NOPTileConstraint()) + +GAP9MaxPool2DTilingReadyBindings = TilingReadyNodeBindings(nodeBindings = GAP9MaxPool2DBindings, + tileConstraint = MaxPoolCTileConstraint()) + +GAP9RQSTilingReadyBindings = TilingReadyNodeBindings(nodeBindings = GAP9RQSBindings, + tileConstraint = RequantShiftTileConstraint()) + +GAP9UniformRQSTilingReadyBindings = TilingReadyNodeBindings(nodeBindings = GAP9UniformRQSBindings, + tileConstraint = UnaryTileConstraint()) + +GAP9TransposeTilingReadyBindings = TilingReadyNodeBindings(nodeBindings = GAP9TransposeBindings, + tileConstraint = TransposeTileConstraint()) + +GAP9AddTilingReadyBindings = TilingReadyNodeBindings(nodeBindings = GAP9AddBindings, + tileConstraint = AddTileConstraint()) + +GAP9SoftmaxTilingReadyBindings = TilingReadyNodeBindings(nodeBindings = GAP9SoftmaxBindings, + tileConstraint = iSoftmaxTileConstraint()) + +GAP9ConcatTilingReadyBindings = TilingReadyNodeBindings(nodeBindings = GAP9ConcatBindings, + tileConstraint = ConcatTileConstraint()) + +GAP9iRMSNormTilingReadyBindings = TilingReadyNodeBindings(nodeBindings = GAP9iRMSNormBindings, + tileConstraint = iRMSNormTileConstraint()) + +GAP9iRQSGELUTilingReadyBindings = TilingReadyNodeBindings(nodeBindings = GAP9iRQSGELUBindings, + tileConstraint = RQSiGELUTileConstraint()) + +GAP9MulTilingReadyBindings = TilingReadyNodeBindings(nodeBindings = GAP9MulBindings, + tileConstraint = MulTileConstraint()) + +GAP9ReluTilingReadyBindings = TilingReadyNodeBindings(nodeBindings = [GAP9ReluBinding], + tileConstraint = UnaryTileConstraint()) + +GAP9LayernormTilingReadyBindings = TilingReadyNodeBindings(nodeBindings = [GAP9LayernormBinding], + tileConstraint = LayernormTileConstraint()) + +GAP9FPGELUTilingReadyBindings = TilingReadyNodeBindings(nodeBindings = [GAP9FloatGELUBinding], + tileConstraint = UnaryTileConstraint()) + +GAP9GatherTilingReadyBindings = TilingReadyNodeBindings(nodeBindings = GAP9GatherBindings, + tileConstraint = GatherTileConstraint()) + +GAP9SoftmaxCrossEntropyTilingReadyBindings = TilingReadyNodeBindings( + nodeBindings = GAP9SoftmaxCrossEntropyLossBindings, tileConstraint = SoftmaxCrossEntropyTileConstraint()) + +GAP9SoftmaxCrossEntropyGradTilingReadyBindings = TilingReadyNodeBindings( + nodeBindings = GAP9SoftmaxCrossEntropyLossGradBindings, tileConstraint = SoftmaxCrossEntropyGradTileConstraint()) + +GAP9SoftmaxGradTilingReadyBindings = TilingReadyNodeBindings(nodeBindings = GAP9SoftmaxGradBindings, + tileConstraint = UntiledTileConstraint()) + +GAP9ReduceSumTilingReadyBindings = TilingReadyNodeBindings(nodeBindings = GAP9ReduceSumBindings, + tileConstraint = UntiledTileConstraint()) + +GAP9SGDTilingReadyBindings = TilingReadyNodeBindings(nodeBindings = GAP9SGDBindings, + tileConstraint = SGDTileConstraint()) diff --git a/DeeployTest/testUtils/platformMapping.py b/DeeployTest/testUtils/platformMapping.py index f107ab2e93..9d526906f9 100644 --- a/DeeployTest/testUtils/platformMapping.py +++ b/DeeployTest/testUtils/platformMapping.py @@ -14,6 +14,7 @@ from Deeploy.Targets.Chimera.Platform import ChimeraOptimizer, ChimeraPlatform from Deeploy.Targets.CortexM.Deployer import CMSISDeployer from Deeploy.Targets.CortexM.Platform import CMSISOptimizer, CMSISPlatform +from Deeploy.Targets.GAP9.Deployer import GAP9Deployer from Deeploy.Targets.GAP9.Platform import GAP9Platform, MemoryGAP9Platform, MemoryGAP9PlatformWrapper from Deeploy.Targets.Generic.Deployer import GenericDeployer from Deeploy.Targets.Generic.Platform import GenericOptimizer, GenericPlatform @@ -206,8 +207,24 @@ def mapDeployer(platform: DeploymentPlatform, default_channels_first = default_channels_first, deeployStateDir = deeployStateDir) - elif isinstance(platform, (PULPPlatform, MemoryPULPPlatform, MemoryPULPPlatformWrapper, GAP9Platform, - MemoryGAP9Platform, MemoryGAP9PlatformWrapper)): + elif isinstance(platform, (GAP9Platform, MemoryGAP9Platform, MemoryGAP9PlatformWrapper)): + + if loweringOptimizer is None: + loweringOptimizer = PULPOptimizer + + if default_channels_first is None: + default_channels_first = False + + deployer = GAP9Deployer(graph, + platform, + inputTypes, + loweringOptimizer, + scheduler, + name = name, + default_channels_first = default_channels_first, + deeployStateDir = deeployStateDir) + + elif isinstance(platform, (PULPPlatform, MemoryPULPPlatform, MemoryPULPPlatformWrapper)): if loweringOptimizer is None: loweringOptimizer = PULPOptimizer From b51e29d94604c0c703203d6fae8ccfdd59465dd2 Mon Sep 17 00:00:00 2001 From: Run Wang <52746141+SamanthaWangdl@users.noreply.github.com> Date: Fri, 21 Nov 2025 02:26:01 +0000 Subject: [PATCH 12/49] [GAP0] WIP Tiling Support for L3 --- CMakeLists.txt | 2 +- Deeploy/Targets/GAP9/Bindings.py | 6 +- Deeploy/Targets/GAP9/DMA/L3Dma.py | 64 ++ Deeploy/Targets/GAP9/Deployer.py | 69 +- DeeployTest/CMakeLists.txt | 8 +- DeeployTest/Platforms/GAP9/sdk.config | 8 +- DeeployTest/Platforms/GAP9/src/deeploytest.c | 4 +- DeeployTest/output.txt | 869 +++++++++++++++++++ cmake/gap9/gap9_gvsoc.cmake | 120 +++ cmake/simulation.cmake | 8 + 10 files changed, 1143 insertions(+), 15 deletions(-) create mode 100644 Deeploy/Targets/GAP9/DMA/L3Dma.py create mode 100644 DeeployTest/output.txt create mode 100644 cmake/gap9/gap9_gvsoc.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index d19feef2c0..da4765b40e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -225,7 +225,7 @@ endif() if(platform STREQUAL GAP9) project(${TESTNAME} LANGUAGES C ASM) - + include(${CMAKE_CURRENT_LIST_DIR}/cmake/gap9/gap9_gvsoc.cmake) add_compile_options( -Wno-error=unknown-pragmas ) diff --git a/Deeploy/Targets/GAP9/Bindings.py b/Deeploy/Targets/GAP9/Bindings.py index 6bb2053024..68a4c9d60b 100644 --- a/Deeploy/Targets/GAP9/Bindings.py +++ b/Deeploy/Targets/GAP9/Bindings.py @@ -25,11 +25,11 @@ from Deeploy.Targets.PULPOpen.CodeTransformationPasses.PULPClusterTiling import PULPClusterTiling from Deeploy.Targets.PULPOpen.CodeTransformationPasses.PULPL3Tiling import PULPL3Tiling from Deeploy.Targets.PULPOpen.CodeTransformationPasses.PULPProfileUntiled import PULPProfileUntiled -from Deeploy.Targets.PULPOpen.DMA.L3Dma import l3DmaHack from Deeploy.Targets.PULPOpen.Bindings import TilingCallClosure, ForkClosure, \ MemoryAwareFunctionCallClosure, L3MemoryAwareFunctionCallClosure, MemoryAwareForkTransformer from Deeploy.Targets.PULPOpen.DataTypes import PULPDMAFuture from Deeploy.Targets.GAP9.DMA.ClDma import ClDma +from Deeploy.Targets.GAP9.DMA.L3Dma import gap9L3DmaHack # Import templates from PULPOpen and Generic from Deeploy.Targets.Generic.Templates import AddTemplate, ConcatTemplate, DequantTemplate, FloatReduceMeanTemplate, \ @@ -60,7 +60,7 @@ MemoryManagementGeneration("L1"), TilingVariableReplacement("L2"), MemoryAwareFunctionCallClosure(writeback = False, generateStruct = True), - PULPL3Tiling("L3", "L2", l3DmaHack), + PULPL3Tiling("L3", "L2", gap9L3DmaHack), # Use GAP9-specific L3 DMA PULPProfileUntiled(), ArgumentStructGeneration(), L3MemoryAwareFunctionCallClosure(writeback = False), @@ -79,7 +79,7 @@ MemoryManagementGeneration("L1"), TilingVariableReplacement("L2"), MemoryAwareFunctionCallClosure(writeback = False, generateStruct = True), - PULPL3Tiling("L3", "L2", l3DmaHack), + PULPL3Tiling("L3", "L2", gap9L3DmaHack), # Use GAP9-specific L3 DMA PULPProfileUntiled(), ArgumentStructGeneration(), L3MemoryAwareFunctionCallClosure(writeback = False), diff --git a/Deeploy/Targets/GAP9/DMA/L3Dma.py b/Deeploy/Targets/GAP9/DMA/L3Dma.py new file mode 100644 index 0000000000..adbf161328 --- /dev/null +++ b/Deeploy/Targets/GAP9/DMA/L3Dma.py @@ -0,0 +1,64 @@ +# SPDX-FileCopyrightText: 2025 ETH Zurich and University of Bologna +# +# SPDX-License-Identifier: Apache-2.0 + +import math +from typing import Dict, Tuple + +from Deeploy.DeeployTypes import NetworkContext, NodeTemplate, OperatorRepresentation, VariableBuffer +from Deeploy.TilingExtension.AsyncDma import AsyncDma, BlockingDmaFromAsyncDmaAdapter, DmaDirection, Future, \ + PerTensorWaitingStrategy + + +class GAP9L3DmaFuture(Future): + + _initTemplate = NodeTemplate("pi_cl_ram_req_t ${name} = {0};") + + _deinitTemplate = NodeTemplate("") + + _allocTemplate = NodeTemplate("") + + _waitTemplate = NodeTemplate(""" + if (${name}.size != 0) { + pi_cl_ram_copy_wait(&${name}); + }""") + + +class GAP9L3Dma(AsyncDma): + + _transferTemplates = { + 2: + NodeTemplate( + "pi_cl_ram_copy_2d(get_ram_ptr(), ${ext}, ${loc}, ${transfer_size}, ${stride}, ${length}, ${ext2loc}, &${future});" + ) + } + _waitingStrategy = PerTensorWaitingStrategy(GAP9L3DmaFuture) + + def __init__(self, transferTemplates: Dict[int, NodeTemplate] = _transferTemplates) -> None: + super().__init__(transferTemplates) + + def checkTransfer(self, ctxt: NetworkContext, externalBuffer: VariableBuffer, localBuffer: VariableBuffer, + shape: Tuple[int, ...], strideExt: Tuple[int, ...], strideLoc: Tuple[int, ...], + direction: DmaDirection) -> None: + super().checkTransfer(ctxt, externalBuffer, localBuffer, shape, strideExt, strideLoc, direction) + assert strideExt[-1] == 1, \ + "GAP9 RAM API requires contiguous transfers of the innermost dimension for external memory" + assert strideLoc[0] == shape[1] and strideLoc[1] == 1, \ + f"GAP9 RAM API requires contiguous transfers for local memory. Received local shape: {shape}, stride: {strideLoc}" + + def transferOpRepr(self, externalBuffer: VariableBuffer, localBuffer: VariableBuffer, shape: Tuple[int, ...], + strideExt: Tuple[int, ...], strideLoc: Tuple[int, ...], direction: DmaDirection, + future: Future) -> OperatorRepresentation: + operatorRepresentation = super().transferOpRepr(externalBuffer, localBuffer, shape, strideExt, strideLoc, + direction, future) + operatorRepresentation.update({ + "ext2loc": 1 if direction == "ExternalToLocal" else 0, + "transfer_size": math.prod(shape), + "length": shape[1], + "stride": strideExt[0], + }) + return operatorRepresentation + + +# Blocking adapter for L3 DMA (used in GAP9 L3 tiling) +gap9L3DmaHack = BlockingDmaFromAsyncDmaAdapter(GAP9L3Dma()) diff --git a/Deeploy/Targets/GAP9/Deployer.py b/Deeploy/Targets/GAP9/Deployer.py index 49bd885e5a..529e80a694 100644 --- a/Deeploy/Targets/GAP9/Deployer.py +++ b/Deeploy/Targets/GAP9/Deployer.py @@ -15,10 +15,19 @@ import onnx_graphsurgeon as gs from Deeploy.AbstractDataTypes import Pointer -from Deeploy.DeeployTypes import DeploymentPlatform, TopologyOptimizer +from Deeploy.DeeployTypes import ConstantBuffer, DeploymentPlatform, NodeTemplate, TopologyOptimizer, VariableBuffer from Deeploy.Targets.PULPOpen.Deployer import PULPDeployer from Deeploy.Targets.GAP9.Bindings import GAP9Transformer, GAP9ClusterTransformer, GAP9SimpleTransformer +# GAP9-specific L3 RAM allocation and loading templates +_GAP9L3AllocTemplate = NodeTemplate(""" +${locPtr} = cl_ram_malloc(${size}); +""") + +_GAP9L3InitTemplate = NodeTemplate(""" +load_file_to_ram(${locPtr}, "${extName}.hex"); +""") + class GAP9Deployer(PULPDeployer): """ @@ -27,9 +36,10 @@ class GAP9Deployer(PULPDeployer): This deployer uses GAP9-specific transformers that employ ClDma (cl_dma.h) instead of the low-level MCHAN API used by PULPDeployer. - The key difference is in the DMA implementation: - - PULP: Uses MchanDma (low-level MCHAN hardware API) - - GAP9: Uses ClDma (PMSIS cl_dma.h high-level API) + The key differences from PULPDeployer: + - DMA: Uses ClDma (PMSIS cl_dma.h) instead of MchanDma (MCHAN hardware API) + - L3 RAM: Uses GAP9 APS256XXN OctaSPI RAM accessed via pi_cl_ram_* APIs + - File System: Uses ReadFS to load L3 data from flash """ def __init__(self, @@ -56,3 +66,54 @@ def __init__(self, self.Transformer = GAP9Transformer self.ClusterTransformer = GAP9ClusterTransformer self.SimpleTransformer = GAP9SimpleTransformer + + def generateBufferAllocationCode(self) -> str: + """ + Generate buffer allocation code with GAP9-specific L3 RAM support. + + For L3 buffers: + 1. Allocate space in APS256XXN OctaSPI RAM using cl_ram_malloc() + 2. Load data from ReadFS using load_file_to_ram() + 3. Assign extName to enable hex dump generation + """ + retStr = super().generateBufferAllocationCode() + + L3FileStr = "" + globalConstBuffers = [ + buf for key, buf in self.ctxt.globalObjects.items() + if isinstance(buf, VariableBuffer) and buf._deploy + ] + nonArenaBuffers = [buf for buf in globalConstBuffers if buf._users != []] + outputBuffNames = [outputBuffer.name for outputBuffer in self.graph.outputs] + + # Find all L3 constant buffers + l3ConstBuffer = [] + for buf in nonArenaBuffers: + if hasattr(buf, "_memoryLevel") and buf._memoryLevel == "L3" and buf.name not in outputBuffNames: + l3ConstBuffer.append(buf) + + # Generate allocation and loading code for each L3 buffer + for idx, buf in enumerate(l3ConstBuffer): + locPtr = str(buf._instance) + extName = str(idx) + buf.extName = extName # This enables hex dump generation + size = np.prod(buf.shape) * (buf._type.referencedType.typeWidth // 8) + + # Allocate L3 RAM space (for constant buffers only) + if isinstance(buf, ConstantBuffer): + L3FileStr += _GAP9L3AllocTemplate.generate({ + "locPtr": locPtr, + "extName": extName, + "size": size + }) + + # Load data from ReadFS + L3FileStr += _GAP9L3InitTemplate.generate({ + "locPtr": locPtr, + "extName": extName, + "size": size + }) + + retStr = retStr + L3FileStr + + return retStr diff --git a/DeeployTest/CMakeLists.txt b/DeeployTest/CMakeLists.txt index 4e7fe40fc8..0bdd94c9b3 100644 --- a/DeeployTest/CMakeLists.txt +++ b/DeeployTest/CMakeLists.txt @@ -61,8 +61,12 @@ elseif(platform STREQUAL GAP9) if (NOT HEXLIST) target_compile_options(network PUBLIC -DNOFLASH) else() - gvsoc_flags_add_files_to_hyperflash(GVSOC_HEX_HYPERFLASH_FLAGS HEXLIST) - list(APPEND GVSOC_EXTRA_FLAGS ${GVSOC_HEX_HYPERFLASH_FLAGS}) + message(STATUS "==== HEXLIST ====") + foreach(f ${HEXLIST}) + message(STATUS "HEXLIST file: ${f}") + endforeach() + gvsoc_flags_add_files_to_flash(GAPY_RUNNER_ARGS HEXLIST) + message(STATUS "GAPY_RUNNER_ARGS: ${GAPY_RUNNER_ARGS}") endif() add_subdirectory(Platforms/GAP9) diff --git a/DeeployTest/Platforms/GAP9/sdk.config b/DeeployTest/Platforms/GAP9/sdk.config index 16695a4acc..c0b2bdf2e8 100644 --- a/DeeployTest/Platforms/GAP9/sdk.config +++ b/DeeployTest/Platforms/GAP9/sdk.config @@ -11,12 +11,14 @@ CONFIG_DRIVER_CLUSTER_CONF_PROPERTY_ICACHE_CONF=0x7FF CONFIG_DRIVER_TYPE_FLASH=y CONFIG_DRIVER_TYPE_RAM=y -# CONFIG_DRIVER_MRAM=y +CONFIG_DRIVER_MRAM=y +CONFIG_READFS_FLASH_TYPE_OSPI=y + CONFIG_DRIVER_READFS=y # CONFIG_READFS_FLASH_TYPE_MRAM=y -# CONFIG_DRIVER_APS256XXN=y -# CONFIG_DRIVER_RAM_API=y +CONFIG_DRIVER_APS256XXN=y +CONFIG_DRIVER_RAM_API=y CONFIG_ENABLE_LIBMATH=y diff --git a/DeeployTest/Platforms/GAP9/src/deeploytest.c b/DeeployTest/Platforms/GAP9/src/deeploytest.c index 465e529c77..0aa1149272 100644 --- a/DeeployTest/Platforms/GAP9/src/deeploytest.c +++ b/DeeployTest/Platforms/GAP9/src/deeploytest.c @@ -132,7 +132,7 @@ int main(void) { for (uint32_t buf = 0; buf < DeeployNetwork_num_outputs; buf++) { tot_tested += DeeployNetwork_outputs_bytes[buf] / sizeof(OUTPUTTYPE); - if ((uint32_t)DeeployNetwork_outputs[buf] < 0x1000000) { + if ((uint32_t)DeeployNetwork_outputs[buf] < 0x10000000) { compbuf = pi_l2_malloc(DeeployNetwork_outputs_bytes[buf]); ram_read(compbuf, DeeployNetwork_outputs[buf], DeeployNetwork_outputs_bytes[buf]); @@ -170,7 +170,7 @@ int main(void) { } } } - if ((uint32_t)DeeployNetwork_outputs[buf] < 0x1000000) { + if ((uint32_t)DeeployNetwork_outputs[buf] < 0x10000000) { pi_l2_free(compbuf, DeeployNetwork_outputs_bytes[buf]); } } diff --git a/DeeployTest/output.txt b/DeeployTest/output.txt new file mode 100644 index 0000000000..2152566c73 --- /dev/null +++ b/DeeployTest/output.txt @@ -0,0 +1,869 @@ +-- Building for platform 'GAP9' +-- [SDK] Version: 5.20.4 +-- [Platform] GVSoC +-- [OS] FreeRTOS (Scheduler v2) +-- [Printf] Semihost +-- [Board] GAP Family : 9 +-- [Board] GAP Version : 2 +-- ============================= Project Configuration ============================ +-- [Deeploy] platform = GAP9 +-- [Deeploy] use_dma = +-- ================================================================================ +-- +-- ==== HEXLIST ==== +-- HEXLIST file: /app/Deeploy/DeeployTest/TEST_GAP9/Tests/testFloatMatmul/hex/0.hex +-- HEXLIST file: /app/Deeploy/DeeployTest/TEST_GAP9/Tests/testFloatMatmul/hex/1.hex +-- GAPY_RUNNER_ARGS: --flash-property=/app/Deeploy/DeeployTest/TEST_GAP9/Tests/testFloatMatmul/hex/0.hex@flash:readfs_flash:file;--flash-property=/app/Deeploy/DeeployTest/TEST_GAP9/Tests/testFloatMatmul/hex/1.hex@flash:readfs_flash:file +-- [Deeploy GAP9] L3 mode: using gapy with readfs +-- [Deeploy GAP9] Adding readfs files: --flash-property=/app/Deeploy/DeeployTest/TEST_GAP9/Tests/testFloatMatmul/hex/0.hex@flash:readfs_flash:file;--flash-property=/app/Deeploy/DeeployTest/TEST_GAP9/Tests/testFloatMatmul/hex/1.hex@flash:readfs_flash:file +-- [Deeploy GAP9] GAPY_CMD = /app/install/gap9-sdk/utils/gapy_v2/bin/gapy --target=gap9.evk --target-dir=/app/install/gap9-sdk/install/workstation/generators --model-dir=/app/install/gap9-sdk/install/workstation/models --platform=gvsoc --work-dir=/app/Deeploy/DeeployTest/TEST_GAP9/build/gvsoc_workdir --target-property=boot.flash_device=mram --target-property=boot.mode=flash --multi-flash-content=/app/install/gap9-sdk/utils/layouts/default_layout_multi_readfs.json --flash-property=/app/Deeploy/DeeployTest/TEST_GAP9/build/testFloatMatmul@mram:app:binary --flash-property=/app/Deeploy/DeeployTest/TEST_GAP9/Tests/testFloatMatmul/hex/0.hex@flash:readfs_flash:file --flash-property=/app/Deeploy/DeeployTest/TEST_GAP9/Tests/testFloatMatmul/hex/1.hex@flash:readfs_flash:file --flash-property=/app/install/gap9-sdk/install/target/bin/fsbl@mram:fsbl:binary --flash-property=/app/install/gap9-sdk/install/target/bin/ssbl@mram:ssbl:binary --py-stack image flash run --binary=/app/Deeploy/DeeployTest/TEST_GAP9/build/testFloatMatmul +-- [Log] none +-- [PULP-NN] pmsis target exists, extracting properties... +-- [PULP-NN] PMSIS_INCLUDES: /app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/maestro/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/i2s/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/efuse/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/fll/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/cluster/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/udma_core/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/timer/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/fc_event/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/pad/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/gpio/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/ffc/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/perf/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/watchdog/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/i2c/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/i2s/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/i3c/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/udma_datamove/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/spim/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/udma_timeout/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/udma_timestamp/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/dmacpy/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/pwm/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/rtc/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/xip/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/udma_hyperbus/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/udma_octospi/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/udma_aes/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/udma_aes_dual_core/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/udma_cpi/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/udma_csi2/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/udma_uart/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/udma_fifo/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/udma_sdio/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/quiddikey/include;/app/install/gap9-sdk/rtos/pmsis/implem/include;/app/install/gap9-sdk/rtos/pmsis/implem/rtos/include;/app/install/gap9-sdk/rtos/pmsis/bsp/boards/include;/app/install/gap9-sdk/rtos/pmsis/bsp/buffer;/app/install/gap9-sdk/rtos/pmsis/bsp/crc/crc32/include;/app/install/gap9-sdk/rtos/pmsis/bsp/crc/include;/app/install/gap9-sdk/rtos/pmsis/bsp/flash/api/include;/app/install/gap9-sdk/rtos/pmsis/bsp/flash/mram/include;/app/install/gap9-sdk/rtos/pmsis/bsp/flash/mx25u51245g/include;/app/install/gap9-sdk/rtos/pmsis/bsp/flash/include;/app/install/gap9-sdk/rtos/pmsis/bsp/powersupply/api/include;/app/install/gap9-sdk/rtos/pmsis/bsp/powersupply/powersupplygpio/include;/app/install/gap9-sdk/rtos/pmsis/bsp/powersupply/include;/app/install/gap9-sdk/rtos/pmsis/bsp/ram/api/include;/app/install/gap9-sdk/rtos/pmsis/bsp/ram/aps256xxn/include;/app/install/gap9-sdk/rtos/pmsis/bsp/ram/include;/app/install/gap9-sdk/rtos/pmsis/bsp/include;/app/Deeploy/DeeployTest/TEST_GAP9/build/devicetree/internal/include;/app/Deeploy/DeeployTest/TEST_GAP9/build/devicetree/include;/app/Deeploy/DeeployTest/TEST_GAP9/build/devicetree/fpv2/include;/app/install/gap9-sdk/rtos/pmsis/include +-- [PULP-NN] PMSIS_COMPILE_OPTIONS: -D__GAP__;-D__riscv__;-D__RISCV_ARCH_GAP__=1;-D__USE_TCDM_MALLOC__=1;-D__FC_MALLOC_NATIVE__=0;-D__L2_MALLOC_NATIVE__=0;-D__PMSIS_L2_MALLOC_NATIVE__=0;-DPMSIS_DRIVERS=1;-DFEATURE_CLUSTER;-DGAP_SDK_VERSION=5.20.4;-D__PLATFORM_GVSOC__;-D__PLATFORM__=ARCHI_PLATFORM_GVSOC;-D__FREERTOS__;-DSCHEDULER_V2;-DSCHEDULER_V3;-D__SEMIHOSTING__;-DPRINTF_SEMIHOST;-D__GAP_DRIVER_READFS__=1 +-- [PULP-NN] Added PMSIS includes to pulp-nn-mixed +-- ============================= Simulation Configuration ============================ +-- [Simulator] QuestaSim = questa-2022.3 +-- [Simulator] Verilator = verilator-4.110 +-- [Simulator] VCS = vcs-2020.12 +-- [Simulator] banshee_simulation = OFF +-- [Simulator] banshee_configuration = +-- [Simulator] gvsoc_simulation = ON +-- [Simulator] banshee_stack_size = 16777216 +-- [Simulator] num_threads = 1 +-- ================================================================================ +-- +-- Configuring done +-- Generating done +-- Build files have been written to: /app/Deeploy/DeeployTest/TEST_GAP9/build +Consolidate compiler generated dependencies of target pmsis_printf +[ 0%] Built target pmsis_printf +Consolidate compiler generated dependencies of target pulp_allocator +[ 0%] Built target pulp_allocator +Consolidate compiler generated dependencies of target freertos_libs +[ 0%] Built target freertos_libs +Consolidate compiler generated dependencies of target fll_pmu_lib +[ 1%] Built target fll_pmu_lib +Scanning dependencies of target pmsis +Consolidate compiler generated dependencies of target pmsis +[ 1%] Building C object pmsis/CMakeFiles/pmsis.dir/implem/utils/gap_io.c.obj +[ 1%] Building C object pmsis/CMakeFiles/pmsis.dir/bsp/bsp/bsp.c.obj +[ 1%] Building C object pmsis/CMakeFiles/pmsis.dir/bsp/fs/read_fs/read_fs.c.obj +[ 2%] Building C object pmsis/CMakeFiles/pmsis.dir/bsp/partition/flash_partition_v2.c.obj +[ 2%] Building C object pmsis/CMakeFiles/pmsis.dir/bsp/partition/secret_storage.c.obj +[ 2%] Building C object pmsis/CMakeFiles/pmsis.dir/__/devicetree/internal/devicetree_internal.c.obj +[ 2%] Building C object pmsis/CMakeFiles/pmsis.dir/__/devicetree/src/dt.c.obj +[ 2%] Building C object pmsis/CMakeFiles/pmsis.dir/__/devicetree/fpv2/devicetree_fpv2.c.obj +[ 2%] Linking C static library ../lib/libpmsis.a +[ 6%] Built target pmsis +Scanning dependencies of target pmsis_backend +Consolidate compiler generated dependencies of target pmsis_backend +[ 7%] Built target pmsis_backend +Scanning dependencies of target freertos +Consolidate compiler generated dependencies of target freertos +[ 9%] Built target freertos +Consolidate compiler generated dependencies of target pulp-nn-mixed +[ 9%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_i2_i2.c.obj +[ 10%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_i2_i4.c.obj +[ 10%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_i2_i8.c.obj +[ 10%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_i2_u2.c.obj +[ 10%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_i2_u4.c.obj +[ 10%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_i2_u8.c.obj +[ 10%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_i4_i2.c.obj +[ 10%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_i4_i4.c.obj +[ 10%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_i4_i8.c.obj +[ 10%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_i4_u2.c.obj +[ 11%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_i4_u4.c.obj +[ 11%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_i4_u8.c.obj +[ 11%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_i8_i2.c.obj +[ 11%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_i8_i4.c.obj +[ 11%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_i8_i8.c.obj +[ 11%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_i8_u2.c.obj +[ 11%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_i8_u4.c.obj +[ 11%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_i8_u8.c.obj +[ 11%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_u2_i2.c.obj +[ 12%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_u2_i4.c.obj +[ 12%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_u2_i8.c.obj +[ 12%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_u2_u2.c.obj +[ 12%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_u2_u4.c.obj +[ 12%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_u2_u8.c.obj +[ 12%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_u4_i2.c.obj +[ 12%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_u4_i4.c.obj +[ 12%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_u4_i8.c.obj +[ 12%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_u4_u2.c.obj +[ 13%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_u4_u4.c.obj +[ 13%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_u4_u8.c.obj +[ 13%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_u8_i2.c.obj +[ 13%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_u8_i4.c.obj +[ 13%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_u8_i8.c.obj +[ 13%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_u8_u2.c.obj +[ 13%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_u8_u4.c.obj +[ 13%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_u8_u8.c.obj +[ 13%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_i2_i2.c.obj +[ 14%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_i2_i4.c.obj +[ 14%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_i2_i8.c.obj +[ 14%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_i2_u2.c.obj +[ 14%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_i2_u4.c.obj +[ 14%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_i2_u8.c.obj +[ 14%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_i4_i2.c.obj +[ 14%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_i4_i4.c.obj +[ 14%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_i4_i8.c.obj +[ 14%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_i4_u2.c.obj +[ 15%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_i4_u4.c.obj +[ 15%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_i4_u8.c.obj +[ 15%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_i8_i2.c.obj +[ 15%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_i8_i4.c.obj +[ 15%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_i8_i8.c.obj +[ 15%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_i8_u2.c.obj +[ 15%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_i8_u4.c.obj +[ 15%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_i8_u8.c.obj +[ 15%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_u2_i2.c.obj +[ 16%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_u2_i4.c.obj +[ 16%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_u2_i8.c.obj +[ 16%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_u2_u2.c.obj +[ 16%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_u2_u4.c.obj +[ 16%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_u2_u8.c.obj +[ 16%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_u4_i2.c.obj +[ 16%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_u4_i4.c.obj +[ 16%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_u4_i8.c.obj +[ 16%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_u4_u2.c.obj +[ 17%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_u4_u4.c.obj +[ 17%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_u4_u8.c.obj +[ 17%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_u8_i2.c.obj +[ 17%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_u8_i4.c.obj +[ 17%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_u8_i8.c.obj +[ 17%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_u8_u2.c.obj +[ 17%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_u8_u4.c.obj +[ 17%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_u8_u8.c.obj +[ 17%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_i2_i2.c.obj +[ 18%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_i2_i4.c.obj +[ 18%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_i2_i8.c.obj +[ 18%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_i2_u2.c.obj +[ 18%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_i2_u4.c.obj +[ 18%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_i2_u8.c.obj +[ 18%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_i4_i2.c.obj +[ 18%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_i4_i4.c.obj +[ 18%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_i4_i8.c.obj +[ 18%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_i4_u2.c.obj +[ 19%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_i4_u4.c.obj +[ 19%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_i4_u8.c.obj +[ 19%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_i8_i2.c.obj +[ 19%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_i8_i4.c.obj +[ 19%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_i8_i8.c.obj +[ 19%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_i8_u2.c.obj +[ 19%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_i8_u4.c.obj +[ 19%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_i8_u8.c.obj +[ 19%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_u2_i2.c.obj +[ 20%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_u2_i4.c.obj +[ 20%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_u2_i8.c.obj +[ 20%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_u2_u2.c.obj +[ 20%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_u2_u4.c.obj +[ 20%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_u2_u8.c.obj +[ 20%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_u4_i2.c.obj +[ 20%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_u4_i4.c.obj +[ 20%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_u4_i8.c.obj +[ 20%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_u4_u2.c.obj +[ 21%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_u4_u4.c.obj +[ 21%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_u4_u8.c.obj +[ 21%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_u8_i2.c.obj +[ 21%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_u8_i4.c.obj +[ 21%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_u8_i8.c.obj +[ 21%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_u8_u2.c.obj +[ 21%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_u8_u4.c.obj +[ 21%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_u8_u8.c.obj +[ 21%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_i2_i2.c.obj +[ 22%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_i2_i4.c.obj +[ 22%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_i2_i8.c.obj +[ 22%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_i2_u2.c.obj +[ 22%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_i2_u4.c.obj +[ 22%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_i2_u8.c.obj +[ 22%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_i4_i2.c.obj +[ 22%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_i4_i4.c.obj +[ 22%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_i4_i8.c.obj +[ 22%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_i4_u2.c.obj +[ 23%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_i4_u4.c.obj +[ 23%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_i4_u8.c.obj +[ 23%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_i8_i2.c.obj +[ 23%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_i8_i4.c.obj +[ 23%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_i8_i8.c.obj +[ 23%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_i8_u2.c.obj +[ 23%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_i8_u4.c.obj +[ 23%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_i8_u8.c.obj +[ 23%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_u2.c.obj +[ 24%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_u2_i2.c.obj +[ 24%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_u2_i4.c.obj +[ 24%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_u2_i8.c.obj +[ 24%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_u2_u2.c.obj +[ 24%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_u2_u4.c.obj +[ 24%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_u2_u8.c.obj +[ 24%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_u4_i2.c.obj +[ 24%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_u4_i4.c.obj +[ 24%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_u4_i8.c.obj +[ 25%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_u4_u2.c.obj +[ 25%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_u4_u4.c.obj +[ 25%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_u4_u8.c.obj +[ 25%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_u8_i2.c.obj +[ 25%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_u8_i4.c.obj +[ 25%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_u8_i8.c.obj +[ 25%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_u8_u2.c.obj +[ 25%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_u8_u4.c.obj +[ 25%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_u8_u8.c.obj +[ 26%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_i2_i2.c.obj +[ 26%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_i2_i4.c.obj +[ 26%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_i2_i8.c.obj +[ 26%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_i2_u2.c.obj +[ 26%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_i2_u4.c.obj +[ 26%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_i2_u8.c.obj +[ 26%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_i4_i2.c.obj +[ 26%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_i4_i4.c.obj +[ 26%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_i4_i8.c.obj +[ 27%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_i4_u2.c.obj +[ 27%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_i4_u4.c.obj +[ 27%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_i4_u8.c.obj +[ 27%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_i8_i2.c.obj +[ 27%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_i8_i4.c.obj +[ 27%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_i8_i8.c.obj +[ 27%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_i8_u2.c.obj +[ 27%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_i8_u4.c.obj +[ 27%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_i8_u8.c.obj +[ 28%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_u2.c.obj +[ 28%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_u2_i2.c.obj +[ 28%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_u2_i4.c.obj +[ 28%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_u2_i8.c.obj +[ 28%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_u2_u2.c.obj +[ 28%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_u2_u4.c.obj +[ 28%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_u2_u8.c.obj +[ 28%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_u4.c.obj +[ 28%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_u4_i2.c.obj +[ 29%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_u4_i4.c.obj +[ 29%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_u4_i8.c.obj +[ 29%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_u4_u2.c.obj +[ 29%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_u4_u4.c.obj +[ 29%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_u4_u8.c.obj +[ 29%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_u8_i2.c.obj +[ 29%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_u8_i4.c.obj +[ 29%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_u8_i8.c.obj +[ 29%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_u8_u2.c.obj +[ 30%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_u8_u4.c.obj +[ 30%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_u8_u8.c.obj +[ 30%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_i2_i2.c.obj +[ 30%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_i2_i4.c.obj +[ 30%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_i2_i8.c.obj +[ 30%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_i2_u2.c.obj +[ 30%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_i2_u4.c.obj +[ 30%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_i2_u8.c.obj +[ 30%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_i4_i2.c.obj +[ 31%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_i4_i4.c.obj +[ 31%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_i4_i8.c.obj +[ 31%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_i4_u2.c.obj +[ 31%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_i4_u4.c.obj +[ 31%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_i4_u8.c.obj +[ 31%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_i8_i2.c.obj +[ 31%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_i8_i4.c.obj +[ 31%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_i8_i8.c.obj +[ 31%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_i8_u2.c.obj +[ 32%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_i8_u4.c.obj +[ 32%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_i8_u8.c.obj +[ 32%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_u2.c.obj +[ 32%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_u2_i2.c.obj +[ 32%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_u2_i4.c.obj +[ 32%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_u2_i8.c.obj +[ 32%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_u2_u2.c.obj +[ 32%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_u2_u4.c.obj +[ 32%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_u2_u8.c.obj +[ 33%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_u4.c.obj +[ 33%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_u4_i2.c.obj +[ 33%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_u4_i4.c.obj +[ 33%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_u4_i8.c.obj +[ 33%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_u4_u2.c.obj +[ 33%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_u4_u4.c.obj +[ 33%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_u4_u8.c.obj +[ 33%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_u8.c.obj +[ 33%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_u8_i2.c.obj +[ 34%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_u8_i4.c.obj +[ 34%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_u8_i8.c.obj +[ 34%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_u8_u2.c.obj +[ 34%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_u8_u4.c.obj +[ 34%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_u8_u8.c.obj +[ 34%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i2_i2_i2.c.obj +[ 34%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i2_i2_i4.c.obj +[ 34%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i2_i2_i8.c.obj +[ 34%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i2_i4_i2.c.obj +[ 35%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i2_i4_i4.c.obj +[ 35%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i2_i4_i8.c.obj +[ 35%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i2_i8_i2.c.obj +[ 35%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i2_i8_i4.c.obj +[ 35%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i2_i8_i8.c.obj +[ 35%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i2_u2_i2.c.obj +[ 35%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i2_u2_i4.c.obj +[ 35%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i2_u2_i8.c.obj +[ 35%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i2_u4_i2.c.obj +[ 36%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i2_u4_i4.c.obj +[ 36%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i2_u4_i8.c.obj +[ 36%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i2_u8_i2.c.obj +[ 36%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i2_u8_i4.c.obj +[ 36%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i2_u8_i8.c.obj +[ 36%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i4_i2_i2.c.obj +[ 36%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i4_i2_i4.c.obj +[ 36%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i4_i2_i8.c.obj +[ 36%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i4_i4_i2.c.obj +[ 37%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i4_i4_i4.c.obj +[ 37%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i4_i4_i8.c.obj +[ 37%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i4_i8_i2.c.obj +[ 37%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i4_i8_i4.c.obj +[ 37%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i4_i8_i8.c.obj +[ 37%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i4_u2_i2.c.obj +[ 37%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i4_u2_i4.c.obj +[ 37%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i4_u2_i8.c.obj +[ 37%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i4_u4_i2.c.obj +[ 38%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i4_u4_i4.c.obj +[ 38%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i4_u4_i8.c.obj +[ 38%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i4_u8_i2.c.obj +[ 38%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i4_u8_i4.c.obj +[ 38%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i4_u8_i8.c.obj +[ 38%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i8_i2_i2.c.obj +[ 38%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i8_i2_i4.c.obj +[ 38%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i8_i2_i8.c.obj +[ 38%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i8_i4_i2.c.obj +[ 39%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i8_i4_i4.c.obj +[ 39%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i8_i4_i8.c.obj +[ 39%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i8_i8_i2.c.obj +[ 39%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i8_i8_i4.c.obj +[ 39%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i8_i8_i8.c.obj +[ 39%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i8_u2_i2.c.obj +[ 39%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i8_u2_i4.c.obj +[ 39%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i8_u2_i8.c.obj +[ 39%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i8_u4_i2.c.obj +[ 40%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i8_u4_i4.c.obj +[ 40%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i8_u4_i8.c.obj +[ 40%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i8_u8_i2.c.obj +[ 40%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i8_u8_i4.c.obj +[ 40%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i8_u8_i8.c.obj +[ 40%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u2_i2_i2.c.obj +[ 40%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u2_i2_i4.c.obj +[ 40%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u2_i2_i8.c.obj +[ 40%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u2_i4_i2.c.obj +[ 41%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u2_i4_i4.c.obj +[ 41%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u2_i4_i8.c.obj +[ 41%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u2_i8_i2.c.obj +[ 41%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u2_i8_i4.c.obj +[ 41%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u2_i8_i8.c.obj +[ 41%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u2_u2_i2.c.obj +[ 41%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u2_u2_i4.c.obj +[ 41%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u2_u2_i8.c.obj +[ 41%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u2_u4_i2.c.obj +[ 42%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u2_u4_i4.c.obj +[ 42%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u2_u4_i8.c.obj +[ 42%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u2_u8_i2.c.obj +[ 42%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u2_u8_i4.c.obj +[ 42%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u2_u8_i8.c.obj +[ 42%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u4_i2_i2.c.obj +[ 42%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u4_i2_i4.c.obj +[ 42%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u4_i2_i8.c.obj +[ 42%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u4_i4_i2.c.obj +[ 43%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u4_i4_i4.c.obj +[ 43%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u4_i4_i8.c.obj +[ 43%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u4_i8_i2.c.obj +[ 43%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u4_i8_i4.c.obj +[ 43%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u4_i8_i8.c.obj +[ 43%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u4_u2_i2.c.obj +[ 43%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u4_u2_i4.c.obj +[ 43%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u4_u2_i8.c.obj +[ 43%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u4_u4_i2.c.obj +[ 44%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u4_u4_i4.c.obj +[ 44%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u4_u4_i8.c.obj +[ 44%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u4_u8_i2.c.obj +[ 44%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u4_u8_i4.c.obj +[ 44%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u4_u8_i8.c.obj +[ 44%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u8_i2_i2.c.obj +[ 44%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u8_i2_i4.c.obj +[ 44%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u8_i2_i8.c.obj +[ 44%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u8_i4_i2.c.obj +[ 44%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u8_i4_i4.c.obj +[ 45%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u8_i4_i8.c.obj +[ 45%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u8_i8_i2.c.obj +[ 45%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u8_i8_i4.c.obj +[ 45%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u8_i8_i8.c.obj +[ 45%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u8_u2_i2.c.obj +[ 45%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u8_u2_i4.c.obj +[ 45%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u8_u2_i8.c.obj +[ 45%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u8_u4_i2.c.obj +[ 45%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u8_u4_i4.c.obj +[ 46%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u8_u4_i8.c.obj +[ 46%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u8_u8_i2.c.obj +[ 46%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u8_u8_i4.c.obj +[ 46%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u8_u8_i8.c.obj +[ 46%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i2_i2_i2.c.obj +[ 46%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i2_i2_i4.c.obj +[ 46%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i2_i2_i8.c.obj +[ 46%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i2_i4_i2.c.obj +[ 46%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i2_i4_i4.c.obj +[ 47%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i2_i4_i8.c.obj +[ 47%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i2_i8_i2.c.obj +[ 47%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i2_i8_i4.c.obj +[ 47%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i2_i8_i8.c.obj +[ 47%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i2_u2_i2.c.obj +[ 47%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i2_u2_i4.c.obj +[ 47%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i2_u2_i8.c.obj +[ 47%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i2_u4_i2.c.obj +[ 47%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i2_u4_i4.c.obj +[ 48%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i2_u4_i8.c.obj +[ 48%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i2_u8_i2.c.obj +[ 48%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i2_u8_i4.c.obj +[ 48%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i2_u8_i8.c.obj +[ 48%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i4_i2_i2.c.obj +[ 48%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i4_i2_i4.c.obj +[ 48%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i4_i2_i8.c.obj +[ 48%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i4_i4_i2.c.obj +[ 48%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i4_i4_i4.c.obj +[ 50%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i4_i4_i8.c.obj +[ 50%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i4_i8_i2.c.obj +[ 50%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i4_i8_i4.c.obj +[ 50%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i4_i8_i8.c.obj +[ 50%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i4_u2_i2.c.obj +[ 50%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i4_u2_i4.c.obj +[ 50%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i4_u2_i8.c.obj +[ 50%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i4_u4_i2.c.obj +[ 50%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i4_u4_i4.c.obj +[ 51%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i4_u4_i8.c.obj +[ 51%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i4_u8_i2.c.obj +[ 51%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i4_u8_i4.c.obj +[ 51%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i4_u8_i8.c.obj +[ 51%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i8_i2_i2.c.obj +[ 51%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i8_i2_i4.c.obj +[ 51%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i8_i2_i8.c.obj +[ 51%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i8_i4_i2.c.obj +[ 51%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i8_i4_i4.c.obj +[ 52%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i8_i4_i8.c.obj +[ 52%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i8_i8_i2.c.obj +[ 52%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i8_i8_i4.c.obj +[ 52%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i8_i8_i8.c.obj +[ 52%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i8_u2_i2.c.obj +[ 52%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i8_u2_i4.c.obj +[ 52%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i8_u2_i8.c.obj +[ 52%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i8_u4_i2.c.obj +[ 52%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i8_u4_i4.c.obj +[ 53%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i8_u4_i8.c.obj +[ 53%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i8_u8_i2.c.obj +[ 53%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i8_u8_i4.c.obj +[ 53%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i8_u8_i8.c.obj +[ 53%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u2_i2_i2.c.obj +[ 53%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u2_i2_i4.c.obj +[ 53%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u2_i2_i8.c.obj +[ 53%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u2_i4_i2.c.obj +[ 53%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u2_i4_i4.c.obj +[ 54%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u2_i4_i8.c.obj +[ 54%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u2_i8_i2.c.obj +[ 54%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u2_i8_i4.c.obj +[ 54%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u2_i8_i8.c.obj +[ 54%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u2_u2_i2.c.obj +[ 54%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u2_u2_i4.c.obj +[ 54%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u2_u2_i8.c.obj +[ 54%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u2_u4_i2.c.obj +[ 54%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u2_u4_i4.c.obj +[ 55%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u2_u4_i8.c.obj +[ 55%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u2_u8_i2.c.obj +[ 55%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u2_u8_i4.c.obj +[ 55%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u2_u8_i8.c.obj +[ 55%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u4_i2_i2.c.obj +[ 55%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u4_i2_i4.c.obj +[ 55%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u4_i2_i8.c.obj +[ 55%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u4_i4_i2.c.obj +[ 55%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u4_i4_i4.c.obj +[ 56%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u4_i4_i8.c.obj +[ 56%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u4_i8_i2.c.obj +[ 56%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u4_i8_i4.c.obj +[ 56%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u4_i8_i8.c.obj +[ 56%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u4_u2_i2.c.obj +[ 56%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u4_u2_i4.c.obj +[ 56%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u4_u2_i8.c.obj +[ 56%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u4_u4_i2.c.obj +[ 56%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u4_u4_i4.c.obj +[ 57%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u4_u4_i8.c.obj +[ 57%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u4_u8_i2.c.obj +[ 57%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u4_u8_i4.c.obj +[ 57%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u4_u8_i8.c.obj +[ 57%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u8_i2_i2.c.obj +[ 57%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u8_i2_i4.c.obj +[ 57%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u8_i2_i8.c.obj +[ 57%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u8_i4_i2.c.obj +[ 57%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u8_i4_i4.c.obj +[ 58%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u8_i4_i8.c.obj +[ 58%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u8_i8_i2.c.obj +[ 58%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u8_i8_i4.c.obj +[ 58%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u8_i8_i8.c.obj +[ 58%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u8_u2_i2.c.obj +[ 58%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u8_u2_i4.c.obj +[ 58%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u8_u2_i8.c.obj +[ 58%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u8_u4_i2.c.obj +[ 58%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u8_u4_i4.c.obj +[ 59%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u8_u4_i8.c.obj +[ 59%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u8_u8_i2.c.obj +[ 59%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u8_u8_i4.c.obj +[ 59%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u8_u8_i8.c.obj +[ 59%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearNoQuant/pulp_nn_linear_i2_i32_i2.c.obj +[ 59%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearNoQuant/pulp_nn_linear_i2_i32_i4.c.obj +[ 59%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearNoQuant/pulp_nn_linear_i2_i32_i8.c.obj +[ 59%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearNoQuant/pulp_nn_linear_i4_i32_i2.c.obj +[ 59%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearNoQuant/pulp_nn_linear_i4_i32_i4.c.obj +[ 60%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearNoQuant/pulp_nn_linear_i4_i32_i8.c.obj +[ 60%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearNoQuant/pulp_nn_linear_i8_i32_i2.c.obj +[ 60%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearNoQuant/pulp_nn_linear_i8_i32_i4.c.obj +[ 60%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearNoQuant/pulp_nn_linear_i8_i32_i8.c.obj +[ 60%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearNoQuant/pulp_nn_linear_u2_i32_i2.c.obj +[ 60%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearNoQuant/pulp_nn_linear_u2_i32_i4.c.obj +[ 60%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearNoQuant/pulp_nn_linear_u2_i32_i8.c.obj +[ 60%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearNoQuant/pulp_nn_linear_u4_i32_i2.c.obj +[ 60%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearNoQuant/pulp_nn_linear_u4_i32_i4.c.obj +[ 61%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearNoQuant/pulp_nn_linear_u4_i32_i8.c.obj +[ 61%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearNoQuant/pulp_nn_linear_u8_i32_i2.c.obj +[ 61%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearNoQuant/pulp_nn_linear_u8_i32_i4.c.obj +[ 61%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearNoQuant/pulp_nn_linear_u8_i32_i8.c.obj +[ 61%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i2_i2_i2.c.obj +[ 61%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i2_i2_i4.c.obj +[ 61%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i2_i2_i8.c.obj +[ 61%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i2_i4_i2.c.obj +[ 61%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i2_i4_i4.c.obj +[ 62%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i2_i4_i8.c.obj +[ 62%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i2_i8_i2.c.obj +[ 62%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i2_i8_i4.c.obj +[ 62%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i2_i8_i8.c.obj +[ 62%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i2_u2_i2.c.obj +[ 62%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i2_u2_i4.c.obj +[ 62%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i2_u2_i8.c.obj +[ 62%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i2_u4_i2.c.obj +[ 62%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i2_u4_i4.c.obj +[ 63%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i2_u4_i8.c.obj +[ 63%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i2_u8_i2.c.obj +[ 63%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i2_u8_i4.c.obj +[ 63%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i2_u8_i8.c.obj +[ 63%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i4_i2_i2.c.obj +[ 63%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i4_i2_i4.c.obj +[ 63%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i4_i2_i8.c.obj +[ 63%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i4_i4_i2.c.obj +[ 63%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i4_i4_i4.c.obj +[ 64%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i4_i4_i8.c.obj +[ 64%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i4_i8_i2.c.obj +[ 64%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i4_i8_i4.c.obj +[ 64%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i4_i8_i8.c.obj +[ 64%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i4_u2_i2.c.obj +[ 64%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i4_u2_i4.c.obj +[ 64%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i4_u2_i8.c.obj +[ 64%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i4_u4_i2.c.obj +[ 64%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i4_u4_i4.c.obj +[ 65%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i4_u4_i8.c.obj +[ 65%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i4_u8_i2.c.obj +[ 65%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i4_u8_i4.c.obj +[ 65%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i4_u8_i8.c.obj +[ 65%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i8_i2_i2.c.obj +[ 65%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i8_i2_i4.c.obj +[ 65%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i8_i2_i8.c.obj +[ 65%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i8_i4_i2.c.obj +[ 65%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i8_i4_i4.c.obj +[ 66%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i8_i4_i8.c.obj +[ 66%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i8_i8_i2.c.obj +[ 66%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i8_i8_i4.c.obj +[ 66%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i8_i8_i8.c.obj +[ 66%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i8_u2_i2.c.obj +[ 66%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i8_u2_i4.c.obj +[ 66%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i8_u2_i8.c.obj +[ 66%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i8_u4_i2.c.obj +[ 66%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i8_u4_i4.c.obj +[ 67%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i8_u4_i8.c.obj +[ 67%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i8_u8_i2.c.obj +[ 67%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i8_u8_i4.c.obj +[ 67%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i8_u8_i8.c.obj +[ 67%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u2_i2_i2.c.obj +[ 67%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u2_i2_i4.c.obj +[ 67%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u2_i2_i8.c.obj +[ 67%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u2_i4_i2.c.obj +[ 67%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u2_i4_i4.c.obj +[ 68%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u2_i4_i8.c.obj +[ 68%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u2_i8_i2.c.obj +[ 68%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u2_i8_i4.c.obj +[ 68%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u2_i8_i8.c.obj +[ 68%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u2_u2_i2.c.obj +[ 68%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u2_u2_i4.c.obj +[ 68%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u2_u2_i8.c.obj +[ 68%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u2_u4_i2.c.obj +[ 68%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u2_u4_i4.c.obj +[ 69%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u2_u4_i8.c.obj +[ 69%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u2_u8_i2.c.obj +[ 69%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u2_u8_i4.c.obj +[ 69%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u2_u8_i8.c.obj +[ 69%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u4_i2_i2.c.obj +[ 69%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u4_i2_i4.c.obj +[ 69%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u4_i2_i8.c.obj +[ 69%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u4_i4_i2.c.obj +[ 69%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u4_i4_i4.c.obj +[ 70%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u4_i4_i8.c.obj +[ 70%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u4_i8_i2.c.obj +[ 70%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u4_i8_i4.c.obj +[ 70%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u4_i8_i8.c.obj +[ 70%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u4_u2_i2.c.obj +[ 70%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u4_u2_i4.c.obj +[ 70%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u4_u2_i8.c.obj +[ 70%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u4_u4_i2.c.obj +[ 70%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u4_u4_i4.c.obj +[ 71%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u4_u4_i8.c.obj +[ 71%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u4_u8_i2.c.obj +[ 71%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u4_u8_i4.c.obj +[ 71%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u4_u8_i8.c.obj +[ 71%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u8_i2_i2.c.obj +[ 71%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u8_i2_i4.c.obj +[ 71%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u8_i2_i8.c.obj +[ 71%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u8_i4_i2.c.obj +[ 71%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u8_i4_i4.c.obj +[ 72%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u8_i4_i8.c.obj +[ 72%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u8_i8_i2.c.obj +[ 72%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u8_i8_i4.c.obj +[ 72%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u8_i8_i8.c.obj +[ 72%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u8_u2_i2.c.obj +[ 72%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u8_u2_i4.c.obj +[ 72%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u8_u2_i8.c.obj +[ 72%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u8_u4_i2.c.obj +[ 72%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u8_u4_i4.c.obj +[ 73%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u8_u4_i8.c.obj +[ 73%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u8_u8_i2.c.obj +[ 73%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u8_u8_i4.c.obj +[ 73%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u8_u8_i8.c.obj +[ 73%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_i8_i2_i2.c.obj +[ 73%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_i8_i2_i4.c.obj +[ 73%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_i8_i2_i8.c.obj +[ 73%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_i8_i4_i2.c.obj +[ 73%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_i8_i4_i4.c.obj +[ 74%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_i8_i4_i8.c.obj +[ 74%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_i8_i8_i2.c.obj +[ 74%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_i8_i8_i4.c.obj +[ 74%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_i8_i8_i8.c.obj +[ 74%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_i8_u2_i2.c.obj +[ 74%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_i8_u2_i4.c.obj +[ 74%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_i8_u2_i8.c.obj +[ 74%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_i8_u4_i2.c.obj +[ 74%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_i8_u4_i4.c.obj +[ 75%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_i8_u4_i8.c.obj +[ 75%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_i8_u8_i2.c.obj +[ 75%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_i8_u8_i4.c.obj +[ 75%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_i8_u8_i8.c.obj +[ 75%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_u8_i2_i2.c.obj +[ 75%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_u8_i2_i4.c.obj +[ 75%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_u8_i2_i8.c.obj +[ 75%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_u8_i4_i2.c.obj +[ 75%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_u8_i4_i4.c.obj +[ 76%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_u8_i4_i8.c.obj +[ 76%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_u8_i8_i2.c.obj +[ 76%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_u8_i8_i4.c.obj +[ 76%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_u8_i8_i8.c.obj +[ 76%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_u8_u2_i2.c.obj +[ 76%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_u8_u2_i4.c.obj +[ 76%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_u8_u2_i8.c.obj +[ 76%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_u8_u4_i2.c.obj +[ 76%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_u8_u4_i4.c.obj +[ 77%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_u8_u4_i8.c.obj +[ 77%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_u8_u8_i2.c.obj +[ 77%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_u8_u8_i4.c.obj +[ 77%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_u8_u8_i8.c.obj +[ 77%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i2_i2_i2.c.obj +[ 77%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i2_i2_i4.c.obj +[ 77%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i2_i2_i8.c.obj +[ 77%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i2_i4_i2.c.obj +[ 77%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i2_i4_i4.c.obj +[ 78%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i2_i4_i8.c.obj +[ 78%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i2_i8_i2.c.obj +[ 78%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i2_i8_i4.c.obj +[ 78%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i2_i8_i8.c.obj +[ 78%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i2_u2_i2.c.obj +[ 78%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i2_u2_i4.c.obj +[ 78%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i2_u2_i8.c.obj +[ 78%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i2_u4_i2.c.obj +[ 78%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i2_u4_i4.c.obj +[ 79%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i2_u4_i8.c.obj +[ 79%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i2_u8_i2.c.obj +[ 79%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i2_u8_i4.c.obj +[ 79%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i2_u8_i8.c.obj +[ 79%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i4_i2_i2.c.obj +[ 79%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i4_i2_i4.c.obj +[ 79%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i4_i2_i8.c.obj +[ 79%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i4_i4_i2.c.obj +[ 79%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i4_i4_i4.c.obj +[ 80%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i4_i4_i8.c.obj +[ 80%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i4_i8_i2.c.obj +[ 80%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i4_i8_i4.c.obj +[ 80%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i4_i8_i8.c.obj +[ 80%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i4_u2_i2.c.obj +[ 80%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i4_u2_i4.c.obj +[ 80%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i4_u2_i8.c.obj +[ 80%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i4_u4_i2.c.obj +[ 80%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i4_u4_i4.c.obj +[ 81%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i4_u4_i8.c.obj +[ 81%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i4_u8_i2.c.obj +[ 81%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i4_u8_i4.c.obj +[ 81%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i4_u8_i8.c.obj +[ 81%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i8_i2_i2.c.obj +[ 81%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i8_i2_i4.c.obj +[ 81%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i8_i2_i8.c.obj +[ 81%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i8_i4_i2.c.obj +[ 81%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i8_i4_i4.c.obj +[ 82%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i8_i4_i8.c.obj +[ 82%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i8_i8_i2.c.obj +[ 82%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i8_i8_i4.c.obj +[ 82%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i8_i8_i8.c.obj +[ 82%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i8_u2_i2.c.obj +[ 82%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i8_u2_i4.c.obj +[ 82%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i8_u2_i8.c.obj +[ 82%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i8_u4_i2.c.obj +[ 82%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i8_u4_i4.c.obj +[ 83%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i8_u4_i8.c.obj +[ 83%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i8_u8_i2.c.obj +[ 83%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i8_u8_i4.c.obj +[ 83%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i8_u8_i8.c.obj +[ 83%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u2_i2_i2.c.obj +[ 83%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u2_i2_i4.c.obj +[ 83%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u2_i2_i8.c.obj +[ 83%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u2_i4_i2.c.obj +[ 83%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u2_i4_i4.c.obj +[ 84%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u2_i4_i8.c.obj +[ 84%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u2_i8_i2.c.obj +[ 84%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u2_i8_i4.c.obj +[ 84%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u2_i8_i8.c.obj +[ 84%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u2_u2_i2.c.obj +[ 84%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u2_u2_i4.c.obj +[ 84%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u2_u2_i8.c.obj +[ 84%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u2_u4_i2.c.obj +[ 84%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u2_u4_i4.c.obj +[ 85%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u2_u4_i8.c.obj +[ 85%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u2_u8_i2.c.obj +[ 85%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u2_u8_i4.c.obj +[ 85%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u2_u8_i8.c.obj +[ 85%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u4_i2_i2.c.obj +[ 85%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u4_i2_i4.c.obj +[ 85%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u4_i2_i8.c.obj +[ 85%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u4_i4_i2.c.obj +[ 85%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u4_i4_i4.c.obj +[ 86%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u4_i4_i8.c.obj +[ 86%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u4_i8_i2.c.obj +[ 86%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u4_i8_i4.c.obj +[ 86%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u4_i8_i8.c.obj +[ 86%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u4_u2_i2.c.obj +[ 86%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u4_u2_i4.c.obj +[ 86%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u4_u2_i8.c.obj +[ 86%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u4_u4_i2.c.obj +[ 86%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u4_u4_i4.c.obj +[ 87%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u4_u4_i8.c.obj +[ 87%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u4_u8_i2.c.obj +[ 87%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u4_u8_i4.c.obj +[ 87%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u4_u8_i8.c.obj +[ 87%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u8_i2_i2.c.obj +[ 87%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u8_i2_i4.c.obj +[ 87%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u8_i2_i8.c.obj +[ 87%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u8_i4_i2.c.obj +[ 87%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u8_i4_i4.c.obj +[ 88%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u8_i4_i8.c.obj +[ 88%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u8_i8_i2.c.obj +[ 88%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u8_i8_i4.c.obj +[ 88%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u8_i8_i8.c.obj +[ 88%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u8_u2_i2.c.obj +[ 88%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u8_u2_i4.c.obj +[ 88%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u8_u2_i8.c.obj +[ 88%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u8_u4_i2.c.obj +[ 88%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u8_u4_i4.c.obj +[ 89%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u8_u4_i8.c.obj +[ 89%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u8_u8_i2.c.obj +[ 89%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u8_u8_i4.c.obj +[ 89%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u8_u8_i8.c.obj +[ 89%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_i2_i2.c.obj +[ 89%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_i2_i4.c.obj +[ 89%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_i2_i8.c.obj +[ 89%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_i2_u2.c.obj +[ 89%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_i2_u4.c.obj +[ 90%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_i2_u8.c.obj +[ 90%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_i4_i2.c.obj +[ 90%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_i4_i4.c.obj +[ 90%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_i4_i8.c.obj +[ 90%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_i4_u2.c.obj +[ 90%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_i4_u4.c.obj +[ 90%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_i4_u8.c.obj +[ 90%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_i8_i2.c.obj +[ 90%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_i8_i4.c.obj +[ 91%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_i8_i8.c.obj +[ 91%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_i8_u2.c.obj +[ 91%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_i8_u4.c.obj +[ 91%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_i8_u8.c.obj +[ 91%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_u2_i2.c.obj +[ 91%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_u2_i4.c.obj +[ 91%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_u2_i8.c.obj +[ 91%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_u2_u2.c.obj +[ 91%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_u2_u4.c.obj +[ 92%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_u2_u8.c.obj +[ 92%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_u4_i2.c.obj +[ 92%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_u4_i4.c.obj +[ 92%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_u4_i8.c.obj +[ 92%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_u4_u2.c.obj +[ 92%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_u4_u4.c.obj +[ 92%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_u4_u8.c.obj +[ 92%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_u8_i2.c.obj +[ 92%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_u8_i4.c.obj +[ 93%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_u8_i8.c.obj +[ 93%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_u8_u2.c.obj +[ 93%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_u8_u4.c.obj +[ 93%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_u8_u8.c.obj +[ 93%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/MaxPool/pulp_nn_maxpool_i2.c.obj +[ 93%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/MaxPool/pulp_nn_maxpool_i4.c.obj +[ 93%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/MaxPool/pulp_nn_maxpool_i8.c.obj +[ 93%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/MaxPool/pulp_nn_maxpool_u2.c.obj +[ 93%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/MaxPool/pulp_nn_maxpool_u4.c.obj +[ 94%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/MaxPool/pulp_nn_maxpool_u8.c.obj +[ 94%] Linking C static library ../../../../lib/libpulp-nn-mixed.a +[ 94%] Built target pulp-nn-mixed +Consolidate compiler generated dependencies of target deeploybasic +[ 97%] Built target deeploybasic +Consolidate compiler generated dependencies of target deeploygap9 +[ 97%] Building C object TargetLibraries/GAP9/CMakeFiles/deeploygap9.dir/src/Util.c.obj +[ 97%] Building C object TargetLibraries/GAP9/CMakeFiles/deeploygap9.dir/src/dory_dma.c.obj +[ 97%] Building C object TargetLibraries/GAP9/CMakeFiles/deeploygap9.dir/src/dory_mem.c.obj +[ 97%] Building C object TargetLibraries/GAP9/CMakeFiles/deeploygap9.dir/__/PULPOpen/src/Convolution_fp32.c.obj +[ 97%] Building C object TargetLibraries/GAP9/CMakeFiles/deeploygap9.dir/__/PULPOpen/src/DWConvolution_fp32.c.obj +[ 98%] Building C object TargetLibraries/GAP9/CMakeFiles/deeploygap9.dir/__/PULPOpen/src/GELU.c.obj +[ 98%] Building C object TargetLibraries/GAP9/CMakeFiles/deeploygap9.dir/__/PULPOpen/src/Gemm.c.obj +[ 98%] Building C object TargetLibraries/GAP9/CMakeFiles/deeploygap9.dir/__/PULPOpen/src/Layernorm.c.obj +[ 98%] Building C object TargetLibraries/GAP9/CMakeFiles/deeploygap9.dir/__/PULPOpen/src/Matmul.c.obj +[ 98%] Building C object TargetLibraries/GAP9/CMakeFiles/deeploygap9.dir/__/PULPOpen/src/MaxPool.c.obj +[ 98%] Building C object TargetLibraries/GAP9/CMakeFiles/deeploygap9.dir/__/PULPOpen/src/RQiHardswish.c.obj +[ 98%] Building C object TargetLibraries/GAP9/CMakeFiles/deeploygap9.dir/__/PULPOpen/src/Relu.c.obj +[ 98%] Building C object TargetLibraries/GAP9/CMakeFiles/deeploygap9.dir/__/PULPOpen/src/RequantShift.c.obj +[ 98%] Building C object TargetLibraries/GAP9/CMakeFiles/deeploygap9.dir/__/PULPOpen/src/Softmax.c.obj +[100%] Building C object TargetLibraries/GAP9/CMakeFiles/deeploygap9.dir/__/PULPOpen/src/UniformRequantShift.c.obj +[100%] Building C object TargetLibraries/GAP9/CMakeFiles/deeploygap9.dir/__/PULPOpen/src/Util.c.obj +[100%] Building C object TargetLibraries/GAP9/CMakeFiles/deeploygap9.dir/__/PULPOpen/src/gemv.c.obj +[100%] Building C object TargetLibraries/GAP9/CMakeFiles/deeploygap9.dir/__/PULPOpen/src/iRMSnorm.c.obj +[100%] Linking C static library ../../lib/libdeeploygap9.a +[100%] Built target deeploygap9 +Consolidate compiler generated dependencies of target network +[100%] Building C object DeeployTest/CMakeFiles/network.dir/TEST_GAP9/Tests/testFloatMatmul/Network.c.obj +[100%] Built target network +Consolidate compiler generated dependencies of target testFloatMatmul +[100%] Building C object DeeployTest/Platforms/GAP9/CMakeFiles/testFloatMatmul.dir/src/CycleCounter.c.obj +[100%] Building C object DeeployTest/Platforms/GAP9/CMakeFiles/testFloatMatmul.dir/src/deeploytest.c.obj +[100%] Linking C executable ../../../testFloatMatmul +[100%] Built target testFloatMatmul +[ 0%] Built target pmsis_printf +[ 0%] Built target pulp_allocator +[ 0%] Built target freertos_libs +[ 1%] Built target fll_pmu_lib +Consolidate compiler generated dependencies of target pmsis +[ 6%] Built target pmsis +[ 7%] Built target pmsis_backend +[ 9%] Built target freertos +Consolidate compiler generated dependencies of target pulp-nn-mixed +[ 94%] Built target pulp-nn-mixed +[ 97%] Built target deeploybasic +Consolidate compiler generated dependencies of target deeploygap9 +[100%] Built target deeploygap9 +Consolidate compiler generated dependencies of target network +[100%] Built target network +Consolidate compiler generated dependencies of target testFloatMatmul +[100%] Built target testFloatMatmul +[100%] Built target image +Generation Directory: /app/Deeploy/DeeployTest/TEST_GAP9/Tests/testFloatMatmul +Test Directory : Tests/testFloatMatmul +Test Name : testFloatMatmul diff --git a/cmake/gap9/gap9_gvsoc.cmake b/cmake/gap9/gap9_gvsoc.cmake new file mode 100644 index 0000000000..1c62aab5bd --- /dev/null +++ b/cmake/gap9/gap9_gvsoc.cmake @@ -0,0 +1,120 @@ +# SPDX-FileCopyrightText: 2025 ETH Zurich and University of Bologna +# +# SPDX-License-Identifier: Apache-2.0 + +# Mark that GAP9-specific gvsoc emulation is defined +set(GAP9_GVSOC_DEFINED TRUE) + +macro(add_gvsoc_emulation name target) + if(NOT DEFINED GVSOC_INSTALL_DIR) + message(FATAL_ERROR "Environment variable GVSOC_INSTALL_DIR not set") + endif() + + set(GVSOC_WORKDIR ${CMAKE_BINARY_DIR}/gvsoc_workdir) + make_directory(${GVSOC_WORKDIR}) + set(GVSOC_BINARY "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${name}") + + # GAP9 SDK paths + set(GAP9_SDK_HOME $ENV{GAP_SDK_HOME}) + if(NOT DEFINED GAP9_SDK_HOME) + message(FATAL_ERROR "Environment variable GAP_SDK_HOME not set") + endif() + + # Check if GAPY_RUNNER_ARGS is defined (indicates L3 with readfs files) + if(DEFINED GAPY_RUNNER_ARGS) + # L3 mode: Use gapy with flash layout and readfs + message(STATUS "[Deeploy GAP9] L3 mode: using gapy with readfs") + + set(GAPY "${GAP9_SDK_HOME}/utils/gapy_v2/bin/gapy") + set(FLASH_LAYOUT "${GAP9_SDK_HOME}/utils/layouts/default_layout_multi_readfs.json") + set(FSBL_BINARY "${GAP9_SDK_HOME}/install/target/bin/fsbl") + set(SSBL_BINARY "${GAP9_SDK_HOME}/install/target/bin/ssbl") + + # Build the gapy command + set(GAPY_CMD + ${GAPY} + --target=gap9.evk + --target-dir=${GAP9_SDK_HOME}/install/workstation/generators + --model-dir=${GAP9_SDK_HOME}/install/workstation/models + --platform=gvsoc + --work-dir=${GVSOC_WORKDIR} + --target-property=boot.flash_device=mram + --target-property=boot.mode=flash + --multi-flash-content=${FLASH_LAYOUT} + --flash-property=${GVSOC_BINARY}@mram:app:binary + ) + + # Add readfs files if provided + if(GAPY_RUNNER_ARGS) + list(LENGTH GAPY_RUNNER_ARGS num_readfs_files) + message(STATUS "[Deeploy GAP9] Adding ${num_readfs_files} readfs file(s)") + list(APPEND GAPY_CMD ${GAPY_RUNNER_ARGS}) + endif() + + # Add fsbl/ssbl + list(APPEND GAPY_CMD + --flash-property=${FSBL_BINARY}@mram:fsbl:binary + --flash-property=${SSBL_BINARY}@mram:ssbl:binary + ) + + # Add final commands + list(APPEND GAPY_CMD + --py-stack + image flash run + --binary=${GVSOC_BINARY} + ) + + # Convert list to string for printing + string(REPLACE ";" " " GAPY_CMD_STR "${GAPY_CMD}") + + add_custom_target(gvsoc_${name} + DEPENDS ${name} + WORKING_DIRECTORY ${GVSOC_WORKDIR} + COMMAND bash -c "${CMAKE_COMMAND} -E copy_if_different ${CMAKE_BINARY_DIR}/*.bin ${GVSOC_WORKDIR}/ 2>/dev/null || true" + COMMAND ${CMAKE_COMMAND} -E copy_if_different + ${GAP9_SDK_HOME}/utils/efuse/GAP9/efuse_hyper_preload.data + ${GVSOC_WORKDIR}/chip.efuse_preload.data + COMMAND ${CMAKE_COMMAND} -E echo "==========================================" + COMMAND ${CMAKE_COMMAND} -E echo "[Deeploy GAP9] Executing gapy command (L3 mode with readfs):" + COMMAND ${CMAKE_COMMAND} -E echo "${GAPY_CMD_STR}" + COMMAND ${CMAKE_COMMAND} -E echo "==========================================" + COMMAND ${GAPY_CMD} + COMMENT "Simulating ${name} with gapy for GAP9 (L3 mode)" + POST_BUILD + USES_TERMINAL + VERBATIM + ) + + else() + # L2 mode: Use traditional gvsoc command directly + message(STATUS "[Deeploy GAP9] L2 mode: using traditional gvsoc") + + set(GVSOC_EXECUTABLE "${GVSOC_INSTALL_DIR}/bin/gvsoc") + + set(GVSOC_CMD + ${GVSOC_EXECUTABLE} + --target=${target} + --binary ${GVSOC_BINARY} + --work-dir=${GVSOC_WORKDIR} + ${GVSOC_EXTRA_FLAGS} + image flash run + ) + + # Convert list to string for printing + string(REPLACE ";" " " GVSOC_CMD_STR "${GVSOC_CMD}") + + add_custom_target(gvsoc_${name} + DEPENDS ${name} + WORKING_DIRECTORY ${GVSOC_WORKDIR} + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_BINARY_DIR}/*.bin ${GVSOC_WORKDIR}/ || true + COMMAND ${CMAKE_COMMAND} -E echo "==========================================" + COMMAND ${CMAKE_COMMAND} -E echo "[Deeploy GAP9] Executing gvsoc command (L2 mode):" + COMMAND ${CMAKE_COMMAND} -E echo "${GVSOC_CMD_STR}" + COMMAND ${CMAKE_COMMAND} -E echo "==========================================" + COMMAND ${GVSOC_CMD} + COMMENT "Simulating ${name} with gvsoc for GAP9 (L2 mode)" + POST_BUILD + USES_TERMINAL + ) + endif() +endmacro() \ No newline at end of file diff --git a/cmake/simulation.cmake b/cmake/simulation.cmake index d3d87ab311..c3356855ff 100644 --- a/cmake/simulation.cmake +++ b/cmake/simulation.cmake @@ -69,6 +69,14 @@ function(gvsoc_flags_add_files_to_hyperflash out_var files_var) set(${out_var} ${flags} PARENT_SCOPE) endfunction() +function(gvsoc_flags_add_files_to_flash out_var files_var) + set(flags) + foreach(file ${${files_var}}) + list(APPEND flags "--flash-property=${file}@flash:readfs_flash:files") + endforeach() + set(${out_var} ${flags} PARENT_SCOPE) +endfunction() + # The macro creates a new gvsoc_ cmake target which executes the final # binary on the gvsoc simulator. To give extra flags to the gvsoc command, set # the GVSOC_EXTRA_FLAGS variable. From 6b5c2e595010ff7100e2e239bda884c3d549e4bf Mon Sep 17 00:00:00 2001 From: Run Wang <52746141+SamanthaWangdl@users.noreply.github.com> Date: Fri, 21 Nov 2025 21:07:22 +0000 Subject: [PATCH 13/49] [GAP9] Layernorm Epsilon ABI Issue --- Deeploy/Targets/PULPOpen/Templates/FloatLayernormTemplate.py | 4 ++-- TargetLibraries/PULPOpen/inc/kernel/Layernorm.h | 4 ++-- TargetLibraries/PULPOpen/src/Layernorm.c | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Deeploy/Targets/PULPOpen/Templates/FloatLayernormTemplate.py b/Deeploy/Targets/PULPOpen/Templates/FloatLayernormTemplate.py index 9d4f60e8fc..ce6f409a28 100644 --- a/Deeploy/Targets/PULPOpen/Templates/FloatLayernormTemplate.py +++ b/Deeploy/Targets/PULPOpen/Templates/FloatLayernormTemplate.py @@ -11,8 +11,8 @@ ${data_out}, ${weight}, ${bias}, - ${epsilon}, ${size}, - ${lastDimLength} + ${lastDimLength}, + ${epsilon} ); """) \ No newline at end of file diff --git a/TargetLibraries/PULPOpen/inc/kernel/Layernorm.h b/TargetLibraries/PULPOpen/inc/kernel/Layernorm.h index 43e9c55cf4..55bb28fb08 100644 --- a/TargetLibraries/PULPOpen/inc/kernel/Layernorm.h +++ b/TargetLibraries/PULPOpen/inc/kernel/Layernorm.h @@ -11,7 +11,7 @@ void PULP_Layernorm_fp32_fp32(float32_t *data_in, float32_t *data_out, float32_t *scale, float32_t *bias, - float32_t epsilon, uint32_t size, - uint32_t lastDimLength); + uint32_t size, + uint32_t lastDimLength, float32_t epsilon); #endif // __DEEPLOY_MATH_LAYERNORM_KERNEL_HEADER__ \ No newline at end of file diff --git a/TargetLibraries/PULPOpen/src/Layernorm.c b/TargetLibraries/PULPOpen/src/Layernorm.c index 73d1bbab58..e8829e4e1e 100644 --- a/TargetLibraries/PULPOpen/src/Layernorm.c +++ b/TargetLibraries/PULPOpen/src/Layernorm.c @@ -12,8 +12,8 @@ void PULP_Layernorm_fp32_fp32(float32_t *data_in, float32_t *data_out, float32_t *scale, float32_t *bias, - float32_t epsilon, uint32_t size, - uint32_t lastDimLength) { + uint32_t size, + uint32_t lastDimLength, float32_t epsilon) { int8_t core_id = pi_core_id(); int8_t log2Core = LOG2(NUM_CORES); From 3a1d87705ba1817a74c62ba2d2ec7cd1769b251d Mon Sep 17 00:00:00 2001 From: Run Wang <52746141+SamanthaWangdl@users.noreply.github.com> Date: Thu, 27 Nov 2025 13:49:37 +0000 Subject: [PATCH 14/49] [GAP9] Fixed Zero Cyclecounter Issue --- DeeployTest/Platforms/GAP9/src/deeploytest.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/DeeployTest/Platforms/GAP9/src/deeploytest.c b/DeeployTest/Platforms/GAP9/src/deeploytest.c index 0aa1149272..f4818e0104 100644 --- a/DeeployTest/Platforms/GAP9/src/deeploytest.c +++ b/DeeployTest/Platforms/GAP9/src/deeploytest.c @@ -17,6 +17,7 @@ #define SLAVESTACKSIZE 3800 struct pi_device cluster_dev; +uint32_t total_cycles = 0; typedef struct { void *expected; @@ -68,7 +69,12 @@ void InitNetworkWrapper(void *args) { void RunNetworkWrapper(void *args) { (void)args; + // Initialize performance counter in cluster context + ResetTimer(); + StartTimer(); RunNetwork(pi_core_id(), pi_cl_cluster_nb_cores()); + total_cycles = getCycles(); + StopTimer(); } int main(void) { @@ -113,10 +119,7 @@ int main(void) { pi_cluster_task(&cluster_task, RunNetworkWrapper, NULL); cluster_task.slave_stack_size = SLAVESTACKSIZE; - ResetTimer(); - StartTimer(); pi_cluster_send_task_to_cl(&cluster_dev, &cluster_task); - StopTimer(); #ifndef CI printf("Output:\r\n"); @@ -175,7 +178,7 @@ int main(void) { } } - printf("Runtime: %u cycles\r\n", getCycles()); + printf("Runtime: %u cycles\r\n", total_cycles); printf("Errors: %u out of %u \r\n", tot_err, tot_tested); return 0; From faa6421b437f3ee49e5b67300c8d741a3597f49b Mon Sep 17 00:00:00 2001 From: Run Wang <52746141+SamanthaWangdl@users.noreply.github.com> Date: Fri, 28 Nov 2025 13:49:30 +0000 Subject: [PATCH 15/49] [GAP9] Add CI --- .github/workflows/_runner-gap9-tiled.yml | 78 +++++++ .github/workflows/_runner-gap9.yml | 54 +++++ .github/workflows/ci-platform-gap9-tiled.yml | 213 +++++++++++++++++++ .github/workflows/ci-platform-gap9.yml | 93 ++++++++ 4 files changed, 438 insertions(+) create mode 100644 .github/workflows/_runner-gap9-tiled.yml create mode 100644 .github/workflows/_runner-gap9.yml create mode 100644 .github/workflows/ci-platform-gap9-tiled.yml create mode 100644 .github/workflows/ci-platform-gap9.yml diff --git a/.github/workflows/_runner-gap9-tiled.yml b/.github/workflows/_runner-gap9-tiled.yml new file mode 100644 index 0000000000..11f17b7537 --- /dev/null +++ b/.github/workflows/_runner-gap9-tiled.yml @@ -0,0 +1,78 @@ +# SPDX-FileCopyrightText: 2025 ETH Zurich and University of Bologna +# +# SPDX-License-Identifier: Apache-2.0 + +--- +name: _runner-gap9-tiled + +"on": + workflow_call: + inputs: + runner: + required: true + type: string + docker-image: + required: true + type: string + test-name: + required: true + type: string + num-cores: + required: false + default: 8 + type: number + L1: + required: false + default: "[64000]" + type: string + default-memory-level: + required: false + default: "L2" + type: string + double-buffer: + required: false + default: false + type: boolean + memory-allocation-strategy: + required: false + default: "MiniMalloc" + type: string + search-strategy: + required: false + default: "random-max" + type: string + +jobs: + test-runner-gap9-tiled: + strategy: + fail-fast: false + matrix: + L1: ${{ fromJSON(inputs.L1) }} + runs-on: ${{ inputs.runner }} + container: + image: ${{ inputs.docker-image }} + steps: + - name: Checkout Repo + uses: actions/checkout@v4 + with: + submodules: recursive + - name: Build Deeploy + shell: bash + run: pip install -e . + - name: Cache ccache + uses: actions/cache/restore@v4 + with: + path: /app/.ccache + key: ccache-ci + - name: Run Test + uses: nick-fields/retry@v3 + with: + timeout_minutes: 15 + max_attempts: 3 + retry_on: timeout + command: | + cd DeeployTest + mkdir -p /app/.ccache + export CCACHE_DIR=/app/.ccache + python testRunner_tiled_gap9.py -t Tests/${{ inputs.test-name }} --cores=${{ inputs.num-cores }} --l1 ${{ matrix.L1 }} --defaultMemLevel=${{ inputs.default-memory-level }} ${{ inputs.double-buffer && '--doublebuffer' || '' }} --memAllocStrategy=${{ inputs.memory-allocation-strategy }} --searchStrategy=${{ inputs.search-strategy }} + shell: bash diff --git a/.github/workflows/_runner-gap9.yml b/.github/workflows/_runner-gap9.yml new file mode 100644 index 0000000000..d55046e227 --- /dev/null +++ b/.github/workflows/_runner-gap9.yml @@ -0,0 +1,54 @@ +# SPDX-FileCopyrightText: 2025 ETH Zurich and University of Bologna +# +# SPDX-License-Identifier: Apache-2.0 + +--- +name: _runner-gap9 + +"on": + workflow_call: + inputs: + runner: + required: true + type: string + docker-image: + required: true + type: string + test-names: + required: true + type: string + num-cores: + required: true + type: number + +jobs: + test-runner-gap9: + runs-on: ${{ inputs.runner }} + container: + image: ${{ inputs.docker-image }} + steps: + - name: Checkout Repo + uses: actions/checkout@v4 + with: + submodules: recursive + - name: Build Deeploy + shell: bash + run: pip install -e . + - name: Cache ccache + uses: actions/cache/restore@v4 + with: + path: /app/.ccache + key: ccache-ci + - name: Run Test + run: | + testNames="${{ inputs.test-names }}" + cd DeeployTest + mkdir -p /app/.ccache + export CCACHE_DIR=/app/.ccache + echo "$testNames" | while IFS= read -r testName; do + if [[ -n "$testName" ]]; then + echo "Running test: $testName" + python testRunner_gap9.py -t Tests/$testName --cores=${{ inputs.num-cores }} + fi + done + shell: bash diff --git a/.github/workflows/ci-platform-gap9-tiled.yml b/.github/workflows/ci-platform-gap9-tiled.yml new file mode 100644 index 0000000000..e059c8f147 --- /dev/null +++ b/.github/workflows/ci-platform-gap9-tiled.yml @@ -0,0 +1,213 @@ +# SPDX-FileCopyrightText: 2025 ETH Zurich and University of Bologna +# +# SPDX-License-Identifier: Apache-2.0 + +--- +name: CI • GAP9 (Tiled) + +"on": + push: + branches: + - "**" + tags: + - "v*.*.*" + pull_request: + workflow_dispatch: + inputs: + docker_image_deeploy: + description: "Deeploy Image to use" + required: false + default: "ghcr.io/pulp-platform/deeploy:devel" + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + select-env: + uses: ./.github/workflows/_select-env.yml + with: + docker_image_deeploy: ${{ inputs.docker_image_deeploy }} + + gap9-kernels-tiled-singlebuffer-L2: + needs: select-env + strategy: + fail-fast: false + matrix: + test-data: + - name: "testMatMul" + L1: [64000, 32000, 16000] + - name: "test2DRequantizedConv" + L1: [8000, 6000, 4000] + - name: "test2DRequantizedStriddedPaddedConv" + L1: [600] + - name: "testRequantizedDWConv" + L1: [2561] + - name: "iSoftmax" + L1: [800, 500, 300] + - name: "testConcat" + L1: [32000, 16000, 8000] + - name: "testRMSNorm" + L1: [2048, 1024, 512] + - name: "Hardswish" + L1: [750] + - name: "RQHardswish" + L1: [750] + - name: "testFloatGEMM" + L1: [8000] + - name: "testFloat2DConvolution" + L1: [1600] + - name: "testFloat2DConvolutionBias" + L1: [6600] + - name: "testFloat2DConvolutionZeroBias" + L1: [6600] + - name: "testFloat2DDWConvolution" + L1: [7200] + - name: "testFloat2DDWConvolutionBias" + L1: [7200] + - name: "testFloat2DDWConvolutionZeroBias" + L1: [7200] + - name: "testFloatLayerNorm" + L1: [2000] + - name: "testFloatMaxPool" + L1: [2000] + - name: "testFloatMatmul" + L1: [2000] + - name: "testFloatRelu" + L1: [2000] + - name: "testFloatReshapeWithSkipConnection" + L1: [1400] + - name: "testFloatSoftmax" + L1: [4000] + - name: "testFloatTranspose" + L1: [2000] + - name: "testFloatMul" + L1: [2000] + - name: "largeFloatAdd" + L1: [220000] + - name: "testRQGEMMwBatch" + L1: [20000] + - name: "testMatMulBatch" + L1: [20000] + uses: ./.github/workflows/_runner-gap9-tiled.yml + with: + runner: ${{ needs.select-env.outputs.runner }} + docker-image: ${{ needs.select-env.outputs.image }} + test-name: ${{ matrix.test-data.name }} + num-cores: 8 + L1: ${{ toJson(matrix.test-data.L1) }} + + gap9-kernels-tiled-doublebuffer-L2: + needs: select-env + strategy: + fail-fast: false + matrix: + test-data: + - name: "testMatMul" + L1: [64000, 32000, 16000] + - name: "test2DRequantizedConv" + L1: [8000, 6000, 5000] + - name: "testRequantizedDWConv" + L1: [5121] + - name: "iSoftmax" + L1: [1600, 1000, 600] + - name: "testConcat" + L1: [64000, 32000, 16000] + - name: "testRMSNorm" + L1: [4096, 2048, 1024] + - name: "Hardswish" + L1: [750] + - name: "RQHardswish" + L1: [800] + - name: "testFloatGEMM" + L1: [8000] + - name: "testFloat2DConvolution" + L1: [2000] + - name: "testFloat2DConvolutionBias" + L1: [8800] + - name: "testFloat2DConvolutionZeroBias" + L1: [8800] + - name: "testFloat2DDWConvolution" + L1: [9800] + - name: "testFloat2DDWConvolutionBias" + L1: [10000] + - name: "testFloat2DDWConvolutionZeroBias" + L1: [9800] + - name: "testFloatLayerNorm" + L1: [2000] + - name: "testFloatMaxPool" + L1: [5000] + - name: "testFloatMatmul" + L1: [5000] + - name: "testFloatRelu" + L1: [20] + - name: "testFloatReshapeWithSkipConnection" + L1: [2600] + - name: "testFloatSoftmax" + L1: [8000] + - name: "testFloatTranspose" + L1: [2000] + - name: "testFloatMul" + L1: [2000] + uses: ./.github/workflows/_runner-gap9-tiled.yml + with: + runner: ${{ needs.select-env.outputs.runner }} + docker-image: ${{ needs.select-env.outputs.image }} + test-name: ${{ matrix.test-data.name }} + num-cores: 8 + L1: ${{ toJson(matrix.test-data.L1) }} + double-buffer: true + + gap9-models-tiled-singlebuffer-L2: + needs: select-env + strategy: + fail-fast: false + matrix: + test-data: + - name: "simpleRegression" + L1: [45000, 30000, 15000] + - name: "miniMobileNet" + L1: [60000, 12000, 6000, 3000] + - name: "miniMobileNetv2" + L1: [60000, 16000, 12000, 8000] + - name: "Attention" + L1: [60000, 10000, 5000] + - name: "MLPerf/KeywordSpotting" + L1: [64000] + - name: "MLPerf/ImageClassification" + L1: [64000] + - name: "MLPerf/AnomalyDetection" + L1: [64000] + num-cores: [8] + uses: ./.github/workflows/_runner-gap9-tiled.yml + with: + runner: ${{ needs.select-env.outputs.runner }} + docker-image: ${{ needs.select-env.outputs.image }} + test-name: ${{ matrix.test-data.name }} + num-cores: ${{ matrix.num-cores }} + L1: ${{ toJson(matrix.test-data.L1) }} + + gap9-models-tiled-doublebuffer-L2: + needs: select-env + strategy: + fail-fast: false + matrix: + test-data: + - name: "simpleRegression" + L1: [60000, 45000, 30000] + - name: "miniMobileNet" + L1: [60000, 24000, 12000, 6000] + - name: "miniMobileNetv2" + L1: [60000, 32000, 24000, 16000] + - name: "Attention" + L1: [60000, 20000, 10000, 5000] + num-cores: [8] + double-buffer: [true] + uses: ./.github/workflows/_runner-gap9-tiled.yml + with: + runner: ${{ needs.select-env.outputs.runner }} + docker-image: ${{ needs.select-env.outputs.image }} + test-name: ${{ matrix.test-data.name }} + num-cores: ${{ matrix.num-cores }} + L1: ${{ toJson(matrix.test-data.L1) }} + double-buffer: ${{ matrix.double-buffer }} diff --git a/.github/workflows/ci-platform-gap9.yml b/.github/workflows/ci-platform-gap9.yml new file mode 100644 index 0000000000..29440bed7f --- /dev/null +++ b/.github/workflows/ci-platform-gap9.yml @@ -0,0 +1,93 @@ +# SPDX-FileCopyrightText: 2025 ETH Zurich and University of Bologna +# +# SPDX-License-Identifier: Apache-2.0 + +--- +name: CI • GAP9 + +"on": + push: + branches: + - "**" + tags: + - "v*.*.*" + pull_request: + workflow_dispatch: + inputs: + docker_image_deeploy: + description: "Deeploy Image to use" + required: false + default: "ghcr.io/pulp-platform/deeploy:devel" + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + select-env: + uses: ./.github/workflows/_select-env.yml + with: + docker_image_deeploy: ${{ inputs.docker_image_deeploy }} + + gap9-kernels: + needs: select-env + uses: ./.github/workflows/_runner-gap9.yml + with: + runner: ${{ needs.select-env.outputs.runner }} + docker-image: ${{ needs.select-env.outputs.image }} + test-names: | + Adder + MultIO + test1DPad + test2DPad + testMatMul + testMatMulAdd + testRequantizedDWConv + test2DRequantizedConv + iSoftmax + testConcat + testRMSNorm + trueIntegerDivSandwich + Hardswish + RQHardswish + testBacktracking + testFloatAdder + testFloatGEMM + + testFloat2DConvolution + testFloat2DConvolutionBias + testFloat2DConvolutionZeroBias + + testFloat2DDWConvolution + testFloat2DDWConvolutionBias + testFloat2DDWConvolutionZeroBias + + testFloatLayerNorm + testFloatRelu + testFloatMaxPool + testFloatMatmul + testFloatSoftmax + testFloatTranspose + testFloatMul + Quant + Dequant + testFloatReduceSum + testFloatReshapeWithSkipConnection + QuantizedLinear + num-cores: 8 + + gap9-models: + needs: select-env + uses: ./.github/workflows/_runner-gap9.yml + with: + runner: ${{ needs.select-env.outputs.runner }} + docker-image: ${{ needs.select-env.outputs.image }} + test-names: | + simpleRegression + miniMobileNet + miniMobileNetv2 + Attention + MLPerf/KeywordSpotting + MLPerf/ImageClassification + MLPerf/AnomalyDetection + num-cores: 8 From 584729c9ead3ce4806b1d6d01d008659221d5867 Mon Sep 17 00:00:00 2001 From: Run Wang <52746141+SamanthaWangdl@users.noreply.github.com> Date: Fri, 28 Nov 2025 14:34:04 +0000 Subject: [PATCH 16/49] [GAP9] Fix L2 GVSoC target build with hexlist --- DeeployTest/CMakeLists.txt | 15 +++++++++++---- DeeployTest/testUtils/codeGenerate.py | 6 ++++++ cmake/gap9/gap9_gvsoc.cmake | 24 ++++++++++++------------ 3 files changed, 29 insertions(+), 16 deletions(-) diff --git a/DeeployTest/CMakeLists.txt b/DeeployTest/CMakeLists.txt index 0bdd94c9b3..1fbfc8360b 100644 --- a/DeeployTest/CMakeLists.txt +++ b/DeeployTest/CMakeLists.txt @@ -52,18 +52,25 @@ elseif(DEEPLOY_ARCH STREQUAL CHIMERA) add_subdirectory(Platforms/Chimera) elseif(platform STREQUAL GAP9) + # Search for hex files generated by Python code generator + # These files indicate L3 mode (external memory with readfs) file(GLOB_RECURSE HEXLIST - "${GENERATED_SOURCE}/hex/**" + "${GENERATED_SOURCE}/hex/*" ) - list(APPEND GVSOC_EXTRA_FLAGS --target-property=boot.flash_device=mram --target-property=boot.mode=flash) - if (NOT HEXLIST) + # L2 mode: No flash/readfs files + # Data lives in L2 memory only target_compile_options(network PUBLIC -DNOFLASH) + message(STATUS "[Deeploy GAP9] L2 mode: No hex files found, -DNOFLASH set") + message(STATUS "[Deeploy GAP9] If you expect L3 mode, ensure Python codegen created hex files in ${GENERATED_SOURCE}/hex/") else() + # L3 mode: Use flash with readfs files + # Data will be loaded from external flash via readfs + message(STATUS "[Deeploy GAP9] L3 mode: Found ${CMAKE_MATCH_COUNT} hex file(s)") message(STATUS "==== HEXLIST ====") foreach(f ${HEXLIST}) - message(STATUS "HEXLIST file: ${f}") + message(STATUS " ${f}") endforeach() gvsoc_flags_add_files_to_flash(GAPY_RUNNER_ARGS HEXLIST) message(STATUS "GAPY_RUNNER_ARGS: ${GAPY_RUNNER_ARGS}") diff --git a/DeeployTest/testUtils/codeGenerate.py b/DeeployTest/testUtils/codeGenerate.py index 370d138a5a..7df8451aa1 100644 --- a/DeeployTest/testUtils/codeGenerate.py +++ b/DeeployTest/testUtils/codeGenerate.py @@ -265,6 +265,12 @@ def generateTestNetwork(deployer: NetworkDeployer, test_inputs: List[np.ndarray] # Create input and output vectors os.makedirs(dumpdir, exist_ok = True) + # Clean up old hex files to avoid confusion between L2/L3 modes + import shutil + hex_dir = os.path.join(dumpdir, 'hex') + if os.path.exists(hex_dir): + shutil.rmtree(hex_dir) + testInputStr = generateTestInputsHeader(deployer, test_inputs) with open(f'{dumpdir}/testinputs.h', "w") as f: f.write(testInputStr) diff --git a/cmake/gap9/gap9_gvsoc.cmake b/cmake/gap9/gap9_gvsoc.cmake index 1c62aab5bd..2a5029925c 100644 --- a/cmake/gap9/gap9_gvsoc.cmake +++ b/cmake/gap9/gap9_gvsoc.cmake @@ -20,8 +20,8 @@ macro(add_gvsoc_emulation name target) message(FATAL_ERROR "Environment variable GAP_SDK_HOME not set") endif() - # Check if GAPY_RUNNER_ARGS is defined (indicates L3 with readfs files) - if(DEFINED GAPY_RUNNER_ARGS) + # Check if GAPY_RUNNER_ARGS is defined and non-empty (indicates L3 with readfs files) + if(GAPY_RUNNER_ARGS) # L3 mode: Use gapy with flash layout and readfs message(STATUS "[Deeploy GAP9] L3 mode: using gapy with readfs") @@ -86,29 +86,29 @@ macro(add_gvsoc_emulation name target) ) else() - # L2 mode: Use traditional gvsoc command directly - message(STATUS "[Deeploy GAP9] L2 mode: using traditional gvsoc") - + # L2 mode: Use traditional gvsoc command directly (no flash/readfs) + message(STATUS "[Deeploy GAP9] L2 mode: using traditional gvsoc without flash") + set(GVSOC_EXECUTABLE "${GVSOC_INSTALL_DIR}/bin/gvsoc") - + + # L2 mode: run directly without flash operations set(GVSOC_CMD ${GVSOC_EXECUTABLE} --target=${target} --binary ${GVSOC_BINARY} --work-dir=${GVSOC_WORKDIR} - ${GVSOC_EXTRA_FLAGS} - image flash run + run ) - + # Convert list to string for printing string(REPLACE ";" " " GVSOC_CMD_STR "${GVSOC_CMD}") - + add_custom_target(gvsoc_${name} DEPENDS ${name} WORKING_DIRECTORY ${GVSOC_WORKDIR} - COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_BINARY_DIR}/*.bin ${GVSOC_WORKDIR}/ || true + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_BINARY_DIR}/*.bin ${GVSOC_WORKDIR}/ || true COMMAND ${CMAKE_COMMAND} -E echo "==========================================" - COMMAND ${CMAKE_COMMAND} -E echo "[Deeploy GAP9] Executing gvsoc command (L2 mode):" + COMMAND ${CMAKE_COMMAND} -E echo "[Deeploy GAP9] Executing gvsoc command - L2 mode:" COMMAND ${CMAKE_COMMAND} -E echo "${GVSOC_CMD_STR}" COMMAND ${CMAKE_COMMAND} -E echo "==========================================" COMMAND ${GVSOC_CMD} From 3e2fc8798cab87ef183d9b6a06454e216290ba13 Mon Sep 17 00:00:00 2001 From: Run Wang <52746141+SamanthaWangdl@users.noreply.github.com> Date: Fri, 28 Nov 2025 14:34:38 +0000 Subject: [PATCH 17/49] [GAP9] Sdk.config add macro for clusterstack --- DeeployTest/Platforms/GAP9/sdk.config | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/DeeployTest/Platforms/GAP9/sdk.config b/DeeployTest/Platforms/GAP9/sdk.config index c0b2bdf2e8..d4e4db6565 100644 --- a/DeeployTest/Platforms/GAP9/sdk.config +++ b/DeeployTest/Platforms/GAP9/sdk.config @@ -27,4 +27,7 @@ CONFIG_IO_PRINTF_FLOAT_ENABLE=y CONFIG_IO_PRINTF_FLOAT_EXPONENT_ENABLE=y CONFIG_PLATFORM_GVSOC=y -# CONFIG_DRIVER_CLUSTERDECOMPRESSOR=n \ No newline at end of file +# CONFIG_DRIVER_CLUSTERDECOMPRESSOR=n + +#CONFIG_CL_MASTER_CORE_STACK_SIZE=14000 +#CONFIG_CL_SLAVE_CORE_STACK_SIZE=1000 \ No newline at end of file From 6b55e98b5ae670c3e56cfddfd3653372141058f0 Mon Sep 17 00:00:00 2001 From: Run Wang <52746141+SamanthaWangdl@users.noreply.github.com> Date: Sun, 30 Nov 2025 19:54:42 +0000 Subject: [PATCH 18/49] [GAP9] Fix Cluster DMA Concurrent Tasks Bug with Mchan Template from Dory --- Deeploy/Targets/GAP9/Bindings.py | 6 +- Deeploy/Targets/GAP9/DMA/ClDma.py | 85 ------------------- Deeploy/Targets/GAP9/DMA/MchanDma.py | 105 ++++++++++++++++++++++++ Deeploy/Targets/GAP9/DMA/__init__.py | 3 - Deeploy/Targets/GAP9/Platform.py | 3 +- TargetLibraries/GAP9/inc/DeeployMchan.h | 44 ++++++++++ 6 files changed, 154 insertions(+), 92 deletions(-) delete mode 100644 Deeploy/Targets/GAP9/DMA/ClDma.py create mode 100644 Deeploy/Targets/GAP9/DMA/MchanDma.py delete mode 100644 Deeploy/Targets/GAP9/DMA/__init__.py create mode 100644 TargetLibraries/GAP9/inc/DeeployMchan.h diff --git a/Deeploy/Targets/GAP9/Bindings.py b/Deeploy/Targets/GAP9/Bindings.py index 68a4c9d60b..73cc1ce03f 100644 --- a/Deeploy/Targets/GAP9/Bindings.py +++ b/Deeploy/Targets/GAP9/Bindings.py @@ -28,7 +28,7 @@ from Deeploy.Targets.PULPOpen.Bindings import TilingCallClosure, ForkClosure, \ MemoryAwareFunctionCallClosure, L3MemoryAwareFunctionCallClosure, MemoryAwareForkTransformer from Deeploy.Targets.PULPOpen.DataTypes import PULPDMAFuture -from Deeploy.Targets.GAP9.DMA.ClDma import ClDma +from Deeploy.Targets.GAP9.DMA.MchanDma import GAP9MchanDma from Deeploy.Targets.GAP9.DMA.L3Dma import gap9L3DmaHack # Import templates from PULPOpen and Generic @@ -55,7 +55,7 @@ PULPSynchCoresPass(), ForkClosure(writeback = False, generateStruct = True), TilingVariableReplacementUpdate("L1"), - PULPClusterTiling("L2", "L1", ClDma()), # Use ClDma instead of MchanDma + PULPClusterTiling("L2", "L1", GAP9MchanDma()), # Use GAP9MchanDma instead of ClDma ArgumentStructGeneration(), MemoryManagementGeneration("L1"), TilingVariableReplacement("L2"), @@ -74,7 +74,7 @@ TilingVariableReplacement("L1"), TilingCallClosure(writeback = False, generateStruct = True), TilingVariableReplacementUpdate("L1"), - PULPClusterTiling("L2", "L1", ClDma()), # Use ClDma instead of MchanDma + PULPClusterTiling("L2", "L1", GAP9MchanDma()), # Use GAP9MchanDma instead of ClDma ArgumentStructGeneration(), MemoryManagementGeneration("L1"), TilingVariableReplacement("L2"), diff --git a/Deeploy/Targets/GAP9/DMA/ClDma.py b/Deeploy/Targets/GAP9/DMA/ClDma.py deleted file mode 100644 index b96796affa..0000000000 --- a/Deeploy/Targets/GAP9/DMA/ClDma.py +++ /dev/null @@ -1,85 +0,0 @@ -# SPDX-FileCopyrightText: 2025 ETH Zurich and University of Bologna -# -# SPDX-License-Identifier: Apache-2.0 - -import math -from typing import Dict, Tuple - -from Deeploy.DeeployTypes import NetworkContext, NodeTemplate, OperatorRepresentation, VariableBuffer -from Deeploy.TilingExtension.AsyncDma import AsyncDma, PerTensorWaitingStrategy, DmaDirection, Future - - -class ClDmaFuture(Future): - """ - Future implementation for GAP9's cl_dma.h API. - Uses pi_cl_dma_cmd_t structure to track DMA transfers. - """ - - _initTemplate = NodeTemplate("pi_cl_dma_cmd_t ${name};") - - _deinitTemplate = NodeTemplate("") - - _allocTemplate = NodeTemplate("") # SDK handles allocation automatically - - _waitTemplate = NodeTemplate("pi_cl_dma_cmd_wait(&${name});") - - -class ClDma(AsyncDma): - """ - GAP9 Cluster DMA implementation using cl_dma.h high-level API. - - This uses the PMSIS standard API (pi_cl_dma_cmd) instead of low-level MCHAN. - Benefits: - - Higher abstraction level - - Better portability - - Automatic resource management - - Cleaner API - """ - - _transferTemplates = { - 1: NodeTemplate("pi_cl_dma_cmd(${ext}, ${loc}, ${size}, ${dir}, &${future});"), - 2: NodeTemplate("pi_cl_dma_cmd_2d(${ext}, ${loc}, ${size}, ${stride}, ${length}, ${dir}, &${future});"), - } - _waitingStrategy = PerTensorWaitingStrategy(ClDmaFuture) - - def __init__(self, transferTemplates: Dict[int, NodeTemplate] = _transferTemplates) -> None: - super().__init__(transferTemplates) - - def checkTransfer(self, ctxt: NetworkContext, externalBuffer: VariableBuffer, localBuffer: VariableBuffer, - shape: Tuple[int, ...], strideExt: Tuple[int, ...], strideLoc: Tuple[int, ...], - direction: DmaDirection) -> None: - super().checkTransfer(ctxt, externalBuffer, localBuffer, shape, strideExt, strideLoc, direction) - - transferRank = len(shape) - # GAP9 cl_dma requires contiguous transfers for innermost dimension - assert strideExt[ - -1] == 1, "GAP9 cl_dma supports only contiguous transfers of the innermost dimension for external memory" - if transferRank == 1: - assert strideLoc[0] == 1, "GAP9 cl_dma supports only contiguous transfers for local memory" - else: - assert strideLoc[0] == shape[1] and strideLoc[ - 1] == 1, "GAP9 cl_dma supports only contiguous transfers for local memory" - - def transferOpRepr(self, externalBuffer: VariableBuffer, localBuffer: VariableBuffer, shape: Tuple[int, ...], - strideExt: Tuple[int, ...], strideLoc: Tuple[int, ...], direction: DmaDirection, - future: Future) -> OperatorRepresentation: - operatorRepresentation = super().transferOpRepr(externalBuffer, localBuffer, shape, strideExt, strideLoc, - direction, future) - - transferRank = len(shape) - - # Use cl_dma API direction enum: PI_CL_DMA_DIR_EXT2LOC (1) or PI_CL_DMA_DIR_LOC2EXT (0) - operatorRepresentation["dir"] = "PI_CL_DMA_DIR_EXT2LOC" if direction == "ExternalToLocal" else "PI_CL_DMA_DIR_LOC2EXT" - - # Total transfer size in bytes (shape already contains byte counts from the framework) - transferSize = math.prod(shape) - operatorRepresentation["size"] = transferSize - - # For 2D transfers, add stride and length parameters (already in bytes) - if transferRank == 2: - # stride: bytes to add to go to next line (row stride in external memory) - operatorRepresentation["stride"] = strideExt[0] - # length: bytes per line (number of bytes after which DMA switches to next line) - operatorRepresentation["length"] = shape[1] - - return operatorRepresentation diff --git a/Deeploy/Targets/GAP9/DMA/MchanDma.py b/Deeploy/Targets/GAP9/DMA/MchanDma.py new file mode 100644 index 0000000000..eec611c986 --- /dev/null +++ b/Deeploy/Targets/GAP9/DMA/MchanDma.py @@ -0,0 +1,105 @@ +# SPDX-FileCopyrightText: 2025 ETH Zurich and University of Bologna +# +# SPDX-License-Identifier: Apache-2.0 + +import math +from typing import Dict, Tuple + +from Deeploy.DeeployTypes import NetworkContext, NodeTemplate, OperatorRepresentation, VariableBuffer +from Deeploy.TilingExtension.AsyncDma import AsyncDma, DirectionWaitingStrategy, DmaDirection, Future + + +class MchanTransferFuture(Future): + """ + Future implementation for GAP9's MCHAN v7 low-level API. + Based on DORY's implementation: https://github.com/pulp-platform/dory + + Uses direct hardware register access for maximum performance. + """ + + _initTemplate = NodeTemplate("int ${name} = -1;") + + _deinitTemplate = NodeTemplate("") + + _allocTemplate = NodeTemplate("${name} = mchan_transfer_get_id();") + + _waitTemplate = NodeTemplate(""" +if (${name} >= 0) { + mchan_transfer_wait(${name}); + mchan_transfer_free(${name}); +} +""") + + +class GAP9MchanDma(AsyncDma): + """ + GAP9 Cluster DMA implementation using MCHAN v7 low-level API. + + This implementation follows DORY's approach for GAP9: + - Direct hardware register access for MCHAN v7 + - Manual transfer ID management + - Support for 1D, 2D, and 3D transfers + - Event-based or polled synchronization + + References: + - DORY GAP9: https://github.com/pulp-platform/dory/tree/master/dory/Hardware_targets/PULP/GAP9 + - MCHAN v7 specification in GAP9 documentation + """ + + _transferTemplates = { + 1: NodeTemplate("{ mchan_transfer_t __mchan_tmp = { .cmd = ${cmd}, .size = ${size}, .loc = ${loc}, .ext = ${ext} }; mchan_transfer_push_1d(__mchan_tmp); }"), + 2: NodeTemplate("{ mchan_transfer_t __mchan_tmp = { .cmd = ${cmd}, .size = ${size}, .loc = ${loc}, .ext = ${ext}, .ext_size_1d = ${size_1d}, .ext_stride_1d = ${stride_2d} }; mchan_transfer_push_2d(__mchan_tmp); }"), + } + _waitingStrategy = DirectionWaitingStrategy(MchanTransferFuture, "transfer") + + def __init__(self, transferTemplates: Dict[int, NodeTemplate] = _transferTemplates) -> None: + super().__init__(transferTemplates) + + def checkTransfer(self, ctxt: NetworkContext, externalBuffer: VariableBuffer, localBuffer: VariableBuffer, + shape: Tuple[int, ...], strideExt: Tuple[int, ...], strideLoc: Tuple[int, ...], + direction: DmaDirection) -> None: + super().checkTransfer(ctxt, externalBuffer, localBuffer, shape, strideExt, strideLoc, direction) + + transferRank = len(shape) + # MCHAN v7 requires contiguous transfers for innermost dimension in external memory + assert strideExt[ + -1] == 1, "GAP9 MCHAN supports only contiguous transfers of the innermost dimension for external memory" + + # Local memory (TCDM) must also be contiguous + if transferRank == 1: + assert strideLoc[0] == 1, "GAP9 MCHAN supports only contiguous transfers for local memory" + else: + assert strideLoc[0] == shape[1] and strideLoc[ + 1] == 1, "GAP9 MCHAN supports only contiguous transfers for local memory" + + def transferOpRepr(self, externalBuffer: VariableBuffer, localBuffer: VariableBuffer, shape: Tuple[int, ...], + strideExt: Tuple[int, ...], strideLoc: Tuple[int, ...], direction: DmaDirection, + future: Future) -> OperatorRepresentation: + operatorRepresentation = super().transferOpRepr(externalBuffer, localBuffer, shape, strideExt, strideLoc, + direction, future) + + transferRank = len(shape) + + # Build MCHAN command using flags from mchan.h + # We construct the cmd value in Python and let the C code use the macros + mchanFlags = 0 + mchanFlags += (1 << 0) if direction == "ExternalToLocal" else 0 # direction + mchanFlags += (1 << 1) # increment addresses + mchanFlags += (1 << 2) if transferRank == 2 else 0 # 2d transfer + mchanFlags += (1 << 3) # event enable + + mchanTransferSize = math.prod(shape) + mchanTransferSizeBits = math.ceil(math.log2(mchanTransferSize)) if mchanTransferSize > 0 else 0 + assert mchanTransferSizeBits <= 17, ( + "The transfer size is not representable with 17 bits. " + f"Received transfer size {mchanTransferSize} that requires {mchanTransferSizeBits} bits") + + # cmd = (flags << 17) + size, matching PULPOpen MchanDma pattern + operatorRepresentation["cmd"] = (mchanFlags << 17) + mchanTransferSize + operatorRepresentation["size"] = mchanTransferSize + + if transferRank == 2: + operatorRepresentation["size_1d"] = shape[1] + operatorRepresentation["stride_2d"] = strideExt[0] + + return operatorRepresentation diff --git a/Deeploy/Targets/GAP9/DMA/__init__.py b/Deeploy/Targets/GAP9/DMA/__init__.py deleted file mode 100644 index 4694b67df5..0000000000 --- a/Deeploy/Targets/GAP9/DMA/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -# SPDX-FileCopyrightText: 2025 ETH Zurich and University of Bologna -# -# SPDX-License-Identifier: Apache-2.0 diff --git a/Deeploy/Targets/GAP9/Platform.py b/Deeploy/Targets/GAP9/Platform.py index 697b8010ba..147fc50484 100644 --- a/Deeploy/Targets/GAP9/Platform.py +++ b/Deeploy/Targets/GAP9/Platform.py @@ -232,7 +232,8 @@ class GAP9StructBuffer(StructBuffer): _includeList = [ "pmsis.h", "DeeployGAP9Math.h", - "pulp_nn_kernels.h" + "pulp_nn_kernels.h", + "DeeployMchan.h" ] diff --git a/TargetLibraries/GAP9/inc/DeeployMchan.h b/TargetLibraries/GAP9/inc/DeeployMchan.h new file mode 100644 index 0000000000..f4822070fc --- /dev/null +++ b/TargetLibraries/GAP9/inc/DeeployMchan.h @@ -0,0 +1,44 @@ +/* + * SPDX-FileCopyrightText: 2025 ETH Zurich and University of Bologna + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#ifndef _DEEPLOY_MCHAN_H +#define _DEEPLOY_MCHAN_H + +/* + * GAP9 MCHAN v7 configuration wrapper for Deeploy + * + * This header configures and includes mchan.h with proper GAP9-specific settings. + * Based on DORY's GAP9 DMA implementation. + */ + +#include "pmsis.h" + +// Define MCHAN base address if not already defined +#ifndef MCHAN_BASE_ADDR +#define MCHAN_BASE_ADDR (CLUSTER_PERIPHERALS_ADDR + CLUSTER_MCHAN_OFFSET) +#endif + +// Define MCHAN version (GAP9 uses v7) +#ifndef MCHAN_VERSION +#define MCHAN_VERSION 7 +#endif + +// Use event-based synchronization (recommended for GAP9) +#ifndef MCHAN_POLLED +#define MCHAN_EVENT +#endif + +// Define event bit for cluster DMA +#ifdef MCHAN_EVENT +#ifndef MCHAN_EVENT_BIT +#define MCHAN_EVENT_BIT (CLUSTER_IRQ_DMA0) // Typically 8 +#endif +#endif + +// Now include the mchan.h header with all configurations set +#include "mchan.h" + +#endif // _DEEPLOY_MCHAN_H From ccaad61e63aedcf84c108666cdf4ffeab98d8d7e Mon Sep 17 00:00:00 2001 From: Run Wang <52746141+SamanthaWangdl@users.noreply.github.com> Date: Sun, 30 Nov 2025 20:01:12 +0000 Subject: [PATCH 19/49] [GAP9] Fix free template from PULP-sdk to GAP9sdk --- Deeploy/Targets/GAP9/Templates/FreeTemplate.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Deeploy/Targets/GAP9/Templates/FreeTemplate.py b/Deeploy/Targets/GAP9/Templates/FreeTemplate.py index 185b330b16..9604b5f951 100644 --- a/Deeploy/Targets/GAP9/Templates/FreeTemplate.py +++ b/Deeploy/Targets/GAP9/Templates/FreeTemplate.py @@ -6,12 +6,12 @@ gap9L2LocalTemplate = NodeTemplate("pi_l2_free(${name}, sizeof(${type.referencedType.typeName}) * ${size});") gap9L2GlobalTemplate = NodeTemplate("pi_l2_free(${name}, sizeof(${type.referencedType.typeName}) * ${size});") -gap9L1FreeTemplate = NodeTemplate("pi_l1_malloc_free(${name}, sizeof(${type.referencedType.typeName}) * ${size});\n") +gap9L1FreeTemplate = NodeTemplate("pi_l1_free(${name}, sizeof(${type.referencedType.typeName}) * ${size});\n") gap9L1GlobalFreeTemplate = NodeTemplate("") gap9GenericFree = NodeTemplate(""" % if _memoryLevel == "L1": -pi_l1_malloc_free(${name}, sizeof(${type.referencedType.typeName}) * ${size}); +pi_l1_free(${name}, sizeof(${type.referencedType.typeName}) * ${size}); % elif _memoryLevel == "L2" or _memoryLevel is None: pi_l2_free(${name}, sizeof(${type.referencedType.typeName}) * ${size}); % elif _memoryLevel == "L3": From af01a2e208c8ff7b7e4f5cde90857de89306d8f4 Mon Sep 17 00:00:00 2001 From: Run Wang <52746141+SamanthaWangdl@users.noreply.github.com> Date: Sun, 30 Nov 2025 20:53:29 +0000 Subject: [PATCH 20/49] [GAP9] Fix duplicate L3 Alloc Code generation due to PULP inheritance issueFix duplicate template generation due to PULP inheritance issue --- Deeploy/Targets/GAP9/Deployer.py | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/Deeploy/Targets/GAP9/Deployer.py b/Deeploy/Targets/GAP9/Deployer.py index 529e80a694..13aaaca4cf 100644 --- a/Deeploy/Targets/GAP9/Deployer.py +++ b/Deeploy/Targets/GAP9/Deployer.py @@ -15,6 +15,7 @@ import onnx_graphsurgeon as gs from Deeploy.AbstractDataTypes import Pointer +from Deeploy.CommonExtensions.NetworkDeployers.SignPropDeployer import SignPropDeployer from Deeploy.DeeployTypes import ConstantBuffer, DeploymentPlatform, NodeTemplate, TopologyOptimizer, VariableBuffer from Deeploy.Targets.PULPOpen.Deployer import PULPDeployer from Deeploy.Targets.GAP9.Bindings import GAP9Transformer, GAP9ClusterTransformer, GAP9SimpleTransformer @@ -68,15 +69,7 @@ def __init__(self, self.SimpleTransformer = GAP9SimpleTransformer def generateBufferAllocationCode(self) -> str: - """ - Generate buffer allocation code with GAP9-specific L3 RAM support. - - For L3 buffers: - 1. Allocate space in APS256XXN OctaSPI RAM using cl_ram_malloc() - 2. Load data from ReadFS using load_file_to_ram() - 3. Assign extName to enable hex dump generation - """ - retStr = super().generateBufferAllocationCode() + retStr = SignPropDeployer.generateBufferAllocationCode(self) L3FileStr = "" globalConstBuffers = [ From 71896e72c899956ef691ba9bb6cf420a952617d0 Mon Sep 17 00:00:00 2001 From: Run Wang <52746141+SamanthaWangdl@users.noreply.github.com> Date: Sun, 30 Nov 2025 21:40:27 +0000 Subject: [PATCH 21/49] [GAP9] Change GAP9 DWConV Based on PULP change --- Deeploy/Targets/GAP9/Tiler.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/Deeploy/Targets/GAP9/Tiler.py b/Deeploy/Targets/GAP9/Tiler.py index 73d3958ae9..32676df5e6 100644 --- a/Deeploy/Targets/GAP9/Tiler.py +++ b/Deeploy/Targets/GAP9/Tiler.py @@ -54,9 +54,11 @@ GAP9SoftmaxGradBindings, GAP9TransposeBindings, GAP9UniformRQSBindings, + GAP9FloatDWConv2DBindings ) from Deeploy.Targets.PULPOpen.TileConstraints.ConvTileConstraint import Conv2DTileConstraint, RQConv2DTileConstraint -from Deeploy.Targets.PULPOpen.TileConstraints.DWConvTileConstraint import DWConv2DTileConstraint +from Deeploy.Targets.PULPOpen.TileConstraints.DWConvTileConstraint import DWConv2DTileConstraint, \ + RQDWConv2DTileConstraint from Deeploy.Targets.PULPOpen.TileConstraints.GatherTileConstraint import GatherTileConstraint from Deeploy.Targets.PULPOpen.TileConstraints.GEMMTileConstraint import FloatGEMMTileConstraint, GEMMTileConstraint from Deeploy.Targets.PULPOpen.TileConstraints.iSoftmaxTileConstraint import iSoftmaxTileConstraint @@ -74,11 +76,14 @@ tileConstraint = RQConv2DTileConstraint()) GAP9RQSDWConv2DTilingReadyBindings = TilingReadyNodeBindings(nodeBindings = GAP9RQSDWConv2DBindings, - tileConstraint = DWConv2DTileConstraint()) + tileConstraint = RQDWConv2DTileConstraint()) GAP9Conv2DTilingReadyBindings = TilingReadyNodeBindings(nodeBindings = GAP9FloatConv2DBindings, tileConstraint = Conv2DTileConstraint()) +GAP9DWConv2DTilingReadyBindings = TilingReadyNodeBindings(nodeBindings = GAP9FloatDWConv2DBindings, + tileConstraint = DWConv2DTileConstraint()) + GAP9RQSGEMMTilingReadyBindings = TilingReadyNodeBindings(nodeBindings = GAP9RQSGEMMBindings, tileConstraint = GEMMTileConstraint()) From f88d5c5e2d9c66df67186f109b00e90d899bf745 Mon Sep 17 00:00:00 2001 From: Run Wang <52746141+SamanthaWangdl@users.noreply.github.com> Date: Tue, 16 Dec 2025 15:30:53 +0000 Subject: [PATCH 22/49] [GAP-CI] Update runner-gap9.yml --- .github/workflows/_runner-gap9.yml | 17 +++++++++++++---- .github/workflows/_select-env.yml | 13 ++----------- .github/workflows/ci-deeploy.yml | 4 ++-- DeeployTest/testUtils/codeGenerate.py | 2 +- TargetLibraries/GAP9/CMakeLists.txt | 11 +++++++++++ cmake/gap9/gap9_gvsoc.cmake | 7 +++++-- 6 files changed, 34 insertions(+), 20 deletions(-) diff --git a/.github/workflows/_runner-gap9.yml b/.github/workflows/_runner-gap9.yml index d55046e227..82dfb4d475 100644 --- a/.github/workflows/_runner-gap9.yml +++ b/.github/workflows/_runner-gap9.yml @@ -33,22 +33,31 @@ jobs: submodules: recursive - name: Build Deeploy shell: bash - run: pip install -e . + run: | + source /app/install/gap9-sdk/.gap9-venv/bin/activate + source /app/install/gap9-sdk/configs/gap9_evk_audio.sh || true + pip install -e . || true + deactivate - name: Cache ccache uses: actions/cache/restore@v4 with: path: /app/.ccache - key: ccache-ci + key: ccache-ci - name: Run Test run: | testNames="${{ inputs.test-names }}" + source /app/install/gap9-sdk/.gap9-venv/bin/activate + source /app/install/gap9-sdk/configs/gap9_evk_audio.sh || true + export GVSOC_INSTALL_DIR=/app/install/gap9-sdk/install/workstation + export GAP_RISCV_GCC_TOOLCHAIN=/app/install/gcc/gap9 cd DeeployTest mkdir -p /app/.ccache export CCACHE_DIR=/app/.ccache echo "$testNames" | while IFS= read -r testName; do if [[ -n "$testName" ]]; then echo "Running test: $testName" - python testRunner_gap9.py -t Tests/$testName --cores=${{ inputs.num-cores }} + python testRunner_gap9.py -t Tests/$testName fi done - shell: bash + deactivate + shell: bash \ No newline at end of file diff --git a/.github/workflows/_select-env.yml b/.github/workflows/_select-env.yml index 1085c7eaa1..2fd615532b 100644 --- a/.github/workflows/_select-env.yml +++ b/.github/workflows/_select-env.yml @@ -26,16 +26,7 @@ jobs: - id: set-docker-image shell: bash run: | - if [[ -n "${{ inputs.docker_image_deeploy }}" ]]; then - IMAGE="${{ inputs.docker_image_deeploy }}" - elif [[ "${{ github.ref }}" == refs/tags/* ]]; then - TAG_NAME="${GITHUB_REF##refs/tags/}" - IMAGE="ghcr.io/pulp-platform/deeploy:${TAG_NAME}" - elif [[ "${{ github.ref_name }}" == "main" ]]; then - IMAGE="ghcr.io/pulp-platform/deeploy:main" - else - IMAGE="ghcr.io/pulp-platform/deeploy:devel" - fi + IMAGE="ghcr.io/runwangdl/deeploy:gap9" echo "image=${IMAGE}" >> "$GITHUB_OUTPUT" - id: set-runner @@ -45,4 +36,4 @@ jobs: echo "runner=self-hosted" >> "$GITHUB_OUTPUT" else echo "runner=ubuntu-latest" >> "$GITHUB_OUTPUT" - fi + fi \ No newline at end of file diff --git a/.github/workflows/ci-deeploy.yml b/.github/workflows/ci-deeploy.yml index 429e9c2027..dd50bdb9a5 100644 --- a/.github/workflows/ci-deeploy.yml +++ b/.github/workflows/ci-deeploy.yml @@ -17,7 +17,7 @@ name: CI • Deeploy docker_image_deeploy: description: "Deeploy Image to use" required: false - default: "ghcr.io/pulp-platform/deeploy:devel" + default: "ghcr.io/runwangdl/deeploy:gap9" concurrency: group: ${{ github.workflow }}-${{ github.ref }} @@ -235,4 +235,4 @@ jobs: shell: bash run: | cd DeeployTest - python testDmas.py + python testDmas.py \ No newline at end of file diff --git a/DeeployTest/testUtils/codeGenerate.py b/DeeployTest/testUtils/codeGenerate.py index 62f2d889ae..ff4f7757f4 100644 --- a/DeeployTest/testUtils/codeGenerate.py +++ b/DeeployTest/testUtils/codeGenerate.py @@ -192,7 +192,7 @@ def generateTestNetworkImplementation(deployer: NetworkDeployer, verbosityCfg: C void InitNetwork(__attribute__((unused)) uint32_t core_id, __attribute__((unused)) uint32_t numThreads){ #ifndef CI - printf("[%d %d] Init Network!\\n", pi_cluster_id(), pi_core_id()); + printf("Init Network!\\n"); #endif """ retStr += deployer.generateEngineInitializationCode() diff --git a/TargetLibraries/GAP9/CMakeLists.txt b/TargetLibraries/GAP9/CMakeLists.txt index 947096f6bf..f9c348a72c 100644 --- a/TargetLibraries/GAP9/CMakeLists.txt +++ b/TargetLibraries/GAP9/CMakeLists.txt @@ -42,11 +42,22 @@ target_link_libraries(deeploygap9 PUBLIC pmsis) set(PULPNNVERSION XPULPV2) set(PULPNNBITWIDTH 32) add_compile_definitions(NUM_CORES=${NUM_CORES}) + +# RW: Create symlink to PULPOpen third_party if it doesn't exist +if(NOT EXISTS ${CMAKE_CURRENT_LIST_DIR}/third_party) + file(CREATE_LINK + ${CMAKE_CURRENT_LIST_DIR}/../PULPOpen/third_party + ${CMAKE_CURRENT_LIST_DIR}/third_party + SYMBOLIC) + message(STATUS "[Deeploy GAP9] Created symlink: third_party -> ../PULPOpen/third_party") +endif() + add_subdirectory(third_party/pulp-nn-mixed) #RW: GCC not recognizing -Wno-typedef-redefinition defined in PULP-NN CMakelist target_compile_options(pulp-nn-mixed PRIVATE -Wno-error) target_link_libraries(deeploygap9 PUBLIC pulp-nn-mixed) +target_link_libraries(pulp-nn-mixed PUBLIC pmsis) target_link_libraries(deeploygap9 PUBLIC m) diff --git a/cmake/gap9/gap9_gvsoc.cmake b/cmake/gap9/gap9_gvsoc.cmake index 2a5029925c..51fea8de8e 100644 --- a/cmake/gap9/gap9_gvsoc.cmake +++ b/cmake/gap9/gap9_gvsoc.cmake @@ -97,7 +97,7 @@ macro(add_gvsoc_emulation name target) --target=${target} --binary ${GVSOC_BINARY} --work-dir=${GVSOC_WORKDIR} - run + image flash run ) # Convert list to string for printing @@ -106,7 +106,10 @@ macro(add_gvsoc_emulation name target) add_custom_target(gvsoc_${name} DEPENDS ${name} WORKING_DIRECTORY ${GVSOC_WORKDIR} - COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_BINARY_DIR}/*.bin ${GVSOC_WORKDIR}/ || true + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_BINARY_DIR}/*.bin ${GVSOC_WORKDIR}/ || true + COMMAND ${CMAKE_COMMAND} -E copy_if_different + ${GAP9_SDK_HOME}/utils/efuse/GAP9/efuse_hyper_preload.data + ${GVSOC_WORKDIR}/chip.efuse_preload.data COMMAND ${CMAKE_COMMAND} -E echo "==========================================" COMMAND ${CMAKE_COMMAND} -E echo "[Deeploy GAP9] Executing gvsoc command - L2 mode:" COMMAND ${CMAKE_COMMAND} -E echo "${GVSOC_CMD_STR}" From 4429a6a69d85ea63e49c362a18cbfd690f0f87c5 Mon Sep 17 00:00:00 2001 From: runwangdl Date: Wed, 17 Dec 2025 02:23:05 +0100 Subject: [PATCH 23/49] [GAP-CI] Some CI Bugs fixed --- .github/workflows/_runner-gap9-tiled.yml | 32 +- .github/workflows/_runner-gap9.yml | 6 +- .github/workflows/ci-platform-gap9-tiled.yml | 6 - .github/workflows/ci-platform-gap9.yml | 1 - .github/workflows/infra-generate-ccache.yml | 9 + Container/Dockerfile.Gap9 | 45 + Container/Dockerfile.toolchain | 2 +- Deeploy/Targets/GAP9/Bindings.py | 28 +- Deeploy/Targets/GAP9/DMA/MchanDma.py | 40 +- Deeploy/Targets/GAP9/Deployer.py | 22 +- Deeploy/Targets/GAP9/Platform.py | 182 ++-- Deeploy/Targets/GAP9/Tiler.py | 43 +- Deeploy/Targets/PULPOpen/Deployer.py | 2 +- DeeployTest/Platforms/GAP9/CMakeLists.txt | 2 - DeeployTest/output.txt | 869 ------------------ TargetLibraries/GAP9/inc/DeeployMchan.h | 6 +- .../PULPOpen/inc/kernel/Layernorm.h | 3 +- TargetLibraries/PULPOpen/src/Layernorm.c | 3 +- 18 files changed, 220 insertions(+), 1081 deletions(-) create mode 100644 Container/Dockerfile.Gap9 delete mode 100644 DeeployTest/output.txt diff --git a/.github/workflows/_runner-gap9-tiled.yml b/.github/workflows/_runner-gap9-tiled.yml index 11f17b7537..f91b151aa1 100644 --- a/.github/workflows/_runner-gap9-tiled.yml +++ b/.github/workflows/_runner-gap9-tiled.yml @@ -58,21 +58,25 @@ jobs: submodules: recursive - name: Build Deeploy shell: bash - run: pip install -e . - - name: Cache ccache - uses: actions/cache/restore@v4 + run: | + source /app/install/gap9-sdk/.gap9-venv/bin/activate + source /app/install/gap9-sdk/configs/gap9_evk_audio.sh || true + pip install -e . || true + deactivate + - name: Setup ccache + uses: actions/cache@v4 with: path: /app/.ccache key: ccache-ci - name: Run Test - uses: nick-fields/retry@v3 - with: - timeout_minutes: 15 - max_attempts: 3 - retry_on: timeout - command: | - cd DeeployTest - mkdir -p /app/.ccache - export CCACHE_DIR=/app/.ccache - python testRunner_tiled_gap9.py -t Tests/${{ inputs.test-name }} --cores=${{ inputs.num-cores }} --l1 ${{ matrix.L1 }} --defaultMemLevel=${{ inputs.default-memory-level }} ${{ inputs.double-buffer && '--doublebuffer' || '' }} --memAllocStrategy=${{ inputs.memory-allocation-strategy }} --searchStrategy=${{ inputs.search-strategy }} - shell: bash + run: | + source /app/install/gap9-sdk/.gap9-venv/bin/activate + source /app/install/gap9-sdk/configs/gap9_evk_audio.sh || true + export GVSOC_INSTALL_DIR=/app/install/gap9-sdk/install/workstation + export GAP_RISCV_GCC_TOOLCHAIN=/app/install/gcc/gap9 + cd DeeployTest + mkdir -p /app/.ccache + export CCACHE_DIR=/app/.ccache + python testRunner_tiled_gap9.py -t Tests/${{ inputs.test-name }} --cores=${{ inputs.num-cores }} --l1 ${{ matrix.L1 }} --defaultMemLevel=${{ inputs.default-memory-level }} ${{ inputs.double-buffer && '--doublebuffer' || '' }} --memAllocStrategy=${{ inputs.memory-allocation-strategy }} --searchStrategy=${{ inputs.search-strategy }} + deactivate + shell: bash diff --git a/.github/workflows/_runner-gap9.yml b/.github/workflows/_runner-gap9.yml index 82dfb4d475..c4dde94ba4 100644 --- a/.github/workflows/_runner-gap9.yml +++ b/.github/workflows/_runner-gap9.yml @@ -38,11 +38,11 @@ jobs: source /app/install/gap9-sdk/configs/gap9_evk_audio.sh || true pip install -e . || true deactivate - - name: Cache ccache - uses: actions/cache/restore@v4 + - name: Setup ccache + uses: actions/cache@v4 with: path: /app/.ccache - key: ccache-ci + key: ccache-ci - name: Run Test run: | testNames="${{ inputs.test-names }}" diff --git a/.github/workflows/ci-platform-gap9-tiled.yml b/.github/workflows/ci-platform-gap9-tiled.yml index e059c8f147..63c20f6883 100644 --- a/.github/workflows/ci-platform-gap9-tiled.yml +++ b/.github/workflows/ci-platform-gap9-tiled.yml @@ -47,8 +47,6 @@ jobs: L1: [800, 500, 300] - name: "testConcat" L1: [32000, 16000, 8000] - - name: "testRMSNorm" - L1: [2048, 1024, 512] - name: "Hardswish" L1: [750] - name: "RQHardswish" @@ -83,8 +81,6 @@ jobs: L1: [2000] - name: "testFloatMul" L1: [2000] - - name: "largeFloatAdd" - L1: [220000] - name: "testRQGEMMwBatch" L1: [20000] - name: "testMatMulBatch" @@ -113,8 +109,6 @@ jobs: L1: [1600, 1000, 600] - name: "testConcat" L1: [64000, 32000, 16000] - - name: "testRMSNorm" - L1: [4096, 2048, 1024] - name: "Hardswish" L1: [750] - name: "RQHardswish" diff --git a/.github/workflows/ci-platform-gap9.yml b/.github/workflows/ci-platform-gap9.yml index 29440bed7f..c8375fd01a 100644 --- a/.github/workflows/ci-platform-gap9.yml +++ b/.github/workflows/ci-platform-gap9.yml @@ -46,7 +46,6 @@ jobs: test2DRequantizedConv iSoftmax testConcat - testRMSNorm trueIntegerDivSandwich Hardswish RQHardswish diff --git a/.github/workflows/infra-generate-ccache.yml b/.github/workflows/infra-generate-ccache.yml index 721f09870b..ebe1790a65 100644 --- a/.github/workflows/infra-generate-ccache.yml +++ b/.github/workflows/infra-generate-ccache.yml @@ -43,6 +43,15 @@ jobs: python testRunner_tiled_siracusa.py -t ./Tests/Adder python testRunner_tiled_siracusa_w_neureka.py -t ./Tests/Adder python testRunner_chimera.py -t ./Tests/Adder + + # GAP9 tests + source /app/install/gap9-sdk/.gap9-venv/bin/activate + source /app/install/gap9-sdk/configs/gap9_evk_audio.sh || true + export GVSOC_INSTALL_DIR=/app/install/gap9-sdk/install/workstation + export GAP_RISCV_GCC_TOOLCHAIN=/app/install/gcc/gap9 + python testRunner_gap9.py -t ./Tests/Adder + python testRunner_tiled_gap9.py -t ./Tests/Adder + deactivate - name: Clean and Upload CCache uses: actions/cache@v4 with: diff --git a/Container/Dockerfile.Gap9 b/Container/Dockerfile.Gap9 new file mode 100644 index 0000000000..f7c93b66be --- /dev/null +++ b/Container/Dockerfile.Gap9 @@ -0,0 +1,45 @@ +FROM ghcr.io/pulp-platform/deeploy:latest + +ENV GAP_RISCV_GCC_TOOLCHAIN=/app/install/gcc/gap9 +ENV GAP_SDK_HOME=/app/install/gap9-sdk +ENV GAP_RISCV_GCC_TOOLCHAIN=/app/install/gcc/gap9 + +WORKDIR /app + +# Install SSH keys to access private repositories +RUN mkdir -p -m 0700 ~/.ssh && \ + ssh-keyscan iis-git.ee.ethz.ch >> ~/.ssh/known_hosts && \ + ssh-keyscan github.com >> ~/.ssh/known_hosts + +COPY Makefile ./ +COPY toolchain/*.patch toolchain/ + +RUN apt-get update && \ + apt-get upgrade -y && \ + apt-get install -y \ + sudo \ + rsync \ + build-essential \ + g++ \ + python3-dev \ + device-tree-compiler \ + bison \ + flex && \ + rm -rf /var/lib/apt/lists/* + +RUN --mount=type=cache,target=/ccache \ + ccache -z && make gap9-toolchain && \ + rm -rf /app/toolchain/gap9-toolchain + +RUN --mount=type=ssh \ + --mount=type=cache,target=/ccache \ + --mount=type=cache,target=/root/.cache/pip \ + ccache -z && \ + make gap9-sdk && \ + ccache -s && \ + rm -rf /app/toolchain/gap9-sdk && \ + rm -rf /app/install/gap9-sdk/build && \ + rm -rf /app/install/gap9-sdk/.git && \ + rm -rf /app/install/gap9-sdk/nn_menu && \ + find /app/install/gap9-sdk -name "*.o" -delete && \ + find /app/install/gap9-sdk -name "*.a" -not -path "*/lib/*" -delete \ No newline at end of file diff --git a/Container/Dockerfile.toolchain b/Container/Dockerfile.toolchain index c912d47e97..a7f4c828d6 100644 --- a/Container/Dockerfile.toolchain +++ b/Container/Dockerfile.toolchain @@ -119,4 +119,4 @@ RUN rm -rf cmake-* && \ rm -rf toolchain/llvm-project && \ rm -rf toolchain/minimalloc && \ rm -rf toolchain/picolibc && \ - rm -rf toolchain/gap9-toolchain + rm -rf toolchain/gap9-toolchain \ No newline at end of file diff --git a/Deeploy/Targets/GAP9/Bindings.py b/Deeploy/Targets/GAP9/Bindings.py index 73cc1ce03f..0e7b052f46 100644 --- a/Deeploy/Targets/GAP9/Bindings.py +++ b/Deeploy/Targets/GAP9/Bindings.py @@ -1,7 +1,6 @@ # SPDX-FileCopyrightText: 2025 ETH Zurich and University of Bologna # # SPDX-License-Identifier: Apache-2.0 - """ GAP9-specific bindings using cl_dma.h API instead of low-level MCHAN. @@ -12,25 +11,15 @@ import itertools from Deeploy.AbstractDataTypes import PointerClass +from Deeploy.CommonExtensions.CodeTransformationPasses.MemoryAllocation import ArgumentStructGeneration, \ + MemoryManagementGeneration, MemoryPassthroughGeneration from Deeploy.CommonExtensions.DataTypes import FloatDataTypes, IntegerDataTypes, SignedIntegerDataTypes, float32_t, \ int8_t, int32_t, int64_t, uint8_t from Deeploy.DeeployTypes import CodeTransformation, NodeBinding from Deeploy.FutureExtension.Bindings.AutoFutureBinding import AutoFutureBinding -from Deeploy.CommonExtensions.CodeTransformationPasses.MemoryAllocation import ArgumentStructGeneration, \ - MemoryManagementGeneration, MemoryPassthroughGeneration from Deeploy.FutureExtension.CodeTransformationPasses.FutureCodeTransformation import FutureGeneration -from Deeploy.TilingExtension.CodeTransformationPasses.TilingVariableReplacement import TilingVariableReplacement, \ - TilingVariableReplacementUpdate -from Deeploy.Targets.PULPOpen.CodeTransformationPasses.PULPClusterSynch import PULPSynchCoresPass -from Deeploy.Targets.PULPOpen.CodeTransformationPasses.PULPClusterTiling import PULPClusterTiling -from Deeploy.Targets.PULPOpen.CodeTransformationPasses.PULPL3Tiling import PULPL3Tiling -from Deeploy.Targets.PULPOpen.CodeTransformationPasses.PULPProfileUntiled import PULPProfileUntiled -from Deeploy.Targets.PULPOpen.Bindings import TilingCallClosure, ForkClosure, \ - MemoryAwareFunctionCallClosure, L3MemoryAwareFunctionCallClosure, MemoryAwareForkTransformer -from Deeploy.Targets.PULPOpen.DataTypes import PULPDMAFuture -from Deeploy.Targets.GAP9.DMA.MchanDma import GAP9MchanDma from Deeploy.Targets.GAP9.DMA.L3Dma import gap9L3DmaHack - +from Deeploy.Targets.GAP9.DMA.MchanDma import GAP9MchanDma # Import templates from PULPOpen and Generic from Deeploy.Targets.Generic.Templates import AddTemplate, ConcatTemplate, DequantTemplate, FloatReduceMeanTemplate, \ FloatReduceSumTemplate, GatherTemplate, QuantTemplate, RQSiGELUTemplate, SliceTemplate, iHardswishTemplate @@ -38,6 +27,13 @@ GatherChecker, GELUChecker, GEMMChecker, HardswishChecker, LayerNormChecker, MatMulChecker, MulChecker, \ QuantChecker, ReduceMeanChecker, ReluChecker, ReshapeChecker, RQAddChecker, RQHardswishChecker, SGDChecker, \ SliceChecker, SoftmaxChecker, SoftmaxCrossEntropyLossChecker, TransposeChecker +from Deeploy.Targets.PULPOpen.Bindings import ForkClosure, L3MemoryAwareFunctionCallClosure, \ + MemoryAwareForkTransformer, MemoryAwareFunctionCallClosure, TilingCallClosure +from Deeploy.Targets.PULPOpen.CodeTransformationPasses.PULPClusterSynch import PULPSynchCoresPass +from Deeploy.Targets.PULPOpen.CodeTransformationPasses.PULPClusterTiling import PULPClusterTiling +from Deeploy.Targets.PULPOpen.CodeTransformationPasses.PULPL3Tiling import PULPL3Tiling +from Deeploy.Targets.PULPOpen.CodeTransformationPasses.PULPProfileUntiled import PULPProfileUntiled +from Deeploy.Targets.PULPOpen.DataTypes import PULPDMAFuture from Deeploy.Targets.PULPOpen.Templates import ConvTemplate, DMASliceTemplate, FloatAddTemplate, FloatConvTemplate, \ FloatGELUTemplate, FloatGemmTemplate, FloatLayernormTemplate, FloatMatMulTemplate, FloatMaxPoolTemplate, \ FloatMulTemplate, FloatReluTemplate, FloatSoftmaxTemplate, GEMMTemplate, MatrixVectorTemplate, MaxPool2DTemplate, \ @@ -46,7 +42,8 @@ iRMSNormTemplate, iSoftmaxTemplate from Deeploy.Targets.PULPOpen.TypeCheckers import PULPConvChecker, PULPLinearChecker, PULPMaxPoolChecker, \ PULPRequantShiftChecker - +from Deeploy.TilingExtension.CodeTransformationPasses.TilingVariableReplacement import TilingVariableReplacement, \ + TilingVariableReplacementUpdate # GAP9-specific transformer using cl_dma.h API GAP9Transformer = CodeTransformation([ @@ -102,7 +99,6 @@ MemoryPassthroughGeneration(), FutureGeneration()]) - # =============================================================================== # GAP9-specific bindings using ClDma instead of MchanDma # All bindings below use GAP9Transformer or GAP9ClusterTransformer diff --git a/Deeploy/Targets/GAP9/DMA/MchanDma.py b/Deeploy/Targets/GAP9/DMA/MchanDma.py index eec611c986..14e7eb0930 100644 --- a/Deeploy/Targets/GAP9/DMA/MchanDma.py +++ b/Deeploy/Targets/GAP9/DMA/MchanDma.py @@ -10,13 +10,6 @@ class MchanTransferFuture(Future): - """ - Future implementation for GAP9's MCHAN v7 low-level API. - Based on DORY's implementation: https://github.com/pulp-platform/dory - - Uses direct hardware register access for maximum performance. - """ - _initTemplate = NodeTemplate("int ${name} = -1;") _deinitTemplate = NodeTemplate("") @@ -24,31 +17,24 @@ class MchanTransferFuture(Future): _allocTemplate = NodeTemplate("${name} = mchan_transfer_get_id();") _waitTemplate = NodeTemplate(""" -if (${name} >= 0) { - mchan_transfer_wait(${name}); - mchan_transfer_free(${name}); -} -""") + if (${name} >= 0) { + mchan_transfer_wait(${name}); + mchan_transfer_free(${name}); + } + """) class GAP9MchanDma(AsyncDma): - """ - GAP9 Cluster DMA implementation using MCHAN v7 low-level API. - - This implementation follows DORY's approach for GAP9: - - Direct hardware register access for MCHAN v7 - - Manual transfer ID management - - Support for 1D, 2D, and 3D transfers - - Event-based or polled synchronization - - References: - - DORY GAP9: https://github.com/pulp-platform/dory/tree/master/dory/Hardware_targets/PULP/GAP9 - - MCHAN v7 specification in GAP9 documentation - """ _transferTemplates = { - 1: NodeTemplate("{ mchan_transfer_t __mchan_tmp = { .cmd = ${cmd}, .size = ${size}, .loc = ${loc}, .ext = ${ext} }; mchan_transfer_push_1d(__mchan_tmp); }"), - 2: NodeTemplate("{ mchan_transfer_t __mchan_tmp = { .cmd = ${cmd}, .size = ${size}, .loc = ${loc}, .ext = ${ext}, .ext_size_1d = ${size_1d}, .ext_stride_1d = ${stride_2d} }; mchan_transfer_push_2d(__mchan_tmp); }"), + 1: + NodeTemplate( + "{ mchan_transfer_t __mchan_tmp = { .cmd = ${cmd}, .size = ${size}, .loc = ${loc}, .ext = ${ext} }; mchan_transfer_push_1d(__mchan_tmp); }" + ), + 2: + NodeTemplate( + "{ mchan_transfer_t __mchan_tmp = { .cmd = ${cmd}, .size = ${size}, .loc = ${loc}, .ext = ${ext}, .ext_size_1d = ${size_1d}, .ext_stride_1d = ${stride_2d} }; mchan_transfer_push_2d(__mchan_tmp); }" + ), } _waitingStrategy = DirectionWaitingStrategy(MchanTransferFuture, "transfer") diff --git a/Deeploy/Targets/GAP9/Deployer.py b/Deeploy/Targets/GAP9/Deployer.py index 13aaaca4cf..cf7382d0ed 100644 --- a/Deeploy/Targets/GAP9/Deployer.py +++ b/Deeploy/Targets/GAP9/Deployer.py @@ -1,7 +1,6 @@ # SPDX-FileCopyrightText: 2025 ETH Zurich and University of Bologna # # SPDX-License-Identifier: Apache-2.0 - """ GAP9-specific deployer that uses cl_dma.h API. @@ -9,7 +8,7 @@ the GAP9Bindings transformers. """ -from typing import Callable, Dict, List, Type +from typing import Callable, Dict, Type import numpy as np import onnx_graphsurgeon as gs @@ -17,8 +16,8 @@ from Deeploy.AbstractDataTypes import Pointer from Deeploy.CommonExtensions.NetworkDeployers.SignPropDeployer import SignPropDeployer from Deeploy.DeeployTypes import ConstantBuffer, DeploymentPlatform, NodeTemplate, TopologyOptimizer, VariableBuffer +from Deeploy.Targets.GAP9.Bindings import GAP9ClusterTransformer, GAP9SimpleTransformer, GAP9Transformer from Deeploy.Targets.PULPOpen.Deployer import PULPDeployer -from Deeploy.Targets.GAP9.Bindings import GAP9Transformer, GAP9ClusterTransformer, GAP9SimpleTransformer # GAP9-specific L3 RAM allocation and loading templates _GAP9L3AllocTemplate = NodeTemplate(""" @@ -62,7 +61,7 @@ def __init__(self, default_channels_first = default_channels_first, deeployStateDir = deeployStateDir, inputOffsets = inputOffsets) - + # Override transformers to use GAP9-specific ones with ClDma self.Transformer = GAP9Transformer self.ClusterTransformer = GAP9ClusterTransformer @@ -73,8 +72,7 @@ def generateBufferAllocationCode(self) -> str: L3FileStr = "" globalConstBuffers = [ - buf for key, buf in self.ctxt.globalObjects.items() - if isinstance(buf, VariableBuffer) and buf._deploy + buf for key, buf in self.ctxt.globalObjects.items() if isinstance(buf, VariableBuffer) and buf._deploy ] nonArenaBuffers = [buf for buf in globalConstBuffers if buf._users != []] outputBuffNames = [outputBuffer.name for outputBuffer in self.graph.outputs] @@ -94,18 +92,10 @@ def generateBufferAllocationCode(self) -> str: # Allocate L3 RAM space (for constant buffers only) if isinstance(buf, ConstantBuffer): - L3FileStr += _GAP9L3AllocTemplate.generate({ - "locPtr": locPtr, - "extName": extName, - "size": size - }) + L3FileStr += _GAP9L3AllocTemplate.generate({"locPtr": locPtr, "extName": extName, "size": size}) # Load data from ReadFS - L3FileStr += _GAP9L3InitTemplate.generate({ - "locPtr": locPtr, - "extName": extName, - "size": size - }) + L3FileStr += _GAP9L3InitTemplate.generate({"locPtr": locPtr, "extName": extName, "size": size}) retStr = retStr + L3FileStr diff --git a/Deeploy/Targets/GAP9/Platform.py b/Deeploy/Targets/GAP9/Platform.py index 147fc50484..cb37a28e91 100644 --- a/Deeploy/Targets/GAP9/Platform.py +++ b/Deeploy/Targets/GAP9/Platform.py @@ -10,7 +10,19 @@ from Deeploy.MemoryLevelExtension.MemoryLevels import MemoryHierarchy, MemoryLevel from Deeploy.MemoryLevelExtension.NetworkDeployers.MemoryLevelDeployer import MemoryPlatform, MemoryPlatformWrapper from Deeploy.Targets.GAP9.Templates import AllocateTemplate, FreeTemplate -from Deeploy.Targets.Generic.Templates import AllocateTemplate as BasicAllocateTemplate +# Import GAP9-specific tiler bindings +from Deeploy.Targets.GAP9.Tiler import GAP9AddTilingReadyBindings, GAP9ConcatTilingReadyBindings, \ + GAP9Conv2DTilingReadyBindings, GAP9DWConv2DTilingReadyBindings, GAP9FlattenTilingReadyBindings, \ + GAP9FPGELUTilingReadyBindings, GAP9FPGEMMTilingReadyBindings, GAP9GatherTilingReadyBindings, \ + GAP9iHardswishTilingReadyBindings, GAP9iRMSNormTilingReadyBindings, GAP9iRQSGELUTilingReadyBindings, \ + GAP9LayernormTilingReadyBindings, GAP9MatMulTilingReadyBindings, GAP9MaxPool2DTilingReadyBindings, \ + GAP9MulTilingReadyBindings, GAP9ReduceSumTilingReadyBindings, GAP9ReluTilingReadyBindings, \ + GAP9RQAddTilingReadyBindings, GAP9RQSConv2DTilingReadyBindings, GAP9RQSDWConv2DTilingReadyBindings, \ + GAP9RQSGEMMTilingReadyBindings, GAP9RQSiHardswishTilingReadyBindings, GAP9RQSMatrixVecTilingReadyBindings, \ + GAP9RQSTallGEMMTilingReadyBindings, GAP9RQSTilingReadyBindings, GAP9SGDTilingReadyBindings, \ + GAP9SoftmaxCrossEntropyGradTilingReadyBindings, GAP9SoftmaxCrossEntropyTilingReadyBindings, \ + GAP9SoftmaxGradTilingReadyBindings, GAP9SoftmaxTilingReadyBindings, GAP9TransposeTilingReadyBindings, \ + GAP9UniformRQSTilingReadyBindings from Deeploy.Targets.Generic.Bindings import BasicGEMMBindings, BasicPad1DBindings, BasicPad2DBindings, \ BasicRQIntegerDivBinding from Deeploy.Targets.Generic.Layers import AddLayer, ConcatLayer, ConvLayer, GatherLayer, GELULayer, GEMMLayer, \ @@ -24,48 +36,14 @@ RQIntegerDivParser, RQSiGELUParser, RQSiHardswishParser, SGDParser, SliceParser, \ SoftmaxCrossEntropyLossGradParser, SoftmaxCrossEntropyLossParser, SoftmaxGradParser, SoftmaxParser, \ TransposeParser, UniformRequantShiftParser, UnsqueezeParser, iHardswishParser, iRMSNormParser, iSoftmaxParser +from Deeploy.Targets.Generic.Templates import AllocateTemplate as BasicAllocateTemplate from Deeploy.Targets.PULPOpen.Bindings import BasicDequantBindings, BasicQuantBindings, PULPConv1DBinding, \ - PULPDMASliceBindings, PULPDWConv1DBinding, PULPFloatDWConv2DBindings, PULPReduceMeanBindings, PULPSliceBindings + PULPDMASliceBindings, PULPDWConv1DBinding, PULPReduceMeanBindings, PULPSliceBindings from Deeploy.Targets.PULPOpen.Layers import PULPRQSConvLayer, PULPRQSGEMMLayer from Deeploy.Targets.PULPOpen.Parsers import PULPConv1DParser, PULPConv2DParser, PULPDWConv1DParser, \ PULPDWConv2DParser, PULPFPConv2DParser, PULPFPDWConv2DParser, PULPGEMMParser, PULPMatrixVecParser, \ PULPTallGEMMParser -# Import GAP9-specific tiler bindings -from Deeploy.Targets.GAP9.Tiler import ( - GAP9AddTilingReadyBindings, - GAP9ConcatTilingReadyBindings, - GAP9Conv2DTilingReadyBindings, - GAP9FlattenTilingReadyBindings, - GAP9FPGELUTilingReadyBindings, - GAP9FPGEMMTilingReadyBindings, - GAP9GatherTilingReadyBindings, - GAP9iHardswishTilingReadyBindings, - GAP9iRMSNormTilingReadyBindings, - GAP9iRQSGELUTilingReadyBindings, - GAP9LayernormTilingReadyBindings, - GAP9MatMulTilingReadyBindings, - GAP9MaxPool2DTilingReadyBindings, - GAP9MulTilingReadyBindings, - GAP9ReduceSumTilingReadyBindings, - GAP9ReluTilingReadyBindings, - GAP9RQAddTilingReadyBindings, - GAP9RQSConv2DTilingReadyBindings, - GAP9RQSDWConv2DTilingReadyBindings, - GAP9RQSGEMMTilingReadyBindings, - GAP9RQSiHardswishTilingReadyBindings, - GAP9RQSMatrixVecTilingReadyBindings, - GAP9RQSTallGEMMTilingReadyBindings, - GAP9RQSTilingReadyBindings, - GAP9SGDTilingReadyBindings, - GAP9SoftmaxCrossEntropyGradTilingReadyBindings, - GAP9SoftmaxCrossEntropyTilingReadyBindings, - GAP9SoftmaxGradTilingReadyBindings, - GAP9SoftmaxTilingReadyBindings, - GAP9TransposeTilingReadyBindings, - GAP9UniformRQSTilingReadyBindings, -) - # Create GAP9-specific NodeMappers GAP9_RQAddMapper = NodeMapper(RQAddParser(), GAP9RQAddTilingReadyBindings) GAP9_AddMapper = NodeMapper(AddParser(), GAP9AddTilingReadyBindings) @@ -89,7 +67,7 @@ GAP9_DWConv1DMapper = NodeMapper(PULPDWConv1DParser(), [PULPDWConv1DBinding]) GAP9_FPConv2DMapper = NodeMapper(PULPFPConv2DParser(), GAP9Conv2DTilingReadyBindings) GAP9_Conv2DMapper = NodeMapper(PULPConv2DParser(), GAP9RQSConv2DTilingReadyBindings) -GAP9_FPDWConv2DMapper = NodeMapper(PULPFPDWConv2DParser(), PULPFloatDWConv2DBindings) +GAP9_FPDWConv2DMapper = NodeMapper(PULPFPDWConv2DParser(), GAP9DWConv2DTilingReadyBindings) GAP9_DWConv2DMapper = NodeMapper(PULPDWConv2DParser(), GAP9RQSDWConv2DTilingReadyBindings) GAP9_GEMMMapper = NodeMapper(PULPGEMMParser(), GAP9RQSGEMMTilingReadyBindings) GAP9_FloatGEMMMapper = NodeMapper(GEMMParser(), GAP9FPGEMMTilingReadyBindings) @@ -118,44 +96,82 @@ # GAP9-specific mapping using ClDma GAP9Mapping = { - 'Conv': ConvLayer([GAP9_FPConv2DMapper, GAP9_FPDWConv2DMapper]), - 'RequantizedConv': PULPRQSConvLayer([GAP9_Conv2DMapper, GAP9_DWConv2DMapper, GAP9_Conv1DMapper, GAP9_DWConv1DMapper]), - 'RequantizedGemm': PULPRQSGEMMLayer([GAP9_MatrixVecMapper, GAP9_TallGEMMMapper, GAP9_GEMMMapper]), - 'Gemm': GEMMLayer([GAP9_FloatGEMMMapper, GAP9_GEMMDequantMapper]), - 'Gelu': GELULayer([GAP9_GELUMapper]), - 'LayerNormalization': LayerNormLayer([GAP9_LayerNormMapper]), - 'MaxPool': MaxPoolLayer([GAP9_MaxPool2DMapper]), - 'RequantizediGELU': RQSiGELULayer([GAP9_RQGELU_int8_Mapper]), - 'RQIntegerDiv': RQIntegerDivLayer([GAP9_RQIntegerDivMapper]), - 'MatMul': MatMulLayer([GAP9_MatMulMapper]), - 'IntegerMean': ReduceMeanLayer([GAP9_ReduceMeanMapper]), - 'iSoftmax': SoftmaxLayer([GAP9_Softmax_int8_Mapper]), - 'Softmax': SoftmaxLayer([GAP9_SoftmaxMapper]), - 'ReduceMean': ReduceMeanLayer([GAP9_ReduceMeanMapper]), - 'ReduceSum': ReduceSumLayer([GAP9_ReduceSumMapper]), - 'RequantShift': RequantShiftLayer([GAP9_UniformRequantShiftMapper, GAP9_RequantShiftMapper]), - 'Add': AddLayer([GAP9_AddMapper]), - 'Flatten': ReshapeLayer([GAP9_FlattenMapper]), - 'Gather': GatherLayer([GAP9_GatherMapper]), - 'Mul': MulLayer([GAP9_MulMapper]), - 'Pad': PadLayer([GAP9_Pad1DMapper, GAP9_Pad2DMapper]), - 'Relu': ReluLayer([GAP9_ReluMapper]), - 'Reshape': ReshapeLayer([GAP9_ReshapeMapper]), - 'Squeeze': ReshapeLayer([GAP9_UnsqueezeMapper]), - 'Transpose': TransposeLayer([GAP9_TransposeMapper]), - 'Unsqueeze': ReshapeLayer([GAP9_UnsqueezeMapper]), - 'Slice': SliceLayer([GAP9_SliceMapper, GAP9_DMASliceMapper]), - 'RequantizedAdd': AddLayer([GAP9_RQAddMapper]), - 'Concat': ConcatLayer([GAP9_ConcatMapper]), - 'iRMSNorm': iRMSNormLayer([GAP9_iRMSNormMapper]), - 'iHardswish': iHardswishLayer([GAP9_iHardswishMapper]), - 'RequantizediHardswish': RQSiHardswishLayer([GAP9_RQSiHardswishMapper]), - 'Quant': QuantLayer([GAP9_QuantMapper]), - 'Dequant': QuantLayer([GAP9_DequantMapper]), - 'SoftmaxGrad': SoftmaxGradLayer([GAP9_SoftmaxGradMapper]), - 'SoftmaxCrossEntropyLoss': SoftmaxCrossEntropyLossLayer([GAP9_SoftmaxCrossEntropyLossMapper]), - 'SoftmaxCrossEntropyLossGrad': SoftmaxCrossEntropyLossGradLayer([GAP9_SoftmaxCrossEntropyLossGradMapper]), - 'SGD': SGDLayer([GAP9_SGDMapper]) + 'Conv': + ConvLayer([GAP9_FPConv2DMapper, GAP9_FPDWConv2DMapper]), + 'RequantizedConv': + PULPRQSConvLayer([GAP9_Conv2DMapper, GAP9_DWConv2DMapper, GAP9_Conv1DMapper, GAP9_DWConv1DMapper]), + 'RequantizedGemm': + PULPRQSGEMMLayer([GAP9_MatrixVecMapper, GAP9_TallGEMMMapper, GAP9_GEMMMapper]), + 'Gemm': + GEMMLayer([GAP9_FloatGEMMMapper, GAP9_GEMMDequantMapper]), + 'Gelu': + GELULayer([GAP9_GELUMapper]), + 'LayerNormalization': + LayerNormLayer([GAP9_LayerNormMapper]), + 'MaxPool': + MaxPoolLayer([GAP9_MaxPool2DMapper]), + 'RequantizediGELU': + RQSiGELULayer([GAP9_RQGELU_int8_Mapper]), + 'RQIntegerDiv': + RQIntegerDivLayer([GAP9_RQIntegerDivMapper]), + 'MatMul': + MatMulLayer([GAP9_MatMulMapper]), + 'IntegerMean': + ReduceMeanLayer([GAP9_ReduceMeanMapper]), + 'iSoftmax': + SoftmaxLayer([GAP9_Softmax_int8_Mapper]), + 'Softmax': + SoftmaxLayer([GAP9_SoftmaxMapper]), + 'ReduceMean': + ReduceMeanLayer([GAP9_ReduceMeanMapper]), + 'ReduceSum': + ReduceSumLayer([GAP9_ReduceSumMapper]), + 'RequantShift': + RequantShiftLayer([GAP9_UniformRequantShiftMapper, GAP9_RequantShiftMapper]), + 'Add': + AddLayer([GAP9_AddMapper]), + 'Flatten': + ReshapeLayer([GAP9_FlattenMapper]), + 'Gather': + GatherLayer([GAP9_GatherMapper]), + 'Mul': + MulLayer([GAP9_MulMapper]), + 'Pad': + PadLayer([GAP9_Pad1DMapper, GAP9_Pad2DMapper]), + 'Relu': + ReluLayer([GAP9_ReluMapper]), + 'Reshape': + ReshapeLayer([GAP9_ReshapeMapper]), + 'Squeeze': + ReshapeLayer([GAP9_UnsqueezeMapper]), + 'Transpose': + TransposeLayer([GAP9_TransposeMapper]), + 'Unsqueeze': + ReshapeLayer([GAP9_UnsqueezeMapper]), + 'Slice': + SliceLayer([GAP9_SliceMapper, GAP9_DMASliceMapper]), + 'RequantizedAdd': + AddLayer([GAP9_RQAddMapper]), + 'Concat': + ConcatLayer([GAP9_ConcatMapper]), + 'iRMSNorm': + iRMSNormLayer([GAP9_iRMSNormMapper]), + 'iHardswish': + iHardswishLayer([GAP9_iHardswishMapper]), + 'RequantizediHardswish': + RQSiHardswishLayer([GAP9_RQSiHardswishMapper]), + 'Quant': + QuantLayer([GAP9_QuantMapper]), + 'Dequant': + QuantLayer([GAP9_DequantMapper]), + 'SoftmaxGrad': + SoftmaxGradLayer([GAP9_SoftmaxGradMapper]), + 'SoftmaxCrossEntropyLoss': + SoftmaxCrossEntropyLossLayer([GAP9_SoftmaxCrossEntropyLossMapper]), + 'SoftmaxCrossEntropyLossGrad': + SoftmaxCrossEntropyLossGradLayer([GAP9_SoftmaxCrossEntropyLossGradMapper]), + 'SGD': + SGDLayer([GAP9_SGDMapper]) } @@ -229,17 +245,17 @@ class GAP9StructBuffer(StructBuffer): # SCHEREMO: stdint is included before pulp_nn_kernels.h because it is supposed to be included in there, but isn't... -_includeList = [ - "pmsis.h", - "DeeployGAP9Math.h", - "pulp_nn_kernels.h", - "DeeployMchan.h" -] +_includeList = ["pmsis.h", "DeeployGAP9Math.h", "pulp_nn_kernels.h", "DeeployMchan.h"] class GAP9ClusterEngine(DeploymentEngine): - def __init__(self, name: str, Mapping = GAP9Mapping, initCode = "", includeList = _includeList, n_cores: int = 8) -> None: + def __init__(self, + name: str, + Mapping = GAP9Mapping, + initCode = "", + includeList = _includeList, + n_cores: int = 8) -> None: super().__init__(name, Mapping, initCode, includeList) self.n_cores = n_cores diff --git a/Deeploy/Targets/GAP9/Tiler.py b/Deeploy/Targets/GAP9/Tiler.py index 32676df5e6..fefe12b6d7 100644 --- a/Deeploy/Targets/GAP9/Tiler.py +++ b/Deeploy/Targets/GAP9/Tiler.py @@ -1,7 +1,6 @@ # SPDX-FileCopyrightText: 2025 ETH Zurich and University of Bologna # # SPDX-License-Identifier: Apache-2.0 - """ GAP9-specific tiler bindings using ClDma instead of MchanDma. @@ -11,6 +10,14 @@ import copy +from Deeploy.Targets.GAP9.Bindings import GAP9AddBindings, GAP9ConcatBindings, GAP9FloatConv2DBindings, \ + GAP9FloatDWConv2DBindings, GAP9FloatGELUBinding, GAP9FloatGEMMBindings, GAP9GatherBindings, \ + GAP9iHardswishBindings, GAP9iRMSNormBindings, GAP9iRQSGELUBindings, GAP9LayernormBinding, GAP9MatMulBindings, \ + GAP9MaxPool2DBindings, GAP9MulBindings, GAP9ReduceSumBindings, GAP9ReluBinding, GAP9ReshapeBindings, \ + GAP9RQAddBindings, GAP9RQSBindings, GAP9RQSConv2DBindings, GAP9RQSDWConv2DBindings, GAP9RQSGEMMBindings, \ + GAP9RQSiHardswishBindings, GAP9RQSMatrixVecBindings, GAP9RQSTallGEMMBindings, GAP9SGDBindings, \ + GAP9SoftmaxBindings, GAP9SoftmaxCrossEntropyLossBindings, GAP9SoftmaxCrossEntropyLossGradBindings, \ + GAP9SoftmaxGradBindings, GAP9TransposeBindings, GAP9UniformRQSBindings from Deeploy.Targets.Generic.TileConstraints.AddTileConstraint import AddTileConstraint from Deeploy.Targets.Generic.TileConstraints.ConcatTileConstraint import ConcatTileConstraint from Deeploy.Targets.Generic.TileConstraints.iHardswishTileConstraint import iHardswishTileConstraint @@ -22,40 +29,6 @@ from Deeploy.Targets.Generic.TileConstraints.TransposeTileConstraint import TransposeTileConstraint from Deeploy.Targets.Generic.TileConstraints.UnaryTileConstraint import UnaryTileConstraint from Deeploy.Targets.Generic.TileConstraints.UntiledTileConstraint import UntiledTileConstraint -from Deeploy.Targets.GAP9.Bindings import ( - GAP9AddBindings, - GAP9ConcatBindings, - GAP9FloatConv2DBindings, - GAP9FloatGELUBinding, - GAP9FloatGEMMBindings, - GAP9GatherBindings, - GAP9iHardswishBindings, - GAP9iRMSNormBindings, - GAP9iRQSGELUBindings, - GAP9LayernormBinding, - GAP9MatMulBindings, - GAP9MaxPool2DBindings, - GAP9MulBindings, - GAP9ReduceSumBindings, - GAP9ReluBinding, - GAP9ReshapeBindings, - GAP9RQAddBindings, - GAP9RQSBindings, - GAP9RQSConv2DBindings, - GAP9RQSDWConv2DBindings, - GAP9RQSGEMMBindings, - GAP9RQSiHardswishBindings, - GAP9RQSMatrixVecBindings, - GAP9RQSTallGEMMBindings, - GAP9SGDBindings, - GAP9SoftmaxBindings, - GAP9SoftmaxCrossEntropyLossBindings, - GAP9SoftmaxCrossEntropyLossGradBindings, - GAP9SoftmaxGradBindings, - GAP9TransposeBindings, - GAP9UniformRQSBindings, - GAP9FloatDWConv2DBindings -) from Deeploy.Targets.PULPOpen.TileConstraints.ConvTileConstraint import Conv2DTileConstraint, RQConv2DTileConstraint from Deeploy.Targets.PULPOpen.TileConstraints.DWConvTileConstraint import DWConv2DTileConstraint, \ RQDWConv2DTileConstraint diff --git a/Deeploy/Targets/PULPOpen/Deployer.py b/Deeploy/Targets/PULPOpen/Deployer.py index 4162c4e9a2..0828cb392e 100644 --- a/Deeploy/Targets/PULPOpen/Deployer.py +++ b/Deeploy/Targets/PULPOpen/Deployer.py @@ -13,9 +13,9 @@ from Deeploy.CommonExtensions.OptimizationPasses.TopologyOptimizationPasses.LoweringOptimizationPasses import \ PULPNCHWtoNHWCPass, RemoveGlobalOutputReshapePass, TransposeMatmulInputsPass from Deeploy.DeeployTypes import ConstantBuffer, DeploymentPlatform, NodeTemplate, TopologyOptimizer, VariableBuffer +from Deeploy.Targets.GAP9.Platform import GAP9ClusterEngine from Deeploy.Targets.Generic.TopologyOptimizationPasses.Passes import ReshapeConstOptPass, TransposeConstOptPass, \ TransposeMergePass, TransposeNoPermOptPass, TransposeSplitPass -from Deeploy.Targets.GAP9.Platform import GAP9ClusterEngine from Deeploy.Targets.PULPOpen.Platform import PULPClusterEngine from Deeploy.Targets.PULPOpen.TopologyOptimizationPasses.Passes import RQAddTransposeSquashPass diff --git a/DeeployTest/Platforms/GAP9/CMakeLists.txt b/DeeployTest/Platforms/GAP9/CMakeLists.txt index b1d32659f6..0a7fde9c00 100644 --- a/DeeployTest/Platforms/GAP9/CMakeLists.txt +++ b/DeeployTest/Platforms/GAP9/CMakeLists.txt @@ -4,8 +4,6 @@ set(ProjectId ${TESTNAME}) -# set($ENV{KCONFIG_CONFIG} ${CMAKE_CURRENT_LIST_DIR}/sdk.config) -# set(${SDKCONFIG_DIR} ${CMAKE_CURRENT_LIST_DIR}) set(${SDKCONFIG_FILE} ${CMAKE_CURRENT_LIST_DIR}/sdk.config) diff --git a/DeeployTest/output.txt b/DeeployTest/output.txt deleted file mode 100644 index 2152566c73..0000000000 --- a/DeeployTest/output.txt +++ /dev/null @@ -1,869 +0,0 @@ --- Building for platform 'GAP9' --- [SDK] Version: 5.20.4 --- [Platform] GVSoC --- [OS] FreeRTOS (Scheduler v2) --- [Printf] Semihost --- [Board] GAP Family : 9 --- [Board] GAP Version : 2 --- ============================= Project Configuration ============================ --- [Deeploy] platform = GAP9 --- [Deeploy] use_dma = --- ================================================================================ --- --- ==== HEXLIST ==== --- HEXLIST file: /app/Deeploy/DeeployTest/TEST_GAP9/Tests/testFloatMatmul/hex/0.hex --- HEXLIST file: /app/Deeploy/DeeployTest/TEST_GAP9/Tests/testFloatMatmul/hex/1.hex --- GAPY_RUNNER_ARGS: --flash-property=/app/Deeploy/DeeployTest/TEST_GAP9/Tests/testFloatMatmul/hex/0.hex@flash:readfs_flash:file;--flash-property=/app/Deeploy/DeeployTest/TEST_GAP9/Tests/testFloatMatmul/hex/1.hex@flash:readfs_flash:file --- [Deeploy GAP9] L3 mode: using gapy with readfs --- [Deeploy GAP9] Adding readfs files: --flash-property=/app/Deeploy/DeeployTest/TEST_GAP9/Tests/testFloatMatmul/hex/0.hex@flash:readfs_flash:file;--flash-property=/app/Deeploy/DeeployTest/TEST_GAP9/Tests/testFloatMatmul/hex/1.hex@flash:readfs_flash:file --- [Deeploy GAP9] GAPY_CMD = /app/install/gap9-sdk/utils/gapy_v2/bin/gapy --target=gap9.evk --target-dir=/app/install/gap9-sdk/install/workstation/generators --model-dir=/app/install/gap9-sdk/install/workstation/models --platform=gvsoc --work-dir=/app/Deeploy/DeeployTest/TEST_GAP9/build/gvsoc_workdir --target-property=boot.flash_device=mram --target-property=boot.mode=flash --multi-flash-content=/app/install/gap9-sdk/utils/layouts/default_layout_multi_readfs.json --flash-property=/app/Deeploy/DeeployTest/TEST_GAP9/build/testFloatMatmul@mram:app:binary --flash-property=/app/Deeploy/DeeployTest/TEST_GAP9/Tests/testFloatMatmul/hex/0.hex@flash:readfs_flash:file --flash-property=/app/Deeploy/DeeployTest/TEST_GAP9/Tests/testFloatMatmul/hex/1.hex@flash:readfs_flash:file --flash-property=/app/install/gap9-sdk/install/target/bin/fsbl@mram:fsbl:binary --flash-property=/app/install/gap9-sdk/install/target/bin/ssbl@mram:ssbl:binary --py-stack image flash run --binary=/app/Deeploy/DeeployTest/TEST_GAP9/build/testFloatMatmul --- [Log] none --- [PULP-NN] pmsis target exists, extracting properties... --- [PULP-NN] PMSIS_INCLUDES: /app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/maestro/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/i2s/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/efuse/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/fll/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/cluster/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/udma_core/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/timer/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/fc_event/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/pad/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/gpio/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/ffc/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/perf/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/watchdog/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/i2c/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/i2s/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/i3c/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/udma_datamove/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/spim/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/udma_timeout/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/udma_timestamp/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/dmacpy/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/pwm/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/rtc/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/xip/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/udma_hyperbus/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/udma_octospi/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/udma_aes/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/udma_aes_dual_core/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/udma_cpi/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/udma_csi2/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/udma_uart/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/udma_fifo/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/udma_sdio/include;/app/install/gap9-sdk/rtos/pmsis/implem/chips/gap9/quiddikey/include;/app/install/gap9-sdk/rtos/pmsis/implem/include;/app/install/gap9-sdk/rtos/pmsis/implem/rtos/include;/app/install/gap9-sdk/rtos/pmsis/bsp/boards/include;/app/install/gap9-sdk/rtos/pmsis/bsp/buffer;/app/install/gap9-sdk/rtos/pmsis/bsp/crc/crc32/include;/app/install/gap9-sdk/rtos/pmsis/bsp/crc/include;/app/install/gap9-sdk/rtos/pmsis/bsp/flash/api/include;/app/install/gap9-sdk/rtos/pmsis/bsp/flash/mram/include;/app/install/gap9-sdk/rtos/pmsis/bsp/flash/mx25u51245g/include;/app/install/gap9-sdk/rtos/pmsis/bsp/flash/include;/app/install/gap9-sdk/rtos/pmsis/bsp/powersupply/api/include;/app/install/gap9-sdk/rtos/pmsis/bsp/powersupply/powersupplygpio/include;/app/install/gap9-sdk/rtos/pmsis/bsp/powersupply/include;/app/install/gap9-sdk/rtos/pmsis/bsp/ram/api/include;/app/install/gap9-sdk/rtos/pmsis/bsp/ram/aps256xxn/include;/app/install/gap9-sdk/rtos/pmsis/bsp/ram/include;/app/install/gap9-sdk/rtos/pmsis/bsp/include;/app/Deeploy/DeeployTest/TEST_GAP9/build/devicetree/internal/include;/app/Deeploy/DeeployTest/TEST_GAP9/build/devicetree/include;/app/Deeploy/DeeployTest/TEST_GAP9/build/devicetree/fpv2/include;/app/install/gap9-sdk/rtos/pmsis/include --- [PULP-NN] PMSIS_COMPILE_OPTIONS: -D__GAP__;-D__riscv__;-D__RISCV_ARCH_GAP__=1;-D__USE_TCDM_MALLOC__=1;-D__FC_MALLOC_NATIVE__=0;-D__L2_MALLOC_NATIVE__=0;-D__PMSIS_L2_MALLOC_NATIVE__=0;-DPMSIS_DRIVERS=1;-DFEATURE_CLUSTER;-DGAP_SDK_VERSION=5.20.4;-D__PLATFORM_GVSOC__;-D__PLATFORM__=ARCHI_PLATFORM_GVSOC;-D__FREERTOS__;-DSCHEDULER_V2;-DSCHEDULER_V3;-D__SEMIHOSTING__;-DPRINTF_SEMIHOST;-D__GAP_DRIVER_READFS__=1 --- [PULP-NN] Added PMSIS includes to pulp-nn-mixed --- ============================= Simulation Configuration ============================ --- [Simulator] QuestaSim = questa-2022.3 --- [Simulator] Verilator = verilator-4.110 --- [Simulator] VCS = vcs-2020.12 --- [Simulator] banshee_simulation = OFF --- [Simulator] banshee_configuration = --- [Simulator] gvsoc_simulation = ON --- [Simulator] banshee_stack_size = 16777216 --- [Simulator] num_threads = 1 --- ================================================================================ --- --- Configuring done --- Generating done --- Build files have been written to: /app/Deeploy/DeeployTest/TEST_GAP9/build -Consolidate compiler generated dependencies of target pmsis_printf -[ 0%] Built target pmsis_printf -Consolidate compiler generated dependencies of target pulp_allocator -[ 0%] Built target pulp_allocator -Consolidate compiler generated dependencies of target freertos_libs -[ 0%] Built target freertos_libs -Consolidate compiler generated dependencies of target fll_pmu_lib -[ 1%] Built target fll_pmu_lib -Scanning dependencies of target pmsis -Consolidate compiler generated dependencies of target pmsis -[ 1%] Building C object pmsis/CMakeFiles/pmsis.dir/implem/utils/gap_io.c.obj -[ 1%] Building C object pmsis/CMakeFiles/pmsis.dir/bsp/bsp/bsp.c.obj -[ 1%] Building C object pmsis/CMakeFiles/pmsis.dir/bsp/fs/read_fs/read_fs.c.obj -[ 2%] Building C object pmsis/CMakeFiles/pmsis.dir/bsp/partition/flash_partition_v2.c.obj -[ 2%] Building C object pmsis/CMakeFiles/pmsis.dir/bsp/partition/secret_storage.c.obj -[ 2%] Building C object pmsis/CMakeFiles/pmsis.dir/__/devicetree/internal/devicetree_internal.c.obj -[ 2%] Building C object pmsis/CMakeFiles/pmsis.dir/__/devicetree/src/dt.c.obj -[ 2%] Building C object pmsis/CMakeFiles/pmsis.dir/__/devicetree/fpv2/devicetree_fpv2.c.obj -[ 2%] Linking C static library ../lib/libpmsis.a -[ 6%] Built target pmsis -Scanning dependencies of target pmsis_backend -Consolidate compiler generated dependencies of target pmsis_backend -[ 7%] Built target pmsis_backend -Scanning dependencies of target freertos -Consolidate compiler generated dependencies of target freertos -[ 9%] Built target freertos -Consolidate compiler generated dependencies of target pulp-nn-mixed -[ 9%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_i2_i2.c.obj -[ 10%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_i2_i4.c.obj -[ 10%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_i2_i8.c.obj -[ 10%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_i2_u2.c.obj -[ 10%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_i2_u4.c.obj -[ 10%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_i2_u8.c.obj -[ 10%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_i4_i2.c.obj -[ 10%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_i4_i4.c.obj -[ 10%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_i4_i8.c.obj -[ 10%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_i4_u2.c.obj -[ 11%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_i4_u4.c.obj -[ 11%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_i4_u8.c.obj -[ 11%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_i8_i2.c.obj -[ 11%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_i8_i4.c.obj -[ 11%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_i8_i8.c.obj -[ 11%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_i8_u2.c.obj -[ 11%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_i8_u4.c.obj -[ 11%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_i8_u8.c.obj -[ 11%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_u2_i2.c.obj -[ 12%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_u2_i4.c.obj -[ 12%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_u2_i8.c.obj -[ 12%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_u2_u2.c.obj -[ 12%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_u2_u4.c.obj -[ 12%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_u2_u8.c.obj -[ 12%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_u4_i2.c.obj -[ 12%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_u4_i4.c.obj -[ 12%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_u4_i8.c.obj -[ 12%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_u4_u2.c.obj -[ 13%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_u4_u4.c.obj -[ 13%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_u4_u8.c.obj -[ 13%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_u8_i2.c.obj -[ 13%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_u8_i4.c.obj -[ 13%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_u8_i8.c.obj -[ 13%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_u8_u2.c.obj -[ 13%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_u8_u4.c.obj -[ 13%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i2_u8_u8.c.obj -[ 13%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_i2_i2.c.obj -[ 14%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_i2_i4.c.obj -[ 14%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_i2_i8.c.obj -[ 14%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_i2_u2.c.obj -[ 14%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_i2_u4.c.obj -[ 14%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_i2_u8.c.obj -[ 14%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_i4_i2.c.obj -[ 14%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_i4_i4.c.obj -[ 14%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_i4_i8.c.obj -[ 14%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_i4_u2.c.obj -[ 15%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_i4_u4.c.obj -[ 15%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_i4_u8.c.obj -[ 15%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_i8_i2.c.obj -[ 15%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_i8_i4.c.obj -[ 15%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_i8_i8.c.obj -[ 15%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_i8_u2.c.obj -[ 15%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_i8_u4.c.obj -[ 15%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_i8_u8.c.obj -[ 15%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_u2_i2.c.obj -[ 16%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_u2_i4.c.obj -[ 16%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_u2_i8.c.obj -[ 16%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_u2_u2.c.obj -[ 16%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_u2_u4.c.obj -[ 16%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_u2_u8.c.obj -[ 16%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_u4_i2.c.obj -[ 16%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_u4_i4.c.obj -[ 16%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_u4_i8.c.obj -[ 16%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_u4_u2.c.obj -[ 17%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_u4_u4.c.obj -[ 17%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_u4_u8.c.obj -[ 17%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_u8_i2.c.obj -[ 17%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_u8_i4.c.obj -[ 17%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_u8_i8.c.obj -[ 17%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_u8_u2.c.obj -[ 17%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_u8_u4.c.obj -[ 17%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i4_u8_u8.c.obj -[ 17%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_i2_i2.c.obj -[ 18%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_i2_i4.c.obj -[ 18%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_i2_i8.c.obj -[ 18%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_i2_u2.c.obj -[ 18%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_i2_u4.c.obj -[ 18%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_i2_u8.c.obj -[ 18%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_i4_i2.c.obj -[ 18%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_i4_i4.c.obj -[ 18%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_i4_i8.c.obj -[ 18%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_i4_u2.c.obj -[ 19%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_i4_u4.c.obj -[ 19%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_i4_u8.c.obj -[ 19%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_i8_i2.c.obj -[ 19%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_i8_i4.c.obj -[ 19%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_i8_i8.c.obj -[ 19%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_i8_u2.c.obj -[ 19%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_i8_u4.c.obj -[ 19%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_i8_u8.c.obj -[ 19%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_u2_i2.c.obj -[ 20%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_u2_i4.c.obj -[ 20%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_u2_i8.c.obj -[ 20%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_u2_u2.c.obj -[ 20%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_u2_u4.c.obj -[ 20%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_u2_u8.c.obj -[ 20%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_u4_i2.c.obj -[ 20%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_u4_i4.c.obj -[ 20%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_u4_i8.c.obj -[ 20%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_u4_u2.c.obj -[ 21%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_u4_u4.c.obj -[ 21%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_u4_u8.c.obj -[ 21%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_u8_i2.c.obj -[ 21%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_u8_i4.c.obj -[ 21%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_u8_i8.c.obj -[ 21%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_u8_u2.c.obj -[ 21%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_u8_u4.c.obj -[ 21%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_i8_u8_u8.c.obj -[ 21%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_i2_i2.c.obj -[ 22%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_i2_i4.c.obj -[ 22%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_i2_i8.c.obj -[ 22%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_i2_u2.c.obj -[ 22%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_i2_u4.c.obj -[ 22%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_i2_u8.c.obj -[ 22%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_i4_i2.c.obj -[ 22%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_i4_i4.c.obj -[ 22%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_i4_i8.c.obj -[ 22%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_i4_u2.c.obj -[ 23%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_i4_u4.c.obj -[ 23%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_i4_u8.c.obj -[ 23%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_i8_i2.c.obj -[ 23%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_i8_i4.c.obj -[ 23%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_i8_i8.c.obj -[ 23%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_i8_u2.c.obj -[ 23%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_i8_u4.c.obj -[ 23%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_i8_u8.c.obj -[ 23%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_u2.c.obj -[ 24%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_u2_i2.c.obj -[ 24%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_u2_i4.c.obj -[ 24%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_u2_i8.c.obj -[ 24%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_u2_u2.c.obj -[ 24%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_u2_u4.c.obj -[ 24%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_u2_u8.c.obj -[ 24%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_u4_i2.c.obj -[ 24%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_u4_i4.c.obj -[ 24%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_u4_i8.c.obj -[ 25%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_u4_u2.c.obj -[ 25%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_u4_u4.c.obj -[ 25%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_u4_u8.c.obj -[ 25%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_u8_i2.c.obj -[ 25%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_u8_i4.c.obj -[ 25%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_u8_i8.c.obj -[ 25%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_u8_u2.c.obj -[ 25%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_u8_u4.c.obj -[ 25%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u2_u8_u8.c.obj -[ 26%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_i2_i2.c.obj -[ 26%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_i2_i4.c.obj -[ 26%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_i2_i8.c.obj -[ 26%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_i2_u2.c.obj -[ 26%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_i2_u4.c.obj -[ 26%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_i2_u8.c.obj -[ 26%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_i4_i2.c.obj -[ 26%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_i4_i4.c.obj -[ 26%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_i4_i8.c.obj -[ 27%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_i4_u2.c.obj -[ 27%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_i4_u4.c.obj -[ 27%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_i4_u8.c.obj -[ 27%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_i8_i2.c.obj -[ 27%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_i8_i4.c.obj -[ 27%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_i8_i8.c.obj -[ 27%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_i8_u2.c.obj -[ 27%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_i8_u4.c.obj -[ 27%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_i8_u8.c.obj -[ 28%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_u2.c.obj -[ 28%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_u2_i2.c.obj -[ 28%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_u2_i4.c.obj -[ 28%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_u2_i8.c.obj -[ 28%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_u2_u2.c.obj -[ 28%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_u2_u4.c.obj -[ 28%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_u2_u8.c.obj -[ 28%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_u4.c.obj -[ 28%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_u4_i2.c.obj -[ 29%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_u4_i4.c.obj -[ 29%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_u4_i8.c.obj -[ 29%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_u4_u2.c.obj -[ 29%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_u4_u4.c.obj -[ 29%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_u4_u8.c.obj -[ 29%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_u8_i2.c.obj -[ 29%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_u8_i4.c.obj -[ 29%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_u8_i8.c.obj -[ 29%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_u8_u2.c.obj -[ 30%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_u8_u4.c.obj -[ 30%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u4_u8_u8.c.obj -[ 30%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_i2_i2.c.obj -[ 30%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_i2_i4.c.obj -[ 30%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_i2_i8.c.obj -[ 30%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_i2_u2.c.obj -[ 30%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_i2_u4.c.obj -[ 30%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_i2_u8.c.obj -[ 30%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_i4_i2.c.obj -[ 31%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_i4_i4.c.obj -[ 31%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_i4_i8.c.obj -[ 31%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_i4_u2.c.obj -[ 31%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_i4_u4.c.obj -[ 31%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_i4_u8.c.obj -[ 31%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_i8_i2.c.obj -[ 31%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_i8_i4.c.obj -[ 31%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_i8_i8.c.obj -[ 31%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_i8_u2.c.obj -[ 32%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_i8_u4.c.obj -[ 32%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_i8_u8.c.obj -[ 32%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_u2.c.obj -[ 32%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_u2_i2.c.obj -[ 32%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_u2_i4.c.obj -[ 32%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_u2_i8.c.obj -[ 32%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_u2_u2.c.obj -[ 32%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_u2_u4.c.obj -[ 32%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_u2_u8.c.obj -[ 33%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_u4.c.obj -[ 33%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_u4_i2.c.obj -[ 33%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_u4_i4.c.obj -[ 33%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_u4_i8.c.obj -[ 33%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_u4_u2.c.obj -[ 33%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_u4_u4.c.obj -[ 33%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_u4_u8.c.obj -[ 33%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_u8.c.obj -[ 33%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_u8_i2.c.obj -[ 34%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_u8_i4.c.obj -[ 34%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_u8_i8.c.obj -[ 34%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_u8_u2.c.obj -[ 34%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_u8_u4.c.obj -[ 34%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Add/pulp_nn_add_u8_u8_u8.c.obj -[ 34%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i2_i2_i2.c.obj -[ 34%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i2_i2_i4.c.obj -[ 34%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i2_i2_i8.c.obj -[ 34%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i2_i4_i2.c.obj -[ 35%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i2_i4_i4.c.obj -[ 35%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i2_i4_i8.c.obj -[ 35%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i2_i8_i2.c.obj -[ 35%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i2_i8_i4.c.obj -[ 35%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i2_i8_i8.c.obj -[ 35%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i2_u2_i2.c.obj -[ 35%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i2_u2_i4.c.obj -[ 35%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i2_u2_i8.c.obj -[ 35%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i2_u4_i2.c.obj -[ 36%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i2_u4_i4.c.obj -[ 36%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i2_u4_i8.c.obj -[ 36%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i2_u8_i2.c.obj -[ 36%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i2_u8_i4.c.obj -[ 36%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i2_u8_i8.c.obj -[ 36%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i4_i2_i2.c.obj -[ 36%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i4_i2_i4.c.obj -[ 36%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i4_i2_i8.c.obj -[ 36%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i4_i4_i2.c.obj -[ 37%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i4_i4_i4.c.obj -[ 37%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i4_i4_i8.c.obj -[ 37%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i4_i8_i2.c.obj -[ 37%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i4_i8_i4.c.obj -[ 37%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i4_i8_i8.c.obj -[ 37%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i4_u2_i2.c.obj -[ 37%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i4_u2_i4.c.obj -[ 37%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i4_u2_i8.c.obj -[ 37%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i4_u4_i2.c.obj -[ 38%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i4_u4_i4.c.obj -[ 38%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i4_u4_i8.c.obj -[ 38%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i4_u8_i2.c.obj -[ 38%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i4_u8_i4.c.obj -[ 38%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i4_u8_i8.c.obj -[ 38%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i8_i2_i2.c.obj -[ 38%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i8_i2_i4.c.obj -[ 38%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i8_i2_i8.c.obj -[ 38%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i8_i4_i2.c.obj -[ 39%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i8_i4_i4.c.obj -[ 39%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i8_i4_i8.c.obj -[ 39%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i8_i8_i2.c.obj -[ 39%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i8_i8_i4.c.obj -[ 39%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i8_i8_i8.c.obj -[ 39%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i8_u2_i2.c.obj -[ 39%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i8_u2_i4.c.obj -[ 39%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i8_u2_i8.c.obj -[ 39%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i8_u4_i2.c.obj -[ 40%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i8_u4_i4.c.obj -[ 40%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i8_u4_i8.c.obj -[ 40%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i8_u8_i2.c.obj -[ 40%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i8_u8_i4.c.obj -[ 40%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_i8_u8_i8.c.obj -[ 40%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u2_i2_i2.c.obj -[ 40%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u2_i2_i4.c.obj -[ 40%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u2_i2_i8.c.obj -[ 40%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u2_i4_i2.c.obj -[ 41%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u2_i4_i4.c.obj -[ 41%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u2_i4_i8.c.obj -[ 41%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u2_i8_i2.c.obj -[ 41%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u2_i8_i4.c.obj -[ 41%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u2_i8_i8.c.obj -[ 41%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u2_u2_i2.c.obj -[ 41%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u2_u2_i4.c.obj -[ 41%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u2_u2_i8.c.obj -[ 41%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u2_u4_i2.c.obj -[ 42%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u2_u4_i4.c.obj -[ 42%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u2_u4_i8.c.obj -[ 42%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u2_u8_i2.c.obj -[ 42%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u2_u8_i4.c.obj -[ 42%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u2_u8_i8.c.obj -[ 42%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u4_i2_i2.c.obj -[ 42%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u4_i2_i4.c.obj -[ 42%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u4_i2_i8.c.obj -[ 42%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u4_i4_i2.c.obj -[ 43%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u4_i4_i4.c.obj -[ 43%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u4_i4_i8.c.obj -[ 43%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u4_i8_i2.c.obj -[ 43%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u4_i8_i4.c.obj -[ 43%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u4_i8_i8.c.obj -[ 43%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u4_u2_i2.c.obj -[ 43%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u4_u2_i4.c.obj -[ 43%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u4_u2_i8.c.obj -[ 43%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u4_u4_i2.c.obj -[ 44%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u4_u4_i4.c.obj -[ 44%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u4_u4_i8.c.obj -[ 44%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u4_u8_i2.c.obj -[ 44%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u4_u8_i4.c.obj -[ 44%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u4_u8_i8.c.obj -[ 44%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u8_i2_i2.c.obj -[ 44%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u8_i2_i4.c.obj -[ 44%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u8_i2_i8.c.obj -[ 44%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u8_i4_i2.c.obj -[ 44%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u8_i4_i4.c.obj -[ 45%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u8_i4_i8.c.obj -[ 45%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u8_i8_i2.c.obj -[ 45%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u8_i8_i4.c.obj -[ 45%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u8_i8_i8.c.obj -[ 45%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u8_u2_i2.c.obj -[ 45%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u8_u2_i4.c.obj -[ 45%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u8_u2_i8.c.obj -[ 45%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u8_u4_i2.c.obj -[ 45%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u8_u4_i4.c.obj -[ 46%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u8_u4_i8.c.obj -[ 46%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u8_u8_i2.c.obj -[ 46%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u8_u8_i4.c.obj -[ 46%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Convolution/pulp_nn_conv_u8_u8_i8.c.obj -[ 46%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i2_i2_i2.c.obj -[ 46%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i2_i2_i4.c.obj -[ 46%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i2_i2_i8.c.obj -[ 46%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i2_i4_i2.c.obj -[ 46%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i2_i4_i4.c.obj -[ 47%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i2_i4_i8.c.obj -[ 47%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i2_i8_i2.c.obj -[ 47%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i2_i8_i4.c.obj -[ 47%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i2_i8_i8.c.obj -[ 47%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i2_u2_i2.c.obj -[ 47%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i2_u2_i4.c.obj -[ 47%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i2_u2_i8.c.obj -[ 47%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i2_u4_i2.c.obj -[ 47%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i2_u4_i4.c.obj -[ 48%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i2_u4_i8.c.obj -[ 48%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i2_u8_i2.c.obj -[ 48%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i2_u8_i4.c.obj -[ 48%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i2_u8_i8.c.obj -[ 48%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i4_i2_i2.c.obj -[ 48%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i4_i2_i4.c.obj -[ 48%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i4_i2_i8.c.obj -[ 48%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i4_i4_i2.c.obj -[ 48%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i4_i4_i4.c.obj -[ 50%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i4_i4_i8.c.obj -[ 50%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i4_i8_i2.c.obj -[ 50%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i4_i8_i4.c.obj -[ 50%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i4_i8_i8.c.obj -[ 50%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i4_u2_i2.c.obj -[ 50%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i4_u2_i4.c.obj -[ 50%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i4_u2_i8.c.obj -[ 50%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i4_u4_i2.c.obj -[ 50%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i4_u4_i4.c.obj -[ 51%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i4_u4_i8.c.obj -[ 51%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i4_u8_i2.c.obj -[ 51%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i4_u8_i4.c.obj -[ 51%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i4_u8_i8.c.obj -[ 51%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i8_i2_i2.c.obj -[ 51%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i8_i2_i4.c.obj -[ 51%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i8_i2_i8.c.obj -[ 51%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i8_i4_i2.c.obj -[ 51%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i8_i4_i4.c.obj -[ 52%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i8_i4_i8.c.obj -[ 52%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i8_i8_i2.c.obj -[ 52%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i8_i8_i4.c.obj -[ 52%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i8_i8_i8.c.obj -[ 52%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i8_u2_i2.c.obj -[ 52%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i8_u2_i4.c.obj -[ 52%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i8_u2_i8.c.obj -[ 52%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i8_u4_i2.c.obj -[ 52%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i8_u4_i4.c.obj -[ 53%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i8_u4_i8.c.obj -[ 53%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i8_u8_i2.c.obj -[ 53%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i8_u8_i4.c.obj -[ 53%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_i8_u8_i8.c.obj -[ 53%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u2_i2_i2.c.obj -[ 53%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u2_i2_i4.c.obj -[ 53%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u2_i2_i8.c.obj -[ 53%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u2_i4_i2.c.obj -[ 53%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u2_i4_i4.c.obj -[ 54%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u2_i4_i8.c.obj -[ 54%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u2_i8_i2.c.obj -[ 54%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u2_i8_i4.c.obj -[ 54%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u2_i8_i8.c.obj -[ 54%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u2_u2_i2.c.obj -[ 54%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u2_u2_i4.c.obj -[ 54%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u2_u2_i8.c.obj -[ 54%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u2_u4_i2.c.obj -[ 54%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u2_u4_i4.c.obj -[ 55%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u2_u4_i8.c.obj -[ 55%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u2_u8_i2.c.obj -[ 55%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u2_u8_i4.c.obj -[ 55%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u2_u8_i8.c.obj -[ 55%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u4_i2_i2.c.obj -[ 55%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u4_i2_i4.c.obj -[ 55%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u4_i2_i8.c.obj -[ 55%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u4_i4_i2.c.obj -[ 55%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u4_i4_i4.c.obj -[ 56%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u4_i4_i8.c.obj -[ 56%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u4_i8_i2.c.obj -[ 56%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u4_i8_i4.c.obj -[ 56%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u4_i8_i8.c.obj -[ 56%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u4_u2_i2.c.obj -[ 56%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u4_u2_i4.c.obj -[ 56%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u4_u2_i8.c.obj -[ 56%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u4_u4_i2.c.obj -[ 56%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u4_u4_i4.c.obj -[ 57%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u4_u4_i8.c.obj -[ 57%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u4_u8_i2.c.obj -[ 57%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u4_u8_i4.c.obj -[ 57%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u4_u8_i8.c.obj -[ 57%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u8_i2_i2.c.obj -[ 57%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u8_i2_i4.c.obj -[ 57%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u8_i2_i8.c.obj -[ 57%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u8_i4_i2.c.obj -[ 57%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u8_i4_i4.c.obj -[ 58%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u8_i4_i8.c.obj -[ 58%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u8_i8_i2.c.obj -[ 58%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u8_i8_i4.c.obj -[ 58%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u8_i8_i8.c.obj -[ 58%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u8_u2_i2.c.obj -[ 58%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u8_u2_i4.c.obj -[ 58%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u8_u2_i8.c.obj -[ 58%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u8_u4_i2.c.obj -[ 58%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u8_u4_i4.c.obj -[ 59%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u8_u4_i8.c.obj -[ 59%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u8_u8_i2.c.obj -[ 59%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u8_u8_i4.c.obj -[ 59%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Depthwise/pulp_nn_depthwise_u8_u8_i8.c.obj -[ 59%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearNoQuant/pulp_nn_linear_i2_i32_i2.c.obj -[ 59%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearNoQuant/pulp_nn_linear_i2_i32_i4.c.obj -[ 59%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearNoQuant/pulp_nn_linear_i2_i32_i8.c.obj -[ 59%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearNoQuant/pulp_nn_linear_i4_i32_i2.c.obj -[ 59%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearNoQuant/pulp_nn_linear_i4_i32_i4.c.obj -[ 60%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearNoQuant/pulp_nn_linear_i4_i32_i8.c.obj -[ 60%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearNoQuant/pulp_nn_linear_i8_i32_i2.c.obj -[ 60%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearNoQuant/pulp_nn_linear_i8_i32_i4.c.obj -[ 60%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearNoQuant/pulp_nn_linear_i8_i32_i8.c.obj -[ 60%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearNoQuant/pulp_nn_linear_u2_i32_i2.c.obj -[ 60%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearNoQuant/pulp_nn_linear_u2_i32_i4.c.obj -[ 60%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearNoQuant/pulp_nn_linear_u2_i32_i8.c.obj -[ 60%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearNoQuant/pulp_nn_linear_u4_i32_i2.c.obj -[ 60%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearNoQuant/pulp_nn_linear_u4_i32_i4.c.obj -[ 61%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearNoQuant/pulp_nn_linear_u4_i32_i8.c.obj -[ 61%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearNoQuant/pulp_nn_linear_u8_i32_i2.c.obj -[ 61%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearNoQuant/pulp_nn_linear_u8_i32_i4.c.obj -[ 61%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearNoQuant/pulp_nn_linear_u8_i32_i8.c.obj -[ 61%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i2_i2_i2.c.obj -[ 61%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i2_i2_i4.c.obj -[ 61%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i2_i2_i8.c.obj -[ 61%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i2_i4_i2.c.obj -[ 61%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i2_i4_i4.c.obj -[ 62%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i2_i4_i8.c.obj -[ 62%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i2_i8_i2.c.obj -[ 62%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i2_i8_i4.c.obj -[ 62%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i2_i8_i8.c.obj -[ 62%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i2_u2_i2.c.obj -[ 62%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i2_u2_i4.c.obj -[ 62%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i2_u2_i8.c.obj -[ 62%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i2_u4_i2.c.obj -[ 62%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i2_u4_i4.c.obj -[ 63%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i2_u4_i8.c.obj -[ 63%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i2_u8_i2.c.obj -[ 63%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i2_u8_i4.c.obj -[ 63%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i2_u8_i8.c.obj -[ 63%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i4_i2_i2.c.obj -[ 63%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i4_i2_i4.c.obj -[ 63%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i4_i2_i8.c.obj -[ 63%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i4_i4_i2.c.obj -[ 63%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i4_i4_i4.c.obj -[ 64%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i4_i4_i8.c.obj -[ 64%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i4_i8_i2.c.obj -[ 64%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i4_i8_i4.c.obj -[ 64%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i4_i8_i8.c.obj -[ 64%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i4_u2_i2.c.obj -[ 64%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i4_u2_i4.c.obj -[ 64%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i4_u2_i8.c.obj -[ 64%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i4_u4_i2.c.obj -[ 64%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i4_u4_i4.c.obj -[ 65%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i4_u4_i8.c.obj -[ 65%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i4_u8_i2.c.obj -[ 65%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i4_u8_i4.c.obj -[ 65%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i4_u8_i8.c.obj -[ 65%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i8_i2_i2.c.obj -[ 65%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i8_i2_i4.c.obj -[ 65%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i8_i2_i8.c.obj -[ 65%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i8_i4_i2.c.obj -[ 65%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i8_i4_i4.c.obj -[ 66%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i8_i4_i8.c.obj -[ 66%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i8_i8_i2.c.obj -[ 66%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i8_i8_i4.c.obj -[ 66%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i8_i8_i8.c.obj -[ 66%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i8_u2_i2.c.obj -[ 66%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i8_u2_i4.c.obj -[ 66%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i8_u2_i8.c.obj -[ 66%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i8_u4_i2.c.obj -[ 66%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i8_u4_i4.c.obj -[ 67%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i8_u4_i8.c.obj -[ 67%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i8_u8_i2.c.obj -[ 67%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i8_u8_i4.c.obj -[ 67%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_i8_u8_i8.c.obj -[ 67%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u2_i2_i2.c.obj -[ 67%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u2_i2_i4.c.obj -[ 67%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u2_i2_i8.c.obj -[ 67%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u2_i4_i2.c.obj -[ 67%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u2_i4_i4.c.obj -[ 68%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u2_i4_i8.c.obj -[ 68%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u2_i8_i2.c.obj -[ 68%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u2_i8_i4.c.obj -[ 68%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u2_i8_i8.c.obj -[ 68%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u2_u2_i2.c.obj -[ 68%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u2_u2_i4.c.obj -[ 68%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u2_u2_i8.c.obj -[ 68%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u2_u4_i2.c.obj -[ 68%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u2_u4_i4.c.obj -[ 69%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u2_u4_i8.c.obj -[ 69%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u2_u8_i2.c.obj -[ 69%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u2_u8_i4.c.obj -[ 69%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u2_u8_i8.c.obj -[ 69%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u4_i2_i2.c.obj -[ 69%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u4_i2_i4.c.obj -[ 69%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u4_i2_i8.c.obj -[ 69%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u4_i4_i2.c.obj -[ 69%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u4_i4_i4.c.obj -[ 70%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u4_i4_i8.c.obj -[ 70%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u4_i8_i2.c.obj -[ 70%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u4_i8_i4.c.obj -[ 70%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u4_i8_i8.c.obj -[ 70%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u4_u2_i2.c.obj -[ 70%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u4_u2_i4.c.obj -[ 70%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u4_u2_i8.c.obj -[ 70%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u4_u4_i2.c.obj -[ 70%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u4_u4_i4.c.obj -[ 71%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u4_u4_i8.c.obj -[ 71%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u4_u8_i2.c.obj -[ 71%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u4_u8_i4.c.obj -[ 71%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u4_u8_i8.c.obj -[ 71%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u8_i2_i2.c.obj -[ 71%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u8_i2_i4.c.obj -[ 71%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u8_i2_i8.c.obj -[ 71%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u8_i4_i2.c.obj -[ 71%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u8_i4_i4.c.obj -[ 72%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u8_i4_i8.c.obj -[ 72%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u8_i8_i2.c.obj -[ 72%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u8_i8_i4.c.obj -[ 72%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u8_i8_i8.c.obj -[ 72%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u8_u2_i2.c.obj -[ 72%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u8_u2_i4.c.obj -[ 72%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u8_u2_i8.c.obj -[ 72%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u8_u4_i2.c.obj -[ 72%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u8_u4_i4.c.obj -[ 73%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u8_u4_i8.c.obj -[ 73%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u8_u8_i2.c.obj -[ 73%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u8_u8_i4.c.obj -[ 73%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/LinearQuant/pulp_nn_linear_u8_u8_i8.c.obj -[ 73%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_i8_i2_i2.c.obj -[ 73%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_i8_i2_i4.c.obj -[ 73%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_i8_i2_i8.c.obj -[ 73%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_i8_i4_i2.c.obj -[ 73%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_i8_i4_i4.c.obj -[ 74%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_i8_i4_i8.c.obj -[ 74%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_i8_i8_i2.c.obj -[ 74%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_i8_i8_i4.c.obj -[ 74%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_i8_i8_i8.c.obj -[ 74%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_i8_u2_i2.c.obj -[ 74%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_i8_u2_i4.c.obj -[ 74%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_i8_u2_i8.c.obj -[ 74%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_i8_u4_i2.c.obj -[ 74%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_i8_u4_i4.c.obj -[ 75%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_i8_u4_i8.c.obj -[ 75%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_i8_u8_i2.c.obj -[ 75%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_i8_u8_i4.c.obj -[ 75%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_i8_u8_i8.c.obj -[ 75%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_u8_i2_i2.c.obj -[ 75%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_u8_i2_i4.c.obj -[ 75%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_u8_i2_i8.c.obj -[ 75%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_u8_i4_i2.c.obj -[ 75%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_u8_i4_i4.c.obj -[ 76%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_u8_i4_i8.c.obj -[ 76%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_u8_i8_i2.c.obj -[ 76%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_u8_i8_i4.c.obj -[ 76%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_u8_i8_i8.c.obj -[ 76%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_u8_u2_i2.c.obj -[ 76%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_u8_u2_i4.c.obj -[ 76%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_u8_u2_i8.c.obj -[ 76%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_u8_u4_i2.c.obj -[ 76%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_u8_u4_i4.c.obj -[ 77%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_u8_u4_i8.c.obj -[ 77%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_u8_u8_i2.c.obj -[ 77%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_u8_u8_i4.c.obj -[ 77%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/MatrixMultiplication/pulp_nn_matmul_u8_u8_i8.c.obj -[ 77%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i2_i2_i2.c.obj -[ 77%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i2_i2_i4.c.obj -[ 77%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i2_i2_i8.c.obj -[ 77%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i2_i4_i2.c.obj -[ 77%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i2_i4_i4.c.obj -[ 78%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i2_i4_i8.c.obj -[ 78%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i2_i8_i2.c.obj -[ 78%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i2_i8_i4.c.obj -[ 78%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i2_i8_i8.c.obj -[ 78%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i2_u2_i2.c.obj -[ 78%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i2_u2_i4.c.obj -[ 78%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i2_u2_i8.c.obj -[ 78%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i2_u4_i2.c.obj -[ 78%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i2_u4_i4.c.obj -[ 79%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i2_u4_i8.c.obj -[ 79%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i2_u8_i2.c.obj -[ 79%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i2_u8_i4.c.obj -[ 79%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i2_u8_i8.c.obj -[ 79%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i4_i2_i2.c.obj -[ 79%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i4_i2_i4.c.obj -[ 79%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i4_i2_i8.c.obj -[ 79%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i4_i4_i2.c.obj -[ 79%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i4_i4_i4.c.obj -[ 80%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i4_i4_i8.c.obj -[ 80%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i4_i8_i2.c.obj -[ 80%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i4_i8_i4.c.obj -[ 80%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i4_i8_i8.c.obj -[ 80%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i4_u2_i2.c.obj -[ 80%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i4_u2_i4.c.obj -[ 80%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i4_u2_i8.c.obj -[ 80%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i4_u4_i2.c.obj -[ 80%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i4_u4_i4.c.obj -[ 81%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i4_u4_i8.c.obj -[ 81%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i4_u8_i2.c.obj -[ 81%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i4_u8_i4.c.obj -[ 81%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i4_u8_i8.c.obj -[ 81%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i8_i2_i2.c.obj -[ 81%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i8_i2_i4.c.obj -[ 81%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i8_i2_i8.c.obj -[ 81%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i8_i4_i2.c.obj -[ 81%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i8_i4_i4.c.obj -[ 82%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i8_i4_i8.c.obj -[ 82%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i8_i8_i2.c.obj -[ 82%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i8_i8_i4.c.obj -[ 82%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i8_i8_i8.c.obj -[ 82%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i8_u2_i2.c.obj -[ 82%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i8_u2_i4.c.obj -[ 82%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i8_u2_i8.c.obj -[ 82%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i8_u4_i2.c.obj -[ 82%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i8_u4_i4.c.obj -[ 83%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i8_u4_i8.c.obj -[ 83%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i8_u8_i2.c.obj -[ 83%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i8_u8_i4.c.obj -[ 83%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_i8_u8_i8.c.obj -[ 83%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u2_i2_i2.c.obj -[ 83%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u2_i2_i4.c.obj -[ 83%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u2_i2_i8.c.obj -[ 83%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u2_i4_i2.c.obj -[ 83%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u2_i4_i4.c.obj -[ 84%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u2_i4_i8.c.obj -[ 84%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u2_i8_i2.c.obj -[ 84%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u2_i8_i4.c.obj -[ 84%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u2_i8_i8.c.obj -[ 84%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u2_u2_i2.c.obj -[ 84%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u2_u2_i4.c.obj -[ 84%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u2_u2_i8.c.obj -[ 84%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u2_u4_i2.c.obj -[ 84%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u2_u4_i4.c.obj -[ 85%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u2_u4_i8.c.obj -[ 85%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u2_u8_i2.c.obj -[ 85%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u2_u8_i4.c.obj -[ 85%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u2_u8_i8.c.obj -[ 85%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u4_i2_i2.c.obj -[ 85%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u4_i2_i4.c.obj -[ 85%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u4_i2_i8.c.obj -[ 85%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u4_i4_i2.c.obj -[ 85%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u4_i4_i4.c.obj -[ 86%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u4_i4_i8.c.obj -[ 86%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u4_i8_i2.c.obj -[ 86%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u4_i8_i4.c.obj -[ 86%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u4_i8_i8.c.obj -[ 86%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u4_u2_i2.c.obj -[ 86%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u4_u2_i4.c.obj -[ 86%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u4_u2_i8.c.obj -[ 86%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u4_u4_i2.c.obj -[ 86%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u4_u4_i4.c.obj -[ 87%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u4_u4_i8.c.obj -[ 87%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u4_u8_i2.c.obj -[ 87%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u4_u8_i4.c.obj -[ 87%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u4_u8_i8.c.obj -[ 87%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u8_i2_i2.c.obj -[ 87%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u8_i2_i4.c.obj -[ 87%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u8_i2_i8.c.obj -[ 87%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u8_i4_i2.c.obj -[ 87%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u8_i4_i4.c.obj -[ 88%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u8_i4_i8.c.obj -[ 88%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u8_i8_i2.c.obj -[ 88%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u8_i8_i4.c.obj -[ 88%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u8_i8_i8.c.obj -[ 88%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u8_u2_i2.c.obj -[ 88%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u8_u2_i4.c.obj -[ 88%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u8_u2_i8.c.obj -[ 88%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u8_u4_i2.c.obj -[ 88%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u8_u4_i4.c.obj -[ 89%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u8_u4_i8.c.obj -[ 89%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u8_u8_i2.c.obj -[ 89%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u8_u8_i4.c.obj -[ 89%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pointwise/pulp_nn_pointwise_u8_u8_i8.c.obj -[ 89%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_i2_i2.c.obj -[ 89%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_i2_i4.c.obj -[ 89%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_i2_i8.c.obj -[ 89%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_i2_u2.c.obj -[ 89%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_i2_u4.c.obj -[ 90%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_i2_u8.c.obj -[ 90%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_i4_i2.c.obj -[ 90%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_i4_i4.c.obj -[ 90%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_i4_i8.c.obj -[ 90%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_i4_u2.c.obj -[ 90%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_i4_u4.c.obj -[ 90%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_i4_u8.c.obj -[ 90%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_i8_i2.c.obj -[ 90%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_i8_i4.c.obj -[ 91%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_i8_i8.c.obj -[ 91%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_i8_u2.c.obj -[ 91%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_i8_u4.c.obj -[ 91%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_i8_u8.c.obj -[ 91%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_u2_i2.c.obj -[ 91%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_u2_i4.c.obj -[ 91%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_u2_i8.c.obj -[ 91%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_u2_u2.c.obj -[ 91%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_u2_u4.c.obj -[ 92%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_u2_u8.c.obj -[ 92%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_u4_i2.c.obj -[ 92%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_u4_i4.c.obj -[ 92%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_u4_i8.c.obj -[ 92%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_u4_u2.c.obj -[ 92%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_u4_u4.c.obj -[ 92%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_u4_u8.c.obj -[ 92%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_u8_i2.c.obj -[ 92%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_u8_i4.c.obj -[ 93%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_u8_i8.c.obj -[ 93%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_u8_u2.c.obj -[ 93%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_u8_u4.c.obj -[ 93%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/AvgPool/pulp_nn_avgpool_u8_u8.c.obj -[ 93%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/MaxPool/pulp_nn_maxpool_i2.c.obj -[ 93%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/MaxPool/pulp_nn_maxpool_i4.c.obj -[ 93%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/MaxPool/pulp_nn_maxpool_i8.c.obj -[ 93%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/MaxPool/pulp_nn_maxpool_u2.c.obj -[ 93%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/MaxPool/pulp_nn_maxpool_u4.c.obj -[ 94%] Building C object TargetLibraries/GAP9/third_party/pulp-nn-mixed/CMakeFiles/pulp-nn-mixed.dir/XpulpV2/32bit/src/Pooling/MaxPool/pulp_nn_maxpool_u8.c.obj -[ 94%] Linking C static library ../../../../lib/libpulp-nn-mixed.a -[ 94%] Built target pulp-nn-mixed -Consolidate compiler generated dependencies of target deeploybasic -[ 97%] Built target deeploybasic -Consolidate compiler generated dependencies of target deeploygap9 -[ 97%] Building C object TargetLibraries/GAP9/CMakeFiles/deeploygap9.dir/src/Util.c.obj -[ 97%] Building C object TargetLibraries/GAP9/CMakeFiles/deeploygap9.dir/src/dory_dma.c.obj -[ 97%] Building C object TargetLibraries/GAP9/CMakeFiles/deeploygap9.dir/src/dory_mem.c.obj -[ 97%] Building C object TargetLibraries/GAP9/CMakeFiles/deeploygap9.dir/__/PULPOpen/src/Convolution_fp32.c.obj -[ 97%] Building C object TargetLibraries/GAP9/CMakeFiles/deeploygap9.dir/__/PULPOpen/src/DWConvolution_fp32.c.obj -[ 98%] Building C object TargetLibraries/GAP9/CMakeFiles/deeploygap9.dir/__/PULPOpen/src/GELU.c.obj -[ 98%] Building C object TargetLibraries/GAP9/CMakeFiles/deeploygap9.dir/__/PULPOpen/src/Gemm.c.obj -[ 98%] Building C object TargetLibraries/GAP9/CMakeFiles/deeploygap9.dir/__/PULPOpen/src/Layernorm.c.obj -[ 98%] Building C object TargetLibraries/GAP9/CMakeFiles/deeploygap9.dir/__/PULPOpen/src/Matmul.c.obj -[ 98%] Building C object TargetLibraries/GAP9/CMakeFiles/deeploygap9.dir/__/PULPOpen/src/MaxPool.c.obj -[ 98%] Building C object TargetLibraries/GAP9/CMakeFiles/deeploygap9.dir/__/PULPOpen/src/RQiHardswish.c.obj -[ 98%] Building C object TargetLibraries/GAP9/CMakeFiles/deeploygap9.dir/__/PULPOpen/src/Relu.c.obj -[ 98%] Building C object TargetLibraries/GAP9/CMakeFiles/deeploygap9.dir/__/PULPOpen/src/RequantShift.c.obj -[ 98%] Building C object TargetLibraries/GAP9/CMakeFiles/deeploygap9.dir/__/PULPOpen/src/Softmax.c.obj -[100%] Building C object TargetLibraries/GAP9/CMakeFiles/deeploygap9.dir/__/PULPOpen/src/UniformRequantShift.c.obj -[100%] Building C object TargetLibraries/GAP9/CMakeFiles/deeploygap9.dir/__/PULPOpen/src/Util.c.obj -[100%] Building C object TargetLibraries/GAP9/CMakeFiles/deeploygap9.dir/__/PULPOpen/src/gemv.c.obj -[100%] Building C object TargetLibraries/GAP9/CMakeFiles/deeploygap9.dir/__/PULPOpen/src/iRMSnorm.c.obj -[100%] Linking C static library ../../lib/libdeeploygap9.a -[100%] Built target deeploygap9 -Consolidate compiler generated dependencies of target network -[100%] Building C object DeeployTest/CMakeFiles/network.dir/TEST_GAP9/Tests/testFloatMatmul/Network.c.obj -[100%] Built target network -Consolidate compiler generated dependencies of target testFloatMatmul -[100%] Building C object DeeployTest/Platforms/GAP9/CMakeFiles/testFloatMatmul.dir/src/CycleCounter.c.obj -[100%] Building C object DeeployTest/Platforms/GAP9/CMakeFiles/testFloatMatmul.dir/src/deeploytest.c.obj -[100%] Linking C executable ../../../testFloatMatmul -[100%] Built target testFloatMatmul -[ 0%] Built target pmsis_printf -[ 0%] Built target pulp_allocator -[ 0%] Built target freertos_libs -[ 1%] Built target fll_pmu_lib -Consolidate compiler generated dependencies of target pmsis -[ 6%] Built target pmsis -[ 7%] Built target pmsis_backend -[ 9%] Built target freertos -Consolidate compiler generated dependencies of target pulp-nn-mixed -[ 94%] Built target pulp-nn-mixed -[ 97%] Built target deeploybasic -Consolidate compiler generated dependencies of target deeploygap9 -[100%] Built target deeploygap9 -Consolidate compiler generated dependencies of target network -[100%] Built target network -Consolidate compiler generated dependencies of target testFloatMatmul -[100%] Built target testFloatMatmul -[100%] Built target image -Generation Directory: /app/Deeploy/DeeployTest/TEST_GAP9/Tests/testFloatMatmul -Test Directory : Tests/testFloatMatmul -Test Name : testFloatMatmul diff --git a/TargetLibraries/GAP9/inc/DeeployMchan.h b/TargetLibraries/GAP9/inc/DeeployMchan.h index f4822070fc..0f1110af69 100644 --- a/TargetLibraries/GAP9/inc/DeeployMchan.h +++ b/TargetLibraries/GAP9/inc/DeeployMchan.h @@ -10,8 +10,8 @@ /* * GAP9 MCHAN v7 configuration wrapper for Deeploy * - * This header configures and includes mchan.h with proper GAP9-specific settings. - * Based on DORY's GAP9 DMA implementation. + * This header configures and includes mchan.h with proper GAP9-specific + * settings. Based on DORY's GAP9 DMA implementation. */ #include "pmsis.h" @@ -34,7 +34,7 @@ // Define event bit for cluster DMA #ifdef MCHAN_EVENT #ifndef MCHAN_EVENT_BIT -#define MCHAN_EVENT_BIT (CLUSTER_IRQ_DMA0) // Typically 8 +#define MCHAN_EVENT_BIT (CLUSTER_IRQ_DMA0) // Typically 8 #endif #endif diff --git a/TargetLibraries/PULPOpen/inc/kernel/Layernorm.h b/TargetLibraries/PULPOpen/inc/kernel/Layernorm.h index 55bb28fb08..cb56152bd6 100644 --- a/TargetLibraries/PULPOpen/inc/kernel/Layernorm.h +++ b/TargetLibraries/PULPOpen/inc/kernel/Layernorm.h @@ -10,8 +10,7 @@ #include "DeeployPULPMath.h" void PULP_Layernorm_fp32_fp32(float32_t *data_in, float32_t *data_out, - float32_t *scale, float32_t *bias, - uint32_t size, + float32_t *scale, float32_t *bias, uint32_t size, uint32_t lastDimLength, float32_t epsilon); #endif // __DEEPLOY_MATH_LAYERNORM_KERNEL_HEADER__ \ No newline at end of file diff --git a/TargetLibraries/PULPOpen/src/Layernorm.c b/TargetLibraries/PULPOpen/src/Layernorm.c index e8829e4e1e..9324ff19ee 100644 --- a/TargetLibraries/PULPOpen/src/Layernorm.c +++ b/TargetLibraries/PULPOpen/src/Layernorm.c @@ -11,8 +11,7 @@ #include void PULP_Layernorm_fp32_fp32(float32_t *data_in, float32_t *data_out, - float32_t *scale, float32_t *bias, - uint32_t size, + float32_t *scale, float32_t *bias, uint32_t size, uint32_t lastDimLength, float32_t epsilon) { int8_t core_id = pi_core_id(); From 40d1decd7cff18a8e4bf3411ac54d54333c01b50 Mon Sep 17 00:00:00 2001 From: Run Wang <52746141+SamanthaWangdl@users.noreply.github.com> Date: Sun, 11 Jan 2026 20:22:17 +0000 Subject: [PATCH 24/49] Update default docker for gap9 platform --- .github/workflows/ci-platform-gap9-tiled.yml | 2 +- .github/workflows/ci-platform-gap9.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-platform-gap9-tiled.yml b/.github/workflows/ci-platform-gap9-tiled.yml index 63c20f6883..938eb7374e 100644 --- a/.github/workflows/ci-platform-gap9-tiled.yml +++ b/.github/workflows/ci-platform-gap9-tiled.yml @@ -17,7 +17,7 @@ name: CI • GAP9 (Tiled) docker_image_deeploy: description: "Deeploy Image to use" required: false - default: "ghcr.io/pulp-platform/deeploy:devel" + default: "ghcr.io/runwangdl/deeploy:gap9" concurrency: group: ${{ github.workflow }}-${{ github.ref }} diff --git a/.github/workflows/ci-platform-gap9.yml b/.github/workflows/ci-platform-gap9.yml index c8375fd01a..c8f38857a5 100644 --- a/.github/workflows/ci-platform-gap9.yml +++ b/.github/workflows/ci-platform-gap9.yml @@ -17,7 +17,7 @@ name: CI • GAP9 docker_image_deeploy: description: "Deeploy Image to use" required: false - default: "ghcr.io/pulp-platform/deeploy:devel" + default: "ghcr.io/runwangdl/deeploy:gap9" concurrency: group: ${{ github.workflow }}-${{ github.ref }} From ff053040f7d46f44fdd89093f182fff0eb57ac95 Mon Sep 17 00:00:00 2001 From: Run Wang <52746141+SamanthaWangdl@users.noreply.github.com> Date: Sun, 11 Jan 2026 20:55:12 +0000 Subject: [PATCH 25/49] Change other target to default docker --- .github/workflows/_select-env.yml | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/.github/workflows/_select-env.yml b/.github/workflows/_select-env.yml index 2fd615532b..8c8f007608 100644 --- a/.github/workflows/_select-env.yml +++ b/.github/workflows/_select-env.yml @@ -26,7 +26,16 @@ jobs: - id: set-docker-image shell: bash run: | - IMAGE="ghcr.io/runwangdl/deeploy:gap9" + if [[ -n "${{ inputs.docker_image_deeploy }}" ]]; then + IMAGE="${{ inputs.docker_image_deeploy }}" + elif [[ "${{ github.ref }}" == refs/tags/* ]]; then + TAG_NAME="${GITHUB_REF##refs/tags/}" + IMAGE="ghcr.io/pulp-platform/deeploy:${TAG_NAME}" + elif [[ "${{ github.ref_name }}" == "main" ]]; then + IMAGE="ghcr.io/pulp-platform/deeploy:main" + else + IMAGE="ghcr.io/pulp-platform/deeploy:devel" + fi echo "image=${IMAGE}" >> "$GITHUB_OUTPUT" - id: set-runner From 9b72ff6812fe8f7d1f6bb0b0c04f2d040bc231aa Mon Sep 17 00:00:00 2001 From: Run Wang <52746141+SamanthaWangdl@users.noreply.github.com> Date: Tue, 3 Feb 2026 23:07:57 +0000 Subject: [PATCH 26/49] GAP9 PyTest Adaptation --- .github/workflows/_runner-gap9-tiled.yml | 36 +--- .github/workflows/_runner-gap9.yml | 17 +- .github/workflows/ci-deeploy.yml | 2 +- .github/workflows/ci-platform-gap9-tiled.yml | 155 +------------- .github/workflows/ci-platform-gap9.yml | 52 +---- Container/Dockerfile.deeploy | 71 +------ Container/Dockerfile.toolchain | 57 ++---- DeeployTest/conftest.py | 2 + DeeployTest/deeployRunner_gap9.py | 25 +++ DeeployTest/deeployRunner_tiled_gap9.py | 25 +++ DeeployTest/testUtils/core/config.py | 3 + DeeployTest/testUtils/core/execution.py | 8 + DeeployTest/testUtils/deeployRunner.py | 1 + DeeployTest/test_gap9_config.py | 53 +++++ DeeployTest/test_gap9_tiled_config.py | 80 ++++++++ DeeployTest/test_platforms.py | 193 ++++++++++++++++++ TargetLibraries/GAP9/third_party | 1 + .../PULPOpen/third_party/pulp-nn-mixed | 2 +- 18 files changed, 436 insertions(+), 347 deletions(-) create mode 100644 DeeployTest/deeployRunner_gap9.py create mode 100644 DeeployTest/deeployRunner_tiled_gap9.py create mode 100644 DeeployTest/test_gap9_config.py create mode 100644 DeeployTest/test_gap9_tiled_config.py create mode 120000 TargetLibraries/GAP9/third_party diff --git a/.github/workflows/_runner-gap9-tiled.yml b/.github/workflows/_runner-gap9-tiled.yml index f91b151aa1..1f1fceca78 100644 --- a/.github/workflows/_runner-gap9-tiled.yml +++ b/.github/workflows/_runner-gap9-tiled.yml @@ -14,40 +14,12 @@ name: _runner-gap9-tiled docker-image: required: true type: string - test-name: + pytest-markers: required: true type: string - num-cores: - required: false - default: 8 - type: number - L1: - required: false - default: "[64000]" - type: string - default-memory-level: - required: false - default: "L2" - type: string - double-buffer: - required: false - default: false - type: boolean - memory-allocation-strategy: - required: false - default: "MiniMalloc" - type: string - search-strategy: - required: false - default: "random-max" - type: string jobs: test-runner-gap9-tiled: - strategy: - fail-fast: false - matrix: - L1: ${{ fromJSON(inputs.L1) }} runs-on: ${{ inputs.runner }} container: image: ${{ inputs.docker-image }} @@ -63,8 +35,8 @@ jobs: source /app/install/gap9-sdk/configs/gap9_evk_audio.sh || true pip install -e . || true deactivate - - name: Setup ccache - uses: actions/cache@v4 + - name: Cache ccache + uses: actions/cache/restore@v4 with: path: /app/.ccache key: ccache-ci @@ -77,6 +49,6 @@ jobs: cd DeeployTest mkdir -p /app/.ccache export CCACHE_DIR=/app/.ccache - python testRunner_tiled_gap9.py -t Tests/${{ inputs.test-name }} --cores=${{ inputs.num-cores }} --l1 ${{ matrix.L1 }} --defaultMemLevel=${{ inputs.default-memory-level }} ${{ inputs.double-buffer && '--doublebuffer' || '' }} --memAllocStrategy=${{ inputs.memory-allocation-strategy }} --searchStrategy=${{ inputs.search-strategy }} + pytest test_platforms.py -v -m "${{ inputs.pytest-markers }}" deactivate shell: bash diff --git a/.github/workflows/_runner-gap9.yml b/.github/workflows/_runner-gap9.yml index c4dde94ba4..450f27ea95 100644 --- a/.github/workflows/_runner-gap9.yml +++ b/.github/workflows/_runner-gap9.yml @@ -14,12 +14,9 @@ name: _runner-gap9 docker-image: required: true type: string - test-names: + pytest-marker: required: true type: string - num-cores: - required: true - type: number jobs: test-runner-gap9: @@ -38,14 +35,13 @@ jobs: source /app/install/gap9-sdk/configs/gap9_evk_audio.sh || true pip install -e . || true deactivate - - name: Setup ccache - uses: actions/cache@v4 + - name: Cache ccache + uses: actions/cache/restore@v4 with: path: /app/.ccache key: ccache-ci - name: Run Test run: | - testNames="${{ inputs.test-names }}" source /app/install/gap9-sdk/.gap9-venv/bin/activate source /app/install/gap9-sdk/configs/gap9_evk_audio.sh || true export GVSOC_INSTALL_DIR=/app/install/gap9-sdk/install/workstation @@ -53,11 +49,6 @@ jobs: cd DeeployTest mkdir -p /app/.ccache export CCACHE_DIR=/app/.ccache - echo "$testNames" | while IFS= read -r testName; do - if [[ -n "$testName" ]]; then - echo "Running test: $testName" - python testRunner_gap9.py -t Tests/$testName - fi - done + pytest test_platforms.py -v -n 4 -m "gap9 and ${{ inputs.pytest-marker }}" deactivate shell: bash \ No newline at end of file diff --git a/.github/workflows/ci-deeploy.yml b/.github/workflows/ci-deeploy.yml index ec9e38f992..fc468306b1 100644 --- a/.github/workflows/ci-deeploy.yml +++ b/.github/workflows/ci-deeploy.yml @@ -17,7 +17,7 @@ name: CI • Deeploy docker_image_deeploy: description: "Deeploy Image to use" required: false - default: "ghcr.io/runwangdl/deeploy:gap9" + default: "ghcr.io/pulp-platform/deeploy:devel" concurrency: group: ${{ github.workflow }}-${{ github.ref }} diff --git a/.github/workflows/ci-platform-gap9-tiled.yml b/.github/workflows/ci-platform-gap9-tiled.yml index 938eb7374e..68704d2666 100644 --- a/.github/workflows/ci-platform-gap9-tiled.yml +++ b/.github/workflows/ci-platform-gap9-tiled.yml @@ -27,181 +27,36 @@ jobs: select-env: uses: ./.github/workflows/_select-env.yml with: - docker_image_deeploy: ${{ inputs.docker_image_deeploy }} + docker_image_deeploy: 'ghcr.io/runwangdl/deeploy:gap9' gap9-kernels-tiled-singlebuffer-L2: needs: select-env - strategy: - fail-fast: false - matrix: - test-data: - - name: "testMatMul" - L1: [64000, 32000, 16000] - - name: "test2DRequantizedConv" - L1: [8000, 6000, 4000] - - name: "test2DRequantizedStriddedPaddedConv" - L1: [600] - - name: "testRequantizedDWConv" - L1: [2561] - - name: "iSoftmax" - L1: [800, 500, 300] - - name: "testConcat" - L1: [32000, 16000, 8000] - - name: "Hardswish" - L1: [750] - - name: "RQHardswish" - L1: [750] - - name: "testFloatGEMM" - L1: [8000] - - name: "testFloat2DConvolution" - L1: [1600] - - name: "testFloat2DConvolutionBias" - L1: [6600] - - name: "testFloat2DConvolutionZeroBias" - L1: [6600] - - name: "testFloat2DDWConvolution" - L1: [7200] - - name: "testFloat2DDWConvolutionBias" - L1: [7200] - - name: "testFloat2DDWConvolutionZeroBias" - L1: [7200] - - name: "testFloatLayerNorm" - L1: [2000] - - name: "testFloatMaxPool" - L1: [2000] - - name: "testFloatMatmul" - L1: [2000] - - name: "testFloatRelu" - L1: [2000] - - name: "testFloatReshapeWithSkipConnection" - L1: [1400] - - name: "testFloatSoftmax" - L1: [4000] - - name: "testFloatTranspose" - L1: [2000] - - name: "testFloatMul" - L1: [2000] - - name: "testRQGEMMwBatch" - L1: [20000] - - name: "testMatMulBatch" - L1: [20000] uses: ./.github/workflows/_runner-gap9-tiled.yml with: runner: ${{ needs.select-env.outputs.runner }} docker-image: ${{ needs.select-env.outputs.image }} - test-name: ${{ matrix.test-data.name }} - num-cores: 8 - L1: ${{ toJson(matrix.test-data.L1) }} + pytest-markers: "gap9_tiled and kernels and singlebuffer and l2" gap9-kernels-tiled-doublebuffer-L2: needs: select-env - strategy: - fail-fast: false - matrix: - test-data: - - name: "testMatMul" - L1: [64000, 32000, 16000] - - name: "test2DRequantizedConv" - L1: [8000, 6000, 5000] - - name: "testRequantizedDWConv" - L1: [5121] - - name: "iSoftmax" - L1: [1600, 1000, 600] - - name: "testConcat" - L1: [64000, 32000, 16000] - - name: "Hardswish" - L1: [750] - - name: "RQHardswish" - L1: [800] - - name: "testFloatGEMM" - L1: [8000] - - name: "testFloat2DConvolution" - L1: [2000] - - name: "testFloat2DConvolutionBias" - L1: [8800] - - name: "testFloat2DConvolutionZeroBias" - L1: [8800] - - name: "testFloat2DDWConvolution" - L1: [9800] - - name: "testFloat2DDWConvolutionBias" - L1: [10000] - - name: "testFloat2DDWConvolutionZeroBias" - L1: [9800] - - name: "testFloatLayerNorm" - L1: [2000] - - name: "testFloatMaxPool" - L1: [5000] - - name: "testFloatMatmul" - L1: [5000] - - name: "testFloatRelu" - L1: [20] - - name: "testFloatReshapeWithSkipConnection" - L1: [2600] - - name: "testFloatSoftmax" - L1: [8000] - - name: "testFloatTranspose" - L1: [2000] - - name: "testFloatMul" - L1: [2000] uses: ./.github/workflows/_runner-gap9-tiled.yml with: runner: ${{ needs.select-env.outputs.runner }} docker-image: ${{ needs.select-env.outputs.image }} - test-name: ${{ matrix.test-data.name }} - num-cores: 8 - L1: ${{ toJson(matrix.test-data.L1) }} - double-buffer: true + pytest-markers: "gap9_tiled and kernels and doublebuffer and l2" gap9-models-tiled-singlebuffer-L2: needs: select-env - strategy: - fail-fast: false - matrix: - test-data: - - name: "simpleRegression" - L1: [45000, 30000, 15000] - - name: "miniMobileNet" - L1: [60000, 12000, 6000, 3000] - - name: "miniMobileNetv2" - L1: [60000, 16000, 12000, 8000] - - name: "Attention" - L1: [60000, 10000, 5000] - - name: "MLPerf/KeywordSpotting" - L1: [64000] - - name: "MLPerf/ImageClassification" - L1: [64000] - - name: "MLPerf/AnomalyDetection" - L1: [64000] - num-cores: [8] uses: ./.github/workflows/_runner-gap9-tiled.yml with: runner: ${{ needs.select-env.outputs.runner }} docker-image: ${{ needs.select-env.outputs.image }} - test-name: ${{ matrix.test-data.name }} - num-cores: ${{ matrix.num-cores }} - L1: ${{ toJson(matrix.test-data.L1) }} + pytest-markers: "gap9_tiled and models and singlebuffer and l2" gap9-models-tiled-doublebuffer-L2: needs: select-env - strategy: - fail-fast: false - matrix: - test-data: - - name: "simpleRegression" - L1: [60000, 45000, 30000] - - name: "miniMobileNet" - L1: [60000, 24000, 12000, 6000] - - name: "miniMobileNetv2" - L1: [60000, 32000, 24000, 16000] - - name: "Attention" - L1: [60000, 20000, 10000, 5000] - num-cores: [8] - double-buffer: [true] uses: ./.github/workflows/_runner-gap9-tiled.yml with: runner: ${{ needs.select-env.outputs.runner }} docker-image: ${{ needs.select-env.outputs.image }} - test-name: ${{ matrix.test-data.name }} - num-cores: ${{ matrix.num-cores }} - L1: ${{ toJson(matrix.test-data.L1) }} - double-buffer: ${{ matrix.double-buffer }} + pytest-markers: "gap9_tiled and models and doublebuffer and l2" diff --git a/.github/workflows/ci-platform-gap9.yml b/.github/workflows/ci-platform-gap9.yml index c8f38857a5..30699102dd 100644 --- a/.github/workflows/ci-platform-gap9.yml +++ b/.github/workflows/ci-platform-gap9.yml @@ -27,7 +27,7 @@ jobs: select-env: uses: ./.github/workflows/_select-env.yml with: - docker_image_deeploy: ${{ inputs.docker_image_deeploy }} + docker_image_deeploy: 'ghcr.io/runwangdl/deeploy:gap9' gap9-kernels: needs: select-env @@ -35,45 +35,7 @@ jobs: with: runner: ${{ needs.select-env.outputs.runner }} docker-image: ${{ needs.select-env.outputs.image }} - test-names: | - Adder - MultIO - test1DPad - test2DPad - testMatMul - testMatMulAdd - testRequantizedDWConv - test2DRequantizedConv - iSoftmax - testConcat - trueIntegerDivSandwich - Hardswish - RQHardswish - testBacktracking - testFloatAdder - testFloatGEMM - - testFloat2DConvolution - testFloat2DConvolutionBias - testFloat2DConvolutionZeroBias - - testFloat2DDWConvolution - testFloat2DDWConvolutionBias - testFloat2DDWConvolutionZeroBias - - testFloatLayerNorm - testFloatRelu - testFloatMaxPool - testFloatMatmul - testFloatSoftmax - testFloatTranspose - testFloatMul - Quant - Dequant - testFloatReduceSum - testFloatReshapeWithSkipConnection - QuantizedLinear - num-cores: 8 + pytest-marker: "kernels" gap9-models: needs: select-env @@ -81,12 +43,4 @@ jobs: with: runner: ${{ needs.select-env.outputs.runner }} docker-image: ${{ needs.select-env.outputs.image }} - test-names: | - simpleRegression - miniMobileNet - miniMobileNetv2 - Attention - MLPerf/KeywordSpotting - MLPerf/ImageClassification - MLPerf/AnomalyDetection - num-cores: 8 + pytest-marker: "models" diff --git a/Container/Dockerfile.deeploy b/Container/Dockerfile.deeploy index da8cd3f4c4..65265a6eeb 100644 --- a/Container/Dockerfile.deeploy +++ b/Container/Dockerfile.deeploy @@ -16,7 +16,6 @@ ENV DEBIAN_FRONTEND=noninteractive ENV TZ=Etc/UTC ENV PATH="/root/.cargo/bin:/app/bender:${PATH}" ENV LLVM_INSTALL_DIR=/app/install/llvm -ENV GAP_RISCV_GCC_TOOLCHAIN=/app/install/gcc/gap9 WORKDIR /app @@ -25,14 +24,9 @@ COPY toolchain/*.patch toolchain/ COPY Makefile ./ COPY requirements-dev.txt ./ -# Install SSH keys to access private repositories -RUN mkdir -p -m 0700 ~/.ssh && ssh-keyscan iis-git.ee.ethz.ch >> ~/.ssh/known_hosts - # Compile emulators # WIESEP: We need to already clean up some space, otherwise the GitHub runners run out of disk space RUN --mount=type=cache,target=/ccache \ - --mount=type=cache,target=/root/.cache/pip \ - --mount=type=cache,target=/root/.cargo/registry \ ccache -z && \ make pulp-sdk chimera-sdk qemu mempool banshee xtensor && \ make gvsoc && \ @@ -58,19 +52,10 @@ elif [ "$TARGETPLATFORM" = "linux/arm64" ]; then \ cp /app/bender /bin; \ fi -# Compile Snitch Runtime and GAP9 SDK without ccache wrapping +# Compile Snitch Runtime ENV CC="gcc" ENV CXX="g++" - -RUN --mount=type=ssh \ - --mount=type=cache,target=/ccache \ - --mount=type=cache,target=/root/.cache/pip \ - ccache -z && \ - make gap9-sdk && \ - ccache -s - RUN --mount=type=cache,target=/ccache \ - --mount=type=cache,target=/root/.cache/pip \ ccache -z && \ make snitch_runtime && \ ccache -s @@ -83,13 +68,11 @@ FROM ubuntu:22.04 AS deeploy ARG TARGETPLATFORM ARG DEBIAN_FRONTEND=noninteractive -ARG CMAKE_VERSION=3.31.1 ENV TZ=Etc/UTC # Export symbols necessary for Deeploy's build flow ENV CMAKE=/usr/bin/cmake ENV PULP_SDK_HOME=/app/install/pulp-sdk -ENV GAP_SDK_HOME=/app/install/gap9-sdk ENV SNITCH_HOME=/app/install/snitch_cluster ENV CHIMERA_SDK_HOME=/app/install/chimera-sdk ENV LLVM_INSTALL_DIR=/app/install/llvm @@ -97,26 +80,18 @@ ENV GVSOC_INSTALL_DIR=/app/install/gvsoc ENV SOFTHIER_INSTALL_DIR=/app/install/softhier ENV MINIMALLOC_INSTALL_DIR=/app/install/minimalloc ENV MEMPOOL_HOME=/app/install/mempool -ENV GAP_RISCV_GCC_TOOLCHAIN=/app/install/gcc/gap9 ENV PATH=/root/.cargo/bin:/app/install/qemu/bin:/app/install/banshee:$PATH -ENV LANG=C.UTF-8 -ENV LC_ALL=C.UTF-8 WORKDIR /app COPY pyproject.toml ./ -COPY Container/amd64.list ./ # Add nvidia channel to the pip configuration RUN mkdir -p /etc && printf "[global]\nextra-index-url = https://pypi.ngc.nvidia.com\n" > /etc/pip.conf # Install dependencies -RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ - --mount=type=cache,target=/var/lib/apt,sharing=locked \ - --mount=type=cache,target=/root/.cache/pip \ - mkdir -p /root/.cargo/bin/ && \ +RUN mkdir -p /root/.cargo/bin/ && \ apt-get update && \ - apt-get upgrade -y && \ apt-get install -y git-lfs \ wget \ ccache \ @@ -125,7 +100,6 @@ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ libpixman-1-dev \ libsdl2-dev \ python-is-python3 \ - python3 \ python3.10-venv \ python3.10-distutils \ gcc && \ @@ -134,48 +108,23 @@ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ rm get-pip.py && \ pip install toml-to-requirements && \ toml-to-req --toml-file pyproject.toml && \ - pip install -r requirements.txt && \ - rm requirements.txt pyproject.toml - -# # Install Oh My ZSH -RUN sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended && \ - sed -i 's/ZSH_THEME="robbyrussell"/ZSH_THEME="cypher"/' ~/.zshrc - -# Install AMD64 libraries on ARM64 for GCC GAP9 compiler support -RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ - --mount=type=cache,target=/var/lib/apt,sharing=locked \ -< None: config.addinivalue_line("markers", "siracusa_tiled: mark test as a Siracusa platform test (tiled)") config.addinivalue_line("markers", "siracusa_neureka_tiled: mark test as a Siracusa + Neureka platform test (tiled)") + config.addinivalue_line("markers", "gap9: mark test as a GAP9 platform test") + config.addinivalue_line("markers", "gap9_tiled: mark test as a GAP9 platform test (tiled)") config.addinivalue_line("markers", "kernels: mark test as a kernel test (individual operators)") config.addinivalue_line("markers", "models: mark test as a model test (full networks)") config.addinivalue_line("markers", "singlebuffer: mark test as single-buffer configuration") diff --git a/DeeployTest/deeployRunner_gap9.py b/DeeployTest/deeployRunner_gap9.py new file mode 100644 index 0000000000..d0a44ebdf8 --- /dev/null +++ b/DeeployTest/deeployRunner_gap9.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python +# SPDX-FileCopyrightText: 2025 ETH Zurich and University of Bologna +# +# SPDX-License-Identifier: Apache-2.0 + +import sys + +from testUtils.deeployRunner import main + +if __name__ == "__main__": + + # Define parser setup callback to add GAP9-specific arguments + def setup_parser(parser): + parser.add_argument('--cores', type = int, default = 8, help = 'Number of cores (default: 8)\n') + + # Set default GVSOC install dir for GAP9 + for action in parser._actions: + if action.dest == 'gvsoc_install_dir': + action.default = "${GAP_SDK_HOME}/install/workstation" + + sys.exit( + main(default_platform = "GAP9", + default_simulator = "gvsoc", + tiling_enabled = False, + parser_setup_callback = setup_parser)) diff --git a/DeeployTest/deeployRunner_tiled_gap9.py b/DeeployTest/deeployRunner_tiled_gap9.py new file mode 100644 index 0000000000..50c0c6e7bc --- /dev/null +++ b/DeeployTest/deeployRunner_tiled_gap9.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python +# SPDX-FileCopyrightText: 2025 ETH Zurich and University of Bologna +# +# SPDX-License-Identifier: Apache-2.0 + +import sys + +from testUtils.deeployRunner import main + +if __name__ == "__main__": + + # Define parser setup callback to add GAP9-specific arguments + def setup_parser(parser): + parser.add_argument('--cores', type = int, default = 8, help = 'Number of cores (default: 8)\n') + + # Set default GVSOC install dir for GAP9 + for action in parser._actions: + if action.dest == 'gvsoc_install_dir': + action.default = "${GAP_SDK_HOME}/install/workstation" + + sys.exit( + main(default_platform = "GAP9", + default_simulator = "gvsoc", + tiling_enabled = True, + parser_setup_callback = setup_parser)) diff --git a/DeeployTest/testUtils/core/config.py b/DeeployTest/testUtils/core/config.py index 0c545e1b73..e932c23962 100644 --- a/DeeployTest/testUtils/core/config.py +++ b/DeeployTest/testUtils/core/config.py @@ -19,6 +19,7 @@ class DeeployTestConfig: build_dir: str toolchain: str = "LLVM" toolchain_install_dir: Optional[str] = None + gvsoc_install_dir: Optional[str] = None cmake_args: List[str] = None gen_args: List[str] = None verbose: int = 0 @@ -31,3 +32,5 @@ def __post_init__(self): self.gen_args = [] if self.toolchain_install_dir is None: self.toolchain_install_dir = os.environ.get('LLVM_INSTALL_DIR') + if self.gvsoc_install_dir is None: + self.gvsoc_install_dir = os.environ.get('GVSOC_INSTALL_DIR') diff --git a/DeeployTest/testUtils/core/execution.py b/DeeployTest/testUtils/core/execution.py index 46ed86d303..59644adb2e 100644 --- a/DeeployTest/testUtils/core/execution.py +++ b/DeeployTest/testUtils/core/execution.py @@ -83,6 +83,10 @@ def configure_cmake(config: DeeployTestConfig) -> None: f"-B{config.build_dir}", ] + # Add GVSOC_INSTALL_DIR if available + if config.gvsoc_install_dir: + cmd.append(f"-DGVSOC_INSTALL_DIR={config.gvsoc_install_dir}") + for arg in config.cmake_args: if not arg.startswith("-D"): arg = "-D" + arg @@ -127,6 +131,10 @@ def build_binary(config: DeeployTestConfig) -> None: config.test_name, ] + # GAP9 requires the 'image' target to generate MRAM .bin files for GVSOC + if config.platform == 'GAP9': + cmd.append("image") + env = os.environ.copy() if config.verbose >= 3: env["VERBOSE"] = "1" diff --git a/DeeployTest/testUtils/deeployRunner.py b/DeeployTest/testUtils/deeployRunner.py index 6e6f57e049..c17e94d3d7 100644 --- a/DeeployTest/testUtils/deeployRunner.py +++ b/DeeployTest/testUtils/deeployRunner.py @@ -245,6 +245,7 @@ def create_config_from_args(args: argparse.Namespace, build_dir = build_dir, toolchain = args.toolchain, toolchain_install_dir = args.toolchain_install_dir, + gvsoc_install_dir = getattr(args, 'gvsoc_install_dir', None), cmake_args = cmake_args_list, gen_args = gen_args_list, verbose = args.verbose, diff --git a/DeeployTest/test_gap9_config.py b/DeeployTest/test_gap9_config.py new file mode 100644 index 0000000000..0c19be7248 --- /dev/null +++ b/DeeployTest/test_gap9_config.py @@ -0,0 +1,53 @@ +# SPDX-FileCopyrightText: 2025 ETH Zurich and University of Bologna +# +# SPDX-License-Identifier: Apache-2.0 +"""Test configuration for GAP9 platform.""" + +DEFAULT_NUM_CORES = 8 + +KERNEL_TESTS = [ + "Kernels/Integer/Add/Regular", + "Kernels/Integer/Add/MultIO", + "Kernels/Integer/Pad/Regular_1D", + "Kernels/Integer/Pad/Regular_2D", + "Kernels/Integer/MatMul/Regular", + "Kernels/Integer/MatMul/Add", + "Kernels/Integer/Conv/DW_2D_RQ", + "Kernels/Integer/Conv/Regular_2D_RQ", + "Kernels/Integer/Softmax/Regular", + "Kernels/Integer/Concat", + "Kernels/Integer/Div/Integer", + "Kernels/Integer/Hardswish/Regular", + "Kernels/Integer/Hardswish/RQ", + "Kernels/Integer/Backtracking", + "Kernels/FP32/Add/Regular", + "Kernels/FP32/GEMM/Regular", + "Kernels/FP32/Conv/Regular_2D_Bias", + "Kernels/FP32/Conv/Regular_2D_NoBias", + "Kernels/FP32/Conv/Regular_2D_ZeroValuedBias", + "Kernels/FP32/Conv/DW_2D_Bias", + "Kernels/FP32/Conv/DW_2D_NoBias", + "Kernels/FP32/Conv/DW_2D_ZeroValuedBias", + "Kernels/FP32/LayerNorm", + "Kernels/FP32/ReLU", + "Kernels/FP32/MaxPool", + "Kernels/FP32/MatMul", + "Kernels/FP32/Softmax/Regular", + "Kernels/FP32/Transpose", + "Kernels/FP32/Mul", + "Kernels/Quantized/Quant", + "Kernels/Quantized/Dequant", + "Kernels/FP32/ReduceSum", + "Kernels/FP32/Reshape/SkipConnection", + "Kernels/Quantized/Linear", +] + +MODEL_TESTS = [ + "Models/SimpleRegression", + "Models/MiniMobileNet", + "Models/MiniMobileNetv2", + "Models/Attention", + "Models/MLPerf/KeywordSpotting", + "Models/MLPerf/ImageClassification", + "Models/MLPerf/AnomalyDetection", +] diff --git a/DeeployTest/test_gap9_tiled_config.py b/DeeployTest/test_gap9_tiled_config.py new file mode 100644 index 0000000000..4fca765208 --- /dev/null +++ b/DeeployTest/test_gap9_tiled_config.py @@ -0,0 +1,80 @@ +# SPDX-FileCopyrightText: 2025 ETH Zurich and University of Bologna +# +# SPDX-License-Identifier: Apache-2.0 + +PLATFORM_NAME = "GAP9" +SIMULATOR = "gvsoc" +DEFAULT_CORES = 8 +DEFAULT_L2 = 1024000 +DEFAULT_MEM_ALLOC_STRATEGY = "MiniMalloc" +DEFAULT_SEARCH_STRATEGY = "random-max" + +L2_SINGLEBUFFER_KERNELS = { + "Kernels/Integer/MatMul/Regular": [64000, 32000, 16000], + "Kernels/Integer/Conv/Regular_2D_RQ": [8000, 6000, 4000], + "Kernels/Integer/Conv/StriddedPadded_2D_RQ": [600], + "Kernels/Integer/Conv/DW_2D_RQ": [2561], + "Kernels/Integer/Softmax/Regular": [800, 500, 300], + "Kernels/Integer/Concat": [32000, 16000, 8000], + "Kernels/Integer/Hardswish/Regular": [750], + "Kernels/Integer/Hardswish/RQ": [750], + "Kernels/FP32/GEMM/Regular": [8000], + "Kernels/FP32/Conv/Regular_2D_Bias": [1600], + "Kernels/FP32/Conv/Regular_2D_NoBias": [6600], + "Kernels/FP32/Conv/Regular_2D_ZeroValuedBias": [6600], + "Kernels/FP32/Conv/DW_2D_Bias": [7200], + "Kernels/FP32/Conv/DW_2D_NoBias": [7200], + "Kernels/FP32/Conv/DW_2D_ZeroValuedBias": [7200], + "Kernels/FP32/LayerNorm": [2000], + "Kernels/FP32/MaxPool": [2000], + "Kernels/FP32/MatMul": [2000], + "Kernels/FP32/ReLU": [2000], + "Kernels/FP32/Reshape/SkipConnection": [1400], + "Kernels/FP32/Softmax/Regular": [4000], + "Kernels/FP32/Transpose": [2000], + "Kernels/FP32/Mul": [2000], + "Kernels/Integer/GEMM/Batch_RQ": [20000], + "Kernels/Integer/MatMul/Batch": [20000], +} + +L2_DOUBLEBUFFER_KERNELS = { + "Kernels/Integer/MatMul/Regular": [64000, 32000, 16000], + "Kernels/Integer/Conv/Regular_2D_RQ": [8000, 6000, 5000], + "Kernels/Integer/Conv/DW_2D_RQ": [5121], + "Kernels/Integer/Softmax/Regular": [1600, 1000, 600], + "Kernels/Integer/Concat": [64000, 32000, 16000], + "Kernels/Integer/Hardswish/Regular": [750], + "Kernels/Integer/Hardswish/RQ": [800], + "Kernels/FP32/GEMM/Regular": [8000], + "Kernels/FP32/Conv/Regular_2D_Bias": [2000], + "Kernels/FP32/Conv/Regular_2D_NoBias": [8800], + "Kernels/FP32/Conv/Regular_2D_ZeroValuedBias": [8800], + "Kernels/FP32/Conv/DW_2D_Bias": [9800], + "Kernels/FP32/Conv/DW_2D_NoBias": [10000], + "Kernels/FP32/Conv/DW_2D_ZeroValuedBias": [9800], + "Kernels/FP32/LayerNorm": [2000], + "Kernels/FP32/MaxPool": [5000], + "Kernels/FP32/MatMul": [5000], + "Kernels/FP32/ReLU": [20], + "Kernels/FP32/Reshape/SkipConnection": [2600], + "Kernels/FP32/Softmax/Regular": [8000], + "Kernels/FP32/Transpose": [2000], + "Kernels/FP32/Mul": [2000], +} + +L2_SINGLEBUFFER_MODELS = { + "Models/SimpleRegression": [45000, 30000, 15000], + "Models/MiniMobileNet": [60000, 12000, 6000, 3000], + "Models/MiniMobileNetv2": [60000, 16000, 12000, 8000], + "Models/Attention": [60000, 10000, 5000], + "Models/MLPerf/KeywordSpotting": [64000], + "Models/MLPerf/ImageClassification": [64000], + "Models/MLPerf/AnomalyDetection": [64000], +} + +L2_DOUBLEBUFFER_MODELS = { + "Models/SimpleRegression": [60000, 45000, 30000], + "Models/MiniMobileNet": [60000, 24000, 12000, 6000], + "Models/MiniMobileNetv2": [60000, 32000, 24000, 16000], + "Models/Attention": [60000, 20000, 10000, 5000], +} diff --git a/DeeployTest/test_platforms.py b/DeeployTest/test_platforms.py index 794ae6fe7e..f46bd00284 100644 --- a/DeeployTest/test_platforms.py +++ b/DeeployTest/test_platforms.py @@ -8,6 +8,14 @@ from test_chimera_config import MODEL_TESTS as CHIMERA_MODEL_TESTS from test_cortexm_config import KERNEL_TESTS as CORTEXM_KERNEL_TESTS from test_cortexm_config import MODEL_TESTS as CORTEXM_MODEL_TESTS +from test_gap9_config import DEFAULT_NUM_CORES as GAP9_DEFAULT_NUM_CORES +from test_gap9_config import KERNEL_TESTS as GAP9_KERNEL_TESTS +from test_gap9_config import MODEL_TESTS as GAP9_MODEL_TESTS +from test_gap9_tiled_config import DEFAULT_CORES as GAP9_TILED_DEFAULT_CORES +from test_gap9_tiled_config import L2_DOUBLEBUFFER_KERNELS as GAP9_L2_DOUBLEBUFFER_KERNELS +from test_gap9_tiled_config import L2_DOUBLEBUFFER_MODELS as GAP9_L2_DOUBLEBUFFER_MODELS +from test_gap9_tiled_config import L2_SINGLEBUFFER_KERNELS as GAP9_L2_SINGLEBUFFER_KERNELS +from test_gap9_tiled_config import L2_SINGLEBUFFER_MODELS as GAP9_L2_SINGLEBUFFER_MODELS from test_generic_config import KERNEL_TESTS as GENERIC_KERNEL_TESTS from test_generic_config import MODEL_TESTS as GENERIC_MODEL_TESTS from test_mempool_config import DEFAULT_NUM_THREADS as MEMPOOL_DEFAULT_NUM_THREADS @@ -100,6 +108,13 @@ def param_id(param): "model_tests": SNITCH_MODEL_TESTS, "default_num_cores": SNITCH_DEFAULT_NUM_CORES, }, + "gap9": { + "platform": "GAP9", + "simulator": "gvsoc", + "kernel_tests": GAP9_KERNEL_TESTS, + "model_tests": GAP9_MODEL_TESTS, + "default_num_cores": GAP9_DEFAULT_NUM_CORES, + }, } ### Markers summary ### @@ -114,6 +129,8 @@ def param_id(param): # siracusa: tests from the Siracusa platform (untiled) # siracusa_tiled: tests from the Siracusa platform (tiled) # siracusa_neureka_tiled: tests from the Siracusa + Neureka platform (tiled) +# gap9: tests from the GAP9 platform (untiled) +# gap9_tiled: tests from the GAP9 platform (tiled) # Test type markers: # kernels: single kernel (or single layer) tests # models: full model (multiple layer) tests @@ -726,3 +743,179 @@ def test_siracusa_neureka_tiled_models_l3_doublebuffer_wmem(test_params, deeploy gen_args = ["--neureka-wmem"], ) run_and_assert_test(test_name, config, skipgen, skipsim) + + +@pytest.mark.gap9 +@pytest.mark.kernels +@pytest.mark.parametrize("test_name", GAP9_KERNEL_TESTS, ids = GAP9_KERNEL_TESTS) +def test_gap9_kernels(test_name, deeploy_test_dir, toolchain, toolchain_dir, cmake_args, skipgen, skipsim) -> None: + platform_config = PLATFORM_CONFIGS["gap9"] + + # Add GAP9-specific CMake args for number of cores + gap9_cmake_args = cmake_args + [f"NUM_CORES={platform_config['default_num_cores']}"] + + config = create_test_config( + test_name = test_name, + platform = platform_config["platform"], + simulator = platform_config["simulator"], + deeploy_test_dir = deeploy_test_dir, + toolchain = toolchain, + toolchain_dir = toolchain_dir, + cmake_args = gap9_cmake_args, + tiling = False, + ) + run_and_assert_test(test_name, config, skipgen, skipsim) + + +@pytest.mark.gap9 +@pytest.mark.models +@pytest.mark.parametrize("test_name", GAP9_MODEL_TESTS, ids = GAP9_MODEL_TESTS) +def test_gap9_models(test_name, deeploy_test_dir, toolchain, toolchain_dir, cmake_args, skipgen, skipsim) -> None: + platform_config = PLATFORM_CONFIGS["gap9"] + + # Add GAP9-specific CMake args for number of cores + gap9_cmake_args = cmake_args + [f"NUM_CORES={platform_config['default_num_cores']}"] + + config = create_test_config( + test_name = test_name, + platform = platform_config["platform"], + simulator = platform_config["simulator"], + deeploy_test_dir = deeploy_test_dir, + toolchain = toolchain, + toolchain_dir = toolchain_dir, + cmake_args = gap9_cmake_args, + tiling = False, + ) + run_and_assert_test(test_name, config, skipgen, skipsim) + + +@pytest.mark.gap9_tiled +@pytest.mark.kernels +@pytest.mark.singlebuffer +@pytest.mark.l2 +@pytest.mark.parametrize( + "test_params", + generate_test_params(GAP9_L2_SINGLEBUFFER_KERNELS, "L2-singlebuffer"), + ids = param_id, +) +def test_gap9_tiled_kernels_l2_singlebuffer(test_params, deeploy_test_dir, toolchain, toolchain_dir, cmake_args, + skipgen, skipsim) -> None: + test_name, l1, config_name = test_params + + # Add GAP9-specific CMake args + gap9_cmake_args = cmake_args + [f"NUM_CORES={GAP9_TILED_DEFAULT_CORES}"] + + config = create_test_config( + test_name = test_name, + platform = "GAP9", + simulator = "gvsoc", + deeploy_test_dir = deeploy_test_dir, + toolchain = toolchain, + toolchain_dir = toolchain_dir, + cmake_args = gap9_cmake_args, + tiling = True, + cores = GAP9_TILED_DEFAULT_CORES, + l1 = l1, + default_mem_level = "L2", + double_buffer = False, + ) + run_and_assert_test(test_name, config, skipgen, skipsim) + + +@pytest.mark.gap9_tiled +@pytest.mark.kernels +@pytest.mark.doublebuffer +@pytest.mark.l2 +@pytest.mark.parametrize( + "test_params", + generate_test_params(GAP9_L2_DOUBLEBUFFER_KERNELS, "L2-doublebuffer"), + ids = param_id, +) +def test_gap9_tiled_kernels_l2_doublebuffer(test_params, deeploy_test_dir, toolchain, toolchain_dir, cmake_args, + skipgen, skipsim) -> None: + test_name, l1, config_name = test_params + + # Add GAP9-specific CMake args + gap9_cmake_args = cmake_args + [f"NUM_CORES={GAP9_TILED_DEFAULT_CORES}"] + + config = create_test_config( + test_name = test_name, + platform = "GAP9", + simulator = "gvsoc", + deeploy_test_dir = deeploy_test_dir, + toolchain = toolchain, + toolchain_dir = toolchain_dir, + cmake_args = gap9_cmake_args, + tiling = True, + cores = GAP9_TILED_DEFAULT_CORES, + l1 = l1, + default_mem_level = "L2", + double_buffer = True, + ) + run_and_assert_test(test_name, config, skipgen, skipsim) + + +@pytest.mark.gap9_tiled +@pytest.mark.models +@pytest.mark.singlebuffer +@pytest.mark.l2 +@pytest.mark.parametrize( + "test_params", + generate_test_params(GAP9_L2_SINGLEBUFFER_MODELS, "L2-singlebuffer"), + ids = param_id, +) +def test_gap9_tiled_models_l2_singlebuffer(test_params, deeploy_test_dir, toolchain, toolchain_dir, cmake_args, + skipgen, skipsim) -> None: + test_name, l1, config_name = test_params + + # Add GAP9-specific CMake args + gap9_cmake_args = cmake_args + [f"NUM_CORES={GAP9_TILED_DEFAULT_CORES}"] + + config = create_test_config( + test_name = test_name, + platform = "GAP9", + simulator = "gvsoc", + deeploy_test_dir = deeploy_test_dir, + toolchain = toolchain, + toolchain_dir = toolchain_dir, + cmake_args = gap9_cmake_args, + tiling = True, + cores = GAP9_TILED_DEFAULT_CORES, + l1 = l1, + default_mem_level = "L2", + double_buffer = False, + ) + run_and_assert_test(test_name, config, skipgen, skipsim) + + +@pytest.mark.gap9_tiled +@pytest.mark.models +@pytest.mark.doublebuffer +@pytest.mark.l2 +@pytest.mark.parametrize( + "test_params", + generate_test_params(GAP9_L2_DOUBLEBUFFER_MODELS, "L2-doublebuffer"), + ids = param_id, +) +def test_gap9_tiled_models_l2_doublebuffer(test_params, deeploy_test_dir, toolchain, toolchain_dir, cmake_args, + skipgen, skipsim) -> None: + test_name, l1, config_name = test_params + + # Add GAP9-specific CMake args + gap9_cmake_args = cmake_args + [f"NUM_CORES={GAP9_TILED_DEFAULT_CORES}"] + + config = create_test_config( + test_name = test_name, + platform = "GAP9", + simulator = "gvsoc", + deeploy_test_dir = deeploy_test_dir, + toolchain = toolchain, + toolchain_dir = toolchain_dir, + cmake_args = gap9_cmake_args, + tiling = True, + cores = GAP9_TILED_DEFAULT_CORES, + l1 = l1, + default_mem_level = "L2", + double_buffer = True, + ) + run_and_assert_test(test_name, config, skipgen, skipsim) diff --git a/TargetLibraries/GAP9/third_party b/TargetLibraries/GAP9/third_party new file mode 120000 index 0000000000..a29026a04d --- /dev/null +++ b/TargetLibraries/GAP9/third_party @@ -0,0 +1 @@ +/app/Deeploy/TargetLibraries/GAP9/../PULPOpen/third_party \ No newline at end of file diff --git a/TargetLibraries/PULPOpen/third_party/pulp-nn-mixed b/TargetLibraries/PULPOpen/third_party/pulp-nn-mixed index a9b4aaf597..b69ec23ec8 160000 --- a/TargetLibraries/PULPOpen/third_party/pulp-nn-mixed +++ b/TargetLibraries/PULPOpen/third_party/pulp-nn-mixed @@ -1 +1 @@ -Subproject commit a9b4aaf597c030ce24bf65a00b5f3ec84a1528c4 +Subproject commit b69ec23ec81595ebbec694f4a28d84022858af83 From f9a785d1126bf01d9d9989be7eb0df7aa20919c1 Mon Sep 17 00:00:00 2001 From: Run Wang <52746141+SamanthaWangdl@users.noreply.github.com> Date: Wed, 4 Feb 2026 12:32:48 +0000 Subject: [PATCH 27/49] Apply Philip's Patch about GAP9 workflow --- .../workflows/docker-build-deeploy-gap9.yml | 155 ++++++++++++++++++ .../workflows/docker-build-deeploy-gap9.yml | 155 ++++++++++++++++++ Container/Dockerfile.deeploy | 5 +- Container/Dockerfile.gap9 | 43 +++++ Container/Makefile | 42 +++-- GAP9.md | 32 ++-- 6 files changed, 402 insertions(+), 30 deletions(-) create mode 100644 .github/.github/workflows/docker-build-deeploy-gap9.yml create mode 100644 .github/workflows/docker-build-deeploy-gap9.yml create mode 100644 Container/Dockerfile.gap9 diff --git a/.github/.github/workflows/docker-build-deeploy-gap9.yml b/.github/.github/workflows/docker-build-deeploy-gap9.yml new file mode 100644 index 0000000000..0347cecf82 --- /dev/null +++ b/.github/.github/workflows/docker-build-deeploy-gap9.yml @@ -0,0 +1,155 @@ +# SPDX-FileCopyrightText: 2025 ETH Zurich and University of Bologna +# +# SPDX-License-Identifier: Apache-2.0 + +--- +name: Docker • Build Deeploy GAP9 Container + +"on": + workflow_dispatch: + inputs: + docker_image_deeploy: + description: "Deeploy Image to use" + required: false + default: "ghcr.io/pulp-platform/deeploy:latest" + +jobs: + prepare: + name: Fetch branch name or tag + runs-on: ubuntu-latest + outputs: + docker_tag: ${{ steps.generate_tag.outputs.docker_tag }} + steps: + - uses: actions/checkout@v4 + + - name: Set up environment variables + run: | + echo "BRANCH_NAME=${GITHUB_REF##*/}" >> $GITHUB_ENV + echo "TAG_NAME=${GITHUB_REF##*/}" >> $GITHUB_ENV + echo "IS_TAG=${GITHUB_REF_TYPE}" >> $GITHUB_ENV + + - name: Set Docker tag + id: generate_tag + run: | + if [[ "${{ env.IS_TAG }}" == "tag" ]]; then + echo "docker_tag=${{ env.TAG_NAME }}" >> $GITHUB_OUTPUT + else + echo "docker_tag=${{ env.BRANCH_NAME }}" >> $GITHUB_OUTPUT + fi + + build-deeploy-gap9: + name: Build Deeploy GAP9 Image + needs: [prepare] + runs-on: ${{ matrix.runner }} + outputs: + digest-amd64: ${{ steps.digest.outputs.digest-amd64 }} + digest-arm64: ${{ steps.digest.outputs.digest-arm64 }} + strategy: + fail-fast: false + matrix: + platform: [amd64, arm64] + include: + - platform: amd64 + runner: ubuntu-latest + - platform: arm64 + runner: ubuntu-22.04-arm + steps: + - uses: actions/checkout@v4 + + - name: Free up disk space + uses: jlumbroso/free-disk-space@v1.3.1 + with: + tool-cache: true + android: true + dotnet: true + haskell: true + large-packages: true + + - uses: docker/setup-buildx-action@v3 + + - name: GHCR Log-in + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Build Cache for Docker + id: cache + uses: actions/cache@v4 + with: + path: var-ccache + key: ${{ runner.os }}-${{ matrix.platform }}-build-cache-deeploy-gap9 + + - name: Inject build-cache + uses: reproducible-containers/buildkit-cache-dance@v3.1.0 + with: + cache-map: | + { + "var-ccache": "/ccache" + } + skip-extraction: ${{ steps.cache.outputs.cache-hit }} + + - name: Lower Case Repository Name + run: | + echo "OWNER_LC=${OWNER,,}" >>${GITHUB_ENV} + env: + OWNER: "${{ github.repository_owner }}" + + - name: Build and push final deploy image + id: build + uses: docker/build-push-action@v6 + with: + platforms: linux/${{ matrix.platform }} + context: . + cache-from: type=gha + cache-to: type=gha,mode=min + file: Container/Dockerfile.gap9 + push: true + build-args: | + DEEPLOY_IMAGE=${{ github.event.inputs.docker_image_deeploy }} + outputs: type=image,name=ghcr.io/${{ env.OWNER_LC }}/deeploy-gap9,annotation-index=true,name-canonical=true,push=true + + - name: Extract image digest + id: digest + run: echo "digest-${{ matrix.platform }}=${{ steps.build.outputs.digest }}" >> $GITHUB_OUTPUT + + merge-deeploy-gap9-images: + name: Merge Deeploy GAP9 Images + runs-on: ubuntu-latest + needs: [prepare, build-deeploy-gap9] + steps: + - name: GHCR Log-in + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Lower Case Repository Name + run: | + echo "OWNER_LC=${OWNER,,}" >>${GITHUB_ENV} + env: + OWNER: "${{ github.repository_owner }}" + + - name: Merge Deeploy GAP9 Images + uses: Noelware/docker-manifest-action@v1 + with: + inputs: | + ghcr.io/${{ env.OWNER_LC }}/deeploy-gap9@${{ needs.build-deeploy-gap9.outputs.digest-amd64 }}, + ghcr.io/${{ env.OWNER_LC }}/deeploy-gap9@${{ needs.build-deeploy-gap9.outputs.digest-arm64 }} + tags: | + ghcr.io/${{ env.OWNER_LC }}/deeploy-gap9:latest, + ghcr.io/${{ env.OWNER_LC }}/deeploy-gap9:${{ needs.prepare.outputs.docker_tag }} + push: true + + - name: Set package visibility to internal + uses: actions/github-script@v7 + with: + script: | + await github.rest.packages.updatePackageVersionVisibility({ + package_type: 'container', + package_name: 'deeploy-gap9', + visibility: 'internal', + org: context.repo.owner + }); diff --git a/.github/workflows/docker-build-deeploy-gap9.yml b/.github/workflows/docker-build-deeploy-gap9.yml new file mode 100644 index 0000000000..0347cecf82 --- /dev/null +++ b/.github/workflows/docker-build-deeploy-gap9.yml @@ -0,0 +1,155 @@ +# SPDX-FileCopyrightText: 2025 ETH Zurich and University of Bologna +# +# SPDX-License-Identifier: Apache-2.0 + +--- +name: Docker • Build Deeploy GAP9 Container + +"on": + workflow_dispatch: + inputs: + docker_image_deeploy: + description: "Deeploy Image to use" + required: false + default: "ghcr.io/pulp-platform/deeploy:latest" + +jobs: + prepare: + name: Fetch branch name or tag + runs-on: ubuntu-latest + outputs: + docker_tag: ${{ steps.generate_tag.outputs.docker_tag }} + steps: + - uses: actions/checkout@v4 + + - name: Set up environment variables + run: | + echo "BRANCH_NAME=${GITHUB_REF##*/}" >> $GITHUB_ENV + echo "TAG_NAME=${GITHUB_REF##*/}" >> $GITHUB_ENV + echo "IS_TAG=${GITHUB_REF_TYPE}" >> $GITHUB_ENV + + - name: Set Docker tag + id: generate_tag + run: | + if [[ "${{ env.IS_TAG }}" == "tag" ]]; then + echo "docker_tag=${{ env.TAG_NAME }}" >> $GITHUB_OUTPUT + else + echo "docker_tag=${{ env.BRANCH_NAME }}" >> $GITHUB_OUTPUT + fi + + build-deeploy-gap9: + name: Build Deeploy GAP9 Image + needs: [prepare] + runs-on: ${{ matrix.runner }} + outputs: + digest-amd64: ${{ steps.digest.outputs.digest-amd64 }} + digest-arm64: ${{ steps.digest.outputs.digest-arm64 }} + strategy: + fail-fast: false + matrix: + platform: [amd64, arm64] + include: + - platform: amd64 + runner: ubuntu-latest + - platform: arm64 + runner: ubuntu-22.04-arm + steps: + - uses: actions/checkout@v4 + + - name: Free up disk space + uses: jlumbroso/free-disk-space@v1.3.1 + with: + tool-cache: true + android: true + dotnet: true + haskell: true + large-packages: true + + - uses: docker/setup-buildx-action@v3 + + - name: GHCR Log-in + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Build Cache for Docker + id: cache + uses: actions/cache@v4 + with: + path: var-ccache + key: ${{ runner.os }}-${{ matrix.platform }}-build-cache-deeploy-gap9 + + - name: Inject build-cache + uses: reproducible-containers/buildkit-cache-dance@v3.1.0 + with: + cache-map: | + { + "var-ccache": "/ccache" + } + skip-extraction: ${{ steps.cache.outputs.cache-hit }} + + - name: Lower Case Repository Name + run: | + echo "OWNER_LC=${OWNER,,}" >>${GITHUB_ENV} + env: + OWNER: "${{ github.repository_owner }}" + + - name: Build and push final deploy image + id: build + uses: docker/build-push-action@v6 + with: + platforms: linux/${{ matrix.platform }} + context: . + cache-from: type=gha + cache-to: type=gha,mode=min + file: Container/Dockerfile.gap9 + push: true + build-args: | + DEEPLOY_IMAGE=${{ github.event.inputs.docker_image_deeploy }} + outputs: type=image,name=ghcr.io/${{ env.OWNER_LC }}/deeploy-gap9,annotation-index=true,name-canonical=true,push=true + + - name: Extract image digest + id: digest + run: echo "digest-${{ matrix.platform }}=${{ steps.build.outputs.digest }}" >> $GITHUB_OUTPUT + + merge-deeploy-gap9-images: + name: Merge Deeploy GAP9 Images + runs-on: ubuntu-latest + needs: [prepare, build-deeploy-gap9] + steps: + - name: GHCR Log-in + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Lower Case Repository Name + run: | + echo "OWNER_LC=${OWNER,,}" >>${GITHUB_ENV} + env: + OWNER: "${{ github.repository_owner }}" + + - name: Merge Deeploy GAP9 Images + uses: Noelware/docker-manifest-action@v1 + with: + inputs: | + ghcr.io/${{ env.OWNER_LC }}/deeploy-gap9@${{ needs.build-deeploy-gap9.outputs.digest-amd64 }}, + ghcr.io/${{ env.OWNER_LC }}/deeploy-gap9@${{ needs.build-deeploy-gap9.outputs.digest-arm64 }} + tags: | + ghcr.io/${{ env.OWNER_LC }}/deeploy-gap9:latest, + ghcr.io/${{ env.OWNER_LC }}/deeploy-gap9:${{ needs.prepare.outputs.docker_tag }} + push: true + + - name: Set package visibility to internal + uses: actions/github-script@v7 + with: + script: | + await github.rest.packages.updatePackageVersionVisibility({ + package_type: 'container', + package_name: 'deeploy-gap9', + visibility: 'internal', + org: context.repo.owner + }); diff --git a/Container/Dockerfile.deeploy b/Container/Dockerfile.deeploy index 65265a6eeb..a75b841636 100644 --- a/Container/Dockerfile.deeploy +++ b/Container/Dockerfile.deeploy @@ -128,4 +128,7 @@ RUN pip install -r requirements-dev.txt -r core-requirements.txt -r gapy-require # Copy pre-built toolchains and emulators COPY --from=toolchain /app/install ./install -COPY --from=toolchain /root/.cargo/bin/banshee /root/.cargo/bin/banshee \ No newline at end of file +COPY --from=toolchain /root/.cargo/bin/banshee /root/.cargo/bin/banshee + +# Remove unused files and clean up to reduce image size +RUN rm cmake-* core-requirements.txt gapy-requirements.txt pyproject.toml requirements-dev.txt requirements.txt Makefile \ No newline at end of file diff --git a/Container/Dockerfile.gap9 b/Container/Dockerfile.gap9 new file mode 100644 index 0000000000..a94987ffb7 --- /dev/null +++ b/Container/Dockerfile.gap9 @@ -0,0 +1,43 @@ + +ARG DEEPLOY_IMAGE=ghcr.io/pulp-platform/deeploy:latest +FROM ${DEEPLOY_IMAGE} as deeploy + +ENV GAP_RISCV_GCC_TOOLCHAIN=/app/install/gcc/gap9 +ENV GAP_SDK_HOME=/app/install/gap9-sdk +ENV PATH="${GAP_RISCV_GCC_TOOLCHAIN}/bin:${PATH}" + +ENV TARGET_INSTALL_DIR=/app/install +ENV DEEPLOY_DIR=/app/Deeploy + +USER root + +# Install Python build dependencies and git for pip installs from git repos +# openssh-client is needed for ssh authentication with private repos +RUN apt-get update && \ + apt-get install -y \ + libftdi-dev \ + libftdi1 \ + doxygen \ + git-lfs \ + openssh-client && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* + +WORKDIR /app + +COPY toolchain/gap9.mk ./toolchain/gap9.mk +COPY Makefile ./ + +RUN --mount=type=cache,target=/ccache \ + ccache -z && make gap9-toolchain && \ + rm -rf /app/toolchain/gap9-toolchain + +RUN --mount=type=ssh \ + --mount=type=cache,target=/ccache \ + ccache -z && make gap9-sdk && ccache -s && \ + rm -rf /app/toolchain/gap9-sdk + +# Install Deeploy Python package +COPY pyproject.toml requirements.txt core-requirements.txt gapy-requirements.txt ./ +RUN pip install --upgrade pip && \ + pip install -r requirements.txt -r core-requirements.txt -r gapy-requirements.txt diff --git a/Container/Makefile b/Container/Makefile index e34103b05a..e62be5d383 100644 --- a/Container/Makefile +++ b/Container/Makefile @@ -5,26 +5,34 @@ # Variables TOOLCHAIN_IMAGE ?= ghcr.io/pulp-platform/deeploy-toolchain:latest DEEPOY_IMAGE ?= ghcr.io/pulp-platform/deeploy:latest +DEEPOY_GAP9_IMAGE ?= ghcr.io/pulp-platform/deeploy-gap9:latest -.PHONY: all toolchain deeploy push clean help +SSH_PRIVATE_KEY ?= ~/.ssh/id_ed25519 + +.PHONY: all toolchain deeploy deeploy-gap9 push clean help help: @echo "Makefile for building Deeploy Docker images" @echo "" @echo "Usage:" - @echo " make toolchain # Build only the toolchain image" - @echo " make deeploy # Build only the deploy image" - @echo " make all # Build both images" - @echo " make clean # Remove all images (optional and dangerous)" + @echo " make toolchain # Build only the toolchain image" + @echo " make deeploy # Build only the deeploy image" + @echo " make deeploy-gap9 # Build only the GAP9 deeploy image" + @echo " make all # Build all images" + @echo " make clean # Remove all images (optional and dangerous)" @echo "" @echo "Build Variables:" - @echo " TOOLCHAIN_IMAGE # Name of the toolchain image (default: $(TOOLCHAIN_IMAGE))" - @echo " DEEPOY_IMAGE # Name of the deploy image (default: $(DEEPOY_IMAGE))" + @echo " TOOLCHAIN_IMAGE # Name of the toolchain image (default: $(TOOLCHAIN_IMAGE))" + @echo " DEEPOY_IMAGE # Name of the deeploy image (default: $(DEEPOY_IMAGE))" + @echo " DEEPOY_GAP9_IMAGE # Name of the GAP9 deeploy image (default: $(DEEPOY_GAP9_IMAGE))" + @echo " SSH_PRIVATE_KEY # Path to SSH private key for GAP9 build (default: $(SSH_PRIVATE_KEY))" @echo "" @echo "Example Usage:" @echo " make toolchain TOOLCHAIN_IMAGE=my-toolchain:latest" - @echo " make deeploy DEEPOY_IMAGE=my-deploy:latest" - @echo " make all TOOLCHAIN_IMAGE=my-toolchain:latest DEEPOY_IMAGE=my-deploy:latest" + @echo " make deeploy DEEPOY_IMAGE=my-deeploy:latest" + @echo " make deeploy-gap9 DEEPOY_GAP9_IMAGE=my-deeploy-gap9:latest" + @echo " make all TOOLCHAIN_IMAGE=my-toolchain:latest DEEPOY_IMAGE=my-deeploy:latest" + @echo " make deeploy-gap9 SSH_PRIVATE_KEY=/path/to/key" # Build only the toolchain image toolchain: @@ -40,9 +48,19 @@ deeploy: --build-arg BASE_IMAGE=$(TOOLCHAIN_IMAGE) \ -t $(DEEPOY_IMAGE) .. -# Build both -all: toolchain deeploy +# Build the GAP9 deploy image +deeploy-gap9: + eval $$(ssh-agent) && \ + ssh-add $(SSH_PRIVATE_KEY) && \ + DOCKER_BUILDKIT=1 docker build \ + --ssh default \ + -f Dockerfile.gap9 \ + --build-arg DEEPOY_IMAGE=$(DEEPOY_IMAGE) \ + -t $(DEEPOY_GAP9_IMAGE) .. + +# Build all images +all: toolchain deeploy deeploy-gap9 # Clean all images (optional and dangerous) clean: - docker rmi $(TOOLCHAIN_IMAGE) $(DEEPOY_IMAGE) || true + docker rmi $(TOOLCHAIN_IMAGE) $(DEEPOY_IMAGE) $(DEEPOY_GAP9_IMAGE) || true diff --git a/GAP9.md b/GAP9.md index e216af23c3..5361e55b67 100644 --- a/GAP9.md +++ b/GAP9.md @@ -7,38 +7,36 @@ To use Deeploy with GAP9, a custom Docker container is required because the offi ### Build The Docker Container -To use SSH keys for accessing private repositories during the Docker build process, you need to start the SSH agent and add your SSH private key before running the Docker build command. You can do this by executing the following commands in your terminal: -```sh -cd Container -eval $(ssh-agent) - -# Add your SSH private key to the agent -ssh-add ~/.ssh/id_ed25519 -``` +To use SSH keys for accessing private repositories during the Docker build process, make sure you have an SSH key pair set up on your local machine. By default, the Makefile uses the key located at `~/.ssh/id_ed25519`. If your key is located elsewhere, you can specify its path using the `SSH_PRIVATE_KEY` variable when invoking the make command. To build a local version of the Deeploy Docker image with GAP9 support using the upstream toolchain image, run: ```sh +cd Container + # Build the Deeploy image with the upstream toolchain image -make deeploy DEEPOY_IMAGE=deeploy:gap9 +make deeploy-gap9 DEEPOY_GAP9_IMAGE=deeploy-gap9:latest + +# If you want to specify a custom SSH key path, use: +make deeploy-gap9 DEEPOY_GAP9_IMAGE=deeploy-gap9:latest SSH_PRIVATE_KEY=/path/to/your/private/key ``` -Or, to build both the toolchain and Deeploy images locally, use: +Or, to build the toolchain, Deeploy and GAP9 images locally, use: ```sh -# To build the toolchain container -make toolchain TOOLCHAIN_IMAGE=deeploy-toolchain:gap9 DEEPOY_IMAGE=deeploy:gap9 +cd Container -# To build the Deeploy container with the local toolchain image -make deeploy TOOLCHAIN_IMAGE=deeploy-toolchain:gap9 DEEPOY_IMAGE=deeploy:gap9 +# Build all images +make all TOOLCHAIN_IMAGE=deeploy-toolchain:latest DEEPOY_IMAGE=deeploy:latest DEEPOY_GAP9_IMAGE=deeploy-gap9:latest ``` ### Use The Docker Container -Then you can create and start the container in interactive mode with: + +Once the image is built, you can create and start the container in interactive mode with: ```sh -docker run -it --name deeploy_gap9 -v $(pwd):/app/Deeploy deeploy:gap9 +docker run -it --name deeploy_gap9 -v $(pwd):/app/Deeploy deeploy-gap9:latest ``` -Before running the test, you need to set some environment variables: +Before running tests, you need to set up the GAP9 environment inside the container: ```sh source /app/install/gap9-sdk/.gap9-venv/bin/activate source /app/install/gap9-sdk/configs/gap9_evk_audio.sh From 8ba22ba3ed48276ccab96770c5aae3c975d97c68 Mon Sep 17 00:00:00 2001 From: Run Wang <52746141+SamanthaWangdl@users.noreply.github.com> Date: Wed, 4 Feb 2026 12:34:33 +0000 Subject: [PATCH 28/49] Add math.h to sqrt.c --- TargetLibraries/Generic/src/Sqrt_fp32.c | 1 + 1 file changed, 1 insertion(+) diff --git a/TargetLibraries/Generic/src/Sqrt_fp32.c b/TargetLibraries/Generic/src/Sqrt_fp32.c index 06327fda4e..e206893cde 100644 --- a/TargetLibraries/Generic/src/Sqrt_fp32.c +++ b/TargetLibraries/Generic/src/Sqrt_fp32.c @@ -5,6 +5,7 @@ */ #include "DeeployBasicMath.h" +#include void Sqrt_fp32_fp32(float32_t *data_in, float32_t *data_out, int32_t size) { for (int i = 0; i < size; i++) { From e94bef00f5bd70f46b343afcbc1e7b4dcd8cfc28 Mon Sep 17 00:00:00 2001 From: Run Wang <52746141+SamanthaWangdl@users.noreply.github.com> Date: Wed, 4 Feb 2026 12:48:12 +0000 Subject: [PATCH 29/49] Change the config list for GAP9 --- DeeployTest/test_gap9_config.py | 2 -- DeeployTest/test_gap9_tiled_config.py | 18 ++++++++++++++---- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/DeeployTest/test_gap9_config.py b/DeeployTest/test_gap9_config.py index 0c19be7248..bf0104fc34 100644 --- a/DeeployTest/test_gap9_config.py +++ b/DeeployTest/test_gap9_config.py @@ -43,10 +43,8 @@ ] MODEL_TESTS = [ - "Models/SimpleRegression", "Models/MiniMobileNet", "Models/MiniMobileNetv2", - "Models/Attention", "Models/MLPerf/KeywordSpotting", "Models/MLPerf/ImageClassification", "Models/MLPerf/AnomalyDetection", diff --git a/DeeployTest/test_gap9_tiled_config.py b/DeeployTest/test_gap9_tiled_config.py index 4fca765208..1157cc5915 100644 --- a/DeeployTest/test_gap9_tiled_config.py +++ b/DeeployTest/test_gap9_tiled_config.py @@ -63,18 +63,28 @@ } L2_SINGLEBUFFER_MODELS = { - "Models/SimpleRegression": [45000, 30000, 15000], "Models/MiniMobileNet": [60000, 12000, 6000, 3000], "Models/MiniMobileNetv2": [60000, 16000, 12000, 8000], - "Models/Attention": [60000, 10000, 5000], "Models/MLPerf/KeywordSpotting": [64000], "Models/MLPerf/ImageClassification": [64000], "Models/MLPerf/AnomalyDetection": [64000], } L2_DOUBLEBUFFER_MODELS = { - "Models/SimpleRegression": [60000, 45000, 30000], "Models/MiniMobileNet": [60000, 24000, 12000, 6000], "Models/MiniMobileNetv2": [60000, 32000, 24000, 16000], - "Models/Attention": [60000, 20000, 10000, 5000], + "Models/MLPerf/KeywordSpotting": [64000], + "Models/MLPerf/ImageClassification": [64000], + "Models/MLPerf/AnomalyDetection": [64000], +} + +L3_SINGLEBUFFER_MODELS = { + "Models/miniMobileNet": [60000, 12000, 6000], + "Models/miniMobileNetv2": [60000, 16000, 12000, 8000], + "Models/CCT/FP32/CCT_2_32_32_128": [128000], +} + +L3_DOUBLEBUFFER_MODELS = { + "Models/miniMobileNet": [60000, 24000, 12000, 6000], + "Models/miniMobileNetv2": [60000, 32000, 24000, 16000], } From c75553f481aea7544cfbb46d33578a94afcabe83 Mon Sep 17 00:00:00 2001 From: Run Wang <52746141+SamanthaWangdl@users.noreply.github.com> Date: Wed, 4 Feb 2026 12:50:31 +0000 Subject: [PATCH 30/49] Change docker to private pulp deeploy-gap9 docker --- .github/workflows/ci-platform-gap9-tiled.yml | 4 ++-- .github/workflows/ci-platform-gap9.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci-platform-gap9-tiled.yml b/.github/workflows/ci-platform-gap9-tiled.yml index 68704d2666..99dab34691 100644 --- a/.github/workflows/ci-platform-gap9-tiled.yml +++ b/.github/workflows/ci-platform-gap9-tiled.yml @@ -17,7 +17,7 @@ name: CI • GAP9 (Tiled) docker_image_deeploy: description: "Deeploy Image to use" required: false - default: "ghcr.io/runwangdl/deeploy:gap9" + default: "ghcr.io/pulp-platform/deeploy-gap9:latest" concurrency: group: ${{ github.workflow }}-${{ github.ref }} @@ -27,7 +27,7 @@ jobs: select-env: uses: ./.github/workflows/_select-env.yml with: - docker_image_deeploy: 'ghcr.io/runwangdl/deeploy:gap9' + docker_image_deeploy: 'ghcr.io/pulp-platform/deeploy-gap9:latest' gap9-kernels-tiled-singlebuffer-L2: needs: select-env diff --git a/.github/workflows/ci-platform-gap9.yml b/.github/workflows/ci-platform-gap9.yml index 30699102dd..0eec60f1b7 100644 --- a/.github/workflows/ci-platform-gap9.yml +++ b/.github/workflows/ci-platform-gap9.yml @@ -17,7 +17,7 @@ name: CI • GAP9 docker_image_deeploy: description: "Deeploy Image to use" required: false - default: "ghcr.io/runwangdl/deeploy:gap9" + default: "ghcr.io/pulp-platform/deeploy-gap9:latest" concurrency: group: ${{ github.workflow }}-${{ github.ref }} @@ -27,7 +27,7 @@ jobs: select-env: uses: ./.github/workflows/_select-env.yml with: - docker_image_deeploy: 'ghcr.io/runwangdl/deeploy:gap9' + docker_image_deeploy: 'ghcr.io/pulp-platform/deeploy-gap9:latest' gap9-kernels: needs: select-env From 0dd959684d73e3f66f353545e6536a1c8f1db434 Mon Sep 17 00:00:00 2001 From: Run Wang <52746141+SamanthaWangdl@users.noreply.github.com> Date: Wed, 4 Feb 2026 14:17:30 +0000 Subject: [PATCH 31/49] Add pre-built pulp-nn-mixed library --- TargetLibraries/GAP9/CMakeLists.txt | 51 +- .../GAP9/prebuilt/include/pulp_nn_kernels.h | 18841 ++++++++++++++++ .../GAP9/prebuilt/include/pulp_nn_utils.h | 1938 ++ .../GAP9/prebuilt/libpulp-nn-mixed.a | Bin 0 -> 3265442 bytes TargetLibraries/GAP9/third_party | 2 +- 5 files changed, 20820 insertions(+), 12 deletions(-) create mode 100644 TargetLibraries/GAP9/prebuilt/include/pulp_nn_kernels.h create mode 100644 TargetLibraries/GAP9/prebuilt/include/pulp_nn_utils.h create mode 100644 TargetLibraries/GAP9/prebuilt/libpulp-nn-mixed.a diff --git a/TargetLibraries/GAP9/CMakeLists.txt b/TargetLibraries/GAP9/CMakeLists.txt index f9c348a72c..d05858e586 100644 --- a/TargetLibraries/GAP9/CMakeLists.txt +++ b/TargetLibraries/GAP9/CMakeLists.txt @@ -43,21 +43,50 @@ set(PULPNNVERSION XPULPV2) set(PULPNNBITWIDTH 32) add_compile_definitions(NUM_CORES=${NUM_CORES}) -# RW: Create symlink to PULPOpen third_party if it doesn't exist -if(NOT EXISTS ${CMAKE_CURRENT_LIST_DIR}/third_party) - file(CREATE_LINK - ${CMAKE_CURRENT_LIST_DIR}/../PULPOpen/third_party - ${CMAKE_CURRENT_LIST_DIR}/third_party - SYMBOLIC) - message(STATUS "[Deeploy GAP9] Created symlink: third_party -> ../PULPOpen/third_party") +# Option to use prebuilt pulp-nn library (default: ON for faster builds) +option(USE_PREBUILT_PULPNN "Use prebuilt pulp-nn-mixed library" ON) + +if(USE_PREBUILT_PULPNN) + # Use prebuilt pulp-nn library + set(PREBUILT_PULPNN_DIR ${CMAKE_CURRENT_LIST_DIR}/prebuilt) + + if(EXISTS ${PREBUILT_PULPNN_DIR}/libpulp-nn-mixed.a) + message(STATUS "[Deeploy GAP9] Using prebuilt pulp-nn-mixed library") + + # Create imported target for prebuilt library + add_library(pulp-nn-mixed STATIC IMPORTED) + set_target_properties(pulp-nn-mixed PROPERTIES + IMPORTED_LOCATION ${PREBUILT_PULPNN_DIR}/libpulp-nn-mixed.a + INTERFACE_INCLUDE_DIRECTORIES ${PREBUILT_PULPNN_DIR}/include + ) + else() + message(WARNING "[Deeploy GAP9] Prebuilt pulp-nn library not found at ${PREBUILT_PULPNN_DIR}") + message(WARNING "[Deeploy GAP9] Falling back to building from source") + set(USE_PREBUILT_PULPNN OFF) + endif() endif() -add_subdirectory(third_party/pulp-nn-mixed) +if(NOT USE_PREBUILT_PULPNN) + # Build pulp-nn from source + message(STATUS "[Deeploy GAP9] Building pulp-nn-mixed from source") + + # RW: Create symlink to PULPOpen third_party if it doesn't exist + if(NOT EXISTS ${CMAKE_CURRENT_LIST_DIR}/third_party) + file(CREATE_LINK + ${CMAKE_CURRENT_LIST_DIR}/../PULPOpen/third_party + ${CMAKE_CURRENT_LIST_DIR}/third_party + SYMBOLIC) + message(STATUS "[Deeploy GAP9] Created symlink: third_party -> ../PULPOpen/third_party") + endif() + + add_subdirectory(third_party/pulp-nn-mixed) + + #RW: GCC not recognizing -Wno-typedef-redefinition defined in PULP-NN CMakelist + target_compile_options(pulp-nn-mixed PRIVATE -Wno-error) + target_link_libraries(pulp-nn-mixed PUBLIC pmsis) +endif() -#RW: GCC not recognizing -Wno-typedef-redefinition defined in PULP-NN CMakelist -target_compile_options(pulp-nn-mixed PRIVATE -Wno-error) target_link_libraries(deeploygap9 PUBLIC pulp-nn-mixed) -target_link_libraries(pulp-nn-mixed PUBLIC pmsis) target_link_libraries(deeploygap9 PUBLIC m) diff --git a/TargetLibraries/GAP9/prebuilt/include/pulp_nn_kernels.h b/TargetLibraries/GAP9/prebuilt/include/pulp_nn_kernels.h new file mode 100644 index 0000000000..7a5a2a444b --- /dev/null +++ b/TargetLibraries/GAP9/prebuilt/include/pulp_nn_kernels.h @@ -0,0 +1,18841 @@ +/* + * pulp_nn_kernels.h + * Nazareno Bruschi + * + * Copyright (C) 2019-2020 University of Bologna + * + * 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 + * + * http://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 __PULPNN_KERNELS__ +#define __PULPNN_KERNELS__ + +void pulp_nn_conv_u8_u8_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u8_u8_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u8_i8_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u8_i8_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i8_u8_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i8_u8_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i8_i8_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i8_i8_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u8_u8_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u8_u8_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u8_i8_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u8_i8_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i8_u8_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i8_u8_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i8_i8_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i8_i8_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u8_u8_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u8_u8_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u8_i8_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u8_i8_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i8_u8_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i8_u8_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i8_i8_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i8_i8_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u8_u4_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u8_u4_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u8_i4_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u8_i4_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i8_u4_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i8_u4_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i8_i4_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i8_i4_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u8_u4_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u8_u4_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u8_i4_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u8_i4_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i8_u4_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i8_u4_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i8_i4_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i8_i4_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u8_u4_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u8_u4_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u8_i4_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u8_i4_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i8_u4_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i8_u4_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i8_i4_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i8_i4_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u8_u2_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u8_u2_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u8_i2_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u8_i2_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i8_u2_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i8_u2_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i8_i2_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i8_i2_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u8_u2_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u8_u2_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u8_i2_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u8_i2_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i8_u2_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i8_u2_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i8_i2_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i8_i2_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u8_u2_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u8_u2_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u8_i2_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u8_i2_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i8_u2_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i8_u2_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i8_i2_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i8_i2_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u4_u8_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u4_u8_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u4_i8_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u4_i8_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i4_u8_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i4_u8_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i4_i8_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i4_i8_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u4_u8_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u4_u8_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u4_i8_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u4_i8_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i4_u8_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i4_u8_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i4_i8_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i4_i8_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u4_u8_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u4_u8_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u4_i8_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u4_i8_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i4_u8_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i4_u8_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i4_i8_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i4_i8_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u4_u4_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u4_u4_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u4_i4_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u4_i4_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i4_u4_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i4_u4_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i4_i4_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i4_i4_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u4_u4_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u4_u4_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u4_i4_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u4_i4_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i4_u4_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i4_u4_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i4_i4_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i4_i4_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u4_u4_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u4_u4_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u4_i4_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u4_i4_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i4_u4_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i4_u4_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i4_i4_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i4_i4_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u4_u2_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u4_u2_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u4_i2_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u4_i2_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i4_u2_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i4_u2_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i4_i2_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i4_i2_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u4_u2_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u4_u2_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u4_i2_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u4_i2_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i4_u2_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i4_u2_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i4_i2_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i4_i2_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u4_u2_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u4_u2_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u4_i2_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u4_i2_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i4_u2_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i4_u2_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i4_i2_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i4_i2_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u2_u8_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u2_u8_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u2_i8_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u2_i8_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i2_u8_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i2_u8_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i2_i8_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i2_i8_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u2_u8_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u2_u8_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u2_i8_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u2_i8_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i2_u8_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i2_u8_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i2_i8_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i2_i8_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u2_u8_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u2_u8_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u2_i8_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u2_i8_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i2_u8_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i2_u8_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i2_i8_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i2_i8_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u2_u4_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u2_u4_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u2_i4_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u2_i4_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i2_u4_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i2_u4_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i2_i4_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i2_i4_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u2_u4_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u2_u4_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u2_i4_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u2_i4_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i2_u4_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i2_u4_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i2_i4_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i2_i4_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u2_u4_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u2_u4_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u2_i4_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u2_i4_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i2_u4_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i2_u4_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i2_i4_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i2_i4_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u2_u2_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u2_u2_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u2_i2_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u2_i2_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i2_u2_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i2_u2_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i2_i2_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i2_i2_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u2_u2_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u2_u2_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u2_i2_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u2_i2_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i2_u2_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i2_u2_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i2_i2_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i2_i2_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u2_u2_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u2_u2_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u2_i2_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_u2_i2_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i2_u2_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i2_u2_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i2_i2_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_conv_i2_i2_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_u8_u8_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_u8_i8_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_i8_u8_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_i8_i8_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_u8_u8_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_u8_i8_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_i8_u8_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_i8_i8_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_u8_u8_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_u8_i8_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_i8_u8_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_i8_i8_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_u8_u4_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_u8_i4_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_i8_u4_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_i8_i4_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_u8_u4_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_u8_i4_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_i8_u4_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_i8_i4_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_u8_u4_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_u8_i4_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_i8_u4_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_i8_i4_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_u8_u2_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_u8_i2_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_i8_u2_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_i8_i2_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_u8_u2_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_u8_i2_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_i8_u2_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_i8_i2_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_u8_u2_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_u8_i2_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_i8_u2_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_i8_i2_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_u4_u8_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_u4_i8_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_i4_u8_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_i4_i8_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_u4_u8_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_u4_i8_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_i4_u8_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_i4_i8_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_u4_u8_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_u4_i8_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_i4_u8_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_i4_i8_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_u4_u4_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_u4_i4_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_i4_u4_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_i4_i4_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_u4_u4_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_u4_i4_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_i4_u4_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_i4_i4_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_u4_u4_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_u4_i4_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_i4_u4_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_i4_i4_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_u4_u2_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_u4_i2_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_i4_u2_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_i4_i2_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_u4_u2_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_u4_i2_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_i4_u2_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_i4_i2_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_u4_u2_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_u4_i2_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_i4_u2_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_i4_i2_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_u2_u8_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_u2_i8_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_i2_u8_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_i2_i8_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_u2_u8_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_u2_i8_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_i2_u8_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_i2_i8_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_u2_u8_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_u2_i8_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_i2_u8_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_i2_i8_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_u2_u4_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_u2_i4_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_i2_u4_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_i2_i4_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_u2_u4_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_u2_i4_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_i2_u4_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_i2_i4_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_u2_u4_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_u2_i4_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_i2_u4_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_i2_i4_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_u2_u2_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_u2_i2_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_i2_u2_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_i2_i2_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_u2_u2_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_u2_i2_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_i2_u2_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_i2_i2_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_u2_u2_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_u2_i2_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_i2_u2_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_pointwise_i2_i2_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_u8_u8_i8( + uint8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + uint8_t *pOut2, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t num_col_im2col, + uint16_t ch_out, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_u8_i8_i8( + uint8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pOut2, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t num_col_im2col, + uint16_t ch_out, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_i8_u8_i8( + int8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + uint8_t *pOut2, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t num_col_im2col, + uint16_t ch_out, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_i8_i8_i8( + int8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pOut2, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t num_col_im2col, + uint16_t ch_out, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_u8_u8_i4( + uint8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + uint8_t *pOut2, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t num_col_im2col, + uint16_t ch_out, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_u8_i8_i4( + uint8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pOut2, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t num_col_im2col, + uint16_t ch_out, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_i8_u8_i4( + int8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + uint8_t *pOut2, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t num_col_im2col, + uint16_t ch_out, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_i8_i8_i4( + int8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pOut2, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t num_col_im2col, + uint16_t ch_out, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_u8_u8_i2( + uint8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + uint8_t *pOut2, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t num_col_im2col, + uint16_t ch_out, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_u8_i8_i2( + uint8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pOut2, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t num_col_im2col, + uint16_t ch_out, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_i8_u8_i2( + int8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + uint8_t *pOut2, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t num_col_im2col, + uint16_t ch_out, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_i8_i8_i2( + int8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pOut2, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t num_col_im2col, + uint16_t ch_out, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_u8_u4_i8( + uint8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + uint8_t *pOut2, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t num_col_im2col, + uint16_t ch_out, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_u8_i4_i8( + uint8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pOut2, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t num_col_im2col, + uint16_t ch_out, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_i8_u4_i8( + int8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + uint8_t *pOut2, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t num_col_im2col, + uint16_t ch_out, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_i8_i4_i8( + int8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pOut2, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t num_col_im2col, + uint16_t ch_out, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_u8_u4_i4( + uint8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + uint8_t *pOut2, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t num_col_im2col, + uint16_t ch_out, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_u8_i4_i4( + uint8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pOut2, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t num_col_im2col, + uint16_t ch_out, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_i8_u4_i4( + int8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + uint8_t *pOut2, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t num_col_im2col, + uint16_t ch_out, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_i8_i4_i4( + int8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pOut2, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t num_col_im2col, + uint16_t ch_out, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_u8_u4_i2( + uint8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + uint8_t *pOut2, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t num_col_im2col, + uint16_t ch_out, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_u8_i4_i2( + uint8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pOut2, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t num_col_im2col, + uint16_t ch_out, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_i8_u4_i2( + int8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + uint8_t *pOut2, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t num_col_im2col, + uint16_t ch_out, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_i8_i4_i2( + int8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pOut2, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t num_col_im2col, + uint16_t ch_out, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_u8_u2_i8( + uint8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + uint8_t *pOut2, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t num_col_im2col, + uint16_t ch_out, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_u8_i2_i8( + uint8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pOut2, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t num_col_im2col, + uint16_t ch_out, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_i8_u2_i8( + int8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + uint8_t *pOut2, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t num_col_im2col, + uint16_t ch_out, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_i8_i2_i8( + int8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pOut2, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t num_col_im2col, + uint16_t ch_out, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_u8_u2_i4( + uint8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + uint8_t *pOut2, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t num_col_im2col, + uint16_t ch_out, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_u8_i2_i4( + uint8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pOut2, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t num_col_im2col, + uint16_t ch_out, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_i8_u2_i4( + int8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + uint8_t *pOut2, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t num_col_im2col, + uint16_t ch_out, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_i8_i2_i4( + int8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pOut2, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t num_col_im2col, + uint16_t ch_out, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_u8_u2_i2( + uint8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + uint8_t *pOut2, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t num_col_im2col, + uint16_t ch_out, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_u8_i2_i2( + uint8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pOut2, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t num_col_im2col, + uint16_t ch_out, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_i8_u2_i2( + int8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + uint8_t *pOut2, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t num_col_im2col, + uint16_t ch_out, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_i8_i2_i2( + int8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pOut2, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t num_col_im2col, + uint16_t ch_out, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_u8_u8_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_u8_i8_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_i8_u8_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_i8_i8_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_u8_u8_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_u8_i8_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_i8_u8_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_i8_i8_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_u8_u8_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_u8_i8_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_i8_u8_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_i8_i8_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_u8_u4_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_u8_i4_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_i8_u4_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_i8_i4_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_u8_u4_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_u8_i4_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_i8_u4_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_i8_i4_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_u8_u4_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_u8_i4_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_i8_u4_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_i8_i4_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_u8_u2_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_u8_i2_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_i8_u2_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_i8_i2_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_u8_u2_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_u8_i2_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_i8_u2_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_i8_i2_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_u8_u2_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_u8_i2_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_i8_u2_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_i8_i2_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_u4_u8_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_u4_i8_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_i4_u8_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_i4_i8_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_u4_u8_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_u4_i8_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_i4_u8_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_i4_i8_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_u4_u8_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_u4_i8_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_i4_u8_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_i4_i8_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_u4_u4_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_u4_i4_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_i4_u4_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_i4_i4_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_u4_u4_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_u4_i4_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_i4_u4_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_i4_i4_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_u4_u4_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_u4_i4_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_i4_u4_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_i4_i4_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_u4_u2_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_u4_i2_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_i4_u2_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_i4_i2_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_u4_u2_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_u4_i2_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_i4_u2_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_i4_i2_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_u4_u2_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_u4_i2_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_i4_u2_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_i4_i2_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_u2_u8_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_u2_i8_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_i2_u8_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_i2_i8_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_u2_u8_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_u2_i8_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_i2_u8_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_i2_i8_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_u2_u8_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_u2_i8_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_i2_u8_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_i2_i8_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_u2_u4_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_u2_i4_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_i2_u4_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_i2_i4_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_u2_u4_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_u2_i4_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_i2_u4_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_i2_i4_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_u2_u4_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_u2_i4_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_i2_u4_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_i2_i4_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_u2_u2_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_u2_i2_i8( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_i2_u2_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_i2_i2_i8( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_u2_u2_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_u2_i2_i4( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_i2_u2_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_i2_i2_i4( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_u2_u2_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_u2_i2_i2( + uint8_t *pIn, + uint8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_i2_u2_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_depthwise_i2_i2_i2( + int8_t *pIn, + int8_t *pIm2ColBuffer, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int8_t *pWtBuffer, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_in_x, + uint16_t dim_in_y, + uint16_t ch_in, + uint16_t dim_out_x, + uint16_t dim_out_y, + uint16_t ch_out, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_y_top, + uint16_t padding_y_bottom, + uint16_t padding_x_left, + uint16_t padding_x_right, + uint16_t stride_x, + uint16_t stride_y, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_u8_i32_i8( + uint8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + uint16_t dim_vec, + uint16_t num_o_neurons); + +void pulp_nn_linear_i8_i32_i8( + int8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + uint16_t dim_vec, + uint16_t num_o_neurons); + +void pulp_nn_linear_u8_i32_i4( + uint8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + uint16_t dim_vec, + uint16_t num_o_neurons); + +void pulp_nn_linear_i8_i32_i4( + int8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + uint16_t dim_vec, + uint16_t num_o_neurons); + +void pulp_nn_linear_u8_i32_i2( + uint8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + uint16_t dim_vec, + uint16_t num_o_neurons); + +void pulp_nn_linear_i8_i32_i2( + int8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + uint16_t dim_vec, + uint16_t num_o_neurons); + +void pulp_nn_linear_u4_i32_i8( + uint8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + uint16_t dim_vec, + uint16_t num_o_neurons); + +void pulp_nn_linear_i4_i32_i8( + int8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + uint16_t dim_vec, + uint16_t num_o_neurons); + +void pulp_nn_linear_u4_i32_i4( + uint8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + uint16_t dim_vec, + uint16_t num_o_neurons); + +void pulp_nn_linear_i4_i32_i4( + int8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + uint16_t dim_vec, + uint16_t num_o_neurons); + +void pulp_nn_linear_u4_i32_i2( + uint8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + uint16_t dim_vec, + uint16_t num_o_neurons); + +void pulp_nn_linear_i4_i32_i2( + int8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + uint16_t dim_vec, + uint16_t num_o_neurons); + +void pulp_nn_linear_u2_i32_i8( + uint8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + uint16_t dim_vec, + uint16_t num_o_neurons); + +void pulp_nn_linear_i2_i32_i8( + int8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + uint16_t dim_vec, + uint16_t num_o_neurons); + +void pulp_nn_linear_u2_i32_i4( + uint8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + uint16_t dim_vec, + uint16_t num_o_neurons); + +void pulp_nn_linear_i2_i32_i4( + int8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + uint16_t dim_vec, + uint16_t num_o_neurons); + +void pulp_nn_linear_u2_i32_i2( + uint8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + uint16_t dim_vec, + uint16_t num_o_neurons); + +void pulp_nn_linear_i2_i32_i2( + int8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + uint16_t dim_vec, + uint16_t num_o_neurons); + +void pulp_nn_linear_u8_u8_i8( + uint8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_u8_i8_i8( + uint8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_i8_u8_i8( + int8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_i8_i8_i8( + int8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_u8_u8_i4( + uint8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_u8_i8_i4( + uint8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_i8_u8_i4( + int8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_i8_i8_i4( + int8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_u8_u8_i2( + uint8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_u8_i8_i2( + uint8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_i8_u8_i2( + int8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_i8_i8_i2( + int8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_u8_u4_i8( + uint8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_u8_i4_i8( + uint8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_i8_u4_i8( + int8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_i8_i4_i8( + int8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_u8_u4_i4( + uint8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_u8_i4_i4( + uint8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_i8_u4_i4( + int8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_i8_i4_i4( + int8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_u8_u4_i2( + uint8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_u8_i4_i2( + uint8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_i8_u4_i2( + int8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_i8_i4_i2( + int8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_u8_u2_i8( + uint8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_u8_i2_i8( + uint8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_i8_u2_i8( + int8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_i8_i2_i8( + int8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_u8_u2_i4( + uint8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_u8_i2_i4( + uint8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_i8_u2_i4( + int8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_i8_i2_i4( + int8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_u8_u2_i2( + uint8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_u8_i2_i2( + uint8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_i8_u2_i2( + int8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_i8_i2_i2( + int8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_u4_u8_i8( + uint8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_u4_i8_i8( + uint8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_i4_u8_i8( + int8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_i4_i8_i8( + int8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_u4_u8_i4( + uint8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_u4_i8_i4( + uint8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_i4_u8_i4( + int8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_i4_i8_i4( + int8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_u4_u8_i2( + uint8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_u4_i8_i2( + uint8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_i4_u8_i2( + int8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_i4_i8_i2( + int8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_u4_u4_i8( + uint8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_u4_i4_i8( + uint8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_i4_u4_i8( + int8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_i4_i4_i8( + int8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_u4_u4_i4( + uint8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_u4_i4_i4( + uint8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_i4_u4_i4( + int8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_i4_i4_i4( + int8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_u4_u4_i2( + uint8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_u4_i4_i2( + uint8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_i4_u4_i2( + int8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_i4_i4_i2( + int8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_u4_u2_i8( + uint8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_u4_i2_i8( + uint8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_i4_u2_i8( + int8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_i4_i2_i8( + int8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_u4_u2_i4( + uint8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_u4_i2_i4( + uint8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_i4_u2_i4( + int8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_i4_i2_i4( + int8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_u4_u2_i2( + uint8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_u4_i2_i2( + uint8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_i4_u2_i2( + int8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_i4_i2_i2( + int8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_u2_u8_i8( + uint8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_u2_i8_i8( + uint8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_i2_u8_i8( + int8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_i2_i8_i8( + int8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_u2_u8_i4( + uint8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_u2_i8_i4( + uint8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_i2_u8_i4( + int8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_i2_i8_i4( + int8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_u2_u8_i2( + uint8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_u2_i8_i2( + uint8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_i2_u8_i2( + int8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_i2_i8_i2( + int8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_u2_u4_i8( + uint8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_u2_i4_i8( + uint8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_i2_u4_i8( + int8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_i2_i4_i8( + int8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_u2_u4_i4( + uint8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_u2_i4_i4( + uint8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_i2_u4_i4( + int8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_i2_i4_i4( + int8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_u2_u4_i2( + uint8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_u2_i4_i2( + uint8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_i2_u4_i2( + int8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_i2_i4_i2( + int8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_u2_u2_i8( + uint8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_u2_i2_i8( + uint8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_i2_u2_i8( + int8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_i2_i2_i8( + int8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_u2_u2_i4( + uint8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_u2_i2_i4( + uint8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_i2_u2_i4( + int8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_i2_i2_i4( + int8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_u2_u2_i2( + uint8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_u2_i2_i2( + uint8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_i2_u2_i2( + int8_t *pIn, + int8_t *pBias, + uint8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_linear_i2_i2_i2( + int8_t *pIn, + int8_t *pBias, + int8_t *pOut, + int8_t *pWeight, + int32_t *pKappa, + int32_t *pLambda, + uint16_t out_mul, + uint16_t out_shift, + uint16_t dim_vec, + uint16_t num_o_neurons, + uint8_t flag_relu, + uint8_t flag_batchnorm); + +void pulp_nn_maxpool_u8( + uint8_t * pIn, + uint8_t * pOut, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + uint16_t dim_im_out_x, + uint16_t dim_im_out_y, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_t, + uint16_t padding_b, + uint16_t padding_l, + uint16_t padding_r, + uint16_t stride_x, + uint16_t stride_y); + +void pulp_nn_maxpool_i8( + int8_t * pIn, + int8_t * pOut, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + uint16_t dim_im_out_x, + uint16_t dim_im_out_y, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_t, + uint16_t padding_b, + uint16_t padding_l, + uint16_t padding_r, + uint16_t stride_x, + uint16_t stride_y); + +void pulp_nn_maxpool_u4( + uint8_t * pIn, + uint8_t * pOut, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + uint16_t dim_im_out_x, + uint16_t dim_im_out_y, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_t, + uint16_t padding_b, + uint16_t padding_l, + uint16_t padding_r, + uint16_t stride_x, + uint16_t stride_y); + +void pulp_nn_maxpool_i4( + int8_t * pIn, + int8_t * pOut, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + uint16_t dim_im_out_x, + uint16_t dim_im_out_y, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_t, + uint16_t padding_b, + uint16_t padding_l, + uint16_t padding_r, + uint16_t stride_x, + uint16_t stride_y); + +void pulp_nn_maxpool_u2( + uint8_t * pIn, + uint8_t * pOut, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + uint16_t dim_im_out_x, + uint16_t dim_im_out_y, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_t, + uint16_t padding_b, + uint16_t padding_l, + uint16_t padding_r, + uint16_t stride_x, + uint16_t stride_y); + +void pulp_nn_maxpool_i2( + int8_t * pIn, + int8_t * pOut, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + uint16_t dim_im_out_x, + uint16_t dim_im_out_y, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_t, + uint16_t padding_b, + uint16_t padding_l, + uint16_t padding_r, + uint16_t stride_x, + uint16_t stride_y); + +void pulp_nn_avgpool_u8_u8( + uint8_t * pIn, + uint8_t * pOut, + int32_t lambda, + uint16_t out_shift, + int32_t out_add, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + uint16_t dim_im_out_x, + uint16_t dim_im_out_y, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_t, + uint16_t padding_b, + uint16_t padding_l, + uint16_t padding_r, + uint16_t stride_x, + uint16_t stride_y, + int flag_requant +); + +void pulp_nn_avgpool_u8_i8( + uint8_t * pIn, + int8_t * pOut, + int32_t lambda, + uint16_t out_shift, + int32_t out_add, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + uint16_t dim_im_out_x, + uint16_t dim_im_out_y, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_t, + uint16_t padding_b, + uint16_t padding_l, + uint16_t padding_r, + uint16_t stride_x, + uint16_t stride_y, + int flag_requant +); + +void pulp_nn_avgpool_i8_u8( + int8_t * pIn, + uint8_t * pOut, + int32_t lambda, + uint16_t out_shift, + int32_t out_add, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + uint16_t dim_im_out_x, + uint16_t dim_im_out_y, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_t, + uint16_t padding_b, + uint16_t padding_l, + uint16_t padding_r, + uint16_t stride_x, + uint16_t stride_y, + int flag_requant +); + +void pulp_nn_avgpool_i8_i8( + int8_t * pIn, + int8_t * pOut, + int32_t lambda, + uint16_t out_shift, + int32_t out_add, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + uint16_t dim_im_out_x, + uint16_t dim_im_out_y, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_t, + uint16_t padding_b, + uint16_t padding_l, + uint16_t padding_r, + uint16_t stride_x, + uint16_t stride_y, + int flag_requant +); + +void pulp_nn_avgpool_u8_u4( + uint8_t * pIn, + uint8_t * pOut, + int32_t lambda, + uint16_t out_shift, + int32_t out_add, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + uint16_t dim_im_out_x, + uint16_t dim_im_out_y, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_t, + uint16_t padding_b, + uint16_t padding_l, + uint16_t padding_r, + uint16_t stride_x, + uint16_t stride_y, + int flag_requant +); + +void pulp_nn_avgpool_u8_i4( + uint8_t * pIn, + int8_t * pOut, + int32_t lambda, + uint16_t out_shift, + int32_t out_add, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + uint16_t dim_im_out_x, + uint16_t dim_im_out_y, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_t, + uint16_t padding_b, + uint16_t padding_l, + uint16_t padding_r, + uint16_t stride_x, + uint16_t stride_y, + int flag_requant +); + +void pulp_nn_avgpool_i8_u4( + int8_t * pIn, + uint8_t * pOut, + int32_t lambda, + uint16_t out_shift, + int32_t out_add, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + uint16_t dim_im_out_x, + uint16_t dim_im_out_y, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_t, + uint16_t padding_b, + uint16_t padding_l, + uint16_t padding_r, + uint16_t stride_x, + uint16_t stride_y, + int flag_requant +); + +void pulp_nn_avgpool_i8_i4( + int8_t * pIn, + int8_t * pOut, + int32_t lambda, + uint16_t out_shift, + int32_t out_add, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + uint16_t dim_im_out_x, + uint16_t dim_im_out_y, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_t, + uint16_t padding_b, + uint16_t padding_l, + uint16_t padding_r, + uint16_t stride_x, + uint16_t stride_y, + int flag_requant +); + +void pulp_nn_avgpool_u8_u2( + uint8_t * pIn, + uint8_t * pOut, + int32_t lambda, + uint16_t out_shift, + int32_t out_add, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + uint16_t dim_im_out_x, + uint16_t dim_im_out_y, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_t, + uint16_t padding_b, + uint16_t padding_l, + uint16_t padding_r, + uint16_t stride_x, + uint16_t stride_y, + int flag_requant +); + +void pulp_nn_avgpool_u8_i2( + uint8_t * pIn, + int8_t * pOut, + int32_t lambda, + uint16_t out_shift, + int32_t out_add, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + uint16_t dim_im_out_x, + uint16_t dim_im_out_y, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_t, + uint16_t padding_b, + uint16_t padding_l, + uint16_t padding_r, + uint16_t stride_x, + uint16_t stride_y, + int flag_requant +); + +void pulp_nn_avgpool_i8_u2( + int8_t * pIn, + uint8_t * pOut, + int32_t lambda, + uint16_t out_shift, + int32_t out_add, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + uint16_t dim_im_out_x, + uint16_t dim_im_out_y, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_t, + uint16_t padding_b, + uint16_t padding_l, + uint16_t padding_r, + uint16_t stride_x, + uint16_t stride_y, + int flag_requant +); + +void pulp_nn_avgpool_i8_i2( + int8_t * pIn, + int8_t * pOut, + int32_t lambda, + uint16_t out_shift, + int32_t out_add, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + uint16_t dim_im_out_x, + uint16_t dim_im_out_y, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_t, + uint16_t padding_b, + uint16_t padding_l, + uint16_t padding_r, + uint16_t stride_x, + uint16_t stride_y, + int flag_requant +); + +void pulp_nn_avgpool_u4_u8( + uint8_t * pIn, + uint8_t * pOut, + int32_t lambda, + uint16_t out_shift, + int32_t out_add, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + uint16_t dim_im_out_x, + uint16_t dim_im_out_y, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_t, + uint16_t padding_b, + uint16_t padding_l, + uint16_t padding_r, + uint16_t stride_x, + uint16_t stride_y, + int flag_requant +); + +void pulp_nn_avgpool_u4_i8( + uint8_t * pIn, + int8_t * pOut, + int32_t lambda, + uint16_t out_shift, + int32_t out_add, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + uint16_t dim_im_out_x, + uint16_t dim_im_out_y, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_t, + uint16_t padding_b, + uint16_t padding_l, + uint16_t padding_r, + uint16_t stride_x, + uint16_t stride_y, + int flag_requant +); + +void pulp_nn_avgpool_i4_u8( + int8_t * pIn, + uint8_t * pOut, + int32_t lambda, + uint16_t out_shift, + int32_t out_add, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + uint16_t dim_im_out_x, + uint16_t dim_im_out_y, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_t, + uint16_t padding_b, + uint16_t padding_l, + uint16_t padding_r, + uint16_t stride_x, + uint16_t stride_y, + int flag_requant +); + +void pulp_nn_avgpool_i4_i8( + int8_t * pIn, + int8_t * pOut, + int32_t lambda, + uint16_t out_shift, + int32_t out_add, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + uint16_t dim_im_out_x, + uint16_t dim_im_out_y, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_t, + uint16_t padding_b, + uint16_t padding_l, + uint16_t padding_r, + uint16_t stride_x, + uint16_t stride_y, + int flag_requant +); + +void pulp_nn_avgpool_u4_u4( + uint8_t * pIn, + uint8_t * pOut, + int32_t lambda, + uint16_t out_shift, + int32_t out_add, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + uint16_t dim_im_out_x, + uint16_t dim_im_out_y, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_t, + uint16_t padding_b, + uint16_t padding_l, + uint16_t padding_r, + uint16_t stride_x, + uint16_t stride_y, + int flag_requant +); + +void pulp_nn_avgpool_u4_i4( + uint8_t * pIn, + int8_t * pOut, + int32_t lambda, + uint16_t out_shift, + int32_t out_add, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + uint16_t dim_im_out_x, + uint16_t dim_im_out_y, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_t, + uint16_t padding_b, + uint16_t padding_l, + uint16_t padding_r, + uint16_t stride_x, + uint16_t stride_y, + int flag_requant +); + +void pulp_nn_avgpool_i4_u4( + int8_t * pIn, + uint8_t * pOut, + int32_t lambda, + uint16_t out_shift, + int32_t out_add, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + uint16_t dim_im_out_x, + uint16_t dim_im_out_y, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_t, + uint16_t padding_b, + uint16_t padding_l, + uint16_t padding_r, + uint16_t stride_x, + uint16_t stride_y, + int flag_requant +); + +void pulp_nn_avgpool_i4_i4( + int8_t * pIn, + int8_t * pOut, + int32_t lambda, + uint16_t out_shift, + int32_t out_add, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + uint16_t dim_im_out_x, + uint16_t dim_im_out_y, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_t, + uint16_t padding_b, + uint16_t padding_l, + uint16_t padding_r, + uint16_t stride_x, + uint16_t stride_y, + int flag_requant +); + +void pulp_nn_avgpool_u4_u2( + uint8_t * pIn, + uint8_t * pOut, + int32_t lambda, + uint16_t out_shift, + int32_t out_add, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + uint16_t dim_im_out_x, + uint16_t dim_im_out_y, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_t, + uint16_t padding_b, + uint16_t padding_l, + uint16_t padding_r, + uint16_t stride_x, + uint16_t stride_y, + int flag_requant +); + +void pulp_nn_avgpool_u4_i2( + uint8_t * pIn, + int8_t * pOut, + int32_t lambda, + uint16_t out_shift, + int32_t out_add, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + uint16_t dim_im_out_x, + uint16_t dim_im_out_y, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_t, + uint16_t padding_b, + uint16_t padding_l, + uint16_t padding_r, + uint16_t stride_x, + uint16_t stride_y, + int flag_requant +); + +void pulp_nn_avgpool_i4_u2( + int8_t * pIn, + uint8_t * pOut, + int32_t lambda, + uint16_t out_shift, + int32_t out_add, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + uint16_t dim_im_out_x, + uint16_t dim_im_out_y, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_t, + uint16_t padding_b, + uint16_t padding_l, + uint16_t padding_r, + uint16_t stride_x, + uint16_t stride_y, + int flag_requant +); + +void pulp_nn_avgpool_i4_i2( + int8_t * pIn, + int8_t * pOut, + int32_t lambda, + uint16_t out_shift, + int32_t out_add, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + uint16_t dim_im_out_x, + uint16_t dim_im_out_y, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_t, + uint16_t padding_b, + uint16_t padding_l, + uint16_t padding_r, + uint16_t stride_x, + uint16_t stride_y, + int flag_requant +); + +void pulp_nn_avgpool_u2_u8( + uint8_t * pIn, + uint8_t * pOut, + int32_t lambda, + uint16_t out_shift, + int32_t out_add, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + uint16_t dim_im_out_x, + uint16_t dim_im_out_y, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_t, + uint16_t padding_b, + uint16_t padding_l, + uint16_t padding_r, + uint16_t stride_x, + uint16_t stride_y, + int flag_requant +); + +void pulp_nn_avgpool_u2_i8( + uint8_t * pIn, + int8_t * pOut, + int32_t lambda, + uint16_t out_shift, + int32_t out_add, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + uint16_t dim_im_out_x, + uint16_t dim_im_out_y, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_t, + uint16_t padding_b, + uint16_t padding_l, + uint16_t padding_r, + uint16_t stride_x, + uint16_t stride_y, + int flag_requant +); + +void pulp_nn_avgpool_i2_u8( + int8_t * pIn, + uint8_t * pOut, + int32_t lambda, + uint16_t out_shift, + int32_t out_add, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + uint16_t dim_im_out_x, + uint16_t dim_im_out_y, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_t, + uint16_t padding_b, + uint16_t padding_l, + uint16_t padding_r, + uint16_t stride_x, + uint16_t stride_y, + int flag_requant +); + +void pulp_nn_avgpool_i2_i8( + int8_t * pIn, + int8_t * pOut, + int32_t lambda, + uint16_t out_shift, + int32_t out_add, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + uint16_t dim_im_out_x, + uint16_t dim_im_out_y, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_t, + uint16_t padding_b, + uint16_t padding_l, + uint16_t padding_r, + uint16_t stride_x, + uint16_t stride_y, + int flag_requant +); + +void pulp_nn_avgpool_u2_u4( + uint8_t * pIn, + uint8_t * pOut, + int32_t lambda, + uint16_t out_shift, + int32_t out_add, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + uint16_t dim_im_out_x, + uint16_t dim_im_out_y, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_t, + uint16_t padding_b, + uint16_t padding_l, + uint16_t padding_r, + uint16_t stride_x, + uint16_t stride_y, + int flag_requant +); + +void pulp_nn_avgpool_u2_i4( + uint8_t * pIn, + int8_t * pOut, + int32_t lambda, + uint16_t out_shift, + int32_t out_add, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + uint16_t dim_im_out_x, + uint16_t dim_im_out_y, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_t, + uint16_t padding_b, + uint16_t padding_l, + uint16_t padding_r, + uint16_t stride_x, + uint16_t stride_y, + int flag_requant +); + +void pulp_nn_avgpool_i2_u4( + int8_t * pIn, + uint8_t * pOut, + int32_t lambda, + uint16_t out_shift, + int32_t out_add, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + uint16_t dim_im_out_x, + uint16_t dim_im_out_y, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_t, + uint16_t padding_b, + uint16_t padding_l, + uint16_t padding_r, + uint16_t stride_x, + uint16_t stride_y, + int flag_requant +); + +void pulp_nn_avgpool_i2_i4( + int8_t * pIn, + int8_t * pOut, + int32_t lambda, + uint16_t out_shift, + int32_t out_add, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + uint16_t dim_im_out_x, + uint16_t dim_im_out_y, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_t, + uint16_t padding_b, + uint16_t padding_l, + uint16_t padding_r, + uint16_t stride_x, + uint16_t stride_y, + int flag_requant +); + +void pulp_nn_avgpool_u2_u2( + uint8_t * pIn, + uint8_t * pOut, + int32_t lambda, + uint16_t out_shift, + int32_t out_add, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + uint16_t dim_im_out_x, + uint16_t dim_im_out_y, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_t, + uint16_t padding_b, + uint16_t padding_l, + uint16_t padding_r, + uint16_t stride_x, + uint16_t stride_y, + int flag_requant +); + +void pulp_nn_avgpool_u2_i2( + uint8_t * pIn, + int8_t * pOut, + int32_t lambda, + uint16_t out_shift, + int32_t out_add, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + uint16_t dim_im_out_x, + uint16_t dim_im_out_y, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_t, + uint16_t padding_b, + uint16_t padding_l, + uint16_t padding_r, + uint16_t stride_x, + uint16_t stride_y, + int flag_requant +); + +void pulp_nn_avgpool_i2_u2( + int8_t * pIn, + uint8_t * pOut, + int32_t lambda, + uint16_t out_shift, + int32_t out_add, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + uint16_t dim_im_out_x, + uint16_t dim_im_out_y, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_t, + uint16_t padding_b, + uint16_t padding_l, + uint16_t padding_r, + uint16_t stride_x, + uint16_t stride_y, + int flag_requant +); + +void pulp_nn_avgpool_i2_i2( + int8_t * pIn, + int8_t * pOut, + int32_t lambda, + uint16_t out_shift, + int32_t out_add, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + uint16_t dim_im_out_x, + uint16_t dim_im_out_y, + uint16_t dim_kernel_x, + uint16_t dim_kernel_y, + uint16_t padding_t, + uint16_t padding_b, + uint16_t padding_l, + uint16_t padding_r, + uint16_t stride_x, + uint16_t stride_y, + int flag_requant +); + +void pulp_nn_add_u8_u8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + uint16_t out_mult1, + uint16_t out_mult2, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in); + +void pulp_nn_add_u8_u8_u8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u8_u8_u4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u8_u8_u2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u8_u8_i8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u8_u8_i4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u8_u8_i2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u8_i8_u8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u8_i8_u4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u8_i8_u2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u8_i8_i8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u8_i8_i4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u8_i8_i2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i8_u8_u8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i8_u8_u4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i8_u8_u2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i8_u8_i8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i8_u8_i4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i8_u8_i2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i8_i8_u8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i8_i8_u4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i8_i8_u2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i8_i8_i8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i8_i8_i4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i8_i8_i2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u8_u4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + uint16_t out_mult1, + uint16_t out_mult2, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in); + +void pulp_nn_add_u8_u4_u8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u8_u4_u4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u8_u4_u2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u8_u4_i8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u8_u4_i4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u8_u4_i2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u8_i4_u8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u8_i4_u4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u8_i4_u2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u8_i4_i8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u8_i4_i4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u8_i4_i2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i8_u4_u8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i8_u4_u4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i8_u4_u2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i8_u4_i8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i8_u4_i4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i8_u4_i2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i8_i4_u8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i8_i4_u4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i8_i4_u2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i8_i4_i8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i8_i4_i4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i8_i4_i2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u8_u2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + uint16_t out_mult1, + uint16_t out_mult2, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in); + +void pulp_nn_add_u8_u2_u8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u8_u2_u4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u8_u2_u2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u8_u2_i8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u8_u2_i4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u8_u2_i2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u8_i2_u8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u8_i2_u4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u8_i2_u2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u8_i2_i8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u8_i2_i4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u8_i2_i2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i8_u2_u8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i8_u2_u4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i8_u2_u2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i8_u2_i8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i8_u2_i4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i8_u2_i2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i8_i2_u8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i8_i2_u4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i8_i2_u2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i8_i2_i8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i8_i2_i4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i8_i2_i2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u4_u8_u8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u4_u8_u4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u4_u8_u2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u4_u8_i8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u4_u8_i4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u4_u8_i2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u4_i8_u8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u4_i8_u4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u4_i8_u2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u4_i8_i8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u4_i8_i4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u4_i8_i2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i4_u8_u8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i4_u8_u4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i4_u8_u2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i4_u8_i8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i4_u8_i4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i4_u8_i2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i4_i8_u8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i4_i8_u4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i4_i8_u2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i4_i8_i8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i4_i8_i4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i4_i8_i2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u4_u4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + uint16_t out_mult1, + uint16_t out_mult2, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in); + +void pulp_nn_add_u4_u4_u8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u4_u4_u4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u4_u4_u2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u4_u4_i8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u4_u4_i4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u4_u4_i2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u4_i4_u8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u4_i4_u4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u4_i4_u2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u4_i4_i8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u4_i4_i4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u4_i4_i2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i4_u4_u8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i4_u4_u4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i4_u4_u2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i4_u4_i8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i4_u4_i4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i4_u4_i2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i4_i4_u8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i4_i4_u4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i4_i4_u2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i4_i4_i8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i4_i4_i4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i4_i4_i2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u4_u2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + uint16_t out_mult1, + uint16_t out_mult2, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in); + +void pulp_nn_add_u4_u2_u8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u4_u2_u4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u4_u2_u2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u4_u2_i8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u4_u2_i4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u4_u2_i2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u4_i2_u8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u4_i2_u4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u4_i2_u2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u4_i2_i8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u4_i2_i4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u4_i2_i2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i4_u2_u8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i4_u2_u4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i4_u2_u2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i4_u2_i8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i4_u2_i4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i4_u2_i2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i4_i2_u8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i4_i2_u4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i4_i2_u2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i4_i2_i8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i4_i2_i4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i4_i2_i2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u2_u8_u8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u2_u8_u4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u2_u8_u2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u2_u8_i8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u2_u8_i4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u2_u8_i2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u2_i8_u8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u2_i8_u4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u2_i8_u2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u2_i8_i8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u2_i8_i4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u2_i8_i2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i2_u8_u8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i2_u8_u4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i2_u8_u2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i2_u8_i8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i2_u8_i4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i2_u8_i2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i2_i8_u8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i2_i8_u4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i2_i8_u2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i2_i8_i8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i2_i8_i4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i2_i8_i2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u2_u4_u8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u2_u4_u4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u2_u4_u2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u2_u4_i8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u2_u4_i4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u2_u4_i2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u2_i4_u8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u2_i4_u4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u2_i4_u2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u2_i4_i8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u2_i4_i4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u2_i4_i2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i2_u4_u8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i2_u4_u4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i2_u4_u2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i2_u4_i8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i2_u4_i4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i2_u4_i2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i2_i4_u8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i2_i4_u4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i2_i4_u2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i2_i4_i8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i2_i4_i4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i2_i4_i2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u2_u2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + uint16_t out_mult1, + uint16_t out_mult2, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in); + +void pulp_nn_add_u2_u2_u8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u2_u2_u4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u2_u2_u2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u2_u2_i8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u2_u2_i4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u2_u2_i2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u2_i2_u8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u2_i2_u4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u2_i2_u2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u2_i2_i8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u2_i2_i4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_u2_i2_i2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i2_u2_u8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i2_u2_u4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i2_u2_u2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i2_u2_i8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i2_u2_i4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i2_u2_i2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i2_i2_u8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i2_i2_u4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i2_i2_u2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i2_i2_i8( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i2_i2_i4( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + +void pulp_nn_add_i2_i2_i2( + uint8_t * pIn1, + uint8_t * pIn2, + uint8_t * pOut, + int32_t in_mult1, + int32_t in_add1, + uint16_t in_shift1, + int32_t in_mult2, + int32_t in_add2, + uint16_t in_shift2, + int32_t out_mult, + int32_t out_add, + uint16_t out_shift, + uint16_t dim_im_in_x, + uint16_t dim_im_in_y, + uint16_t ch_im_in, + int out_requant_flag); + + + +#endif \ No newline at end of file diff --git a/TargetLibraries/GAP9/prebuilt/include/pulp_nn_utils.h b/TargetLibraries/GAP9/prebuilt/include/pulp_nn_utils.h new file mode 100644 index 0000000000..8b9bd9c455 --- /dev/null +++ b/TargetLibraries/GAP9/prebuilt/include/pulp_nn_utils.h @@ -0,0 +1,1938 @@ +/* + * pulp_nn_utils.h + * Nazareno Bruschi + * Alessandro Nadalini + * Georg Rutishauser + * + * Copyright (C) 2019-2020 ETH Zurich & University of Bologna + * + * 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 + * + * http://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 __PULPNN_UTILS__ +#define __PULPNN_UTILS__ + +#include "pmsis.h" + +#define bitext(x,size,off) __builtin_pulp_bextract(x,size,off) +#define bitextu(x,size,off) __builtin_pulp_bextractu(x,size,off) +#ifdef __clang__ +#define bitins(dst,not_mask_imm,src,mask_imm,off) __builtin_binsert(dst,not_mask_imm,src,mask_imm,off) +#else +#define bitins(dst,not_mask_imm,src,mask_imm,off) __builtin_pulp_binsert(dst,not_mask_imm,src,mask_imm,off) +#endif +#define pack(x,y,z,t) __builtin_pulp_pack4(x,y,z,t) +#define max4(a,b) __builtin_pulp_maxu4(a,b) +#define maxs4(a, b) __builtin_pulp_max4(a, b) +#define max8(a, b) __builtin_pulp_maxu8(a, b) +#define maxs8(a, b) __builtin_pulp_max8(a, b) +#define max16(a, b) __builtin_pulp_maxu16(a, b) +#define maxs16(a, b) __builtin_pulp_max16(a, b) +#define max32(a,b) __builtin_pulp_maxusi(a,b) +#define maxs32(a,b) __builtin_pulp_maxsi(a,b) +#define min32(a,b) __builtin_pulp_minusi(a,b) +#define mins32(a,b) __builtin_pulp_minsi(a,b) +#define min4(a, b) __builtin_pulp_minu4(a, b) +#define mins4(a, b) __builtin_pulp_min4(a, b) +#define min8(a, b) __builtin_pulp_minu8(a, b) +#define mins8(a, b) __builtin_pulp_min8(a, b) +#define min16(a, b) __builtin_pulp_minu16(a, b) +#define mins16(a, b) __builtin_pulp_min16(a, b) +#define avg4(a,b) __builtin_pulp_avgu4(a,b) +#define avg8(a,b) __builtin_pulp_avgu8(a,b) +#define avg16(a,b) __builtin_pulp_avgu16(a,b) +#define log2(x) __builtin_pulp_fl1(x) +#define min(a,b) ((a)<(b)?(a):(b)) +#define SumDotp4(a, b, c) __builtin_pulp_sdotusp4(a, b, c) +#define SumDotp8(a, b, c) __builtin_pulp_sdotusp8(a, b, c) +#define SumDotp16(a, b, c) __builtin_pulp_sdotusp16(a, b, c) +#define SumDotps4(a, b, c) __builtin_pulp_sdotsp4(a, b, c) +#define SumDotps8(a, b, c) __builtin_pulp_sdotsp8(a, b, c) +#define SumDotps16(a, b, c) __builtin_pulp_sdotsp16(a, b, c) +#define clip4(x) __builtin_pulp_clipu_r(x, 15) +#define clip2(x) __builtin_pulp_clipu_r(x, 3) +#define clip8(x) __builtin_pulp_clipu_r(x, 255) + +#define clips4(x) __builtin_pulp_clip_r(x, 7) +#define clips2(x) __builtin_pulp_clip_r(x, 1) +#define clips8(x) __builtin_pulp_clip_r(x, 127) +#define MacLoadInit(a_update, b_update, a_reg, b_reg, ptr) __builtin_pulp_mlinitspr_v3(a_update, b_update, a_reg, b_reg, ptr) +#define MacLoadUpdate(ptr) __builtin_pulp_mlupdatespr_v3(ptr) +#define MacLoadAssign(ptr) __builtin_pulp_mlassignspr_v3(ptr) +#define MacLoad4(a_update, b_update, a_reg, b_reg, ptr, sum) __builtin_pulp_mlsdotsup4_v3(a_update, b_update, a_reg, b_reg, ptr, sum) +#define MacLoad8(a_update, b_update, a_reg, b_reg, ptr, sum) __builtin_pulp_mlsdotsup8_v3(a_update, b_update, a_reg, b_reg, ptr, sum) +#define MacLoad16(a_update, b_update, a_reg, b_reg, ptr, sum) __builtin_pulp_mlsdotsup16_v3(a_update, b_update, a_reg, b_reg, ptr, sum) +#define MacLoads4(a_update, b_update, a_reg, b_reg, ptr, sum) __builtin_pulp_mlsdotsp4_v3(a_update, b_update, a_reg, b_reg, ptr, sum) +#define MacLoads8(a_update, b_update, a_reg, b_reg, ptr, sum) __builtin_pulp_mlsdotsp8_v3(a_update, b_update, a_reg, b_reg, ptr, sum) +#define MacLoads16(a_update, b_update, a_reg, b_reg, ptr, sum) __builtin_pulp_mlsdotsp16_v3(a_update, b_update, a_reg, b_reg, ptr, sum) + +#define PACK_INT8_SIZE(x) (x) +#define PACK_INT4_SIZE(x) ((x) >> 1) +#define PACK_INT2_SIZE(x) ((x) >> 2) + +#define MemoryFence() asm volatile("":::"memory") + +#define LEGACY_MODE(x) asm volatile ("csrwi 0x010," x) +#define IVEC_FMT(x) asm volatile ("csrwi 0x00D," x) +#define MIXED_SKIP(x) asm volatile ("csrwi 0x00F," x) +#define A_ADDRESS(x) asm volatile ("csrw 0x100, %0" :: "r" (x)) +#define W_ADDRESS(x) asm volatile ("csrw 0x101, %0" :: "r" (x)) +#define A_STRIDE(x) asm volatile ("csrw 0x102, %0":: "r" (x)) +#define W_STRIDE(x) asm volatile ("csrw 0x103, %0":: "r" (x)) +#define A_ROLLBACK(x) asm volatile ("csrw 0x104, %0":: "r" (x)) +#define W_ROLLBACK(x) asm volatile ("csrw 0x105, %0":: "r" (x)) +#define A_SKIP(x) asm volatile ("csrwi 0x106," x) +#define W_SKIP(x) asm volatile ("csrwi 0x107," x) + +static uint8_t __attribute__((noinline)) pulp_nn_quant_u2 ( + int32_t phi, + int16_t m, + int8_t d + ) { + int32_t x = (m * phi) >> d; + uint8_t res = clip2(x); + return res; +} +static uint8_t __attribute__((noinline)) pulp_nn_bn_quant_u2 ( + int32_t phi, + int32_t k, + int32_t lambda, + int8_t d + ) { + int32_t integer_image_phi = (k * phi) + lambda; + int32_t x = (integer_image_phi) >> d; + uint8_t res = clip2(x); + return res; +} +static uint8_t __attribute__((noinline)) pulp_nn_add_quant_u2 ( + uint8_t pix1, + uint8_t pix2, + int16_t m1, + int16_t m2, + int8_t d + ) { + uint32_t integer_image = pix1*m1 + pix2*m2; + uint32_t x = (integer_image) >> d; + uint8_t res = clip2(x); + return res; +} + +static int8_t __attribute__((noinline)) pulp_nn_quant_i2 ( + int32_t phi, + int16_t m, + int8_t d + ) { + int32_t x = (m * phi) >> d; + int8_t res = clips2(x); + return res; +} +static int8_t __attribute__((noinline)) pulp_nn_bn_quant_i2 ( + int32_t phi, + int32_t k, + int32_t lambda, + int8_t d + ) { + int32_t integer_image_phi = (k * phi) + lambda; + int32_t x = (integer_image_phi) >> d; + int8_t res = clips2(x); + return res; +} +static int8_t __attribute__((noinline)) pulp_nn_add_quant_i2 ( + int8_t pix1, + int8_t pix2, + int16_t m1, + int16_t m2, + int8_t d + ) { + int32_t integer_image = pix1*m1 + pix2*m2; + int32_t x = (integer_image) >> d; + int8_t res = clips2(x); + return res; +} + +static uint8_t __attribute__((noinline)) pulp_nn_quant_u4 ( + int32_t phi, + int16_t m, + int8_t d + ) { + int32_t x = (m * phi) >> d; + uint8_t res = clip4(x); + return res; +} +static uint8_t __attribute__((noinline)) pulp_nn_bn_quant_u4 ( + int32_t phi, + int32_t k, + int32_t lambda, + int8_t d + ) { + int32_t integer_image_phi = (k * phi) + lambda; + int32_t x = (integer_image_phi) >> d; + uint8_t res = clip4(x); + return res; +} +static uint8_t __attribute__((noinline)) pulp_nn_add_quant_u4 ( + uint8_t pix1, + uint8_t pix2, + int16_t m1, + int16_t m2, + int8_t d + ) { + uint32_t integer_image = pix1*m1 + pix2*m2; + uint32_t x = (integer_image) >> d; + uint8_t res = clip4(x); + return res; +} + +static int8_t __attribute__((noinline)) pulp_nn_quant_i4 ( + int32_t phi, + int16_t m, + int8_t d + ) { + int32_t x = (m * phi) >> d; + int8_t res = clips4(x); + return res; +} +static int8_t __attribute__((noinline)) pulp_nn_bn_quant_i4 ( + int32_t phi, + int32_t k, + int32_t lambda, + int8_t d + ) { + int32_t integer_image_phi = (k * phi) + lambda; + int32_t x = (integer_image_phi) >> d; + int8_t res = clips4(x); + return res; +} +static int8_t __attribute__((noinline)) pulp_nn_add_quant_i4 ( + int8_t pix1, + int8_t pix2, + int16_t m1, + int16_t m2, + int8_t d + ) { + int32_t integer_image = pix1*m1 + pix2*m2; + int32_t x = (integer_image) >> d; + int8_t res = clips4(x); + return res; +} + +static uint8_t __attribute__((noinline)) pulp_nn_quant_u8 ( + int32_t phi, + int16_t m, + int8_t d + ) { + int32_t x = (m * phi) >> d; + uint8_t res = clip8(x); + return res; +} +static uint8_t __attribute__((noinline)) pulp_nn_bn_quant_u8 ( + int32_t phi, + int32_t k, + int32_t lambda, + int8_t d + ) { + int32_t integer_image_phi = (k * phi) + lambda; + int32_t x = (integer_image_phi) >> d; + uint8_t res = clip8(x); + return res; +} +static uint8_t __attribute__((noinline)) pulp_nn_add_quant_u8 ( + uint8_t pix1, + uint8_t pix2, + int16_t m1, + int16_t m2, + int8_t d + ) { + uint32_t integer_image = pix1*m1 + pix2*m2; + uint32_t x = (integer_image) >> d; + uint8_t res = clip8(x); + return res; +} + +static int8_t __attribute__((noinline)) pulp_nn_quant_i8 ( + int32_t phi, + int16_t m, + int8_t d + ) { + int32_t x = (m * phi) >> d; + int8_t res = clips8(x); + return res; +} +static int8_t __attribute__((noinline)) pulp_nn_bn_quant_i8 ( + int32_t phi, + int32_t k, + int32_t lambda, + int8_t d + ) { + int32_t integer_image_phi = (k * phi) + lambda; + int32_t x = (integer_image_phi) >> d; + int8_t res = clips8(x); + return res; +} +static int8_t __attribute__((noinline)) pulp_nn_add_quant_i8 ( + int8_t pix1, + int8_t pix2, + int16_t m1, + int16_t m2, + int8_t d + ) { + int32_t integer_image = pix1*m1 + pix2*m2; + int32_t x = (integer_image) >> d; + int8_t res = clips8(x); + return res; +} + + +static uint8_t __attribute__((noinline)) pulp_nn_u4_quant(int input, int16_t * pThr) +{ + if(input <= pThr[7] ) + { + if( input <= pThr[3]) + { + if( input <= pThr[1]) + { + if( input <= pThr[0]) + return 0; + else + return 1; + } + else + { + if( input <= pThr[2]) + return 2; + else + return 3; + } + } + else + { + if( input <= pThr[5]) + { + if( input <= pThr[4]) + return 4; + else + return 5; + } + else + { + if( input <= pThr[6]) + return 6; + else + return 7; + } + } + } + else + { + if( input <= pThr[11]) + { + if( input <= pThr[9]) + { + if( input <= pThr[8]) + return 8; + else + return 9; + } + else + { + if( input <= pThr[10]) + return 10; + else + return 11; + } + } + else + { + if( input <= pThr[13]) + { + if( input <= pThr[12]) + return 12; + else + return 13; + } + else + { + if( input <= pThr[14]) + return 14; + else + return 15; + } + } + } +} + +static uint8_t __attribute__((noinline)) pulp_nn_u2_quant(int input, int16_t * pThr) +{ + if( input <= pThr[1]) + { + if( input <= pThr[0]) + { + return 0; + } + else + { + return 1; + } + } + else + { + if( input <= pThr[2]) + { + return 2; + } + else + { + return 3; + } + } +} + +/* + * Common + */ + + +static v4s __attribute__((noinline)) pulp_nn_i4_to_i8_r( int8_t *pSrc) +{ + v4s Src = *((v4s*) pSrc); + int8_t bext1, bext2, bext3, bext4; + + bext1 = (int8_t) bitext((int) Src, 4, 0); + bext2 = (int8_t) bitext((int) Src, 4, 4); + bext3 = (int8_t) bitext((int) Src, 4, 8); + bext4 = (int8_t) bitext((int) Src, 4, 12); + v4s res = pack((int8_t) bext1, (int8_t) bext2, (int8_t) bext3, (int8_t) bext4); + + return res; +} + +static v4u __attribute__((noinline)) pulp_nn_u4_to_u8_r(uint8_t *pSrc) +{ + v4u Src = *((v4u*) pSrc); + uint8_t bext1, bext2, bext3, bext4; + + bext1 = (uint8_t) bitextu((unsigned int) Src, 4, 0); + bext2 = (uint8_t) bitextu((unsigned int) Src, 4, 4); + bext3 = (uint8_t) bitextu((unsigned int) Src, 4, 8); + bext4 = (uint8_t) bitextu((unsigned int) Src, 4, 12); + v4u res = pack((uint8_t) bext1, (uint8_t) bext2, (uint8_t) bext3, (uint8_t) bext4); + + return res; +} + +static v4s __attribute__((noinline)) pulp_nn_i2_to_i8_r( int8_t *pSrc) +{ + v4s Src = *((v4s*) pSrc); + int8_t bext1, bext2, bext3, bext4; + + bext1 = (int8_t) bitext((int) Src, 2, 0); + bext2 = (int8_t) bitext((int) Src, 2, 2); + bext3 = (int8_t) bitext((int) Src, 2, 4); + bext4 = (int8_t) bitext((int) Src, 2, 6); + v4s res = pack((int8_t) bext1, (int8_t) bext2, (int8_t) bext3, (int8_t) bext4); + + return res; +} + +static v4u __attribute__((noinline)) pulp_nn_u2_to_u8_r(uint8_t *pSrc) +{ + v4u Src = *((v4u*) pSrc); + uint8_t bext1, bext2, bext3, bext4; + + bext1 = (uint8_t) bitextu((unsigned int) Src, 2, 0); + bext2 = (uint8_t) bitextu((unsigned int) Src, 2, 2); + bext3 = (uint8_t) bitextu((unsigned int) Src, 2, 4); + bext4 = (uint8_t) bitextu((unsigned int) Src, 2, 6); + v4u res = pack((uint8_t) bext1, (uint8_t) bext2, (uint8_t) bext3, (uint8_t) bext4); + + return res; +} + +static v4s __attribute__((noinline)) pulp_nn_i2_to_i4_r(int8_t *pSrc) +{ + int8_t mask = 0xf0; + int8_t n_mask = ~ mask; + int8_t off = 0x04; + + v4s Src = *((v4s*) pSrc); + int8_t bext1, bext2, bext3, bext4; + int8_t out1, out2, out3, out4; + + bext1 = (int8_t) bitextu((int) Src, 2, 0); + bext2 = (int8_t) bitextu((int) Src, 2, 2); + bext3 = (int8_t) bitextu((int) Src, 2, 4); + bext4 = (int8_t) bitextu((int) Src, 2, 6); + + out1 = bitins(bext1, n_mask, bext2, mask, off); + out2 = bitins(bext3, n_mask, bext4, mask, off); + + bext1 = (int8_t) bitextu((int) Src, 2, 8); + bext2 = (int8_t) bitextu((int) Src, 2, 10); + bext3 = (int8_t) bitextu((int) Src, 2, 12); + bext4 = (int8_t) bitextu((int) Src, 2, 14); + + out3 = bitins(bext1, n_mask, bext2, mask, off); + out4 = bitins(bext3, n_mask, bext4, mask, off); + + v4s res = pack((int8_t) out1, (int8_t) out2, (int8_t) out3, (int8_t) out4); + + return res; +} + +static v4u __attribute__((noinline)) pulp_nn_u2_to_u4_r(uint8_t *pSrc) +{ + int8_t mask = 0xf0; + int8_t n_mask = ~ mask; + int8_t off = 0x04; + + v4u Src = *((v4u*) pSrc); + uint8_t bext1, bext2, bext3, bext4; + uint8_t out1, out2, out3, out4; + + bext1 = (uint8_t) bitextu((unsigned int) Src, 2, 0); + bext2 = (uint8_t) bitextu((unsigned int) Src, 2, 2); + bext3 = (uint8_t) bitextu((unsigned int) Src, 2, 4); + bext4 = (uint8_t) bitextu((unsigned int) Src, 2, 6); + + out1 = bitins(bext1, n_mask, bext2, mask, off); + out2 = bitins(bext3, n_mask, bext4, mask, off); + + bext1 = (uint8_t) bitextu((unsigned int) Src, 2, 8); + bext2 = (uint8_t) bitextu((unsigned int) Src, 2, 10); + bext3 = (uint8_t) bitextu((unsigned int) Src, 2, 12); + bext4 = (uint8_t) bitextu((unsigned int) Src, 2, 14); + + out3 = bitins(bext1, n_mask, bext2, mask, off); + out4 = bitins(bext3, n_mask, bext4, mask, off); + + v4u res = pack((uint8_t) out1, (uint8_t) out2, (uint8_t) out3, (uint8_t) out4); + + return res; +} + +static int8_t *__attribute__((always_inline)) pulp_nn_i4_to_i8( int8_t *pSrc, int8_t *pDst) +{ + v4s Src = *((v4s*) pSrc); + int8_t bext1, bext2, bext3, bext4; + + pSrc+=4; + + bext1 = (int8_t) bitext((int) Src, 4, 0); + bext2 = (int8_t) bitext((int) Src, 4, 4); + bext3 = (int8_t) bitext((int) Src, 4, 8); + bext4 = (int8_t) bitext((int) Src, 4, 12); + *((v4s*)pDst) = pack((int8_t) bext1, (int8_t) bext2, (int8_t) bext3, (int8_t) bext4); + MemoryFence(); + pDst+=4; + bext1 = (int8_t) bitext((int) Src, 4, 16); + bext2 = (int8_t) bitext((int) Src, 4, 20); + bext3 = (int8_t) bitext((int) Src, 4, 24); + bext4 = (int8_t) bitext((int) Src, 4, 28); + *((v4s*)pDst) = pack((int8_t) bext1, (int8_t) bext2, (int8_t) bext3, (int8_t) bext4); + + return pSrc; +} + +static uint8_t *__attribute__((always_inline)) pulp_nn_u4_to_u8(uint8_t *pSrc, uint8_t *pDst) +{ + v4u Src = *((v4u*) pSrc); + uint8_t bext1, bext2, bext3, bext4; + + pSrc+=4; + + bext1 = (uint8_t) bitextu((unsigned int) Src, 4, 0); + bext2 = (uint8_t) bitextu((unsigned int) Src, 4, 4); + bext3 = (uint8_t) bitextu((unsigned int) Src, 4, 8); + bext4 = (uint8_t) bitextu((unsigned int) Src, 4, 12); + *((v4u*)pDst) = pack((uint8_t) bext1, (uint8_t) bext2, (uint8_t) bext3, (uint8_t) bext4); + MemoryFence(); + pDst+=4; + bext1 = (uint8_t) bitextu((unsigned int) Src, 4, 16); + bext2 = (uint8_t) bitextu((unsigned int) Src, 4, 20); + bext3 = (uint8_t) bitextu((unsigned int) Src, 4, 24); + bext4 = (uint8_t) bitextu((unsigned int) Src, 4, 28); + *((v4u*)pDst) = pack((uint8_t) bext1, (uint8_t) bext2, (uint8_t) bext3, (uint8_t) bext4); + + return pSrc; +} + +static int8_t *__attribute__((always_inline)) pulp_nn_i2_to_i8( int8_t * pSrc, int8_t * pDst) +{ + v4s Src = *((v4s*) pSrc); + int8_t bext1, bext2, bext3, bext4; + + pSrc+=4; + + bext1 = (int8_t) bitext((int) Src, 2, 0); + bext2 = (int8_t) bitext((int) Src, 2, 2); + bext3 = (int8_t) bitext((int) Src, 2, 4); + bext4 = (int8_t) bitext((int) Src, 2, 6); + *((v4s*)pDst) = pack((int8_t) bext1, (int8_t) bext2, (int8_t) bext3, (int8_t) bext4); + MemoryFence(); + pDst+=4; + bext1 = (int8_t) bitext((int) Src, 2, 8); + bext2 = (int8_t) bitext((int) Src, 2, 10); + bext3 = (int8_t) bitext((int) Src, 2, 12); + bext4 = (int8_t) bitext((int) Src, 2, 14); + *((v4s*)pDst) = pack((int8_t) bext1, (int8_t) bext2, (int8_t) bext3, (int8_t) bext4); + MemoryFence(); + pDst+=4; + bext1 = (int8_t) bitext((int) Src, 2, 16); + bext2 = (int8_t) bitext((int) Src, 2, 18); + bext3 = (int8_t) bitext((int) Src, 2, 20); + bext4 = (int8_t) bitext((int) Src, 2, 22); + *((v4s*)pDst) = pack((int8_t) bext1, (int8_t) bext2, (int8_t) bext3, (int8_t) bext4); + MemoryFence(); + pDst+=4; + bext1 = (int8_t) bitext((int) Src, 2, 24); + bext2 = (int8_t) bitext((int) Src, 2, 26); + bext3 = (int8_t) bitext((int) Src, 2, 28); + bext4 = (int8_t) bitext((int) Src, 2, 30); + *((v4s*)pDst) = pack((int8_t) bext1, (int8_t) bext2, (int8_t) bext3, (int8_t) bext4); + + return pSrc; +} + +static uint8_t *__attribute__((always_inline)) pulp_nn_u2_to_u8(uint8_t * pSrc, uint8_t * pDst) +{ + v4u Src = *((v4u*) pSrc); + uint8_t bext1, bext2, bext3, bext4; + + pSrc+=4; + + bext1 = (uint8_t) bitextu((unsigned int) Src, 2, 0); + bext2 = (uint8_t) bitextu((unsigned int) Src, 2, 2); + bext3 = (uint8_t) bitextu((unsigned int) Src, 2, 4); + bext4 = (uint8_t) bitextu((unsigned int) Src, 2, 6); + *((v4u*)pDst) = pack((uint8_t) bext1, (uint8_t) bext2, (uint8_t) bext3, (uint8_t) bext4); + MemoryFence(); + pDst+=4; + bext1 = (uint8_t) bitextu((unsigned int) Src, 2, 8); + bext2 = (uint8_t) bitextu((unsigned int) Src, 2, 10); + bext3 = (uint8_t) bitextu((unsigned int) Src, 2, 12); + bext4 = (uint8_t) bitextu((unsigned int) Src, 2, 14); + *((v4u*)pDst) = pack((uint8_t) bext1, (uint8_t) bext2, (uint8_t) bext3, (uint8_t) bext4); + MemoryFence(); + pDst+=4; + bext1 = (uint8_t) bitextu((unsigned int) Src, 2, 16); + bext2 = (uint8_t) bitextu((unsigned int) Src, 2, 18); + bext3 = (uint8_t) bitextu((unsigned int) Src, 2, 20); + bext4 = (uint8_t) bitextu((unsigned int) Src, 2, 22); + *((v4u*)pDst) = pack((uint8_t) bext1, (uint8_t) bext2, (uint8_t) bext3, (uint8_t) bext4); + MemoryFence(); + pDst+=4; + bext1 = (uint8_t) bitextu((unsigned int) Src, 2, 24); + bext2 = (uint8_t) bitextu((unsigned int) Src, 2, 26); + bext3 = (uint8_t) bitextu((unsigned int) Src, 2, 28); + bext4 = (uint8_t) bitextu((unsigned int) Src, 2, 30); + *((v4u*)pDst) = pack((uint8_t) bext1, (uint8_t) bext2, (uint8_t) bext3, (uint8_t) bext4); + + return pSrc; +} + +static int8_t *__attribute__((always_inline)) pulp_nn_i2_to_i4( int8_t * pSrc, int8_t * pDst) +{ + int8_t mask = 0xf0; + int8_t n_mask = ~ mask; + int8_t off = 0x04; + + v4s Src = *((v4s*) pSrc); + int8_t bext1, bext2, bext3, bext4; + int8_t out1, out2, out3, out4; + + pSrc+=4; + + bext1 = (int8_t) bitext((int) Src, 2, 0); + bext2 = (int8_t) bitext((int) Src, 2, 2); + bext3 = (int8_t) bitext((int) Src, 2, 4); + bext4 = (int8_t) bitext((int) Src, 2, 6); + + out1 = bitins(bext1, n_mask, bext2, mask, off); + out2 = bitins(bext3, n_mask, bext4, mask, off); + MemoryFence(); + + bext1 = (int8_t) bitext((int) Src, 2, 8); + bext2 = (int8_t) bitext((int) Src, 2, 10); + bext3 = (int8_t) bitext((int) Src, 2, 12); + bext4 = (int8_t) bitext((int) Src, 2, 14); + + out3 = bitins(bext1, n_mask, bext2, mask, off); + out4 = bitins(bext3, n_mask, bext4, mask, off); + + *((v4s*)pDst) = pack((int8_t) out1, (int8_t) out2, (int8_t) out3, (int8_t) out4); + MemoryFence(); + + pDst+=4; + bext1 = (int8_t) bitext((int) Src, 2, 16); + bext2 = (int8_t) bitext((int) Src, 2, 18); + bext3 = (int8_t) bitext((int) Src, 2, 20); + bext4 = (int8_t) bitext((int) Src, 2, 22); + + out1 = bitins(bext1, n_mask, bext2, mask, off); + out2 = bitins(bext3, n_mask, bext4, mask, off); + MemoryFence(); + + bext1 = (int8_t) bitext((int) Src, 2, 24); + bext2 = (int8_t) bitext((int) Src, 2, 26); + bext3 = (int8_t) bitext((int) Src, 2, 28); + bext4 = (int8_t) bitext((int) Src, 2, 30); + + out3 = bitins(bext1, n_mask, bext2, mask, off); + out4 = bitins(bext3, n_mask, bext4, mask, off); + + *((v4s*)pDst) = pack((int8_t) out1, (int8_t) out2, (int8_t) out3, (int8_t) out4); + + return pSrc; +} + +static uint8_t *__attribute__((always_inline)) pulp_nn_u2_to_u4( uint8_t * pSrc, uint8_t * pDst) +{ + int8_t mask = 0xf0; + int8_t n_mask = ~ mask; + int8_t off = 0x04; + + v4u Src = *((v4u*) pSrc); + uint8_t bext1, bext2, bext3, bext4; + uint8_t out1, out2, out3, out4; + + pSrc+=4; + + bext1 = (uint8_t) bitextu((unsigned int) Src, 2, 0); + bext2 = (uint8_t) bitextu((unsigned int) Src, 2, 2); + bext3 = (uint8_t) bitextu((unsigned int) Src, 2, 4); + bext4 = (uint8_t) bitextu((unsigned int) Src, 2, 6); + + out1 = bitins(bext1, n_mask, bext2, mask, off); + out2 = bitins(bext3, n_mask, bext4, mask, off); + MemoryFence(); + + bext1 = (uint8_t) bitextu((unsigned int) Src, 2, 8); + bext2 = (uint8_t) bitextu((unsigned int) Src, 2, 10); + bext3 = (uint8_t) bitextu((unsigned int) Src, 2, 12); + bext4 = (uint8_t) bitextu((unsigned int) Src, 2, 14); + + out3 = bitins(bext1, n_mask, bext2, mask, off); + out4 = bitins(bext3, n_mask, bext4, mask, off); + + *((v4u*)pDst) = pack((uint8_t) out1, (uint8_t) out2, (uint8_t) out3, (uint8_t) out4); + MemoryFence(); + + pDst+=4; + bext1 = (uint8_t) bitextu((unsigned int) Src, 2, 16); + bext2 = (uint8_t) bitextu((unsigned int) Src, 2, 18); + bext3 = (uint8_t) bitextu((unsigned int) Src, 2, 20); + bext4 = (uint8_t) bitextu((unsigned int) Src, 2, 22); + + out1 = bitins(bext1, n_mask, bext2, mask, off); + out2 = bitins(bext3, n_mask, bext4, mask, off); + MemoryFence(); + + bext1 = (uint8_t) bitextu((unsigned int) Src, 2, 24); + bext2 = (uint8_t) bitextu((unsigned int) Src, 2, 26); + bext3 = (uint8_t) bitextu((unsigned int) Src, 2, 28); + bext4 = (uint8_t) bitextu((unsigned int) Src, 2, 30); + + out3 = bitins(bext1, n_mask, bext2, mask, off); + out4 = bitins(bext3, n_mask, bext4, mask, off); + + *((v4u*)pDst) = pack((uint8_t) out1, (uint8_t) out2, (uint8_t) out3, (uint8_t) out4); + + return pSrc; +} + +/* + * XpulpV2 + */ + +static void __attribute__((noinline)) pulp_zero_mem(uint8_t * pBuffer, unsigned int size) +{ + int lfover = size &0x3; + for (int i=0; i<(size>>2); i++) + { + *((v4u *)pBuffer) = (v4u){0,0,0,0}; + MemoryFence(); + pBuffer+=4; + } + while(lfover) + { + *pBuffer++=0; + lfover--; + } +} + +static void __attribute__((noinline)) pulp_nn_im2col_u2_to_u8(uint8_t * pInput, uint8_t * pOutput, unsigned int blockSize) +{ + unsigned int blkCnt = blockSize >> 4u; + int lfover = blockSize & 0x0f; + for (int i = 0; i> 4u; + int lfover = blockSize & 0x0f; + for (int i = 0; i> 3u; + int lfover = blockSize & 0x07; + for (int i = 0; i> 3u; + int lfover = blockSize & 0x07; + for (int i = 0; i> 2u; + int lfover = blockSize & 0x03; + for (int i = 0; i> 2u; + int lfover = blockSize & 0x03; + for (int i = 0; i> 4u; + int lfover = blockSize & 0x0f; + for (int i = 0; i> 4u; + int lfover = blockSize & 0x0f; + for (int i = 0; i> 4u; + int lfover = blockSize & 0x0f; + for (int i = 0; i> 4u; + int lfover = blockSize & 0x0f; + for (int i = 0; i> 4u; + int lfover = blockSize & 0x0f; + for (int i = 0; i> 4u; + int lfover = blockSize & 0x0f; + for (int i = 0; i> 3u; + int lfover = blockSize & 0x07; + for (int i = 0; i> 3u; + int lfover = blockSize & 0x07; + for (int i = 0; i> 3u; + int lfover = blockSize & 0x07; + for (int i = 0; i> 3u; + int lfover = blockSize & 0x07; + for (int i = 0; i> 2u; + int lfover = blockSize & 0x03; + for (int i = 0; i> 2u; + int lfover = blockSize & 0x03; + for (int i = 0; i> 2; + + while(cnt > 0u) + { + inp = *((v4u*)pIn); + com = *((v4u*)pCom); + + *((v4u*)pIn) = max4(inp, com); + + pCom+=4; + pIn+=4; + cnt--; + } + + int left = length & 0x3; + while (left>0u) + { + if(*pIn<*pCom) + *pIn=*pCom; + + pIn++; + pCom++; + left--; + } +} + +static void __attribute__((noinline)) pulp_nn_compare_and_replace_if_larger_i8( + int8_t * base, int8_t * target, uint16_t length) { + int8_t *pIn = base; + int8_t *pCom = target; + v4s inp; + v4s com; + int cnt = length >> 2; + + while (cnt > 0u) { + inp = *((v4s *)pIn); + com = *((v4s *)pCom); + + *((v4s *)pIn) = maxs4(inp, com); + + pCom += 4; + pIn += 4; + cnt--; + } + + int left = length & 0x3; + while (left > 0u) { + if (*pIn < *pCom) + *pIn = *pCom; + + pIn++; + pCom++; + left--; + } +} + +static void __attribute__((noinline)) pulp_nn_avg_and_replace_u8(uint8_t * base, + uint8_t * target, + uint16_t length) +{ + uint8_t *pIn = base; + uint8_t *pCom = target; + + while (length>0u) + { + *pIn = ((*pIn + *pCom) >> 1); + + pIn++; + pCom++; + length--; + } +} + +static void __attribute__((noinline)) pulp_nn_compare_and_replace_if_larger_u4(uint8_t * base, + uint8_t * target, + uint16_t length) +{ + int8_t mask = 0xf0; + int8_t n_mask = ~ mask; + int8_t off = 0x04; + + uint8_t *pIn = base; + uint8_t *pCom = target; + v4u inp[2]; + v4u com[2]; + uint8_t *out; + int cnt = length >> 2; + + while(cnt > 0u) + { + pulp_nn_u4_to_u8(pIn, (uint8_t *)inp); + pulp_nn_u4_to_u8(pCom, (uint8_t *)com); + + *((v4u *)out) = max4(inp[0], com[0]); + + *((uint8_t*)pIn) = bitins(*out, n_mask, *(out + 1), mask, off); + pIn++; + *((uint8_t*)pIn) = bitins(*(out + 2), n_mask, *(out + 3), mask, off); + pIn++; + + *((v4u *)out) = max4(inp[1], com[1]); + + *((uint8_t*)pIn) = bitins(*out, n_mask, *(out + 1), mask, off); + pIn++; + *((uint8_t*)pIn) = bitins(*(out + 2), n_mask, *(out + 3), mask, off); + pIn++; + + pCom+=4; + cnt--; + } + + int left = length & 0x3; + while (left>0u) + { + uint8_t inA0 = (uint8_t) bitextu((unsigned int) *pIn, 4, 0); + uint8_t inA1 = (uint8_t) bitextu((unsigned int) *pIn, 4, 4); + uint8_t inB0 = (uint8_t) bitextu((unsigned int) *pCom, 4, 0); + uint8_t inB1 = (uint8_t) bitextu((unsigned int) *pCom, 4, 4); + + if(inA0> 2; + + while(cnt > 0u) + { + pulp_nn_i4_to_i8(pIn, (int8_t *)inp); + pulp_nn_i4_to_i8(pCom, (int8_t *)com); + + *((v4s *)out) = maxs4(inp[0], com[0]); + + *((int8_t*)pIn) = bitins(*out, n_mask, *(out + 1), mask, off); + pIn++; + *((int8_t*)pIn) = bitins(*(out + 2), n_mask, *(out + 3), mask, off); + pIn++; + + *((v4s *)out) = maxs4(inp[1], com[1]); + + *((int8_t*)pIn) = bitins(*out, n_mask, *(out + 1), mask, off); + pIn++; + *((int8_t*)pIn) = bitins(*(out + 2), n_mask, *(out + 3), mask, off); + pIn++; + + pCom+=4; + cnt--; + } + + int left = length & 0x3; + while (left>0u) + { + int8_t inA0 = (int8_t) bitext((int) *pIn, 4, 0); + int8_t inA1 = (int8_t) bitext((int) *pIn, 4, 4); + int8_t inB0 = (int8_t) bitext((int) *pCom, 4, 0); + int8_t inB1 = (int8_t) bitext((int) *pCom, 4, 4); + + if(inA00u) + { + uint8_t inA0 = (uint8_t) bitextu((unsigned int) *pIn, 4, 0); + uint8_t inA1 = (uint8_t) bitextu((unsigned int) *pIn, 4, 4); + uint8_t inB0 = (uint8_t) bitextu((unsigned int) *pCom, 4, 0); + uint8_t inB1 = (uint8_t) bitextu((unsigned int) *pCom, 4, 4); + + inA0 = ((inA0 + inB0) >> 1); + inA1 = ((inA1 + inB1) >> 1); + + *((uint8_t*)pIn) = bitins(inA0, n_mask, inA1, mask, off); + + pIn++; + pCom++; + length--; + } +} + +static void __attribute__((noinline)) pulp_nn_compare_and_replace_if_larger_u2(uint8_t * base, + uint8_t * target, + uint16_t length) +{ + int8_t mask2 = 0x0c; + int8_t n_mask2 = ~ mask2; + int8_t mask4 = 0x30; + int8_t n_mask4 = ~ mask4; + int8_t mask6 = 0xc0; + int8_t n_mask6 = ~ mask6; + int8_t off2 = 2; + int8_t off4 = 4; + int8_t off6 = 6; + + uint8_t *pIn = base; + uint8_t *pCom = target; + v4u inp[4]; + v4u com[4]; + uint8_t *out; + int cnt = length >> 2; + + while(cnt > 0u) + { + pulp_nn_u2_to_u8(pIn, inp); + pulp_nn_u2_to_u8(pCom, com); + + *((v4u*)out) = max4(inp[0], com[0]); + + uint8_t inA = (uint8_t) bitins(*out, n_mask2, *(out + 1), mask2, off2); + inA = bitins(inA, n_mask4, *(out + 2), mask4, off4); + *((uint8_t*)pIn) = bitins(inA, n_mask6, *(out + 3), mask6, off6); + pIn++; + + *((v4u*)out) = max4(inp[1], com[1]); + + inA = (uint8_t) bitins(*out, n_mask2, *(out + 1), mask2, off2); + inA = bitins(inA, n_mask4, *(out + 2), mask4, off4); + *((uint8_t*)pIn) = bitins(inA, n_mask6, *(out + 3), mask6, off6); + pIn++; + + *((v4u*)out) = max4(inp[2], com[2]); + + inA = (uint8_t) bitins(*out, n_mask2, *(out + 1), mask2, off2); + inA = bitins(inA, n_mask4, *(out + 2), mask4, off4); + *((uint8_t*)pIn) = bitins(inA, n_mask6, *(out + 3), mask6, off6); + pIn++; + + *((v4u*)out) = max4(inp[3], com[3]); + + inA = (uint8_t) bitins(*out, n_mask2, *(out + 1), mask2, off2); + inA = bitins(inA, n_mask4, *(out + 2), mask4, off4); + *((uint8_t*)pIn) = bitins(inA, n_mask6, *(out + 3), mask6, off6); + pIn++; + + pCom+=4; + cnt--; + } + + int left = length & 0x3; + while (left>0u) + { + uint8_t inA0 = (uint8_t) bitextu((unsigned int) *pIn, 2, 0); + uint8_t inA1 = (uint8_t) bitextu((unsigned int) *pIn, 2, 2); + uint8_t inA2 = (uint8_t) bitextu((unsigned int) *pIn, 2, 4); + uint8_t inA3 = (uint8_t) bitextu((unsigned int) *pIn, 2, 6); + v4u inA4 = pack((uint8_t) inA0, (uint8_t) inA1, (uint8_t) inA2, (uint8_t) inA3); + uint8_t inB0 = (uint8_t) bitextu((unsigned int) *pCom, 2, 0); + uint8_t inB1 = (uint8_t) bitextu((unsigned int) *pCom, 2, 2); + uint8_t inB2 = (uint8_t) bitextu((unsigned int) *pCom, 2, 4); + uint8_t inB3 = (uint8_t) bitextu((unsigned int) *pCom, 2, 6); + v4u inB4 = pack((uint8_t) inB0, (uint8_t) inB1, (uint8_t) inB2, (uint8_t) inB3); + + *((v4u*)out) = max4(inA4, inB4); + + uint8_t inA = (uint8_t) bitins(*out, n_mask2, *(out + 1), mask2, off2); + inA = bitins(inA, n_mask4, *(out + 2), mask4, off4); + *((uint8_t*)pIn) = bitins(inA, n_mask6, *(out + 3), mask6, off6); + + pIn++; + pCom++; + left--; + } +} + + +static void __attribute__((noinline)) pulp_nn_compare_and_replace_if_larger_i2(int8_t * base, + int8_t * target, + uint16_t length) +{ + int8_t mask2 = 0x0c; + int8_t n_mask2 = ~ mask2; + int8_t mask4 = 0x30; + int8_t n_mask4 = ~ mask4; + int8_t mask6 = 0xc0; + int8_t n_mask6 = ~ mask6; + int8_t off2 = 2; + int8_t off4 = 4; + int8_t off6 = 6; + + int8_t *pIn = base; + int8_t *pCom = target; + v4s inp[4]; + v4s com[4]; + int8_t *out; + int cnt = length >> 2; + + while(cnt > 0u) + { + pulp_nn_i2_to_i8(pIn, inp); + pulp_nn_i2_to_i8(pCom, com); + + *((v4s*)out) = maxs4(inp[0], com[0]); + + int8_t inA = (int8_t) bitins(*out, n_mask2, *(out + 1), mask2, off2); + inA = bitins(inA, n_mask4, *(out + 2), mask4, off4); + *((int8_t*)pIn) = bitins(inA, n_mask6, *(out + 3), mask6, off6); + pIn++; + + *((v4s*)out) = maxs4(inp[1], com[1]); + + inA = (int8_t) bitins(*out, n_mask2, *(out + 1), mask2, off2); + inA = bitins(inA, n_mask4, *(out + 2), mask4, off4); + *((int8_t*)pIn) = bitins(inA, n_mask6, *(out + 3), mask6, off6); + pIn++; + + *((v4s*)out) = maxs4(inp[2], com[2]); + + inA = (int8_t) bitins(*out, n_mask2, *(out + 1), mask2, off2); + inA = bitins(inA, n_mask4, *(out + 2), mask4, off4); + *((int8_t*)pIn) = bitins(inA, n_mask6, *(out + 3), mask6, off6); + pIn++; + + *((v4s*)out) = maxs4(inp[3], com[3]); + + inA = (int8_t) bitins(*out, n_mask2, *(out + 1), mask2, off2); + inA = bitins(inA, n_mask4, *(out + 2), mask4, off4); + *((int8_t*)pIn) = bitins(inA, n_mask6, *(out + 3), mask6, off6); + pIn++; + + pCom+=4; + cnt--; + } + + int left = length & 0x3; + while (left>0u) + { + int8_t inA0 = (int8_t) bitext((unsigned int) *pIn, 2, 0); + int8_t inA1 = (int8_t) bitext((unsigned int) *pIn, 2, 2); + int8_t inA2 = (int8_t) bitext((unsigned int) *pIn, 2, 4); + int8_t inA3 = (int8_t) bitext((unsigned int) *pIn, 2, 6); + v4s inA4 = pack((int8_t) inA0, (int8_t) inA1, (int8_t) inA2, (int8_t) inA3); + int8_t inB0 = (int8_t) bitext((unsigned int) *pCom, 2, 0); + int8_t inB1 = (int8_t) bitext((unsigned int) *pCom, 2, 2); + int8_t inB2 = (int8_t) bitext((unsigned int) *pCom, 2, 4); + int8_t inB3 = (int8_t) bitext((unsigned int) *pCom, 2, 6); + v4s inB4 = pack((int8_t) inB0, (int8_t) inB1, (int8_t) inB2, (int8_t) inB3); + + *((v4s*)out) = maxs4(inA4, inB4); + + int8_t inA = (int8_t) bitins(*out, n_mask2, *(out + 1), mask2, off2); + inA = bitins(inA, n_mask4, *(out + 2), mask4, off4); + *((int8_t*)pIn) = bitins(inA, n_mask6, *(out + 3), mask6, off6); + + pIn++; + pCom++; + left--; + } +} + +static void __attribute__((noinline)) pulp_nn_avg_and_replace_u2(uint8_t * base, + uint8_t * target, + uint16_t length) +{ + int8_t mask2 = 0x0c; + int8_t n_mask2 = ~ mask2; + int8_t mask4 = 0x30; + int8_t n_mask4 = ~ mask4; + int8_t mask6 = 0xc0; + int8_t n_mask6 = ~ mask6; + int8_t off2 = 2; + int8_t off4 = 4; + int8_t off6 = 6; + + uint8_t *pIn = base; + uint8_t *pCom = target; + + while (length>0u) + { + uint8_t inA0 = (uint8_t) bitextu((unsigned int) *pIn, 2, 0); + uint8_t inA1 = (uint8_t) bitextu((unsigned int) *pIn, 2, 2); + uint8_t inA2 = (uint8_t) bitextu((unsigned int) *pIn, 2, 4); + uint8_t inA3 = (uint8_t) bitextu((unsigned int) *pIn, 2, 6); + + uint8_t inB0 = (uint8_t) bitextu((unsigned int) *pCom, 2, 0); + uint8_t inB1 = (uint8_t) bitextu((unsigned int) *pCom, 2, 2); + uint8_t inB2 = (uint8_t) bitextu((unsigned int) *pCom, 2, 4); + uint8_t inB3 = (uint8_t) bitextu((unsigned int) *pCom, 2, 6); + + inA0 = ((inA0 + inB0) >> 1); + inA1 = ((inA1 + inB1) >> 1); + inA2 = ((inA2 + inB2) >> 1); + inA3 = ((inA3 + inB3) >> 1); + + uint8_t inA = (uint8_t) bitins(inA0, n_mask2, inA1, mask2, off2); + inA = bitins(inA, n_mask4, inA2, mask4, off4); + *((uint8_t*)pIn) = bitins(inA, n_mask6, inA3, mask6, off6); + + pIn++; + pCom++; + length--; + } +} + +/* + * XpulpNN + */ + +static void __attribute__((noinline)) xpulp_nn_zero_mem_u8(uint8_t * pBuffer, unsigned int size) +{ + int lfover = size &0x3; + for (int i=0; i<(size>>2); i++) + { + *((v4u *)pBuffer) = (v4u){0,0,0,0}; + MemoryFence(); + pBuffer+=4; + } + while(lfover) + { + *pBuffer++=0; + lfover--; + } +} + +static void __attribute__((noinline)) xpulp_nn_zero_mem_u4(uint8_t * pBuffer, unsigned int size) +{ + int lfover = size &0x7; + for (int i=0; i<(size>>3); i++) + { + *((v4u *)pBuffer) = (v4u){0,0,0,0}; + MemoryFence(); + pBuffer+=4; + } + while(lfover) + { + *pBuffer++=0; + lfover-=2; + } +} + +static void __attribute__((noinline)) xpulp_nn_zero_mem_u2(uint8_t * pBuffer, unsigned int size) +{ + int lfover = size &0xf; + for (int i=0; i<(size>>4); i++) + { + *((v4u *)pBuffer) = (v4u){0,0,0,0}; + MemoryFence(); + pBuffer+=4; + } + while(lfover) + { + *pBuffer++=0; + lfover-=4; + } +} + + +static void __attribute__((noinline)) xpulp_nn_compare_and_replace_if_larger_u4(uint8_t * base, + uint8_t * target, + uint16_t length) +{ + int8_t mask = 0xf0; + int8_t n_mask = ~ mask; + int8_t off = 0x04; + + uint8_t *pIn = base; + uint8_t *pCom = target; + + int cnt = length >> 2; + + while(cnt > 0u) + { + *((uint32_t *)pIn) = max8(*((uint32_t *)pIn), *((uint32_t *)pCom)); + + pIn+=4; + pCom+=4; + + cnt--; + } + + int left = length & 0x3; + while (left>0u) + { + uint8_t inA0 = (uint8_t) bitextu((unsigned int) *pIn, 4, 0); + uint8_t inA1 = (uint8_t) bitextu((unsigned int) *pIn, 4, 4); + uint8_t inB0 = (uint8_t) bitextu((unsigned int) *pCom, 4, 0); + uint8_t inB1 = (uint8_t) bitextu((unsigned int) *pCom, 4, 4); + + if(inA0> 2; + + while (cnt > 0u) { + *((int32_t *)pIn) = maxs8(*((int32_t *)pIn), *((int32_t *)pCom)); + + pIn += 4; + pCom += 4; + + cnt--; + } + + int left = length & 0x3; + while (left > 0u) { + int8_t inA0 = (int8_t)bitext((int)*pIn, 4, 0); + int8_t inA1 = (int8_t)bitext((int)*pIn, 4, 4); + int8_t inB0 = (int8_t)bitext((int)*pCom, 4, 0); + int8_t inB1 = (int8_t)bitext((int)*pCom, 4, 4); + + if (inA0 < inB0) + inA0 = inB0; + + if (inA1 < inB1) + inA1 = inB1; + + *((int8_t *)pIn) = bitins(inA0, n_mask, inA1, mask, off); + + pIn++; + pCom++; + left--; + } +} + +static void __attribute__((noinline)) xpulp_nn_avg_and_replace_u4(uint8_t * base, + uint8_t * target, + uint16_t length) +{ + int8_t mask = 0xf0; + int8_t n_mask = ~ mask; + int8_t off = 0x04; + + uint8_t *pIn = base; + uint8_t *pCom = target; + + int cnt = length >> 2; + + while (cnt > 0u) + { + *((uint32_t *)pIn) = avg8(*((uint32_t *)pIn), *((uint32_t *)pCom)); + + pIn+=4; + pCom+=4; + cnt--; + } + + int left = length & 0x3; + + while (left>0u) + { + uint8_t inA0 = (uint8_t) bitextu((unsigned int) *pIn, 4, 0); + uint8_t inA1 = (uint8_t) bitextu((unsigned int) *pIn, 4, 4); + uint8_t inB0 = (uint8_t) bitextu((unsigned int) *pCom, 4, 0); + uint8_t inB1 = (uint8_t) bitextu((unsigned int) *pCom, 4, 4); + + inA0 = ((inA0 + inB0) >> 1); + inA1 = ((inA1 + inB1) >> 1); + + *((uint8_t*)pIn) = bitins(inA0, n_mask, inA1, mask, off); + + pIn++; + pCom++; + length--; + } +} + +static void __attribute__((noinline)) xpulp_nn_compare_and_replace_if_larger_u2(uint8_t * base, + uint8_t * target, + uint16_t length) +{ + int8_t mask2 = 0x0c; + int8_t n_mask2 = ~ mask2; + int8_t mask4 = 0x30; + int8_t n_mask4 = ~ mask4; + int8_t mask6 = 0xc0; + int8_t n_mask6 = ~ mask6; + int8_t off2 = 2; + int8_t off4 = 4; + int8_t off6 = 6; + + uint8_t *pIn = base; + uint8_t *pCom = target; + uint8_t *out; + + int cnt = length >> 2; + + while(cnt > 0u) + { + *((uint32_t *)pIn) = max16(*((uint32_t *)pIn), *((uint32_t *)pCom)); + + pIn+=4; + pCom+=4; + cnt--; + } + + int left = length & 0x3; + while (left>0u) + { + uint8_t inA0 = (uint8_t) bitextu((unsigned int) *pIn, 2, 0); + uint8_t inA1 = (uint8_t) bitextu((unsigned int) *pIn, 2, 2); + uint8_t inA2 = (uint8_t) bitextu((unsigned int) *pIn, 2, 4); + uint8_t inA3 = (uint8_t) bitextu((unsigned int) *pIn, 2, 6); + v4u inA4 = pack((uint8_t) inA0, (uint8_t) inA1, (uint8_t) inA2, (uint8_t) inA3); + uint8_t inB0 = (uint8_t) bitextu((unsigned int) *pCom, 2, 0); + uint8_t inB1 = (uint8_t) bitextu((unsigned int) *pCom, 2, 2); + uint8_t inB2 = (uint8_t) bitextu((unsigned int) *pCom, 2, 4); + uint8_t inB3 = (uint8_t) bitextu((unsigned int) *pCom, 2, 6); + v4u inB4 = pack((uint8_t) inB0, (uint8_t) inB1, (uint8_t) inB2, (uint8_t) inB3); + + *((v4u*)out) = max4(inA4, inB4); + + uint8_t inA = (uint8_t) bitins(*out, n_mask2, *(out + 1), mask2, off2); + inA = bitins(inA, n_mask4, *(out + 2), mask4, off4); + *((uint8_t*)pIn) = bitins(inA, n_mask6, *(out + 3), mask6, off6); + + pIn++; + pCom++; + left--; + } +} +static void __attribute__((noinline)) xpulp_nn_compare_and_replace_if_larger_i2(int8_t * base, + int8_t * target, + uint16_t length) +{ + int8_t mask2 = 0x0c; + int8_t n_mask2 = ~ mask2; + int8_t mask4 = 0x30; + int8_t n_mask4 = ~ mask4; + int8_t mask6 = 0xc0; + int8_t n_mask6 = ~ mask6; + int8_t off2 = 2; + int8_t off4 = 4; + int8_t off6 = 6; + + int8_t *pIn = base; + int8_t *pCom = target; + int8_t *out; + + int cnt = length >> 2; + + while(cnt > 0u) + { + *((int32_t *)pIn) = maxs16(*((int32_t *)pIn), *((int32_t *)pCom)); + + pIn+=4; + pCom+=4; + cnt--; + } + + int left = length & 0x3; + while (left>0u) + { + int8_t inA0 = (int8_t) bitext((int) *pIn, 2, 0); + int8_t inA1 = (int8_t) bitext((int) *pIn, 2, 2); + int8_t inA2 = (int8_t) bitext((int) *pIn, 2, 4); + int8_t inA3 = (int8_t) bitext((int) *pIn, 2, 6); + v4s inA4 = pack((int8_t) inA0, (int8_t) inA1, (int8_t) inA2, (int8_t) inA3); + int8_t inB0 = (int8_t) bitext((int) *pCom, 2, 0); + int8_t inB1 = (int8_t) bitext((int) *pCom, 2, 2); + int8_t inB2 = (int8_t) bitext((int) *pCom, 2, 4); + int8_t inB3 = (int8_t) bitext((int) *pCom, 2, 6); + v4s inB4 = pack((int8_t) inB0, (int8_t) inB1, (int8_t) inB2, (int8_t) inB3); + + *((v4s*)out) = maxs4(inA4, inB4); + + int8_t inA = (int8_t) bitins(*out, n_mask2, *(out + 1), mask2, off2); + inA = bitins(inA, n_mask4, *(out + 2), mask4, off4); + *((int8_t*)pIn) = bitins(inA, n_mask6, *(out + 3), mask6, off6); + + pIn++; + pCom++; + left--; + } +} + +static void __attribute__((noinline)) xpulp_nn_avg_and_replace_u2(uint8_t * base, + uint8_t * target, + uint16_t length) +{ + int8_t mask2 = 0x0c; + int8_t n_mask2 = ~ mask2; + int8_t mask4 = 0x30; + int8_t n_mask4 = ~ mask4; + int8_t mask6 = 0xc0; + int8_t n_mask6 = ~ mask6; + int8_t off2 = 2; + int8_t off4 = 4; + int8_t off6 = 6; + + uint8_t *pIn = base; + uint8_t *pCom = target; + uint8_t *out; + + int cnt = length >> 2; + + while(cnt > 0u) + { + *((uint32_t *)pIn) = avg16(*((uint32_t *)pIn), *((uint32_t *)pCom)); + + pIn+=4; + pCom+=4; + cnt--; + } + + int left = length & 0x3; + while (left>0u) + { + uint8_t inA0 = (uint8_t) bitextu((unsigned int) *pIn, 2, 0); + uint8_t inA1 = (uint8_t) bitextu((unsigned int) *pIn, 2, 2); + uint8_t inA2 = (uint8_t) bitextu((unsigned int) *pIn, 2, 4); + uint8_t inA3 = (uint8_t) bitextu((unsigned int) *pIn, 2, 6); + v4u inA4 = pack((uint8_t) inA0, (uint8_t) inA1, (uint8_t) inA2, (uint8_t) inA3); + uint8_t inB0 = (uint8_t) bitextu((unsigned int) *pCom, 2, 0); + uint8_t inB1 = (uint8_t) bitextu((unsigned int) *pCom, 2, 2); + uint8_t inB2 = (uint8_t) bitextu((unsigned int) *pCom, 2, 4); + uint8_t inB3 = (uint8_t) bitextu((unsigned int) *pCom, 2, 6); + v4u inB4 = pack((uint8_t) inB0, (uint8_t) inB1, (uint8_t) inB2, (uint8_t) inB3); + + *((v4u*)out) = avg4(inA4, inB4); + + uint8_t inA = (uint8_t) bitins(*out, n_mask2, *(out + 1), mask2, off2); + inA = bitins(inA, n_mask4, *(out + 2), mask4, off4); + *((uint8_t*)pIn) = bitins(inA, n_mask6, *(out + 3), mask6, off6); + + pIn++; + pCom++; + left--; + } +} + + +#endif diff --git a/TargetLibraries/GAP9/prebuilt/libpulp-nn-mixed.a b/TargetLibraries/GAP9/prebuilt/libpulp-nn-mixed.a new file mode 100644 index 0000000000000000000000000000000000000000..d63369b6c94ac26122a28ab4c94a3d62fc5da468 GIT binary patch literal 3265442 zcmeFa3!GHdl`p)ys~^xPA~a}xAU5(4v8k$4Pcn4qZlslK2!q%tn#OvfjA;!5ar|Zo z+H^M(Z8NqsUXzfF8sZQ?#!w07M-r}Sy(A$SbP&-Y4#`Eud?aBE8pkoY&i7wupIvpT z&fcdAY+5j!A4TojYwxw!ew_2~we~t|U;J0GWr>>`YNn0LzkK1a*Y67iy#8_Hye7&1 z|G05}ZzvQo^KYslDnCNBc?Z#V@csQmME`3K(a!gY{^cmq-or$%ZX5j|9P&LS!s8>g}f)2VD~4V4-FRQAcaRMxbQ%H}*sW%I{U+4YZ7 zSu9OuHy@?4+wY;WJ3;^Aek$umUe8i0Ti--wUmZzhkD=^8y-#IN?V_^p_fgq1byW5f zwDo*DmF+|R0krqVPAdD|b}D-t`S0(i^0M7jK4d4ApM~_8%~XEjT~vNa50zimM&IVZ>pm5CA+Bnwz*Wkavzni+DPSHbyR-;CMthu8t~O zN}i$pGJddm-&o}zXvuQth{<)q!+YXUu2kQK9@cWl-!{-F9;!GuO%)e~sA6IhRa`!nDvTpk@yRh% z(bPZ{SNW-8-bAWcIG-xo@JY?4iqF+h#qtNK;_pzl<1kfxX%$uUBJUB@`38P}YdckJ z*+muK+e{Tdyo)NH1K*$Tp^6vL&M*B`aj>5%4ujWGl>e_ssIsh%Du*1V$`S2UdCpO) zyr`TiC+wlhsgF{nv5hLHucOMwHmba83RTVn{kprT5^J<_$v&#QZ7Ef*e4i>;f!2vK z_syls-X^MiWEEBZBg#Dip8tFgRc=H6kLsxMx#?8-^O02fuZO7el_OO7tDRJNsE;at zzlkc}LAgK8r>gQaRSgYM)rcypI%h0ZU3iqLF6pPL%kbMbhN_}Vsp?bPsOpN{R5iDb zs;-?#RX5gCRid1#ZrMXsw;!acFYKhMRee;|`3P0rw}q;D@1m+l=1|o?#;NLw=~VU4 zHB|LI{Qf}?RsDD)Rs9TYywE^Z`&y~$z$U7Ce>PQ*?xSk&eyYAYMAb{0sQMn{eQi2b zKYf6z_uNC(N9NFwp*v{Egef#+<|Z0)!yX#4@+b}Y2YjA5ls%aQbHP>yYnmcAw z&HeXK&9`*$Qjn&^yKhv|$qe1D;j&gc!%8C$yOjGyhIGv1g;XOf@JJU>KdhNjS& z^LEpjf3u9v?4C|%KDvd@#JzPU?x!=~>8Igm9i-t?@VVka8h%p~4gY_Z((pcfe`h2O z|M~kg{Lq7RR@qoO>->#$R&Y0+^_dUotiPE{XLaH8k4<#e59iQX`;hmC%{1bS5RI6) zj7H4dLL(L(p%Kdu(1@O0G~x+-`tPCN$gH*Te~SK{+! ze_x9_4fy8 z)FymCe~?DKH=k-RuA$mFbyT~ohibnvmTI3HNwvS5L!(Der_l}gr2A>~1CP+?@9d}1 zFK(gHf1X2Q#&*$|nNw)YEl5AOlE(aCB8_={B%M>$M(0efr*rTeJLeAkeyE?$`QbV` z=k-l=?ywK&Tw^Ppdu;=qyK+9A`?Z~P?*AG?=kDJ|pTP6_6H|`TC+07sPu%6FPkiM7 zed0$|^oiGd=)9`)=)8;HrSs-&rStB<=PO7*_XwT$`*u2i^iDdzp@Gg%AENUgD5vwE zK1}ETpBlPg=t{c4@23lHIFByq=%Ndr97`AMJwzA$-?4Pz#Nl+|XQtDIU+AF=zmcX3 z`?u1CuXoYdGwW#VG<@dmq_KZ{h{itFKx2QtgT}tInJyahK3x>qMHj{Hp^G|t=%Q~n z&_(}JMHl_Cj>cVZ7mb@$PvcVCXl^#y$Tajr(mqT|BCeF8<_Fx;TEAE?&2p zE`D+mUHmVr=;A+CQQeq6s`Ix~-Hb(4cO}yETdD4|E2-|55Y;VjqPkTNQr*4#sP4hB zRQENMf1-ivzViXq{pdWZ`{@pEZ%otpC+5)jZEZ9j*fIWJKcMly zLjG^@`@MVU5>Gu{GJFbMa&A9eGI1nb60D(1n&;9b^WLRPZrnwe-0}fkvV1FD^2Kd* z$+}j$WCOl8?VwA(hqC=mbjb_n(Ixv2(KpA%6Dl(Z97dE*F+O8Uqur> z8K()eXVZjv57LAikWOx=37<#)>MEM>rK2?Af2L`|x7uhz2IYUWizfUO<@PM43BShY z$U&O$r-L+cXq+aVlctH|TWR9u_#N3o6Pq5SiSr(%iHqxL;;l_I@ox{%#7_Kva3@Xt z+A^Am=kdf$6-|6*K23ZcW&R!Ye>-gTXh$d|Z{U=Ll(o1t`(y#qA>F_F=^hcyW z*hG_uEv3nyI7*Wz9H7a;yJ&KAJx!ihMU#_pn!K`&CUJ)lYeo9 zChteRH}9dze|ncLJ@b9K^rCvY)F`J*XZ6sf*N&x2F`7 z+fKT47wE4Jr%QkLAYJ-rKTR2Wn5K-`NmDLspeZw&Xv*A`G$lTlrrfcgrmR^?Q+l`1 zlt;JGl<(mCnawoi`8JwzU?ffX9e%(6K3z7ni7q>LGhH?bpHM$tcEwJ*Y{4qJED@s1 zK7W8NTaE9Yb#&R+TIsTHAEwK;x6@@meU~nK*-w|ff%MxC($umvO+70_Q^!uBsZ+Pn z)K9k3)T<8B)axeF)bvuCy8IEEde2=n^~=cr>Ta6)Pc=04d-XK+$8nnaFHJP{-^S9^ zH-^*Hw>Hz%KToI2hwP`zM~|e-FOJjYmv5xYqg{0Q6-(*zzfRNTpB+w@-@KVF|H2Wv zyz5=Md_BG&KTMZrP_BPIUH$@o{|Y>Qe-B;$=fhM#44?DMseVco)kk(vealL!ZyihZ zNqjHcMfG?0QT>;vQ2oX&RR8~msQw4bsQzb2zr2U)-`GU;Z?B|j%P5YniH0_&@(zNf~L(_iLM$>*am!{$G z*=fJNi>CelJeu}j^T}KJD0$C5K;8>?lK0ZhTRs$TzNve3R?Q=RHKeDDoSplkciN^8NKu@?F23 zd~xJ0y^DOy=8&&rKKXiE$@l11@_iTepR2!p#jUq5Zf{>4OC}fJ;urr&kr_~BMiiMV z{Hjb<^%c(Q0SMrzj!b8DWU8twS`RE1dr-vZ}hX?_APZ zT{ZHG=R9{u)jG!0*}7`v70-Eo0;u|qOlRL!BhQa?XX~nw=aTt-=fQN0yp@^Xx|OM_ zUeLNISupZern9WbDKBQL5e`tBHcF6kI~E7RG!W8_6iMc-8;@06UY z=T9YaIMXo~W6C{HJG#Sb+u6EmE}VA(Gj!YqR;E*UlytVPnhU-)oYj%3 zs;=m}<1R2e?r5Dm?&!P7ENES17PM|=7Pc-jRn-goj*?tBe>O#?vpVvftvg5FtX??p zBGXyjIr7|!W8_7qs=A`@&XG5(JNxdei#c+R24^}(gEJlS@Dw`+lQUJ-74kTXL2@TU zWGYKKGm5^BHB9RJ87VMsd@QzKhHP;YDUa-_6Xzxe%GE z>VRVNyfCXP5 zY5a4J4~yh%+AdGxw)T~1Sp3Ttwddv-*mH9|%I4-RcYCgaL*9^P%c8frKG<^=9P$>e zEXzyB$$@j795~n6i~MDg<(s!I?70dK%3kC@^RgTiz2ISV_Cn+q_Cn+q%D}=ZIWVDM zjzw7o2SqPX7P$%z%3i4E0=I%OzDb=NxVm#BMQ-6Z zh}=RMkPFEQ*QCf*a8UFDWtnxsyop=|2PQbms^)?p7|xLtxe5--Ua01RpE*hyl)X^R z1vof+VRpeW4pwf#I9Ry_y)e70watg;u1xvjwB1<97&N|*b9-X;J}1}z9EbMDRUJZ6um%oRC6JoI|>fUUa0O19t5WhBDb&?BDb&?+?0}oq8Fm9f&;TI zm^Wl`ab>QP1COthgK936&nOIyYA!^sQwG&si06(%24yeu=OUT9efiB_xaE!%IwAgL zyX_$5q;ZgP!;(+Rn;!>B#}Ku24D+TdpJ85a9V89I{MpN^l|O|Jl8&Li%RG0QF6U2c zep~u3=Rf!ywUiRFc=iQrt0hQE2?a^Vkg2L=gM9v{C+QgKx(sf*Sr#M>L+vb!N2x|a zuBBs$<}_W_&NA9!A=RV7Q>kO9@3Qt@W^NjWf~4%SASoqe8T1T6(lOL^84S5O)o2Kk zjv-UkwY0M=9=sZc+F34qFx&2w!l$!?q?1tJW$nEzp6)7!W`EUVXpvN1wn#dLnpx&r znpw6;I)<7qb1jf`5^81{wYZ{c*;phEL$f)>vf*0#F6-`PtCptAx_g;x>AS4Emre0B zU1rHOV<<>U33(p%44JALC{attP&dn{rR%aFX&CZ+DQ8*##Ku5zEgeHNr(?)nQ+JsM zU&m12W$i3OLex?+WNsP>1xYEPAn6$Dx{O-7E(?;5AvdQQDCBcRJxRk*JInefHU>~T z%i^)Dkx+Xti&{Df^AYaJ``6_vMCRBVlU&V*>m3%b)%D?+^{mp;C z+VVC1%D?II%RA*^VO0GR`Obccd?g=czmUoQ9Cy0NSMpKz3+0vbCGu5#)bmvcj&gho zkMF0bmBm9ON(Q&~8VD9=?K^KRv<_?S(o_-Oj2yuX;gre8cSN_mj4ltkd%Cs{o=x^eu;b)AN71`o`)D@^?Zrvo~mE!`4Z)o@@V>{ zyuVl;<$N&{)i{fM=QxXer##5V&^h}h@|Ap)^M&%0=#jRp+?BkQ4pBtb2{G2?t{Jipl|NrOKAf-OlRsa!@|u3-&sTnV)%fuE=jPp39{EanRQ)oUDEL_U4n9`C zLmtjo^~=gv@=?tfm&ZRxzpQ*EA5FiM^94T2`Lgm={o;91$)lVv=A-EscR|Sq`Ko?# z`J6nr-*!v;a`i5igOuauAn6$9^)bH|NIHgjJcUgNcgQ2F&W`EUV zXpvN7XpvN1W|F4M7D>lYGs|2{(`AdKW2o;kS5z$<ezY`B)b%eq;%YH7xh z=SwFcNID61U1sq#3_@og2YtSXb6&yA*ecrx-N4SO_v2p!;t4oBO#MC5;950 z5Y6crf}~@}LaGN!JImr>u4Aa1Wgb9{go31GC`d{PLDF?ukaP@nT}CZ#PBj{Wq+`fb zbuH~I>z~*dcI_;SXRk&=?Y%5&=_J&5nHPYj%S_5KjICU9`)#*DiOri}dv1=6Jy*%W z?$e*+Yj^6m>NTYmk!VjcJx|-f-G;6}{j^kX=%? zvML!+*2y7%+D7Tdb5>P$bhm688}xVgK{qN*J-vj6%DKp2 z+F2QttJ=IF9dp6CijmBli_gXGwC;;+^=wwIZZ<0?yv(xoJ)7mMh+a=C41Aa$2GQ}$ z?~nQdR@_5Hm=u3~qW-q{(rGmcTEK-C(bHDA@Lb`-bA^^CFD_ksplNyXLetmN%gKw* zrJj~2FF;*Aek8ciTzKl`%A z3#l7VK~wV-GEz`5)`h2Lee$B#-ACLx7db)G%IPxi`up8%PcNtT zen&kFx3=#t^RB<&O`iJkWKlJ1iJt|^IpWFF&AUZY^0a6!Jk@fFdTKc>nwF<--npJ` z-YuF7PraPF`(5zVkEd?lxt?y`Et*zN%%5^CiF*3+beVT8L*}V#jA^nmYUw2gtLZHxy~v%>UG2*wMS z4rrecOmLCYWu z&mpIb>!f^k*oh9VcA}oGY67!0RWoQO>e*uG97B+;sTx;1QOlOsy_PK#wS&M!JzKXy z;3ckS3!e-@M?I5_U1b!^JOc_tMo~_#;a7~T0%u~x&5H(XKhmrLBA5Ln%c3|KNGkn z`l**zKL{+Ub`S(n!&VSA(t^lz^#}=~o-OElw)&O8)wF{kh+4KhpIT{|sFjw9dbVg* z&lW^ITNYS1d@d^ixZ*YlOw_RDfz?VYh#F}HQO{OC2&kza1VPlZ7 zsFsMMM3Gih(&TYiF3HQE;5^l3EN)&0O$cTXlN)%~@7l6w;1rHXbXo(`N zFdJ7M#nza>I`>wJJ;yYVXj>nmM3GjCju@{X_Yo_$#)@L4Ib5!-SS4KgVwG^27cSwx z#;g)WT5%sS=HWhKR*535xUVtrU^XuEVwG@j#S}%ql9@-*5i9Z>vv|1AOOZ9kJTM+b z`ch=XxFhZ(CQ7)qB1*XR1tqwU%b1E1MOs0jBCQlzW6Z#P#6$`AR(O55_k~Ni_k~Lo zX$7JbX$2*Uw8GtS9ra>sOdw&AR*I}Ko)q`Kh!SqCh!SpnL5U(GCQ1}(rO1eZ2aDn| zrlLfVR=AKWk78@AC{|)(i>)z%gzkMQ_8b#Diu9%Eh!uN|p%vAL$=Fs{U1s>c!VxW? zJLaT-?&yW2V@-I(*7>ed=+bMx+GH|EShU)y!Hh(BIjn7ghP%^x=M{uX36 z=I+D7%fV$>Tvvhqc3Eij(vKw=h zaAWSaTDYpqun4jXbDnP($(igTIg{O(qj@*xAiFVV;q`;+x>^L(xG{HIEj-{Zk_)ny zxgcvL2ia{{1lf(b+pwTEH?JEtL3U%#CG@pjSBpCmVY*ybi+~yz$z7iMY&pX%$e-MT)A3o zwcUqBxmxmTyNtQ=*%C&@Zph9c9Gm|wV-Xc)nbv|n7a>)+iGFv?!&?(<1#Evb{Q5XJ0!P-5M(4$@OPAO zG~p;wq!rZ=N8I}&O1RC7C{d&pE>!r0ut^Fs|0`OeNGnA~3{9X!kyeVVG5mp9 zbi|6SF~P&VFU8gvcoZG6VrxwNvFtuC#nzbM;no+P6!+N|CEVsklqk{)#>1^I;8A46 zM2RA;uqZC;6l7*ow1j&r#nzYx7HxNwC{d)9q9aypjcFhvQNq0y zULWp#;S%nB;Sxn!fha{u)j1cPF0tSDBR%hF;bAQtQyJG) z`3SQU9kXF4y0KNfM=fIj^E2K>Am^LZ*)~jhkw|c*WJT%gV|~US;$)<$e*> zR+9NUU>2B6XV5UZpfS@mso&_V?l-zy`WLR>^y^Ib5`4e;$~~(;`}s$o+x5)c1MR!J zc5dpQ|7z?0MX$8&i|`<uv@6`1q z-hO~Co}0O7_z0sR@Lp!|JB>!eGi9qb8lGo89gFX->iyL;GMYOo&f93r>Zvd)k~58p zcRWVNZRJMA>mI}NnkQ3}qRg5U88vB2EM7gb^`Y7K_utoW-}WzszErofwQ~dd@aAfw zDQhNX)0tGoh_)`HE7fc)sT`51>fCJ%S+m>lR6L&ubNyG4s-K`trux|?BHb5d=6hcUjT-`^rj8ILVF`fXZD zuYL9K@1AZMN4?$E<2-Nvq-@*FiL?4Uj6dHT4?EpxBEbX>UJSMM9=_xi%#pf^f282TIW;iWZi#jUq5 zzN$Ta8zpYO<@Oovx3#CnC2n6aV@d4x=(yWcGa}>Ci5b3exB6#Xj{kj$Tg5jr@f)QR zsTr|&IOz)}gMnl;8cv0M-asrEPlpmlEE-6L;%T&^xa{k?g8uN|_9C9VRZrxhayuEn zJq5oj=v*u30(_TKMFG8%E`z_n=Fn&K`E1yjw;h}2#Py8N2 zpR{uR3?3s1H>x7sIv&*7Z2TRw{5JmcaT(QL9l$4uPZ*z2wn!|QH2+oxl=UM90l4~+9x+U$-?gRRNBVNBJk{Uv zx1U=ci{pFwGVy)0Of65{xt!{gvE?zUkKb_z)pJI@?6|#$%Tl+-@~L^9t54kaxzDBA z!OUEb%~*={=Asm`mGb}jCMXnSXDN8;^eba8WLq-TVYG2YAUxn`ze+(ct~jp6O( zy?biu-qrpu8FNmzd4JRWJMNo)-!@m|jCU9vE1EMvPNRCw?#vLNXI16%#*m8Vds`Vf<2{`rLeBtazk5^Ky%cW$}(3>yLCBo-Z_Kx}N|V_L^uI?~wHE8`?p=v)QQL1RMkv zIA|xC#?uezG5Q-CI_$Ma z-ak@0Iu0Hp`ooE!H=Pcpyoqo!5sl+Jkq!nEv1r^I@}`5f+aQ~i_XB4P79P&Zwl47S zyICOw9^PmB&3O2@t$a3#gc}|n01q7=;*awz*xAt{i-#c-6D6S7AR|DV(5}QiPD|X| zYRl)e%x^$i;^Bjww(xBcykpqpAx^g)BkU z)LWF*5%cuLn=3}ddstUAdhTpKvNlsGG{%EH8AiS;ARlzbct@-=Gvr%YRH_`-Sz)|< zrNFI??Leb%HXrQF3e1P-S`}s)VRAl17t&9_h_K#DDa!qXk3F2u#($jo{Xx% zxYfJL9$US?Z2aBZ>9M<)(m&L^cF~_sPOOW@BECSt7mNFn-cZ6H4@bShP#~G``@+6d zGA8eH`?u}(|H!cJiL4L;>sH%-GuAzt6`23(&RuR;w+B3QSO){qabjJ>#9fJXjKLDq zo9i^bz?dvnGom-*T zu@==`yQ44Ob)?&<`a-kuTI=Xc^%meS%Cx>+Cd;b7#|`*=+Mnw;0zL zjYi^{(MI=Ap!J0sGjEDE54CKaovGg4WGoCf8Y~B_p_!M%7TvOij`-y|Pw>=^T4G$S3#3gjU9a$j+ z9{$Gm`*>}k?|_E}4|$Wt9S?Q3P@JQAthUeyIx2O)E>2sz->r~O;^B6rB_1BJrH>*# zc(zb7n7fFEhwY$@n3X_GVGE7-@IK;>&Lhyy z?6%Mb>?1-O!#?7{?(OTL8CE~m4Etv_v_C7~*ten47}Hhj-vG4jfW}z$L{|4>`)8(g zqKUqt-XmR^DjPQLv+_4?Yh_#Lp_UA6p*uS9{Zg+p#{$oJLL9~TNLlJ*E9Sp^N=|~zWZ`|;w zld(WD;ETt?{AhMuwnxFB;bBu&ijTw=%B}_Oc&M|5;^gXMwT1o_`YQ3zt{;AMwor89 zFBJDq+d_$^`2v;?OabmiKMLGqTPUO6rUH){1?~-?B~Y2C-)XTiI!Q4SKI&!GDZM}th(i$pJuQ!W&K(vM)pj%r*KI-M6;fqbii_ims zbc}i?`T_a2&K6eD!(_9Ho_{Pl;ozZO-0w|!jbzwJ#zRS8)EDsk!(o3snf3=$v1l}& z1)IFY$$)!XvqA_xaGmY<@$Lb>3LZK=@VM=wDK@=!Fet??+JbVW*hL3z56~CNbAFNfUR38R8a1p-K*DZTf!Pw7eJQ|gbyTpEqU;*oI5pZ3L*$v`L&k3|!ybS#=m z7dq`(&kx%pWzh6SZkql5%1!S)OAvf{;EBjK)>+xCDr!PHw;xnRv++CU16W1uBgnd( zxT<8r{AM3h`{jXW#9S+52%c*r+4Hf`Q%1aVkj=LF*vOK2k1FSe$}Xs^W&)JpiYkjp zw;N`r_c#46WEp9R$mzVjNZw$=^$uZ!_NmxC$Myb8-Pjjw_BPi5@2%Qp|dRer3A zf^xUwH?Kc=$z&TcVCJNm7U53IcFRkF$AD=({j2cdcD?xUwHypoSl$hq>^qlx0Od-- z@(K*(2vp={Gy)%Pm%sT>KRL!o65E!!Z}O6D75cHhg>oBYA$-en(|pl9hn_5!>-IP! zrSEZGIpA0>JX~FTeWZ`;F=)7>emRnO7j(12-zSOP&!3xKuEwxGNiWwmsWSgpGBqdO z%k|#VUalwLy$@e15s#%}fm9%!O8BC10E&iV;ShE@gGLBCuk9wWCFT9XS%c;0%55DB zMsLdsDKNUn_WO7-`q$v0!)T4|R|2pSqj`HYqQYnZ#uMnT^b6v&#NzLA{xM+mjgVPl zG}{FvE`O9*JP?NBk24nYI+K?Ui`h@-CKM`$#kzM&3bFWD-YF>si+=}TE(MF9(qXY* z?u+KzlcUhKmHVg>sfQQWt7i>979Wq_?fyFI-8+(|DBn0SD)xFZ9lPLn3*X$1=RDB9 z@z#m)r5Bqs75EH-2kyP6J#fXJj`IfK{mVqs8}Rykv7jHeW?wj!j70IGXF3{B_%-VeD*gfjAO}IW2K` zJLg+C%xRg=_JR?XuFUVAN?p0lhQp?P+R~LjN*o>t!}Z4*hgJ6NLY?^P5^?y-5_RH4 zi8}EsC|3#&|E5G7eo~9WLCcS~0Ecz^x>5NuXmK1~J>WR3vTlF)J>T9vBgygp3ozHH zc&Hq>%YMO(z3>ed)@|$qS3n~kVE>AJ7OgazJG8u0GB5t=!^POKG?CbCmb`3 zSUBzTMuUO4PXYm+{r2l*#OkK3fWof5D=VbH>YP94@!Pfeg>;S1tn(js#cG{h8(z1^ ztTUTFR2Ei0h_R4ZeWwkpIlhF{ncugiKS256n!|eePuoTU!5W{Z=_OVZL zF5CZgu+JX|MZ@uA)Ne$?Ml9tE2NP-W94P!BkM!(y zve>novJwf59%Q?=&ZpTGqjh#|cnA*|MxTUs?E!Is{y1atX}dQ3r14^*K;Z%`Hndn= zvcK5Xr-D9R#HtP5Sz*D_`5pY*pU9%1$eBD;lvSt`6_PT zWOkGAbN9{P+q!4b3vIjOzew*|`cwF5S4_OBW5JIr z5bL)RKH7+Iad+jh_-L2not+tKd1qI`JG*uD$XvYN`gN@j<=)lpsH~x-U1prZuJz4r zJsnl&k%9M=Jk?Xk@KiqEF=RUN`?*FB;_zOJ*u5J%Yf=8%9`k*p9qSKt8(n?P9N#xn zeKX#;-PX9Yt6{Af4|qdYZKic?W7}Ge_q(GnvjI_lw;($5kObb~1t+}OyR>8FY-8bC z^DW<8bl(Gb>nVju6%RKzbQ;%WP!h2Xujw>n95!TQ{5JOYwTziPr^o2|W7DqgvuilA zFW#J*X^gF}-GvCh8)kBZUv813UF-r+j_}(zlOy~tGb8+F%RGjd7OQWe*G4b+4|@c| zqx0em_AF?+e(UvhiymB5e#6oK5x;uR)lHw?`ss^f_pJW*>YtUJUGv)c3w}G8@qO|B zE_C2{5~k~PG@MSQ5Z^Z%2^s-kDh}QFB+`dxnNK19PrSp+F&)Gu-er2-_M5lGzhO~D zWYz2s_=Q&IejsI!@B0>bDBoogvGcPYSvFtmV)1>srWtQaV(Fu3Q(~sMCv0J95Ax+Z zOG(Hf-&tb4USjECTlxsngB82N?8Jw6lQwYxVxP2r()@RsUA}qv&1*tlfFAR@0{`O? zPBYD4m>>MO3F%_-3}=FY3Jcp&*VYW(fO4f^;R`7D7V0tv566dP8i7xt|MN4zLhg&a zWLt&)&us5rB@5wOmYZgT@`5~B{?9?L&i^^YZ#k8Qg+D}_+|IFK;oNzO&|)z`|>Qh4Td#mJ-i!)PDFlLkm?!@|}e}-Mt?d$|8S$WyGNbo$q{A*_I3i5v(*b`$I0TKTR@d!h`Xa0Ol3lOgBNYl0+{(iFwF%oBP z>qffjHAHgSFf-J_=_82W+dI=Z&^I%)5ixra!#5khcZ-NwF`j-|W<~EEx!@0_W8dJt zyBqX|!jYsuh`H(~6-6o_Z z-VKb7sDJ&(6!tF^*Ld#b1sE}}LR@>-KY;-r>)CjCI$RZGFVVv+L}5w&Ud`% z7Dac*knA#z%KY;J<51Nd{U!S?Xhx0x#k!`w}ep_gF*KC-{l5o3b zRC^%e_|=E4_`HbIE8_ExOrDfz2It^(EN%FFDI;bC$cAO zvfcI{8J2w`D}=x@eqU5vm2|wi8~Z5fuuNkcEdk3SCFyQohVW8%yApCpEc+_bgNS7V z;kJ89>S#ItwA?u-g;>V^uBBkvc_m_5utY3-qC_lvxI`@T>aZ-}SH)Qhdc&Ii!?29Y zR2<8GcU)MevQ`4i7L-+ZuK#fb;_x1ahK4x2g{Q1|7{j2S*}QFqwGumqmDm@AwbHJa zEqcfvjn^{-SSIY1h0i|ByY;e-^#&TV)Y z@sqkXH5-ZR5PNqO?3H~p+q)WiGN!E(apr}k^37H=_Abg+eXF^>$BeSHuy5wd**iMf zYH7T@URo^8D7`KH1`rZa4y&Qd!2+2X&G?4cgupk%-(AA-cb6QUvAeHjV)K~Uz*NtB zO`8yN5cWzwUj-3(H_bL<`daaKL4(E8jKIq$l4T?CB7(44!m?J5Ngk86@)m-%@`B`` zS}WnS69{-CDR0v6k0gy$${!BK{N7juk?G^fpz^KMEVSSmJy^P1lZ9r|R>}Kb;u3gw z(DwUy@s90(8obl_&*tz>9eA|yA z4v6dPDT#x;CgcU!F|R@#WS`NSKq;ovHGn}Ww#w^Kt`uA4FHr6+v|G$p`NI-%@K!Aj z2Go8uy7xm*xUI4X4i3Jha*0_q}zkN zyAIeX85a*C$}UF-H1TPSWvgrhDgvWI8)25&WcSR+Q6{{ zpJ>j&T8WtUGZ`n14*a&xX4$s!-PtBevb~XQl`jJQpqcr5@88uo8+c|$8r+0PgY{OV zL8KAISH#yv8aSBgJ^*bG5r5ko5NR-s_`1gE%n_vPVXJ&>?z`jZ=O??Z65DWi&odZK zLe29>BC${^=u3o*NE!#Sq%%BZ zy!+^El>_2NdP?HjXx3)@9h`hq0`@v+g=IJ#>dgF+A)Xyc+R`tf_%quAM@Y>q8o^1>=EZ;zVtow{1aF;N7sX%I{Llm_qC*(4_(1F%}nRJ zI9trLX^t8XZ}U5?Sv>0vC^FpQ`@9Pts`npO_~B)#K4V3`kBB0Og}WlM zco|~rxyHgZnGtP-I1)!WEpe3nY~=e7oR;}`Wg;8jr;F28Y}u6{5#9dq&M=Hc=uUQ4#WNTg)+O=oV*KWEfD!X5EXOpyPNrD6y#C}R z`_YCBKpf4q2ub|76KS?{@|!(OI|H9p_;7W(DIW&|6>b;C-}`%%D+RaTLb+1ji(rB5 zrX$&jB<)qaeKYQLwJ?p>|&5nWK8S@RtBBC+qd<{cRaw}#KXHilsz@|wak z&himF@9gVT#R%(^Ga$Gz$~xuj+`LoHfZ^Ix&Vb>{Q_hetPkwPdeZf>P<_pR@B>!99FPuAA z`;Od}8%8&A0rMLCm;sD08lO^Ej8?`BFqwV0m;t8Gj)l=TVzMMgb6i4+%LAhW=f$Nj z8H-QH!p-^eFkbQfB;S<173p8wZZJTfc@<*uJYd*OpcKR6Q#KZEFr@VP;gd#{I`oN+ zh3kUF5{WmRYUi#2e~%QNyLPU1?i%peJa_Hxf^*kQ^eyS!HI#HccMW)}Ja^5+=i@qe z4g0g^yCLg4fyEuQr_#A=sYKEj@CAbb!yCYPqe+CK4}{~P>$6?Qc#;QBU&n){|leA^u!?x^^mMwe!f|+c~9wThoI7Nm}hB2Bu zD$d(z%<91jZ^@ZP#e#C9BMw_OY})LZix{|BTlV5-MlITy^T`#qY`a(P=FW+o_0O^O z;my_9UAqFFv#baIrV^*0;(d`W;4duNnYESAvsL^5bjC~sZdiK+_Uv!Lo{e2w%btz> zQefO5jgYd-zWonHv8$qvdkrM`gipf*t1az_UyQ6 z&lcs_o(-?1)IxaSUeSL9_H5fp;4e*(_UsgU>8kD7czY8*y273vwES^%_Uuq&<`DY} z3wt)+Mm|1_xf>_99LPvh;%MAS$p{62p= z9tfszL~1-9NhDKozkF8Mzip3@lLn(3vH}WS`MIo+0;6-jmLdl3MqBx85(zhq=D4vM zjMn+^x?;341}-#Cj)D6P$RaVC(-MofaK44noR;}Id-gKOEHU~Sq$NhP4O^z)L;57J zXAg)Y@W&audHu;thut>=yGyZWr@^2Ud-mNZw@fyQZz%$QOBtB_4t|tk&#r)crP#B7 zjdDtRHe6DKpH%)kpg!zQt99rT8UxowhdvqY*>yW}I6kW4t+Qs#vF%A0pm-+Kc_iL# z95PQbXK$#ryeo}Q2khF=r5VS0Upmvhso7|S$M2Y~TKHY7|#?O7% z-+~wjWW_-E%HboWqxIm$KuG$$K`70UWH=Ix#$vum)Ek2e&Ee|(0V6IqsQ4zdUGhHV ztW(vV{Y17u(vm1L+%TH$j5>@SNP9NNz~%j9iP4;vSp0p?w=kO1GT*L8pXB!J0dZdb zIAif?dp3NWLo$Y50Tu^!SS;fb71yI@4yYb|;_TVQca{;U0jJ7jhGln_=dB*u_R#Eg z{r5NAzx}?@eRVr~;TzVL^#{w_S%x0HXRVQ_7?D}~baT4LU|V+8n%$Yoisy|nmCuh_ zxQ4yMhIJzHZAbIYZuuVRp|$A_qiu`nwbih3Pj_Z*S97NN`_QAGF!kv4+HKd#vfDQ7 z=>oPlXR5X##vkZxYxZ>GO(601>Gt*W5sTq_@Q!}We5*%j;0s4j?@e?MDF+hIPG5QG zN;BTjflwnnz}6xn(b_kfG7BS(W<;WwB8|q2A-vhsHk#jH&Af3faQK?hjJ^C$&!1>~ z*$?QkvcI9ThrRZ--=35hYy<;|cqkBzAplV_5KS0i1RzQ#0>MPWfR)?+2Q8lW@;VhT znC-UW5_)o%?e`oI9+%`}uw}pEg24l6%jUSZ18K`1!Hz$;_x@h5^@|DmdZ$cs7zTm$i@l)yFH46+%(T5kKTq*kS-V*iU*FB}_!%t}SVX5C1 zV6ZNZ#ECuEt*>P#{IYi<-rY{&m;Dob3%~5S2iPn7(dSq%&iC+Qzw8dnFB=hYs}K>l z>R2M;_WtT3!uf4;+hEInw#=Bd0N>9w8XeEVyK8wl`(_(G&zt_)hK!3_fw;JzWe=~M zk9J*wkG36$jhid%KH5OwtdI7PisyT;HBq<*XTY2yKH9KpXMMC`(=PDQh7R4A^U;P) z+oZEi8&PtP*+(072H8g&L6uSgBbYW~>0ru-V^@=bgfHk#1pwg*e>jFmfa9_~N={mR zIrkol!0McTtFUPwkG@=v=af=k4ixv%4wUSp&CK-r@;1zd)R#G}(w84ZzVy-N_*2rR z{ZphRR{zF?#feIM;0uytK0?yP1Asij&=tf7(lX zT;lc>GnT||kB+-NH6t=EotWVpcdLKK<@n#1xK(^36TjPUYfq$R#6$jc0N&V>d-^s?+@zh~q3L$=?H z$LvETE~%A>Uv7KMx^vxD078q|w{2Ke9FJk&ehT8qJ!Vcz-S~%`Z|yO2TISpLm>)*I z)S2Vxx73;WZJhI_S4O}*NnPnW3tc|;J7~8n>{kH2q z!;whX^SPMkwkT8Fb6b>i_uLMa;JJ-c6|$b&Z#X=+59N7oziIQ_hQ)g9v3hQ!PVL}& zZu^a7DCYCVBk`a=Xrxn-aLOA=#0|ur45ve0C1U6NHvtVNt(|+14Wk*e*{&-tVdvf~ ze`YO-BEt={hd_VO=+H%dw^f*}_T3JczT2jcw)N+P-A8*n#FUuLX%%MM?cA$vn7!ME z*=#eF_+5qcNnqzb?YoWn#8jA<3d?!@$x9{+b?ZAzv~w>9gHr6=51?ErcJ2!3%%$ko zwUDnA-TE!9ZY^V6=Ihq{cGXAWyRFCa6Qf&ySUdN?dvD)++I#y1pO>CW_yVjzhts|Q z;5rcI@FZb)k{LMiCl-T-=e)9T2hyo(=RO{ccCmBoVn%1*uTo*O&d$xg+fQO_rC!Zx ziN(i?(I=su`?T*i=2K#<3X4zMxuI7_IO<65l4t4peSaBP%rr;R|$7l;`~ zB$4ACHaO4T}fT#?3z518L)yKHMkCp7UuR?$cO| z5fGPl&p9H`_AAhfb@52TrQ5iF16`b-VIp4ZWca=hqYD}{U5KCEiTK&wR{ZR489zJv z`8lt&@8mO(Chq66B3k$4PK$t_ws{sH;%DQe_D0yV#i_PmYvwqdV>%LVU&C=YM{yiZ z|9hDimzi-m$BHLCvm$bDEO%U4Lrc3n zSK`E@u7{iX%!sy*!`;SNIH!HKIQPgicRJ2#@5GsVOPVv+ZEI}nGTw~f?7xTctHX>H zvi)JB7csM|ZfiDPdAbp`mw?{ghc}kHxHR5bp8l|L4oV=>h|z_}*!!MtG~Nu2Ml9~u zF7sU~8CkofKZBUsZQUzp8`Y_104KIgoNaWx z*M#!`tKSnR0m38Oe7DN-#-7+>biLbTM$N_>)6ye5SAx$0M7)qsEI6if0F!(U;6)1t z^&CLJxi4r$BOz}v0SJ!8jBqr9$Y3}~f+LNbG&*pTyirM<;m#N$E^&^;0o(86Jx7A$ zYOBtXK&We7OzhmbNXl~n&6*{hBXJ)(BhN)L_k(Lh@1BB8a-aBhTbj=V9HesqMJGPI ztF&nsh1l7h0rA`u{pA0pUU)ImTn?sB^C~RIG`=pIr*+YJ|5jP z6Cb{Y;Kxn)E_M#!baYT<8*WEk*(W6FT9hlrHvChRdkf`xsSL-5Wg3AG%OS@ON%}s1 za9`vl+bZY{{MkcqL8(yi#!z zV7g&+XAKa@{UpFNPUF*^1b8SkT6+>;+88b4dK}kDfMe%oV^C){B7Mr71Q?BkBS{?U z9*-r`J|mb6dVT(cH<=2?!{H##z_l&^Y*O9_oH1B7-==Kq0`H#83L)?=_b#wF=bi1O z;)3IZ?Q%OeX&-p%@J{2qoWnciIe-im0n=|w+HdW9tfv2yMyyB(Xt{)OTi&%L|=Bj#0zYwrLzt^}nRu1y4kQgE#i{#AD?ijZfH;?s&mQCxcR7;tsdEls0!IL*lYwN&z@hEQl-Hk1#nT}pg##7*zO+AX z-Pi?Rwp;%r!?Q=TLI^zjJKOK$)!%gI05U3R?4l*$*(q}lpxI6O3&peC``3Cs?PGrq zVAQWX2hb0cQ~L0PWsIoe{qKXGQz@%r43!oHv}ca;@Q zV!4PW;lUnY#VipW8S$LV2+5|c65h6z*biK|dSuSmwtk&B*Vgp5-6u_DcU}GSxV3{kmRhv3w0tk-NSKi{+$7oOWPZEH}Yo z*~jID#c~Nsm=;Suu^o|+VX;I@t$osBX~s@wi{+N)cz3APsK!aSIDK7MEH_AtCv6AVhx?QTH1Qgpi)P_7i+?wJyGyW4fT zT{Ninp$TiSFeG)s;#m01F=HXeRbn)BVqwPuaqewL+p)iYGHSo@lTmre01Yel!b@fs zPS4xCE^`l1ariF8S$eTK)42y;G6y)u(umfF?0&2D>p1T4kFLt?;(6vm)9db-4QnOP z$VgX?IM@SJ8`8Pk(>w)s%juM<=fR3Z_L z6mF52_q^>f@R4C2?_Y^aVBT8WZ-(lpB>5OHZ$EhGFz>kSmhjBn3RxuPaax6WcDrRO zL=Rk-D)WCO!v@)Ot#kM89?wo7Sykop9shd@d{XB2 z7;6z@ck$O}W|n+rbmy>ts4*5l(P+R**zom3-I?K;=5$AQ^Cn`}w|&b* zr5zi0<1Ni?&FOB#gQ&eP1I^w<1fuS)Y=qv1-gjG!p6@kp?=spp&NPCa|98{$2k^akTBFhZLDTl0i7lA}^^NRpG976~I-~k+_@w~RZu<<73_K7w zpX29`r{4m{epxoY40tA@_MW{w56_Oyi!a!-py~Rp*Viq2a8daUNB>9s>OEICeR}Js zFOJ=_dhjCWr=m${aDhl9?TsdJKzlHj45rhua5CYI2cv6C?%e8T7_pl$d`U6S3?eoXWu}25bO1ennK4^Cmv$Ld8=5mOb(-4s-K`trux|?GfF;MsP8bwxAgm4 zWGUk@j+eWXUb|r7?@QP9wzhnmc9p&M;KD(*b|T(hoCDmalhIH(?u~^J{3ief))xq* zeaMl|4*R$5kuqp{AGd!2KIINQu8JCvKZ^^Pmx%qdH!Gxw{quqCH~ZnS%~4#X$Ns6o z^U4`VfCIf2_-~poB;FEPyo}^KiYT)DHtZ52t3Dh1M-fNBVs`BDa(N6!SU#N(aoRek zmG?bm?4K8qmazjW&=;BJ_tOU;jzF&0^?B#0+xxC@mXY25@SBTlOXR7Rvs(Cv9=d8? z7vp~}2WT;`!g5UGYoL8V*-mPgZytX0x|WxeFM$kuxm)p@*Ppy(@_6G2tONs<-L)GH z$i8!1|A2C(*j)!Lj)2cAUw|;3MJ1LSP)wD&=>WvbJ$@{o|Ek!dY~8=;m9~BHz3Dwm zU%>w4qOwYX<;N2hNJbLisP_f?lv(W+?=KGf6D+gln~OE3_R3L#=C2;fSf1OftlO!_ za>Uu|zz!m7v(-3t1~ystx-mE&P%C43yyxDUM>^Y4>RZ6_^(K~gRy=}pXj)8kjd$!= z4_hwpW_CXTeC{>zIo=`Z+c&g>dS|myy$Q$+Dr~XF!WOgC^j^?vf+R9JjE zjsW5a_`LE^w|p%2>99Ctso}-`w+r-Z3P(B^*i>8cLRGf)nl8DZhWv8 zy1P3A)J0zRXdwJ3@Pjp(Ez0nLWnWnHq&Xly@OSmDvd32MFB^aNc6#jYrSuOquYG;V zNr}U8Bbw$DS;Jmm%I7me5%|W&BO$!a7>WDCzBuDw;dLtDaPD14p)22)6b5p+fB$~Qq~sVnooveb`1#C~h8cgKmt z17W!SIP1i`&g7-jiLZuT_$Cx$^9ZkC{8XL;H>X6MI8~xf{0hpAfP8F<8DX`{--Yi_ z{su+}{u@JHvP*^UPd*93*`HKivK(+YYIjD;>cq%Y>cj(Z4&3qMu+WI}t=qz9w*%Jg zCkMpU#HCz(m6t|(ft$X%Q*E7r?YaKhg!DI&Q$Mi5>b7T2g`QmWt^gJ z(k;98m($09&urI*Exd2ZpxU(qJ{*%CilyVg>VV-*8<9{Nx^luF_4{$u3~!}6E_pvO z;bhU7o3c_0yLRq91cBA>W`!Q;bKp!hH{ZuMhi0x=t+Q*xV^(`^`mvrdGl=KF<$8U5 z7(O75!XIZ0KYb1y>(V|Bg`2&y7>+k?loAduQ8B@ZTkT7 z-ne2kN8e}fEcVjMOt9?Qv+Z{6)?>iy!Lw^8{fT5O74n7ga*Zz%k6;Vhn+gU(aIH@n zp|o@-$|4{qvT%p=$%@f~Y}d|@kDEg)SB%!#wK+cSW{j=$>*BPWh-1a*lhCd`Adbx+ zXDmK#*EX>@pz;?pba5LZ(qFo`U3=bu+qDNCi;G#c@z$%ts{OVZA2(A2t=dH7e5*El zN~`s1Mq+5XiHZ@7xUg{pk$JZ{Q(1xCW_XU7yUnI0d-xsAb{xhIwPoj?4(oNM8kTF; zmG|Kt)-hecX^GhW4eebf=2txdJM;!~r`qU%9&g6h>#E(h-a=$)*_Mdhn?+=xZ9@-` zx2+)`k@JxH#U|s$Fx~=!uQU+ZL}sA!*4e_seVA+(?ynq+20eI)9QMYde!TaSFmNnu zB%b!h@FI{e8c6%SSmRM;w7ydVlXqnQa1eTPpY8V?VBAyqh^urPH^<1+*tk~=q>Y>7 z0)^8-_{d9fXsm!@2W z?Dxg%OkT2Fq2JeaCEB!LDSltCqg*LAZjSX-ijDjGS{t`7Y!9ZC)sMBY zCn6>9HD6GG$udr^&c^-O&-44X(o;L%l8rdImT#AbPkdX96W6ny5H^Iay`s@Ys!pU62}=k#FLcobGm+Jttc&dX_uqdMF*_mGDOslSXb z`Hs__=%akciEZ@~cliM?)9iaa0C6g8J=D8Z^RWD-#%$uXA}^U_|7$=D&9n%Y;K!Xv z7mHKT3I;0NY)9SfvPSyzC|4?OzJ>DqC)#j)SSHop@Lu5NJkaDN+bY}}{wf%(l7;Xs z%T0q>*&ehhi<`PQ6=7+HF0RYIf;PDw>7!K~HyJfc@`;|`Xr7X)jxNt{@p6QD5nbMM z!`)S*ZaCi=Vcy{loq;Dbc7X9N?}_(>zW1~z^a(h{#TQSeBB@k37>;)EY$cq z=de%_UsqsZfWCotB^Gj8Vj;%>mie5P`O}deVPWAqPV>VQ*8<2Vv2Zie68{FqpUM^U z2Eu*$lziWp*Mz)un8)!eZbG4Am^ZmZ%xf+Y^9DM81?#*T%rlh!P|ygKd#PccrCJup zyuBv|^Nz>&c<)GpU$NsIAl4FDTZHfNn!Oys!i-qR`r_bt9OERj(;mls7tUL8>+OrL zYER!riJNb^eMb9j?Wu8z+gHq361zP*?)KD-$hdT3hHu=h{u!6!e_!HO@r_LUM(IRq zM#AtK5r5DdjK+NFR2m1EMWTi`o=U;zIG9Y?4Jz`c$G7bfFlcx;E8D)%{rGt=E`fLV z*nS_c?#J)+>hMluZ!H1uA_J!T+2b{Bf~`(v|6YepbnyLqV{vaVnT-35gg>12rqjW2 zG-lv{v1m9EOa`JS?Kvwy%|5RLE*`c0K3-h>06a9fsPo^=;i4i&uc-&ZYxP)dqUN5X zr3c#MKCOg&QV)C%X^D&P+0uVTdhl$b1LBfG4u-4(7eL$|rHE^}`cw6D`4q=R{jX2f>T>-U_?-&S@`N+=m08 zBl=U`SSS=rgrng=I%4>fhT%^qV!l)|Vi+OyTd5z7j>vmv;u1RIAlpQBezG|%)Y(Mg zHTn$*E^VKjmbOowO%yIWS)1ruPJiS!(E)LNJtZ;kv`v(KS`BIB%*Q<4JECEE)=P1l z=&Qh4{=kDa@z|$0G>J>@VITG@XUMy?MvL_ zw8Xvd+VVLq^L0AlBFHCoz^9OwI^c=l3mg#l(o+)mcumL)s+DUw(*krRaK3mZi9QWQkM%;^je&YT) zue9&X#j;=Yf{bPlztM_`S9L7-aRvNFD?8>lA`*g#X0P^vVgDEQgAqP3y)RCqQTs2V z&Fi+_>xl4MvAo>y?DAwDcpkfg>_7S}&S`lK=d}Dsb7m+a{NnVos*2h7_utoW-}Wzs zzEr=i^`YF`lO2^cw6x2N0@$^_xvi(83Nh{Ze3ojQ!s$Uo`yta2(f-~VqX%(!uSKlh z4V|?pe{GNXmc@?s2fB@}zGjZ+o2kATZ(M9^T-w#J){OtV0jI6Bu5D~v%WpsK=*w(C zRNpO=`i&t8#6WfW94jP;ac;(%Um?y19;aXg=hv3H#c+|*JMxDtPH1@oxfmE;~u1=@jx_cBmz-H2lU1R>2xF& zPWoUX4FwV5H)h@Td0)22#Gql~tgHkA6WJ~(E`f=GP@qeqc6i#qVqEA{m z>~E^XM4Z=ooW7!5lXN;C>$lPm#(s`VJLHhq_YBe!``)po*%mrj_D{1DA3oIXDT#?W zALQIS7loL3E}rW*VJ?g97wX~#75ao8OT3^`F!84)V&a{8Obo01V;Crv_Rj%0-$nN> zg}}tQ`xq1F?`_?aLqweKa=pYvdBO{{!OA=8XO@+s4RS;Qr*}*;?|hfM2)UI9niGpw zkNE%DdmH$us(Wp8hsg&74G0NZYW;wUmfAQoYd&*oOlB}aO3}-w#2TDEA6n{(ipcT! z_Ii*ZnIzy)8wiy4M1NqZug4$9%eLs{v>qF6YS9Z`P_)<^`$B~tPjBi$%kk7+&wc)D z?=`b$vUg@DOhS+>e#5Livu4kp%*=k~|Ey;{PjO+|A2$mNi%X?G?!l)dcLk5N#7m}2 zO>tVQ7%!^gnbfxNlmEf2z_p5gvP zIri{&C->Roj=1E|*TN`~3@iT0Z$K%=y2jKx$2IlL_EgZ*!aV?{5$?em2tInAjtgI# zRu5cj=?m;l()Gyz<;UzzpkI6(9zR=aJaOvx!4tQmhV^#VC|&Tug)eT(6L+`j9WWCK zFCwjM@u*C93ELgckjv#j0qBDY)Q9zo-cUFUZ@zHM5er8&0LZ$+DK^zcN(Y*ab0e2a zjafXL=!d8SrAM0PyXbLFKhHN0e_(-gT{>(V?i!CD?0Jf3X+J1)JhPhba;e1{&ug*9 z8@YTJm)%JJ;&PuoJX?B5MYJ4v)}Y~;mBh05rW^arBA;x(s`qR^swI}O_9X>-w(}Iu z<(Y`qusOX7-&TV3O)aksEAJEW@zV+4sJbiG^2&-hp2b-Lo^>m3K&7>*yeTK)#8ZHHN+a$A&b`=0E;_qtj15lmC(#P!NZ->%5aUOGD=L_m!#W1x z3x`?NS$0ZfRN|Q&mfiY<%Egka}Hb4<&wAPe6LkJg95S$5Vm zwNxh+&Q~HGT4gIwF6Dly7+d_4U{jL&%Pi}xSyT67GclL!?Ja_}gVXAOueMJDyWj)|&T`SrT5@XLRmZ(wHJ?`8 z2iB51wZ1*8meF%?r&c7L2&YzJET=^V#aMn@0%Lh;WJDQDuhZ*xL%HGzM-a}*!afH~ zTO$Z1^RZAk-C6_7icahCe|y3IQ5 z({q+D;+OqM`KSZK#~(T#Gec*kX-G9_J&&S-RXt{x2@G zb?n2=S?0h*Et7gsm^c*15{cB=jOEX7O3&ZfY{0^#5`)`m*-l`g4V)!IHfLYLhMBuK z_)0>=V{knsM>LL1(=^Vq5qJo6@^pcN@60xBOXh5T9j$PIL*D>vz7eQo(d{p zE#Z1zLkP*@*zN^dq8{7Zb-Iq@Bk_*JSsn)Np+0kVJi5QL4oJq`)pqgZY1Qu(eYmZv zey8XI0hL5AYCbryHdVu2%?rO%hGc5=E5TXrTyT1(ghXmJ#cRsw`12pyJ#JbCyHZX#(fWIZHjxZN%$4`!(MA ztH&Ix@pz5rGxB92o37O>hI{tmS*#YKbMRdR$H@ z91n?&qx>3GdopzpYTfp*ZhNR}@D5-fW_8<;IZH?v&DP-Q z@k~DlHy_6#=HQ+{U({;DKL>aI>MZHK7Y*eQZ`t*k)j7D!umdYPOFzb0(OHh%9Gu%> zq$zO&%nb3&FDzPe>nzt7Wv(xfF=8PV4%TCvD`V=aL97xhX-W6ot=01heD=tTh#bsK81*K3u(pK7B zSl#*oMr{SZ3H2ngnsCE@9z0=vMb)<6#L9${hy~fyYsy*4s#JD=7P(_1E#nt7MLiItjQnUp%WKvCeeCww?odWD; zMJ4W!p8Dy*BlWT1i5rRARGLpCi;7e%Z0byCT>cZ8+t(lxV@tDqKBg$>seeQ@Hb=jFC6pM!a?pREQbS36>g&iJ` z*E@>l_2{H^DK6vs=_`vRnjcHoglY~|`kbfwX{R|VHHRv#*DR)8r`kZ7k>rbMvBvU^01stjH)24pLx&|_9MEgE20$0CF zczXfAS=vu{d!gF@OxLG;qpwj2AhpW-|Nd`Rhh$u@UZq~&C3>r)53ZIfBcatHsZzfG zekm(%O6T`UBP)$wyQwLf`m)blBtzIla3|hXbO@^&Tur*V)f@|Hc0?xS`! zE@T;yYuvRMll{E(c@<4OFX66!+%4EP8W+wQcQ>}_^Cz0Ru_(?@~+ z26P|2{SV_p&uhnp+P&C;5soKtpLp#wZUe?y!EyQnO~wOrWl2uP0nuv{O*~h&U+5n( zZmSrCYccLRhntqcr<$01bURFN+$U_gbL05@yy7@{iROO|;ThymEmmaGXumlBh1pNTLFgngn)Dn>qJl>*pg9_ed7M7k<%-%}zA#+Zn9J+-v6$Pb`=aQ&;yXh( zjg+30o@+2Ty)Si;Do%f2w>=O08VXMT9{VuEX%oGv5mu#e+AxcX01Ke;431H(Kcv3E zYJj?Wc<^|Hv#5Z@ec4%5muOj3z-FFB^+;A06-Q!A zSyUJ~U=|gy*D#BUWA%`-s4#!a*N`9$nr2+jr7S904x>)?IGqj_@rPYl!RYq5{4NM( zz2T5Mr2kThlLW4Hr;JgH$)u-In~KSux^2SbXT{yADoed#pxW6ii;7^>gnu3yCi~9G zEGqmNQvASxHF7?Lx1VQB9?PPlxmzryPF2WPT#>4g%{&GCOdFoNMsCe(jVvnUY^J;E z0M=H5=l%s;2EcU>+Ghva-9x0^?Wf$0zXGm%GyDcVQgf+7Mfm`_-8QQSfK)y64ble7%<+X=mqyoBk^n{yTN#46c}%rGv4aHi1CKXDGI$U z81FtX-nt}b%43NMA@8ev}t1{m2Ys%d;<9z~^IVp=(#`~mpzs7iX-TD7M zUw?(vktn&scJfyRduwLR>6}wMKvoqP@6C6PDC6y9-iR~efJwQ7$+E-mbU?xzb;&L# z7PlZ&G6ikAP73~T+i0z$-%K5(irK{Ps!ip)sWuhcqDR*QVRk8M2$MS6OzS%!W}ETd zP|ot-6rzr%-xs2e{u%m$@20-E{p;vYrlJZ>&v%oLyQrhzKws3+#GQ)%c=SgB-<=o1 z@aGxJ>GLO==w|cX9E{pUI=4+H}bQTLSVVZchBfaGu~4RKb&;^y!6cV)6KJ*D^s|><3`2P+=tbmCwSsB z>8Dz0?i!akcyH9#|EpP@y;c&tf^6wlp5qLq))8odPqdWp=>(sRUjnq|W;c)?_XFwW zq-Pleqs?M1<$=zoR;A>A>=%r;rZVPuz2q7ob8~rRM>b+#rQQzR*3$YD^-AJI;KdeP z)68?pi9j{_Y$^4R2dd-fW4@X+T&x#sSy7d<7%s?orp#w$R^4efbHQn6J^T|SO^f`+ z!OT&QT+VaM7k0!v5lluSKGGibyZugQ#3}ncD6}Eo3W>8q=C$~4(XFEur*rY$L&50* z_--?;@_;yP#&<&zEbYeMR^T-C1s)F;r$-^*ofpCL=NXU3_-?ALJz_B{udq|KwV9X0 z=M0ZK-c;AcKE1)&zq&>OG^6#fsIn)l-@RVJ8d*yBQZ`_1Y~e>it-^+ytZ{Q)d-tQ& zkM7&(**K%818TCyW~1s_K}~(Am4yo@E3MB5V@XC_H#B8RQQ<*0t?1y?Wn52&`kIx+ zgFOkc0`){|EY2EtbDdXp*P(>c+7eVsUO-*_6tAmet$S}3WA|=7)B>CjD#d%@5QzJU zi?$`Ol1N>*x^K%uI6C|kGt@izsvuhVL+e?qI>L$ZE&WPQoQL>Wka;b@MjdE_7lMyjhbkpwW^vO6H&QBG?|oz&2_IG0@n>6!7U{{@XhN{b=|+hwW{mh)h(3W*=%=)u6qS^-HSC{ zcYr+QAC8AVI#qCGP?%5i_J+opNxUE=OR%u7R1Zp?ARp3uaDH&r`x!LubzH|gVtpjIf%oq0%(k58`zTj=P6&ThnxtcdY0W|391@x9+u@&sX!8J*Mdv+%@sQcw17R z&b#UJD(=*EvpMd2Epps>$lnVENn&!bV| zxiP#ZuNZDoLpI!5Xd|NJPNku7{g^=-8g3s`at}5!JLYwS5nY7H8Nb^eW>|*|PpN3s z<%@d4&~%GaKb;v;jm{aOjTT9}?Hltaf&JCmdxI2KVyQ(wFhobT4KSA2G{YlOk{ITH<#$6GcA&johffqO`DFwnZHI_$s-28S@t3I@N4aaJ(+ z_cm+u%uktPun>V|*3o8uA3h=b&W*uy&ISe#S~E69+Jm*x*-npCLB9gc*vI+EX0xc? z&d6rt=sTv~=3l&T;mb$g)mt98``#5dHO20c!gqc9-s_w0X^IXShhyQe9Eo~8e!na1 zciE%vh!-Xy&TuFifqarq6aAX*G%;%Dm!C@=q>95Eb=yO&k$bTZGaSyvXX`L3Hx2_- zpTb{V;4t+C4pUt$_-rdRas!T8;4u9*84Wl*rrjPGhv{=Bni&qyw}``L**Dqin+KD9 zV+Du*U=fF(F~?z1+-Bmi-;B>5UZ0YI`D|L>oXuuuX}8IzMDW=`;Fg@%sH959Xw0ao*5h>rN-57O&q(9i)oa#Nnz<)ol|7ifz%O z>w)U#Vw^lp@H(e%+X%0Xb=xkoZ9b#*&w5V#VZ3gE*W|yL!fUF3G=7^j+@pZg9@A~( z^M|*BH~OJWA6cr2sS&45pFhz=H@lv;>Qk}`JFrquKZS=s&EY;Iz?o;CR8~KfS zFez;~FFnR-bC1@0-9@BMctnv`MRth-qF$tN#hDw#U?)M3mmSIqkDDuRH`!+gPRDpVL;< zdRkorJq!wM;+zTVSJI02l;#+JG0y6uqVWPPPf+=bFr{n zJ=MOkUB(b^U6cfd<}%b`Q)=npPf%WTj;Y#$-MHIK6?yBZy+%1cw^Ul$Vw;Oxq?T<#%9Uu0e~@64km_EirX$%F zR3X*94Vip*29;a));6}VlRjhvZo^ibJA~}p#ya4oU3^cFz4Lr69(^b7Pjq69atn>d zD&?we>|%_7zX)rAWA>5fYuQOp1w6W!w(u2G!g0I4TY=YhV`5DmD~SeK@AI`v6uA(M z2`wp*T?{YnnRlLY^Q6F8^|R_&{F4Ck0!uzolLFzU%~w!qPTI5TSbtn>nM2pO` zA)@AbEUnzu>#_K{CatF3jAIb_Nq6HoMBcO+hteODPS^t_XCq2myL zJ9MR2utBdyH1S;7ejdbcKP(2}T8u+YDh#PPCZ_Pv%+KR|$qD>c|D3=~9JB?qk^<{f zNr7{b6gbx)DKJ)D(N+rV88|60hO|Djq`(uN3e%*(7^@H-9z#kBylg?rk6P(M|C~t* zM3NE~6ve#0sLSQ|gk*Qf<6~YgJgQ+!9rnd^ANy2SeE#W%k>Yy;sb^Pl?#a|a41cZ? zo#;(8%4wXV5D2dk&bch*Ds9B;6F4^?uT9|G6X*+^%a88ZTwY8sQ#w!aES)i8j%T0$ zTqVEV$e+sNHks!fc04<0aspA;W#j|~Q#pY*A}0`d)-NaU&Kr=akTWOnWOapUP9P=I zn&kunEzc+?5V?hvO-Px%d%UxhCJ88ViTHc8foVBEEcQ`YFwZt|%Gq51F%;lmHm3k7clysv|O6Cfts> z8*+-ZOgkc{M`*0&#gPowa$q+njkWwzWJFm@pW7RYcq1$Z!H(T8NBl8Y6coJ6=?VMs z%Wl-xa<8NSSgqxV&r_SqSrRuWwndMw2jVRMf_<29mS(!yH1?TsmQagwy^Y3M>h(5e zoaHJUhp6RVLSNK!#Gi>ip6*u^qCM16d`ZfoaH4ruit@ta&eYsYf`c~ z%fYNkvBFutYLT-fFJ)uS(oeG0R7-J|X8sHwpEl)}8xvm`G$v9mE}>$7OpGr^W&rYW zkp(~K%mB*O>yL#IVBc%N!8dXJuB~W2cQY)FlEZLOFS#g9res{bX0@`NJcfUMQ+oc+ zwg6a|h}VIw1O~BK(d1)EVA=TQ1GeC7@Rn7QQbc+1ZKX=t8l=;1t$_n^ELnb0Dc7y` zc5#eyb{$KSw=j|cY8bqR`x0`i0taGB2~bLQ2FZIEKEtg*x5Ha&lxV!1wE%e+A#DJ) zSY?M&hI^KF){qM^^5l7n{2t*d%v0at9^8lo_>{viX5&(>!ZUeFyaL>0NP$;~6-5%f z(uaz1H(Z5xs;qI9DosYF@zpf4#zwm2v(gAk1GZeGinco{4Q5W z_S!@0w>$HH-PixD)p<{)4noDcwYqJZpG&V1p&65O8wl$TVIO8#H)P%ts?4YH^g?q= zeW5MYW1XJ2T!7;cSV#P6!rnuz!tRhB;@*H$SA0==+Q6kZ z6V)cHXJtrzZ|A5s5vZol#I*^3-p0+8_MZ0VwY^#@E!d=>rel*{2*z4%FB7sgA2^V- z^#IF?iw?$rIU9PE1xeNl7u^+)*C==1T+uf1u~N3;sagh>u=?>638hR4#^OpzA_z39 zsZJ;-;ZWcB6OKzSb{)W)%e}!^g4y89`!?|GB)oWn`7@<|2a>&8FtY%Nruy<;v^oRP2G*a99HKF&Q?|R@KCjp1hT`5(m%CEuAY)8>QkT^AZj}4xG4l@aiYWEmbsFWd(^oc| zyM$h_xulyV>btq$ZQ@Q`li#h1X{y@NNNYLkrugDt6b@Bw*-vE|ha&)2S{{eOlB1cV zOo&Nbaap9QEYljx+0a;~>$7-KsnpoQ@eInxcrnn-hT5zIdXn))2W{g?TiIN?r+H-y zYuOr9-fHF!@q6Gk5AEaDMEQ$b8e5>KY>5R~*Hx&+I*?zkY9CFdC-zg_pB<#2B)(8bpceCmyWE;QkIc>9&&m;VQ&P9tC5JzoDn%>kA!02Ed5jt^=m1p z!9622S2rhh6sq>*h15Z)cy~;!Mg)OJ6!Sliu=*I~$4I_)kaO^VlS?R_3JDFfr+f+JMh zWv)0tZMVFjP{lz}-NhGb)!iIX-L0nTu3W3`-i&kS_Zez+cXW!>ftfs`6@GJ2&+X^D zCC%f3x5O--(tI??nhyncw==5pmad(gp2eHpUa3dK@ukwSBq5@bd@$J8YAXRIg0GAh zshSiy9xoH_M z#&jN@x3dPfl}tsB%VpRnSkm6k8q!rNTkD}m2||~G{_c97frbP$!Bti)9+j0H;>1zN zF*|cOV|J(4FFRZwdl(KlGIKd&atL4FehsJCR6AQZmrG+woS@pQbCn11!pv|kgR9h` zLki~%G?pqvxJAKu?-Lpfg>lPeQRhA3iYEA!wI4;U7|p@4(j^6ZwsRc2RgYs0n;TL&Vm4c;M9PznWzDsO zUZkcxmTYQP%I*)w$4{5!B;lEgWknNFJr$*~j4g9>EZWyaSoB~}Zf1mHjp|%n8jEtE zSTpAH63F~svZa<)G?y#L@+NGo-g3I0Sju?`m6^mfSV`hRtCG|QD~al@Do*`BgQ4uG zVM|b{>9m!!x0!2?7VKQRzhLGgE2W)}JS{y|dVES`RAQMY%A#SowmH1aGBNK)>%lSaHn_@cMt?1djq0&EHfH;X=W($OQH`Pe*v5*W ztHe5ReLdE&nG}^<@r^yXR+8eyrIM_1lxu>#9xGGpG2$nQrwlb0P2AIh{OJ~;*b!Cz zxF-RXWHBl*&hvq(?CeXh<4dtJ96A)Nc*DJ@sN^JTfp$_G0}c||mTc$M-KgG{U_Xhc zf=w+v6SMfosZqPPD(};%8@pNAgTObiia;c+3D*#Ec9#-`qH<>x>%gbg%?bit<2`|0 zb;Lws?rqV`T1voViC=-Qgw6!1nDmUh>XniM0gJ7OGVKs+Jl*sepLav#;E z;@$6b+e5`W;{8nUE>lx!gm(s-N?yA`j<^E{D(2*Nx^a=hk=!WqhA$>vgqdapXc zmVprj+8s;CaiEcgQ&p(%lmu02Pm!{ct0~1u&(^*cW`p9g1uUe-Q36?ONO9@u=xZUh zrb3vg@t@+py6TEZYW&ko7jgL-VK?ngjDev9FM>|>Kox*CvF$@ot~>Ct*u!@x8zb9tgvxY^xu$m4Ol{XTC@mVI{d z4bQyRef7^8o{`p2Z7QC9SGP@gwnN-K2u_-;y%w>*eK0_^u z+oVn##`WOCtEnUh%iZmJ+WKiLp{wNXm7Kx+y_&v6?v>FTYn!aNWpB>Rl;%tz4tvgMO81~Ic9fHbTcBc+P z#lAGhq^<`aN-algtPQb`a_uX_DdR4fQ?9-Tz9AO$mGnr{T28M!(bsZKI1Yh*I2e3*a*6;LLqZv{EoPjy*R-92*W@<@BNGDwk&>*-(|0 z+^upe!4DPKw*gj&au=1^@z=P8N% zGpXY;HI_OQN#UNc#*&A-ThW|s#=#5CiJqtY8IDQRaUbgXAEQ5VJmvYTv82z0Xl8h5 zHEX91JFqf$7s5Czb9W<_wc~X94YeqKlexP*tOFmIr_6zeL(y0cg{8bLv$i9aawytL zB+iX#D=Qt9!%x-r_Kvc%;-e}A%JDCtoh%dT!t^4YaSbdj` zb0b{enPsP^{Z5S6f%BmBC-Ha7rA5)NB{+Na-TAAn9Mhs8o50DOMp_gfmdqKhof~#M z8xC#dkl4yBL^~68<%BVH@P3u^@dp ze=!aoT(Fwpyw^zkk z9IMBE^Ivd2o?X5@$vWD~d)kx<6M_rcl;3<-qx_()eESbr$5)UoIt(ALyEv*j6s6HnhxbM@||ot z_0v}`OLird6|u4gtYAyRp9F4`jkun$JfJ#HR(4}t*`feD+=hMN(Urk& zI8S0Mzkg=aseh7U((&mB`}Ao6tL7Y=v+$AqWL~p65fS&7k`N2Q_ z-~TGr2ZL2tTvNYb$ycuM4r~2|McYXAc6lR^hBzZ0=5u=Nj!?)hvk>m`8nTSTHYE=6a1>ikhCU4iX=y6rDxyB!y`;ftVaw$xcty^-+g8twj9v5zUJ7*oPVp1h3} z*R<#wcvLyxi3`KU&5a~80=l(fv@0JjleLradg^O2;dR*mwVHoqC;EanB<-f?lP=+F zB38We{=fg*)gc);w0f0#eV6F1jy||rs*HqIhonmR{`;j$^Jy_U`g}x`o;94IC6xHH zq~1BgEqbp+6Zmm0ZlHI&M!SQw@8l&ye{#B=E*Ic39~XMKSjzHOY#8Ck5^Wr=c)Qpl zer&|JH}DAZm!#*T=bfx=3+%$PaUm^mz15QO*)jQ7=&vv4)qX~KB*>hX?$j0 zA}(S1pBq0&!%5F0bclNVSlF}R)&BSaFJqgnL60B*c#{H;{)KS8x{2^(DqI|^t3F}X zFBPywD{EGDuw>J?j^$qfek>@$Rxnt^Y%c>nm`y1Ig4mARlw_Z6>Y}MNEct8Onk}cd zuwv-#7vC{?>g7|VzrTFyip!;LKnC6 zSkXmAO7CYXrgS9BdvJc95M0xyGy*N)FSWf3C}C4kf&nF_6G{Lf*m9r%Fk;mYs@e$| z7?6SPnGj^aitRufpbF52EmF~9RYz5lC9xmumlD<%bTz-))uyyH1`Z@~4TK=XSkOj& z;KTB^ngwy{Hv)IyaoO9(og3K~Zb~~hR^FsJHy(j=V@#S*oC`BX4kf$}e|Afml2lGAB6PnehniyUTEk17Thj8hQE&Ix|U8N z)bfS}d6E2$DlDM)L^LxjSc`Kgo$qsD!7=R13Ksl-7-yxHxYr^U)ZqBipV#y`J{t?3 zHN^s#-AMc3Gx5{Ftg$9x&y5B1@j0bGu^tQj_s!^?_1k$z7re9d&4ouA4mG|ZABera za(~mSHaJIh-n46uZTT+>xv%dEq_(Vhr0DcKswvd<#Sa4$P5~2CC&U{*q0AQL(2AOA z+}W2c_^e2=yoX2+wb^l>BNqr z*Z#Zh5oU`OJiYGFrs+M+MW4R(R*7xnB&lbEZPPeOnRr3a7QbAIC#OiZL+mPP!-!+ujB0pZYu`!M@8+z3< zG%5n6_fs8a^al2An4V-CFAM?~w6i|5T^JO5l)ID-zf~W5DODAp@~T4a2)C7v+lBr9 zTd;8xUH=Bpd0lO9lKQ{K8t2N|M&AE6ump)Mhrh}bWb|H$Go=$igd<36=|NgcOuDGJ zVN1jIsYgDl?O1Z6fVC(R^UV6og~{-emrBX&KfI;%0>ZAMpt2-hQ-F82K(du#Hol{| zd|xwi-2!{Qp}h6y8uGl_zJ>mux%OYA@T_UY@uKNc|3_Bn9+~;Lo%FaW&p2B#WeF4q z*^yT5`Qk;W^rp3xv&35gW!Znig+EcgXDj_b^N~-b3}jn;Z1KY7-OHT~I~u0kw(ho7 z^N-D6_|5KbUWuv*@6iUlinli8d=<0sdfj-v@Eg%y&+*D>pX7c$co))ti4E?c6VLWl zzK@-fA|3y_=VQySZM_%nVPEF{mop1Kk{ti)?D;=_K5`iCa3SB+ZFl*cAv+@9yfL>s zMi2XKB*9e*zbQ z?=|R)8nBi61VU)!K`H9KJ=8B%Z>L&TaFAR(qTPNCUaJ`MlCEEf;}^FRj(klUKZp8M zfKbcZ?}xldEJxMv2YUZS6CbB*aRb$DHQF7EizMlL=;!+V@DTQ8<@duDjI;9lVLTlK zJ`eOWa1t(Nwd8ml-#pwe8Xm%1_V0(^V_Z}W!nGK8ozumPv?8?l+i-5}47td^zi-Bo zS#QoewBU_}2bR9xu)pzDxhKA`z;k(ul zA^AYGo5vCLxqT5=6rsG4u*Vr<@Y{0x?LJxeu}*cx=bLWGSDjgt+Pg6qN!mZP6-r-5 zht_(jjlR9`pek6&b3P0$*63q-hta6c`VP978;|q8qEBG;TT%^lmsLe3*32|BXbG#H^8~PLL z>ra6n3lA)KBZVJeAO(JajVuHkSqQ&Ifge`b$lp*3c0V?f9QV!G$VGZK^5+5KBOfn` z6CcUvx0Lp>AkA@cOxXw|X(uGXHPD3E$RkPOBloo{r9c&xkxWhqo^Dfm|H7+Fx~Dg= zy{j(H=efGTG1@K&Dww$W&V}-V@Qx z@L)ZD|6AcBe~*1x!Gr(CI4gLt8VB?S4vy-Hf##;DcC^ArK8JB8^@KRV^ZBXN+!Tro zqk1A8@sgX5ykh`9a^?O7?<_pB^i9D?HoY2OR8TnWrde|+Z&S}luKA`pA4yy!RTVlu zavUm(?o&lrUsbEDJEroH>ke@~vg7}mQNu3yWr4DhGm=Z5{aX8lQ=9*<|DFIwa&N)0 zO|eZKMITO@-cwXG?Uhe!z)O~bms}Tbn7q%G zO`6ueZ=JI4Hv!i05Z63(w)L!2#@TTG|1W<2KlFpT_Gxh%L%ihuoKsYKPi69w>%dF4 zPt4#YF{7pJabcIT4)av>*y+Sep5psh*b$y^;kX@mE`PAIjjn%#=lnrUXOjBFOLo;v z<9*^KyK30s@1w@}Kg*TA7l9DCgq8A{lBXb(m)sF(`cdDHrXD$^F_U`)Gr0`RWb*}5 z_~Hvw%;fzz*{ICq1v-9lD*ldp0y<9a{U3v!+@rFS&6lRw$@HTy)jc}%aXaa8#7?$c ztFe<0YR?%jy4HxDJoyu_lcy}RlXcCknK;%53}4BPb@WwGs?>h;uSx&cm;sjaDm-Hc-v_+ zkfHR2!wfbgk!UpP2}j*-qy{+Ua2QLx{XSoaMZ_63^ICVR%^Pl~wfpKkVm3#)80S2- zsT}3H)Iq2mrcb+i`y5XFF4Aj)Xz6Z znIBo@sQOJo@4sl`T<9Z5zc;9D#J;TjruYfQS@}&t z^%*@uE{^h29G?}A@)L|R{!QU_8tPrV#=j}@ke$;BZ{;l|-E6Ct@4Yph?>+AwHQjsG zQKNisn*Br#irgGz=V11e|JDdns_8T^n2RU{j`T2!^AqLpD*jvJGR|Oj93}>{v5*x) zPdR5Xu3xETM(N&#x^!=>>&{H~?wIi5q|Aix-URbD_bCZ2;rntmDIkvY9CjJfa~^3f zeX;oiWC?6dC45&WdXWtfLsHK3wdBmdZ_COA>$s|%l{}8DfJ80sg`cuga#wmpC!>t- znOApXWJy<$y_3M~soOK>cC#cN{TB8Qhvd`92}nX&lPsUz z#VVksoEbg!(}SJ$YI@F}1G{cinolD`ho|R2O{o+0@V^*lxH2=a6~ zaTGi2x_Ocgzn9W;BGU1T2bb?1;psUeoA2%SN90J%?s3arOwq%CnMI=hh}Ry%Or1Mo z?7mFjZPD_@ank-sXE~0aMa14oJ6x>aPUUlKoC@;-C;F5=iJTrcDoFdMT`rf;Ez54dI~H}hVP|5Gy20Q2BgR#q?i7IU{eS$o_O<6% zHvUUDeTxkUrf)VNj=tHjhfA~@27`Ccqz(egDLlSKw@rSO&!nCNKW24pAiO(*eVE~$ z-j7m`5-A@O!}V|k6)tHvo?oo*roLEYsK-0K-|}J{hrqk1&=+_&D9)D_C{zk@jQ)rR z#I?MLQ>nJ0w*xdGZ|b~}wt*}0iMSGd8Yeyx+2iOwYFFbzHC3*0*J4ce^U`NZH1WJt z1L?=zf^B;5MHAz)am{LW&MfS}sJ?5$6X>2ss>L`f_1(y2=eUJYawcaye10W4aBVo& zcMmD$J9l=Dr@8M~5_l%EbAV>4?3@Axm^MIm4#%Aw**Sz;X4yHwJHzZ8j&(!G&cR9y zssm}=-MN+Yja3j)LNBa)aEF}{nR%gAiNS6;=5a;64q1G|Gq3gE$+LxLY0gu{v+t%3 zO7-R1kve4Sc=kH>VTNb=_1$`O$c<;_ew2DVBh8Jd-}3KQqCesR@hmT5$#W6U=)D&W zFvD9mo_+qab3Aqk(8@QO4%n6#V1>pnz*80!BkQ{unwetaE59^{_{z(${(Cj} zN>)yMCHsWEi4|&?8=avlE{|Hw`sRG4mi4_nJL{XOGs^pZsAnr))5*0+{KiU!V;X1q zK#-@K_TwyzCOU6^v01I*l()8UU4C`qn3`ycoKcmvY(nPu5@c=vGfz0hy_~f~>YEtR z$xbeX0`lr^jHG1nced8bKvI>pME0pR4y@%}$m!;+B_558H)1XKE)ywpU@a;0o3oZj z>SH|f`_F+BoV7dw*77*d{8m}Z_i=2rudBOb8f$r?Ryl#A;H>3I?Ou(wtcd(czanC9 z&8#_{bBb>|wOnpE)DXCB&uufl_5E*+yZzKRL!`|F&xy?MFGl|TKb{{!%?)M4Ibmnw zbt5;2Ic2*Y@i~!@(-(HdP~!2gf4~29r--vw$5Eb)+Em;lPETx89rvWz97JXuc|4ln zUWOl~9z{~PXXr3Pe$aU7zK)2}HY4o%c_l%X?nyk&mGpXVYT z(q}?6Gd#5FM>z*Ouu|Wxz&I=Q-N^Y-dYDme4he;fG(irJu&>OGhc68p4|jE|h}a(w z%xg`Zo77tGS#hEo z1m+#ZKFlz0$lN8gp?h#F0`sVEgn4@Iaw(2OU>ZPD|#NNv%8kBe_ytxhTU0Tv9D`Ef|bRCv3RVRmAnAF+s*Ng zEkmj|?ysWz3Oze!_Kg+9kNj%Vl-o|XJLz?M+%_X6a8;}Q-c_xr|*nbNyJvDdIV|2xvo zf`5`Ons|K5>I^hHb&I_C(Bi=IJd2v)?25X>F>lE0i`m_b`5Y`{cSb`_ z4+}@(xlF~7K@*>Uy6ZgQE;GC-4Qn{Fxj5(&pTyru;2HIe@N9H&m-!J;>Mb)8b;k6TZo8io7vI7+kG_9-$p1!OYMA+* zZsv#}JJl77g=5T%#RbSv^~)YV(J}p+?yG;+YP=^?2chEJ!@BLE&eI*hKFn|~gR?Zk zIpZ1+5aE(`;V&p~j`~J8r=O>rkK+(H_XPTR;4F1VJRqK(w|Yx@??p4iGpqWPb2op$ z>oU}*n60PF17~So;}M<>hu(77@^maJE)DZ^#uS(I{mTQMg(6`eh3AA3rxS{RxAfb? zVZYbUVqwN$Y$?9u`fJ@+|GdGo485fe9a6dzQ#>0Dc{-Nsv-4JOIfiG%St61|Ex7pq z!gI!Nwl2==*2=lu_1RxB??>m2Y`vu!o(-qoQp^7aXE})c??U8%HxOs3*OsU`af4T0 zP8d^OjuPc%%Thy@*|ihMg|_bBFb~C;FoS|6WZUgj&y$4pD8Y z28H-Ru`POZJ<$3&@*y#)=Q4GdM)+r}yW~0GRx~Jj-f|6&L)3G6pA_QIL~Zw1^z)#* z)V-2{>b&z;cS)ZK(ah>R@-MjqgK}w87GMWfbeG@8I4io#-(s8oC@) z`0R$-6!Ud;me(P?FlbyHCf(&wc*{oOEtlp=Z`oElrnem4G&(=?d1OE4(=VFiMu2%zuHI{mu>@L-68D54C{u> zT|&b6G@f2?m(yEo)xA(d*-zR%)H_tigZcs9awahZBc z9XjOXE+JvGG8d=UTb{kSxbs(UImTTQcj*&kWG0@Ot&MYwsk_|V8R@Q`~pPYcK1 zc>)jZOC<1II;aGmijhs=VJzlnc7H7D47sTSbI7r1RL1%@rxV`IvMf+4^LjWit0wgn zY6j1bQcqGSU4i>ZFQ_&(gXeoY@jRC8UU-Ay`hBhO_h9=MW3=|@|(e<9#$S?jJ$5Z;idk9**{oN3h;I%{-<&H$L(9V8ddapzi&wDLy(APv%b5Kn*Ub~&{qcv#raiNFXap4U+Fsg~N^T5A| zaaL-g?_t~<*fG7m^nCQZleKN}H^HWK2R5waf&T&H^b_0Sr2|8R;4l+Im`P3adCB0( zNCYP|(NcI0WTf!?TEmssfhPM0NZ~o&Sl*LV21?=SLl%xv3QyA_N(IkM;aLe}Ijlxe^=n}z4bqbHyg8XPdQvrm=X<*Quflyzy6x0Zbc}G~E82iPc#IiN5Eqv#6P(V-bWZ#cF2axB zEQ2S2=Mva3D2~m1dWb*!=M4|&JrT_e57y&6O6UAscyI#yvVsQ%7V%)@GI;zB13d&c zr845kK1UfmOLJ!M%*)8&3FlS#0DBx6^)<#u+@68>2Sk44%8iNgux?D1&FS zZhNR1JPmkGGn^l61`lEWaAolL@LEOI4tYC?{v|km(WeX}k-FqO7aw{&cS^6qUlRU6p_ zNOnE`KgxSHC=(|J8#nL_@!S5&??Gx`)BgaEsr+z5`Su^Os=`^TIbyD4rFc z)z0D@0<$(zhBqtS5a9kLlosAFyOyn_{mkxWo7w{ySDHj#_;t1Eyl{-r=Y{_;7hAa_ zGcmm5;2(c6f{Edwu+wk%!&N-waXDPhhzmJ#u?SXrd%V7|&u)lj>Ss`V&+~<60kK2i z5qWj#@$Cw16X&Nkm9N|^HaT0A+Ayp`1z-6l_F;lgRx-nJ(uPhD?d!OR%hz7xgv1lICwjpR@^i=PUCgUmR6@CB0XonPCZeQq9GnT=nUA?7#|^%)~e=Sh5Y{ ztnih0;rOiZm83<{f7QfGzs~9R7-~4o)>FHMj4?NseAzmdVAe}uiA|Rpu3|p0R$cW8tA43~Em~Q#s)Hq)#&sO-pBjGuIHg}|_{+96TTX9b#c&T-O@WbW6g|gD%s&+c- zzy6@XNRl!F>)?g?r10`$2^g6 zBoy*9S@woK9_Z@bA%7GddBk|j&EiXf^Z%D{4hV>o1-7q5zf*TV@s_J~+o_@G48&WK zC$Je_SmZ6C7?h+Za1p#E#|{lI+Ht$U3qIGS;YHqf%lud_jw)QB_e3XqO@c3aZJA9@-JDl^D9mo!E zQ?tX@o!B&W5@m-s7hU$sr!OHpd_Q>0csw~yQZUbC`z7UuPmyf#8B+W;@RqL;Z|RgC zoAlVY%i8zFl{le5dktIpK}A=xC$89#B(0st4|UbGU)GE5YkH^HtX zT~l6oW$k6WPkG_!$LaR}sa76u&4g=WA6yf02_J`R;`?w-JOXs+fooz6u8F&(i;8yy z)$H((wCr$2WQXf{OD%D`xh9<*p2_v4SvqG>j<~& zQctMj_9){mxwf)$zLQ~+(us>77wGEetE<5)=QBw}xP>ASFqV|E3ZdfgWQUIm-ZDQj z%u)55VvM(hzLMFU23{u~yV=@szp(nsU2Co`%H%CCgvw{2EFRp~f}Eb_l5UpJa>WxO zSN!(-cD%CxrKSTdJ^hn<;#-$?!*;q$?LFmzSYF zb$z0&__&s8)Q7v6?PVMC$BR4OL#}u*UO2sr%}F9vJW|67k;W6hXB;d0y^Yz9lVh`_ ztdB|zNj>4)Uz)nKE1fC6s)t;g(~06wx6Mj9II|bp`g)P0dRLI$Su|PcY&*av!N<9* z=%BJ~!oiNW+6qF=&85wS)vap2IJ>pAmfbbCqB_Czz%NdeS8eM}tW>kcr(ToF7gtWy zRlq-!GQ%-upDtTmN#MDVFRmb8T=~P?ipC^z4771|TUjz1R4R}OzVpWJ51N%Ceqf-1Wd$`{{B`Qnt+bK*v3`y@c=;*`?^FK2^vaikW&`I%A-M7sE%`iy*W z3HjpR`%9l5-v>_W*;D^d^q9`Sd@zzpJ?@Cx_Z}DW=;6c@P?NC(BQ79;`*cqu{qGoOg(LnD<0j*Q^f8)@ z3q3Dg6UBqFKHYGK{>Qg?uIyZe-(uX>^rKS81l$%Ah?!h~+1hoVuz<;p+jH}Z+qABI zK`&+O8RhH6DNjh`>n&FE_5RUH=E9+Jsco&(Aa!B!IA#4SNL~2YrmX+iR-~maY>{?v zW)tD{vS{s;rJK`UFEg?beD?Y@f-COzeaOX2Ak_y5&TN#zu>JrW4+OuY@L7)CP)SakT5^n`wY{vCl?pmef?Lc+n1Q6JZ{^3A% z9Q{QMeQ+7QxNXagsXTOsY;@(S`qOMCQibYfO8+8hsY2V24g#%5j)9KKb_NeKITVHi zwcm>nJ*UqZ_Jkr)j{`O@0vL4P73zxb74`E~%hJBi1fv7A1Kw1O-kUl|6{C~7ZNlhX z+UWGzT)n}@XTVZ-;{1}v=-*)*x!N{vP!;%>5RQSzt8jR0T$#O)SpGV*1ZB7SrcUG(aD3 z*;q{L?C!ulxv+RXc3=gI@5DGOSWG@LRn48Q*+BsVF>1cuZIvYA%}CT*%7q59-lZjtk_h>S{tY z4g^jhy-!15B(d&DGob`woWz8=M=#;COGVO zYOtLfhab!<4ilG6HSxeWoZ_+rg3De-0Q(N?w<9VAx!e?6iiaCK`RaP}ubcI&njpRLxyRojjwfWZl1aQN0#@;vd`X&eTh zol2co63E&`^1OoNdE&EW&S$IpB0l?ppb|w|JoxNB@Y%W=`K_x2pH0d0CVV#2<<7hN z<<5Ijx%0$l1F?B7J(A~%o4)+hKMtDDuK09B`D{78pG_*_CvZ3dqp2^jn0#FYMpIwhZpLS?!Z8bsehGbn(Zpek{wL^<0zNx0D&@~J zcGKriG&AhJ3z%nx&yHEd?nf+Q_s15oyAa1`1-pM|j@`^4L&`%7b&YH2F+MxZXV2(K zh2l!AXtJDOdz<@EQBysV^dTAFa2=B1Uyt{_`VEOkq{ zoKTJ+!xwz?o=))9Kz|^1@or!|?!T+GTuyqHF)-F_T1$DLv#C`nxj)ESQD+~<{oy!P zzFMMrjJ@MHm0x!1U`Uo(%}Jkq$Adiy@76;tthG6)6z>K0;{NxSR4`j2$leA{ zlX7g!Lg4>TgKW`GUI_~(ys9Id7(Wh3To;>rVy;q5Nb9ME0<869KxutHpe*y%D#gd) z4&ke1hdumQl#|OU`2NF-DhPXDgG&8VX=VZDlncHiT{Q9dKmPlu#9*HfCh1u58j>U4 zFpJ7Qr^D%Uc~C1mLmsb(iZ6qv`?)@9>f}J`IMq6tcw4opb#jYtd#GIYJJ^R=ot#fD zn}pQ)>!uE>-RQm_3%^X^|0T_qsjqbHmryJ!uCBk2Cp3g z1|!d_xul0B5Ui&RX*bfm8llU6xq!`C zjO$lwS^Qkzr z7~X^(Si$f%jI)B_f5kW}y08myd{#K^KbT^;Q%o>tXtW(}6AT|_jkY<44^JIE71?7n zC;ha6HY|d<=-0SPn@#*wsI=Ed3!FdX+OQE&X#>?$>aQ`CHva)ZEU-*it?^osDk4_tp|=wAO7_eQVxT@edk@3`V_=k;I1|Bmq8>NRe}Hb#e|*E^Wg z5pwzc%pLW+WDkqDqIQSfy~Y8tcub>B>jl+jgvInZ6HScE z#$u})ZL_S;?0R}IS)W$0_{=rhPM4uJ%*<2E=e3-HJwLDY^zdMD2NGyH-kc)MHe4~q zS4+kB+a|1sjywK}4OKU}bZz)3s1)KdOls}6F}3!RuUs*_*`PkB>~P3_7lPBmNWb>` zA`EGvK1bLUa$~V`RGb&|*SgcisI8fQmO4lkk2mYK36Dubr8ZHOs9OW+z{tfj(Hny7d5ktV-|Q!zfnd59*=3Y2gYOi zoQYt3r^NPpn+U5T2cGH3Qa`=v{(5+t{cwptWIwrSrTOBvBavN)yu_g*mBm*e7kL#4%@Ap$~pU6;dpVTS0!B}55Smibz zQ$DiF?Wofp#Xq+<;)puoLK1Si{jR7#5_ZTDyBsxCZl4?LoDZeWdn#rVud6nd=YCpj zrkF(ahJi4fJbq0uJEwNr2(yi~+b-?^%{AKE&k4Oodmj!{U^exQFk8=auf^*Yn0)|! zf!V~FiheQr!>QfYz4n1>>oM&%-cP(0ycyNj^!XD_bhB&g2Z4cBc<$BMffX#@gmG4| zybu^|1lPJtk!|k=sag*kZ&SCh;i*^mP?-K{~*7n~w@13Te;@%m*opp4~#tTT&{D4%*79q|hVHrOb9` zP`Pz)ZDR}D+FGuZY{OO@ULn4UecMptF8fa8~`SIu`#Va8W5M`9#g}fFfI6TcxV8XVtTo(*dr?<{qD_ zB0D_-dhE6E82Q5DKj}S2PTe9eKD0Qne9!V34c~7VciX9N$ny`)4}5bEPsN}|TvU4e z^2Pr?lAhTyzuOau*%1sC@w-DIhdb;B_IiDhkk{@Ac@3HBvw^z-{vDzJilpoCKVgX4 zig`=&jX62{OSZb4`!o zBf008sAr$VbBTJE&j)Ms#2azD$Qk7G!8B=z_AHJ`%oG1!*Z%|hUmHs1REC|kPB~s_ zP9f9F&x4&c=S6YYshI)wyvJWA|4(4imDr+jpgwua9!K|4yBZhz^W_?MEyiR&@1?j+ zH1WLiaD#r_E!a+bt*5c_M%<25w^V}*wei@v1K0F+(5H>=y8xFcF0?;8F4U^SLd$+%?uRKI{f5WN=B#B*i)RNsXiJS+y`T8u+I z>NC<^IUOb#=n>1Fa?kVr49`i=V;uu$9i8_MVPG}_Huc1jXhj$pZv+M|0tPNrG4M-s zXsr@5bMIe`wMwj<)+(`2*qd>_R%r%bt2FhfT5}pzoO3Xn`zG=v_Cw?Rbi1++^SNdF zv1aLTP-#9CWD|RX;oH_uPP=#XM?;&fRBB2pp5{JQMlRB}65!&r<^z2R+xRLeK3+w{ zW697XsSjpay7-3VvKluYt6BQr$w2T04{Z6e$-px z*-Gw~aK0>qPsfqY8glwzacuW?A%m*AVsF>!I_{3SsH28WgP#ZY^(y>r27b=B~9 zqzMy`Pg(pQ*0FEo9H^aG80>dry>Q4Ydt|RucE;R3SIFUUuxJ>XXWhp?)fL|Zx?!a1 z%s}edRlIv9br34vrPl%%NrZRAld6r*K5HATq)DP3H*CGbu^ z$EwG>P8_1ZyTv$;Yc;%k3Vnfh`OzZ}h->+f9iNl9M(@37fDzuZaqVN^#$4Q!3)g00 z2Uc*c7UQho+H)9Z1=pUmh-+Ur#Wj}*LdvY|%>1f6K5dFLH?EOpivGld!?mS{1hS<;N671!RIZLAlzDeYiRfon?pQ81~j?4XUcFDclw zo#R=99?u$hZI||xq}r}&6V-HV(^J7?tv1_qNg*^##*3;X8_@i@1c*2O?}BW_ z<2CH!O-NBFng~354~~-e+)z>VIQ*zM7BYBA0;6j7q5gxDRBtCot9@{KW(oK~+K}9^ zY%BHvq$`6P758pt6;&N;fLLj)WW8H8oV@V0Y4wC=e+pD@0%{@QT}ku>UIemHQlnDR zr$f2paB>EkUA_q@hI$ZL!sO&UbL|K4aXwlw^AY$tt3J+CBBK(`DCLNSv2d2Lm=9_r zS@yxyIqGoPWf%BVS^ZvT|F8S%pEW$&kva$!&%UeM9%}tYYjDl*%!C)UfM-5S^;;5u zWPxY%a2x{9c$U28$vgshmJiwPIf-ZK_1ETg8m&LEf@han#51o&JbT6>p8d!op1I8N zjG_rrO?W3$IG{0CDTe39Gtv#wSJWz=-G1NxmsCfI1-+S$5={qeXP~*Aih03)dRrSI z8LBj$+E(Q%p|&l8+IHF6Df;S6#WSw9?b(XgbaJhP8Vs1G@s&UsV4EE8ODO&L%A$$P z_IF??XVuD_uXNt5l%U4CwL>tL$Ki_H@(*AvudeOW7|UH?EIVnu%2?is5uCB4It}Op z#uCr86u74{mfSm;7|Y#3IpJB#N`QcIalHx>;?>^{sKx@5oX zAI+GT&OcW%kN7;bsWse_Vsj9j<%i~&XQrJ^W1bmj3B~ABI2KXEQ9l=Fd6y3J_M$Ip zIO5MlpM0K2jzBFhoq?IRxhW)V+oMjO>%OY@=#o#RAv84JdjR0qP``XD% zH|uq)mF?s^{PUaAzQeXMpkg9k47L(z#K2!3O9Is{X+B`H%?4&x@tHiD#Z$_t7Ta0_ zS7I=i7nO47VK9%ZDOv99I+i5AVdV(wIIxm^3At5)E3tB-1@nD7gXBjH@8MS9+~KV? zN(H#d7GUrqREqE&uIwO2lP&E8Yl-ok%}kc>>C&8rc|CVRWi3;#!^quBISmtQ*{8CW z;86)dCQ~Nhe@4hrbSI-o*8cmW#<3S z-rK-OQQm9A6E+``ARtN5T8k8Fu(XZ4d+#Tw&}3H3#!_FNmg9*wTI>tHfM~IA+6UUu)Ar%`pr!QV=XtOH%-plH zo0()1k`N%bE_2V!y|c5~*}3+A-Piy6ci>z&=271W^YpxBEzX0-dBo3hoE!c)Z%AaM z7bLdPXV04%ww(obSc&syTg0~c7P0L$i`e#(MQp1u#WuIyP?KWjgD~v8W!<}+x2!$H z6)C-WOWV=`@RrNI1pQ~PNG~_4dJY}I@)x>9wHPY>NZeu53DRAZ1Gc$-r60n`T3kQj=oM@Yn@!DS@|aDte-jEqe*9<*lXj zp6LN=DFwy2RFITe%XvwOSj+ks!CKao?rT4QEX_SZF^NjEK?$>T!Z&iH{a5Enn-0h`aMGp;Hr8BdV-vRKu#H=DI=&mZePR*2?Cnan zKYy}xbHQZxp9Pbp!U;KH&5i!$#`K)r%NyI){%O*JVPU7!zkb0j4;%T zJRV#dYFI;=^yRu#KK%el3b9upJtM~+>T~Sbq1#SGv=Jm=+gTS%vDvaTI2}2XNWe6-uL7M)PnMzSE4X%=|SNyp({pW4y z)3whV$G;dh=*QiIb-HGGan-9>l9Y%n9%vuwF#iW0^mIEO)OKUV zNUxH>KHbX*Kf?-LE4=Z2wB+YN`@Tvm*htg7lklL|os37e4)d!xzoppD8$VvQ4wGuU z63@UJA9n+DyHUPHYufytS&seyaB>1}KlC~rC;Q7qxck9foy2AmtGWO6+GBMe)E^BW z5f9z>uIi~%2Tqeb;}=)vubv6Nc)9**St|1Jlf3@vKG#|4ka7Lfw%n`Rr5oFGrN(H5 z)Tq=yl^Q?M>YuU})Icp1g~;8HPdTQmKVH^F45khh8y9G3DeY-Ig*mtc)Fu=GPD8b{ z?TrW6j@*ONRe1;7fODZo^NRAucO+09E%730C}oDS1C?96mD0&%$-Zsj1lZ4fXj}2l5irN;-ltmm&lX-xmlew7OW@LD#!dE)mZb?@=={i?bEF^GPCw6Ra1k5 z&TnN0ozimbk0CFiwn_}LcvqmOO3HsLAVQ59lzrk^@~wdMeibUqD6iR5-BBeK90;%_ z)v9+qW)k18R`=5^-+jV~$pfiM-cc<-XX?m0=tTW?d(<66-Cw)c=MH&YA-~({@y9%F z7jwEsPj3D^{v`#TQ(nUB{L6}U!k)B#T$$thu5P^6MW-*F<{2E*C_V(#4l*x6ex_V! zm1A@}&Vgg)%jom%)aToM=uf^3|De&mlIvX>aDF^)Bu_t%tuznC`=6jcLUVu0n>%-F z_Y0CArE7&Zj!}fWdYmM$n1`^fzq!9E9KZ-C8}MA+%LpNivx1XUcjY5Im+*Na9%eZC zrbT{q6AoaUui*AMG?bh^o#P}k&DrA?@BPPe}t1X_qSNB ztrAdmogc5F+A33&dIm8zQceaT|7=|d=q*YXkUPsd5R0HT;WVA zlAY(K)b*-xmPSmy>zw3nJk`@IQT;JO%wna!8EHEiDyvX^GZ7gJc|~1KhcN0#LFv60 zlT&Xg*hQ57_*G^SQNqY7tK-Hh3qgKQ#LSE^)2)y=3@ zH!6|MX3zAe@OxilXMA}|0XDm?mg7gA17G}zGf9p}-b z=@uOhrvsL+PCtuteT!O%8Ax$dSYy!H9diAhBZA2?*>}a6WI(j`$%4_l-0mhE*C;g&#=Q6ayc+R z=!r&SQAaq8@}6Q8t}qe5BjR>?@kKUhqXF}XTT+@5|7GXtJ%k9ehkMkyvdOnn;6h2fUZ*k&7;m#6S_Ih!BdzV(f zdX>zFUjFs82Il3a1x@9e$N0|qVuE5jX%FJNL?Xzx1MiUYz;+C5l*gmK3{EuGfc>VNXe3gqaiS-cSIyu==}cy-oT$8C&3t&~ z!$0chG5gki5+@3Om#rhqiMqTFe^_)z+@4Ux#Rwh44o@uRhi97CPV@tev%-nK zZIKgw+&n(?AoW3O8dhRL(KtTj7Nq@SWwyq~%G@E35c`b}hk+9lit5TGFUrbh1#)?}0CA*he~2x!Q&+3{O#?-S1St;u#CwEn&oP zF`%7+GFM1*WlB?Uaf@!9aFOQTlx7_ldvFXhTpTn%igW|=m*KcbeU5*!C$}0a_Ntqq z&J{k1@thykdz-z6bLCh#G}@a!1UAbq-JA)!CU^tf$SoWHa)BGmv8TUS(Srk6!M}gR zI4k(~CdOI8zgI2dU(_7`{6^XtW||v6#*ZqQ@fkCM7ZX3)P+uy~L;`ndrtyN}M`6(! z^1Ja! zpecQ`lG)ybI;L@4hGPu$q_W0zJXA76t}7isrYl|Av2?~=Pu?}|?$h50g*L1|Ke|$Q zT05LE7}~l#%?gH#zvazo{R^*E-fj3=6_>!g$dX}?~ONpyzHD0ss%w@ zBX4{hFx=(W5L~BaHOuu!VR&VD{}_JbkYYGzbaxG{=I2BBavz#u=wZ4BRiEBbl&%~9 zrYc>f#x2}8B@9n!d2keo?fom4-P|BPAVluDcjerM2O472BP-X= zT@hO8pT06S*Ed~^%ymq^-#Pay_}3A+Us+-!)-gH~o9m9E7=_Piw~Has2aA9R%mHHX z<#tCxu)Oi>zexOxqP{p^9jQ4^dcA?*a|i!I<1ST&=eFwB7hrub`20&8!wjEIxZXbT znWja3*(EFpp8*zx$wPt9`kIWy1#o;G8vZvU_tG*B4}}T%#f-yro$EzQ0LuE?2Y*Z1IQ)Hc9QGP&jj+)$mLA@kjD5t?!-T^} zMzAKMMV2|ECL@%!Ji}-aosv$G3k4h#-l1_t*==5IF4b4#U>o|;IJ5iqgQY`9E+*XW8xpv zc6H8``h5FW(dYWy9n@F#xilBcy$@cc{^i(7t$g*jzqKY5#&XRnWqA+p5yA@P(a@TZ zP##{rS}4ziT<5Yi4=hu{{>&XZKA_K-cqoj3E@mvI>x?%uEWXVm7S~wB;(IM(@h>f6 zG5Hx;!Qxj;vDjxf)H0d*Ao#7gAXdAkJCoP8)xr05nJ)Kp0C_OQmU(T` z22100y!LI6mvnDQ>w^`)1kwjTtZAEG&hktUq5Ory37AZN39>pE%3$(MP&^Zwiiq3J z)CbSFm0T0xIv~3y^raA1#`LccR>qNQg1JI?K6g#%Lm^Dg=v*P(gY(N)2%m%!iYtUq zs{2VHe6Mh#eV__qJZH?hqj1z433*(0w}am~GMBnr z%BaQcL)u9ym`!}H(iDE1;#0oPd$jBevoFK_$^^5`G{k*kwi&+-<*jK=ELlILVsLvgmU9J)%z( z?ab?lgiz5WhC(Ld1&r1Ebl6N>_cq-+#n+@CR+{zr`gb^n8CDM^*A11hDOOvFueach z@%TE5bLLpR7k!S;=P|w>5)t&pjLCGJ@n(j}l#jX`gXrfOUBOs2oO51m5tARVh{?af zI4hV;bvvzK@@wXp>~R>(IlF+o#+Yo~kN2hv0h7nLZaGJ3z>X6au%bE?75#3%h%_Rn z#~Tj2T#l&I6%|ESG{!uUm?0YLZWW_8ZXRK-+e~lWXWVQy?+o?w#msdNi8%XW#^N!q zn>5@$pOOB{1%NihV(;+P^z=VS?)Qoh{=y@*hx9e7QPVRQUWU2wGR%XQVIJz3<&iJG zr8;Kdv#lt!nX1rMYI;7dtLeGB_1Kn7=U>~~RL@gpt@B?BhU4)r)OvyEukEeba?P^% z+jCIq1=T#`aPvhqPiaMS34DK1$CF$s=IuD1WQkotR(w5tejf=+$gOQi%u7ipQGu+s zUG~7(w@un!Cj0ziZ2pTuRJ%^1PT7*O%5_!ynj|=2u=lqDN0TMo5xBaOrBE*$8NnEb zDlSrts=rW0&s0fyyL2Ua{jNAY_W-KE1gBP^>WuAdU{^I|?oy^ME1p@ht4j9NP`!S! z4_?4>1}{7h8MzM2&KAh_l}CWL7U1@~EwiR)-xXl!8BY|R`0mKo^z?fpZU`nEem`9M zT`Uw4Lm`*P4*y@#9rE}MXPPs0nA92d9)RD|M>wWo z4zJHtcio@21wGSJJ(x{6U!JQg;yk#A#UAu|Tzj5sdSY4`Z{pk~(-&ku6I~O$AqYv@QesY&q|7>?_om>Ge?P6hj0~OFxRVZ6gQ<_H=(CXpKD_1EKljQYV6Q`rDAO28S?%iIKlrBraeYdSb5`%DLf=|U^)KEi>GEdu?DrsU9kP_8E$#tT8w_H1I zFZ_JB-Beb+tBMs&ll^>I{jAC|`1zJq(l+?{CdkisR;APprwj7%RsDRW_L>s58-Bj1 zxPD_HJ3ceCwqxv8h!S>nPJ*T;4*K*p#Cszxxw)4i{Qns$xhXYVf5^sFm4b1N{(lWU)DQXzsjn(oLPOgWp1Myu( zEzdW!TAp2MEzh53)$&|%YiYl=JWtk?_EF0d$ksXVWFHrr<~e&@OA zZ~NmbWmjHRc`NgkcRoI)O7rF2-P$elm9p}-i+c9IZM*pa?a9rfMTm`e4C*hwyAcPl!dWiEI4kkpP}d?`gZE(=-?{8|hmn>B zL7y=m+Lg@~^sR3W7!L^v2@%O}DKj4hoMj$3%RF$FN-eU1%;kYX0baTuc<#bIz9(fP=CTynh`d-yl0-yw?-Sxxm&$&;`L6|gnuwi5 z_0J0O!==h)oT1#)zNc2o!_g0exg=KeFrEoU)7kde{-d(rZg*f_3ck8Dw^#7K>b(oT zvf!}lw>uL)yxjq*8y>(7^GewYFPsNisdNhca)rO_fZwjhU_K#cFqnHP%5L0tWB$#j z?+n)+staWKDUBfVQBfAyGoTo!-Qy4YBTfW*o*47lT|TG7sZi+ri?1$qw}SH)@4c#> zgo1mUbn8UBc4+5poxkkHG0bpp(EKG-ny=zqIPOv32>0Y%PP%cT)!{ri?!AIO$GYL? zFNZ`@dO^;~(Pz(_8NU79B7a$K5#MgMh;Ki}I4k_+_bu|5H=5&{(@>vc=1(-nUtX;I zG(WulpN2fZ-i$lZ0FjOTXcB#?8xHTP*@OLka#x6UqWw*G-*SP2{szW zYkuo>QW{NiAIyAl;hCG5)ybL)I$5&1Q})bFuE3Ie<~AHKW;f$^LwAB$&PH{m7ox88 zGPSOBkm^cLjYmFSM0KT$sjjs1taNylTvvLUQdj!$4MN+mt`%NxWi|D=44%2{#>H5| zGdKPQ)F*4;nR~*?>@1TU*(rvdl=7gGB3Y&80HUA!?wu9|# z2FH1mTtVeW&^jhd=IrQB-j|e;qO8(n1I9D(yy<6=lrcZHzRUGiPcBbUWQF`x(s2<%!3e8edXvR+e z@ZiyEaGmo>pD8t+37`VCs?U`2{~TcNyHzdbtWL3-6?__yYp!e~t!Pzehg^+C(Q1-D z6I|!xO9sGo!Znwkvu(+Ua-E?lYHy07(-U%uA?AztkQov2_@j2rUNg7f&wmAHF3$%> z(ivQX$GBeHrLk{r`ktrw3Y^tWdhosix%lnfJ6DkmU$gX^X;U1YAAun-(7Cr?-(2-z zN-ibGRnp&ZTzw6F?gd1BzFpS882AeO3*qeq3`E;cc&mB=eX8q|$G{Ny3Z&n4rg@P5 zy_*PT_}e~rLiJ+Ko1p8DH{Q+m6(GLyAq?s-hjAqiV8pv-`{r)MI4is>3^^?2Fp`!v z!rugz{A-!5tNA0w(fk>2d>nAx2Z~i|-20wp8x3*XXT3J)Eklaq!{aMZtojPoRbWks5AZec9P`LvV^@B76Hj(0s4cx>OMIh*$MiQ|&H@f0!|DDwe0 z&TPPN!t%>h9ItK638x6j_cfgYj=zXXXItUYGrttbuGB&Uk{?g*-P(|31H@ z`AG1i*v^h3H$to`b#6yyM*N{5Lna3lr84KrQtRZb3~5`U#M5>vA?3e7dQ}Cnse&49 z2Vbi)v&r`Y`OI;hVzvq7zTm4gj-9j+tfNs2Fj(M2{yL6J4>0$XG1o^+zHeug@J4!~9#4x#Zs& z+B#BmlJr^w!Rd6Kg@V&hY9~E-oTgk2Gn~%gZqta>Cr%sWF)DxsMx3yDC~$f?&Y9!1 zoRe|xo_*vpaUkeD{o737vs}GUI(b2~17`lOuN^6XgeByn(!6ya|_; zF<`t;)|L|EO(XGY1-rp`V-y(gu*`TXR}c?yiTE`FvcSz)|m_1JIB zc$2z!QK`as{}u`=90{+=8SfsP7tTXvyicn8RmQu0#s9Xh?o}D@Eh|Qp@%FmyqATq2 zyTll||2ZO#Pz*kRqMISJCFT@y`|s5>_`{yj8b=?|PEx^a;&+v%U^d06e4Y1b*%xLP zB8D)DqcgR?7BSnvM_2v6#mGBo z?i!Ca@ZN~8|JS3+?6s8K6=b#B!D1&$!b#~Uw7`ggJGOz(#xDV&cK&Y6Y-2yNcfu*p z5(b|kHZ@Ta*w)Z26|4@jX2jlyu|ElI{f(<64OM0)Q!6|paWr?whAcd{q2 zFM;JzWb7351m>a7kPRdioKTg>#CM-k_-_1uAeNmpTcq8R%Bp0(o9dx|$ocNi4rGpc zg`$pF)awmJqs$BIJ~zKBWG*$x!{*V7)BW+?gTd)O`0lks z$##0X z{o(OoxbD92cqqAU^3mtQ=iAjgW?!QjHJ!tO1k>1N}HN7LOhrs>Yg+&w>b2@`zS7T~~Bmo0pbpZ%dkP zI+#)mo@2G%^Fq!ERypooIl-!?Th5_UJue=@`{r7)F7!FC{a0O|`2XSLxOMN{T+=PT z?J-SvUl^_dJg!|nE}P?CX_4c;9|y3)aVIfumG)gpYf^B@Xy-t?|Bi81G-MNSepWPO zzcba4ISH<{rp;Fa*bOn<=Yi`Kwf<|xRSYSHThx#tH;X*-zh{`2#n^Iza8&h)2;?LXG-oJ9$%?;uMLgb!%SI%vC zpdmIrvU2U*6`_^>=__M%ebdFrT*vhLopZl}e;twgl_fS}9it<$xgkfy=k>x~%I%Lj zA}s87BHzmC_QoPnSO*(N()7LLZM5*(^Y{q?YXj)NqMf9I&CR-X!scgnW!-GGQ4|{a*TC5O(5RI5tzC$I-iKyNb=!=i3o_ zYqi&#sjp&lEzX%^^Y_u`*nAFt9qHNiEFHJ*J@$#gV><3Mt{KJAbe-`A$dg+(2Hyni zT8=&a>A0(K04o?A!Z<4!Onz2YF!(n%YZ&~JIR^VMrK~j#gU$Rtd>+ej^o{2OgBKx= z9)QjOzXO6@4+hjE0@R)YHZycuUj5jkJzQrOAFR+NiF^f3-fkhnt zokbk}z9|kfyP@6-lg@^*@G$$7^v!3JPf0eL-EbhogPD9vIG=484`=(7a6UUT9#&9z z4bT`$?GzkKWDF);X5)uXw@sY(DLKD+Ot(Gm?$h50g*L1|Ke}y(sb)va<3jm3H%bvW zoXo*oeupdO^+#hq_XVrlepkEaDR@mBuF@2|CJf~3yhqEv;^utZt4#2^U){D5UK{JS zU1Z~YPWjJzPWutOZ;sbLM_uaSES({1)MhC_86y)k3w!n@ibk3yzy>!JZ;sd zWEBozC7yl^hy)peQ?_SYPF59+1Q%|*bGkld7KN6rK!(j=?>a{8U8_|KHq);aoS^AZG3JV zTa7SyjMFA<7)o$zjP~^D8mDdQO)|*K#q zGSm-@=g&s1q`ZT+iBvzZ1r_>M1f@InRMsch_U00)UyztHxjlw@Oh2lWO5x#EpOh;fmAA7i;iWxu#cB6}ZPjJLvg)!b7C#%fqL3Aw4X{Ns zD_QZ(5+#EQp4@n~vTBw%6Oi4sks~dsZrbS)a28n~6;6C+aYkO$>D$7K4=oPd*>UHL zx+m+#Ej|79@GXaK34EjD8=nV5P0zTZ@Wi!?N7Pxw;Sc#k?y%nv8rG> zyF#Mh7d2+6)7ne=7L8OKoW|HZ;Rd|!KJABqaoxalPBMfXy4F|ychY9}uAc<073$@h z=&IB8CJgEZs?W4k|9uP2k=L8JALqgAC+$U_>$HZUZlD~VqfqWDq1;@KMQ?uy=wq1^ zrH_p>57|HPI4*r2V`v;`Pq}4}qkYt7;X#x@f8)N4G1;$s4Yu*dUzaq0`f;~movsPq z__+DlfT>WSLfuh0|KsJ#arELX3#HmdOP9<%Z%@N|4DOh+s z6?&BXD&clnAx%w{v=jn+>ftSox_qAY?vOn^m|Q7vTh*>=@|vEP z+NG-$h(4S(6+de9fq+`2KzLAdKWeEReYH~HOaXNQ6*uZBi!nagPsx<33M|CF5aLz=doW?nWx=ISpx#V0X&fQXs z%Q;%v_e$k%H(@)+xm$1^9Os@zpX1!n=#Kluv!Rd|Uyyi~t}&911GDk$qOS|@a=DE3 zN*=TP+hNDE+Cv=C($Sp(p4F*%b}PrTeiYl!37a{Iu9#&_N%Lnyd-lM+oV=F zT;v|X@)&7@CnCmcy*;PnDOLnTTbhYzb#h#n_I0MXu3 zsC^4OV^i}Eh8_jxUG`5ww(OY-cI9T&R2W|bMEez7Bp>)%>6~ZaJ|&|egL@=Us$wr< zKlnyv5)P0y)NxpX>bCH+U=!gzCA&AX(m8GGfLUp@M15TqDKCF#YBk~6 ze+A}k25v380l0N4un*WKbyF4GQ#zbG0WW7%cDQzPiPVl*kUX8?VU48tiuzxArvpe%GhWzSpO_Plly zO58>o8l?@s-g{qoX2OkHz%!pEJd^c6YTeuOh-X6~(;dSz1b9Zeod#T>+GUEqALFd( zcD|2sA7MP@-%P}VV#djM(B;BoR&<5$VufN&-uP=}*B5f(0FUrNSn_c*oq(Z=B0B-e8%b?rnTToGy&G@S-t38n2F#8>L$GzHgWhvY7* z*mQEefM^WZrgD}*8(>^Gekv*T;w;A(G21_Zr7Wuq%bcb2R;d8d)*Wq}wLAeo%6P1<>#U! z%369|5x*xKLLni06g;In>Ojd{(TCjBuq)>FlO&{9;dRs>IoTJVoBZs0>iSz)GGO>-ZJd)hCESs2t1|e zjEJJ&$^4;+%O7?{LT;Bkdul}fuIs-3=MC##(oRCby7jtsvR)*OiPEg|mWOZ*Gprjl zZwXcA%Qz9vTT-6~&w8xW^OiL@4~}&d&vJYl0ZhAOc}x22c{9T_stb1$2K9$&GjISa zao${vvl8dMf^k+b?OBVM<}=4M28vQ^8m5`~9SkF;`5&ZtxVm>aZ&`b&{y_NW;{N;I z?#)}mFG$v>FpiiMKfmN6y8#5m1p9Jw^U~0S~?$__t@S|o=x>ziZlFq zZOw&3&1Q*s%So>V#b#R^$aZDZfdeU90$2vlGTt;BdX$v)50h?+{=d?fe4wNU=tl+-`b2eiM=8`2p4eU*o$;>4w zP3EA_>dPxx!N<^~0Ml?z^t$wXa?777`~fp?ALh)=0ixx6Q@En(5Y5N))~#JNFS zdR?Aq*bT*})9G_LUCb3B&%cn*A8|zaw>)#H`}&_ZOxvZMgfXT)ubr}WOru;%GfW#a zcL|jv&A)L>Gn#XS5_9hW zpdGdT{{{_Y3KPk`dP-mx9&GG#qx4b9h8!4r2HdE!o^`8wZOsrv(YzHVKc zRMar8t^Qh}c-aj?`6hPYvw2d{8#&TDSZ@5#CN&>`8+{R$m)Y7r{A>lAbkHVED9vG) zPt9QyCIut4j}%E8->E$QGCM`@J zP1Gfd*ZyS^XFy+WRJKW5TMn?&mIK=MjePs~gRFG?LB4&qI==0_mYm|-TXOhz>G`jp zVPBYkrla~xIo}iVCVc79$Ap#%C!R|F*?Oh5k&CcE8oJzmyXbU@5tmo=cw;`l%jfn& z8R=({h(o)nXLK|uz}BJQ6HC>jlP+x>j;L=o@PXH7?9axRe2ovhN`Agd+^NqY%_Ge( zIMsCl>x-GggG4QnV7un+e;O5qot#e?G;^?A%jx=)@bNPWKjP1;TqF=*81+kc5Z z-%fqL{S)1G>htXr=>4k4p+4XKWsKpu4jZVi=Ks&en8`HxL#=%Ex4*R}6vlGRDrI>O z@2!bFv_>e8hSr3H^6=`_LZ)q=&dE1xNBYm0xg+zBX{v=85|Wf+DZI^5tLvPfb$;|+ zpzj%PfJC`bzQ6u`+>dqoKJmuK5#OjE*NAoc9`MG;eH$C-n_Qvp_&egiSJ5ZiMPl@6 z-vm6i;XzNg<3a70STTxEpTR!e%LsqQik0}3Ja(sJEWH-ZDbnjs#v^+kaud#vcwOH3 zYh}+vzJde%fDgiwkGsL;_Nm}3BeWKun)wF|uMdzZmf!s#VKv9?+GBMe)E^BW5f9z> zuId9+H^@24j2f;|E-?JfHMz)JtYo$~;l z(pd1gRDB)um{cLoQ_DwnD%D%J(#Xu}tyBvR)mwktR8rn9m6l_F3^^9HRbr6Ey8=B` zQvO>35&F`gl3|g2Ds|`+NVsn1_7YDe1M+B``|J1zu+-e{jrmI9mEbJ|8AoFB~tR0KcKA`24DNlTq+_ zlWu(h#tsIbyKxLNd^VYb?Gv93y?_XxT|q9LP))r`ys76VDW9sP z%P8D@G9WeoHXtqWRZ96M0@8cFN_N;&N%<@^|1527lJi=)(&=x)%p9PxGCw>@>$ZAb zb|+cp#^BB;#yoBoa6~0@GNR$nI z#mm3JG0gDTWd3+?c$X~si-%$o`eMdoy3Tkr!{fyWl9yvpAs!S{Q_M`9Gv~`W z)pZ*VU?nd8CdOHbi+_!AlW~5;s}rwHuS?5pew*gfDdy*mzol$``&Ar(<}!KX<8E*v z<3L7YuE3w>QiDi~sOdJJsji~p8SSls|9V|B#S1Xbw zVuFtW$Gu`jDRJC1vKh#|4;(i}f#Via#BwXgB9V9Im?-fq8ulwKDXU>V`#&fp((}?Ee zz^6Cru}6HUx*iRA{C)=@+aC4#!W2@6J<4S*U)$+_`1gvoj8@D(qMf9I*~IB8P2sq| z&sPV4*@d`YnPBz+rp^23xM`xCepB#ya_aN>>L1f~)sunxeEV0?pG-G!G(E??0q>i~ z(C?zpV`$<_dH*u>M*+t@Hm8lx4j+Zw2=C~U)pOi*{qe@T*&H|J)jWhj{bBh!9KZ^e zKY?*pusjzSZ3W9qaDG;>{3CNL_p1p%nXxql)`nQ_^Qq9^zwYd|A;t2VZa!0;oll!l zvu5Nt?jyuX)s6$;4Xt9W6+(e2&`SxoZ(8)An{x?dAJxt9sxZ@m647 zvIp)*z~5w7U|#~;jsmL--U!T#WBZ~L=wn8@o3OeXIYm{n_FC3pzlfZonaC-snz{ZD zobSGBAhXjW$9H?(5wD*yyWJkOyPaYD7juigNI2^9gqYibNUwL(U=O=SD^|a*ouq=* zJ9O(5Uk?VWe~)9BVf9e*-H^Nu8CHupXO7iBMxW#JdE~oE(HD8(Ti=Q`K;?EDl_U)EX0qjCj<4xDW;w-rpL{8{7p z+UqpZk9o~}EXMe5%tpiKBKPAU8@LPp#l&}G-ddjZ{_XAZtoDV(ciX+9=z?ccRCIYG zj#$X!38OfTmpPrH-Rbdr`CTD%sk>c_T09 z?!n|=t^Q&~&gW{F|4z!iT1~lEOwGMw-EYgeSF76C_tm>E0p%_yL34HGU(Q(Pjz=yAjfNcVsK+03hkOxt6g6KQ z?vUFX79qQedBP6;&q(>cN&gHr=2^|Tx(cs7u9qiMzAzWt%jv}AmM>Id`33DH^99N~ zp&VPKaRyFVGn&)ASsh8axP~!jKLKZE&W|R6_V&un!k6xGycWkc>T?YHu5LT^`Sw?7 zyNY?#=i7g-+fIGHy+^m5`h5GRy6x2G+bO?|^Ue=bpC;za4%$&O$D2e#4E?RZe5-$+KB zasvBwFC+ZFSh2z>-$*Bfv2;mI!h_CfG9KCU!#CpmmSQ_^{I#;@hiRUha<+KmVYkocbE3K%>Ysjw{Kyb70moK#(jh*5mryc!wfUu1!mHF z;f=pmHfHX?0UqIlu;k-zaQW=8`p}w&nb>HInGVaEsv~$!dL8BWlQr*RKHHi-*Gk^S zaq?*-?_yx4IbMPHRi%5`d zEa(!Er=;ZBs0ikz<~BUg5St!ZxpwY~&`SUGm9e?L>0)HAWBUEhxnIG*j>!GW5*x9O z(UI8PD5g}ME}ttJ5`l-JXpgv}4Cv)CcuFJm%v}vSpaGv)13J$)korHpe zr1epn;!FH2U+onGlZ!#R>3xYwH)V!{CShzE2Mue?5LCE?op?Epchu*2w_CTJ`h2?& z{mCj0HdCK&q-eD`KaPXs>&00}4skg?pZ@Uf3&1BU zc=t7ovx0Z8Vw@Gcd)^}6QH*GUcMSBY)-=2`^T_ZzE$fax7%sdUsJ7_H6k*tFcw3yk z%&6f#maXHLf6(29FBsk9hXD0h*dOuv-Oh;D7jj1Z!uXWMsEA~5vW0+x{$=sv`%=7hKk6R5Wh*#s7 zr;q(o*v>Jp4(G=?*6&ka~2^vxp37x zLwcdRZH!o47|>o`!N^0}Nhlae9HG*bxbS7ZI)J#4azsop(k%BSjgf}+Y7iG9lDInF&qsgc_|YLrXSpD;ldcuscsCn6uLtH> z;YaVl0jyx>YK*gjoxj64E7)HHhMlQ;5^P|I*fzmRTffAfE{rc*f+rK#7Tka@#Oh;Cy*Y36tdDIy5M3|3(6=kuo z!xQ$1QM=tO`z_m<%j0tJZ++%cgCA@jskkwlE8U}=go24F-8#jMJGE2B4^v(1D{lNX zj$ww0gXT(+aX~RG$3E(F?Ca2Nr#|0q#+BZM^W&JS1e-Ra#QT{JB;)+K17Em*f++N;(9o_ zUJx?!FE1vp^a9TG5JPYn^!Z#~XUrdVxV)|yi}<~MmzR-S0y9KC-ECmRFfV{>NNMMV zD>cjGNXLO@^Mgp*Ak7ZPJnD07BYu=`AKhFj-ozz3KRCvfQqBeL2S)LpnJ0m%~XpkLj|QZEIM!`%SmP{mD(QT4a&@Y_w1H~y96 zjlbgb+ykfr7o1v!s&lrpfnC+)LBJL<*&TmZmF%~#dgEgsyz^x*0=V&}-SOe>FOPt4 zkU&oNnYFz8t^h~Rc%tyccSp9Cw;yIfPQN|m2#1_8hr{RgVD>PIBoI+_LOK&ta47TN z(SV6>YA2z@fv0rq6bF7^J7w!};9qeJ!#L14XzeIH)07+4&l7IJ`Em|)CC-D#d#|I< z6+jTVVB&p ziIr)X{xzaX-P3f{Q#~f4mUpg=FcJBL1I5HP!&=_lZT<+fq910u&F6IoBX?3Q?=H=U zXLoCzT=z7cg=l*Nbx%{W>yBKzH2&7rsCJ6Fr_HvvXA9&sAO9(#VNZ(L;F3pmNmtaA zj;Fe(_3(+8Ymt7rf-B$^P=JepY1} z{N>9kX&e0I6XY*Ht5WKQUp;xstN!v*drb-34S#vm@SeFI^-dLc`O@g9tas{l_(X@( z;fEsB%fjxc&*SznXheOkSS0L=hSe{1)z*( z7&l0+6YyZpb?Py06V8`o+$}f{j&V<+&oOSeIZgRwFHtO`&z?6kEc+ce!<#UuKTh*1 z9KZ^v$uQ0er}+}bS>ZHySmZSAW}K$mZa31xP~kK~PIIh=H?9U^G%2pjsNwyFR>QkX zt>OLCtQy`cZY}M%hWE*u(mrZ<1Kawj;SH=jryAbZZZ4795edSrofXGRE}RLMet>7Ivr%B@vI}xvP$zl-`(0RbC$CEdDnIwzAaRF%h!UU%v+M@Ip-~H z2Pjf&DRSP*;)vDmfa@uk%Y|Sr5vj?{We=E3RQihC1F!SVU@kqC3lsY`%gp7`A8_XK zq$sxF5eC)yrtrIjw+w;b2sx@ojp3USRVG8Xm0F4gaIM`B(tgHxL?;tjh!5yX1lum(H2j_y`*-eS7+Z*V21JFT6RqUj_Z zrP8d&bmWO{64MP<)9E8krG`JPs&EzWhw9w^LMs46!wzl@t!D@QeYmt!4rx#rMr?Hw=yt{#9eyYdlKX)-jk9N zz%NwB+?CwZB#DUW-Y1-^F7<5Rh3c5E1$&x^p_GndHV~fPR85n!lzZCu)Jl0c{^410 z3kS1#7|#T&>1=y!|54d9ygM*21#j^BPvH&zzUm+TXY>!Np5Y(EOT0TEb^jUXG_RDc z@WP>#l}e}3FYm=+PR`^o_f(YKxb4RLn@`^vt~*p0$Z~rbIk&c0)E@SGoX%+2<#D6P zhg%GZPPgc14iOoD5vK|nSqt21wRXPZz3klfM(v~&ycHDx}o?%ni^Tw0@&Js)RVs%lhjjW z)VX50Z{)BW*W|L?H!E3g6lxTz|9k|?4{hTc*~Ei3sWq14d|E2PjNDzBGjjFvd|cWI z^djUiAGj4*1|Af6OSpL9aG3TOJhwfl$>oTKVquXv9nqLC>bJYRVXx?5{N}5E$N55o z4{SJJm^Q*3=3w=hfQbu ztCKYqbh2c1=aQ|vek~o0Mwq5}k+mJZp|=lN{0*QPTsv(i;Myr;nIPqg0?Yl4jpdyR zMrzkjsd}t))4WZ4H+nYCZmr$YHvXeYwVJnee14(Oon$NWCQHd!FkXc@xk-r8ZkjE` zZ<-^piFpS@O-+USntl%saXacZHKA^kyL4W%8}*<>aF0KNdNEnDck6vg)^=S9D|iM` zSh5m(dpwB4?n#f>#z=EHb5g@dd;dCB zSvjk-teO>k8j$0|ZKV9H>SRk04_-;HL^T?t!ig&vXKYD4KP3MdVHU%QI1e7fy^22PDSxNy{}KIj=PdQ_ z#KfPBzllp!pOV(_n#Xn%5T7i^=h`1=seo9^ zT|h=wL~8{sIZnmIVdmLmDNzF1ff3OU^jLY0ssCWa#ZklllgdYt2Z+-kLUzT!Lb=2Du1cM0A4U~>zO;uvOl zr{^s7C~*r|KC>zk3RJi(d&}OT)SjBOZx12J6F!K z%p$H;TEw-X_T4n+EFE4Wjfx*&XN+ssYcsqGETunjRt`ZwxK?|JBU_)iR;R{y0hP1- zcooHWQxwipI z(M*>?P*W&KV&3HADd5?}M}oGXf@a|q;aKq!#B;#3a1%v*c|}rkmxel56au$oOxn{9 zyaLvp0>Vj&mnhFb#yG+ymItgN+`<^bOLjXl=VIb^>#7Dw-AiHo)Ek!s+yu6dBH3e+>Bp`*UVKdY|yzqc4+^WJ=~7 zT;Gx0$j!m|qLC=PHe)E01PqIc%*CS2DLP@E;*5$uGVd^Gy089u<10yvs5Ax7{zbPw z*!b<|IEERX={1*nbm$+?e3s%jz2;x*#CVwEuXxJ;WmOw5(VjDYITS}}Y zMi%S_Yq`BL3?x-pOGIz#IIx!YEWtQpE%9vN6k*ezB^)WiTE^n<4IS zu#lg5y>3j{`3Ubq9wdoJd>*gQ?RMB>{7#U$)ZHS^8}9AXPC~&w;`EfJXiuK!s{`=Q z`~=4^!MzNvr6KN_@s^M&n)#-f@s{`FJUH&{MW5pyacI0x+R~BZEiYZIC0!G|nc-mx z?&-@hs6XD4YUNqcS}wDQhes^p;hPrmaE&P*I-Q1^6t`J?=eL}L@cMx9a95{-h`qIz z(4^!cM|@CP%X8!{?_NK-e9Me3Jvx$e%1>@i&*s_GXfK=uM#25WM)P^LrUP+AckD7` zi_hoWC89gTdaPdYFbOAltS85D`Om?31?W|P*iPjoSuIA2iIR?O@LGujoLQ?9q%T_xv?cT~?zbC*vp$>1*gM!=Da_B>vf!x;&O!eJPL!8@9H zoguF)gvTUz)4f9^nPC~)FX5Bi)dar0FY(2l=7>;3vd4uLIAz`$V zU!dnMYjGYN^N6G6I5+&<<)y2)q|cr=K#AP4^_EmW!HV8;wAW9lFvm7GU`%V=|AY|i z{BV~8(_4Pe3U|5iOTumg?lPLKw?xb*6>54*;x0A+lU`~|WDro4*9Ml7VFr%n=N;@x z)j;c?3fho8E~eth7>^@+yonr7@{kXwdXumvTje>qz3nwgHZhKDJh6!tyav2eG7I=j z+#K2;M{YsE9-!HCa%OzV4u-huw4ny_kb zs!ZlCNnS+5OIl&+YK|Tn?X4^a9p=?opgSFv8qrhSt(BhBNTKl;`3gUwj^S z$Nsb@ql3G=bhVaa+$Cu(ojya22?97nJUe%f%S3e-w3b~gne0-umTzG>+*-@xW7i71 zTRR#JYQK(?HXj6sNnGY{lxpcs{}q%9PXwi0XfEaY2Is1}Y#CEsE^*O>T&H#t zN-XzB-TGj4C}(jD!&ok>KKi{b%eqT?rX?MUK39At&V$Et#MAOvjyOx+KZE`d@Rz!G zVy;h--^3-VyQFJ^H?tVes>kI`IDi%YGJYNuI4kpcZ(HOqA2N;cn8Q$?V&=em*$u_Ou9?MT=C2Z4~k2Q@Z^j-Mjn?+M%`n9$M$WSvuTe(27*<+Wy_e} za+s_7IP880Cgj8j1gY+*X!khn%pP;HkjLe7dqajur~B%kH=KK3I|&8n9?`86&QV;Y zH0zw@0UW~&=Q21;9Xj-*Pm$}No7MC&o2R=4=fQFAS@b!!odaj7JL5j_?2^@6(r3?` z8J=0yr%bbmXMT%#HgftD#tii-*k~Bz4LhCil-M+w1i@?93hVIK8ouC`SG6a3msnydg)FprKdOef2LHJj>8q>d>KoJR5j^_<6*$ zOIB|=hG)cCGLM12#A^qb8RD7uoINg0Im_YHTecxLu6!eLmf2YZH`*v8j-fUW%Z1hw zd2x*VEy?FH7rM*3^;7hyHXF4FC{ujk%FFR%%FA9(U*|`839qlHJM4G*9Db(uqbO+53;eKQG~nOc+DRz!9C3O|8)}bB%)C+c@$!hUa_#*qmo+rdy48Gf zxo)`?4T_$(T!;6<(=YmDL^G%ztXI8mxpi+6Yg^Dpt(y(7zgTa zS%dT7SVtV~$Z?mKuHKS9d)~~rORMz^W?1Ad=UU`0U%@ylb8*jFoQw0B&c(T$OjBEG z9w=VBsRzn%&&3Ug-tx19(OW9qMf08H)FjeVz zyS#MumSfx{ahEQ)fwsg;h3E`pG`GvLw&b=fZAlSsWZ!;p#?i7P3l7!1yYN8m&+GQr zza8#E{)#VjApOYP#Yfv@(YdPGJ*?*S(>Ob|4 z%yKsPygW7ue$2Oi4a^_QP6#r26uYmkWZhHJG>mwzrc-M9Fd$bBpbBu^f2m*%^(E`t zrD^5Z+i*HkG(LYud}j-@{c~VvYR1MZ@}9_(S{@Eil~qL7jp23aOo*U(?CzpRQnZteFj{2QCUHt~q$>N7d7Xwq(I{+sU_boQroZo^t1g zJ6A0@zF^_kJHPI{Wj?7SF_K>CMCrjl{_NjJF5@iXG5$8!I$W%oVOd|GOG6<_goXp3dve6~2J=$MH}az6`o%6Y_Oys9-1*2-mAy zNC!RzD60{Np=cDCLQa$S5}#OpixUr~8gRJ`htZ+t;4xW!nFRF*^~2;LP?s`FwAqx-GylaFZ@ITJA)#)+hdpApPKwbz3p5)EeHE+PSgK)M+b^cTQKTjhYr$Y1v%OKtfE^O~h`|3?N}aM5FDkBJ zsh`=_Z9TJ<VldvK;>sqV zNh_fVmOzvz@~+4`nv%Ldt=!ux6#`k>QYBp}DK$QLrbX)hYlU>GzJ&I42cBxLic7!v zOC@V>DPgt=LFpIR`=57~oc_+ zR<+GZv57L8$SAU~J(53u+>F+pt*jNO(E4p;L_bwAqgDFFQx(`&xH=#eJ_00ps)BVt z1;jvg?eE+ydpydOws+rrhRsBEZQ&>~%tT>)e*d^Ja!BD0$GiZBu*+=^!Qhcayq>5- zbUU3cCOTtY?W?A{jJ4~Swhfi9V~T${aKz8yxD|A8x#bF<$MSLA{_C*bpj%hQDgPSb z#23{89e9ozP7oJYev5-#8aY@P0tJ1qzKe%n#R(ZR)cbxjwsV{a;I%kT3>_W}i41U5 z;Q@Unyy5mMw`@FU#C?=5#QyN02gkC42RRn;V2wpQxDn?!Pd#^9@VAtW2d|pqf!l7V zhcNNmaN50=eS(+cI;Hc`STyX5Z{WTvfJX(9C?oj=^;RE8&8{UpD%E_I2 zbJ>lEEOHT9z-g*7&jwfgb>E=KLdiXT1gLNtsG#^Je(kJuXqnD8k=1;fCyjd}N9sJC z2aQ9ewBb0S33%aeID}=lt?mDtQNbqsG)LO>)0|b?BDJr4rS~y#ia|B%y0V{AZH{Xrj|AM>!|6OwEJ5{Yy<1_}b$D-Bv z)gLdBx=#Z)_LV%J)1&3IZMKKgGR&AMm3n$d9Y>SM)eB4gFmOr?yg_gg-YksF=v-wQ}f{#+rQ zTv5`ooiej$=KM*}W8JF7#}_ZWv-3`8-OjoxOE)ZCb<6Qv7Jj2s&L``AHh3>>+Izt@ z(GgJ2>4lP~w$8vizYg!btwMfR>pO%KU!HoF-c|3v3Eq`<9DE}3Uxbb!ZMZJz#QVpm zfxpaif+U=nb}jCCO3M`pw>M}fkt+}` z-_LLQIHRv%eT#0L;)it2Ir=r8ZbmroR(IFoHO+9I^p${k3I+-1{df@OE6gMXiClc5 ziy_Gl^d&qv=2xK4W5ZVJ6ELCOhWExX|HsrP9vV%rEg_u)-|oYE<$dyY;{B^|{=B~! z{jaFUxr6!?m{2QU{q1k935Bs-vr1Xs!+UFD53Lc(qoFk+p**~LwNTz?j5#Dy%u)55 zfIkttk>%*l>VJa6@=HmB6 z?jD(`{2s3z_c7IulhoRA(ytJqvE{-eO6|BhsXlc|(8 zt4!tHA6?P$OdGK8v6}csaFv@VuC#4bVoJ8DC>RG{X}k40Ar7X}w!keM-za^!v|`RC zHi2TwjU`{YJKQX@#`(@A4k}Vwgreru2t@E_v!{cH+ZQh0$c{{$B;yH~+b0 z)zhp2d%#vo$LcDoQtTPTlqtlYb#xTz_Yar+^(ppW$1vj7PBsC*B;I15 z8jqAb+|C~8#@+``M>dVmFN>G8viQb8*=Ax8S>ZIyn0g1TjR>J3TI38H-!56)LMQ(uikN$bHesh#>NUrF;fynhJ&A?GWH zM!q-NW2-h=bA!dH?O#RN+{ znBLNw>Y3%Gpw)QJiT$gp%Qw=D zWo-sy2~_z>fH=z^6xhI7D%ip%ObpsE7Z%4{Se!UZ@Rf0yw^TUGaEfN7RD3B;l>iqe z76w z+u{MX3EL0Pu9WJ(478{(q4_l8KZ!~G|Ji#N_^7IDfBYnq2N@m)@&I!!ra=QD!DLP{ zNw^l13?vXSQYH`tM3c!x_B+CESqr=6JYlz--EvRNIka0=h4Ikd-Lf9X-sM`hi0`yj4$kdsVcIHzE2;mzn0dU3JZAg$ zAv-l*JObJfoK_?3mKBJaSWmm9OV}+xmv&2EAiHIiSw*{LmEZE%-qzP@rGtg;y~km< z^tIY8(IeU|EB$-x7QXg-(yrImZaKF@yCv;hIdEw$sLKeO^bt@eH?HT5Bth({71{ zia%hxW#=rzJfof|&e|=xzS5Z%aBWOSu}(70@0@#}J68Fem+M=C+~JFnJAA3k9lliM z4);~R8S0C83Aw6UjF?EUX)P_WF<%@wXZEaL+#0bxX__g_(s_m>_s6;B?o;C;bcHgn+? zn{Po^o7t_Kt@f>pb9`M8-7>5y#PP7XpbLD%?~L*-cqP}jIU?FDjEweu7#Y3$q1GI8 z1LxU>hZ(iEe|1h#&DQF1)k|>?cz+gnlsUHHv4+t3;^u8p`hj=bhF{>J;PQk zv<=^XSnN?dc3z0uvZMEJ_U!1rcvpDWi<7=Fnrr{#E1lz8IXbEM{^HQ9J{wt9xV13v z@|Bk-jk_XI*OQg)Fv~K_&FpfxoS3N&SQpK-Q4}wox27jn`u&=oSm_4>EADJ2aaa69vEwsGe;4kIWZGbLqO_ATxXlK# zg{`NiL%ywZ45XYZ@-o0TXcf-w^@8c2Rep;9tcU5FRod6%HkM%5b8>#${ka=yYqUv1>1$nX@yjVD|ei-j|ym$_{jbH75;l7@;|5-jJ-9L9YS4RQb*(NQqjMOqG{_t`^3_oyBmOxGbe^BsvgEb2jg7?^!);m)G%%&wZed(5_RTlM^^wyQ$mdw?1D zHCQR+&JBkTLbx^d4U_p*Z<`KY&y2N2n?CcPxvkP#CzK?3y=@{Noi7X{--hX7zBwDf z>us?4=FADz^U<013d1)?=A#>Tua=K)#r)k5Fy~I|*jL$TH_EDgnN|DD>KQKEM&#S+ zi+nrCOJLhH#PIbAf35Vc@UAPXku|3pndr7JK`u9B(Wxn`HY5HMvm#^#c)uog?Gohc zsZEacF~?lVl3Z-Pt|k^%-0Iu?b%rkW_3jV9fc_2pYJ6kS4l;`)-_CoOT}M3bul4j& z-(uDp-eC4XmY%W5tmCbUoslmx(JhJ{xXc$v?*i{<8C&A>lU>N0P}!JQpYMyNM}&$ElcyjV>~+>>sZpt)6&&XSp77tclGcGqL?qQ5pZ+kLS|ZDz|fd{&$IK{|n?Jj?u>QUkEh% z_~U^E%tL4G8B`8~h3JFg1S`-FWrYsG^S5ejL0J4cw_J;a%0kIH(r7wjBpybPhNU zo_IWz4(Ec|x1OXp&WI6K3vWEc2@8<1XBcLF+pJh&h~>;^VOFHDt%wx%hRfF#etF~d zoINWLCoIOUkBGMQ$T*JiaLZiZ+`qUg7FlCrA2BAH@yJ1kd_ARiwJZwn%FH~CH9lks z_q|^b*D|-F5~GpK&@*(|mKtA|8kdh*dv-jDtfvKWs^*%d9c1l6ogv8D<6BhiI*@Nh z{#nZhgiPevx@Otp#w8t^sq3WE)e|WtXGh8{6CC&U7O?1%v|Hy-m+9L9PrZ9DzcqrsTt``Gc7eeEh81# zdmNagY8So+)o*~R(>2!B`#TXh9?Dbx{suqRy^c0J8te3UDEbKDAL|18k8`X`4=QJY zo`0?w{ZL~aZNX}+J1)+%%@k1Y@lnULPI2P+K8|Vp?p5h%Oba$1N@9>>+P?=mrk%QY zC{~!uBRJEvlNS%=7-QPWh=+2L^3P!;L;krC6C)T$uj9x+XN@-)sXEF($I+^z{Bv?7 z3z&cI{ermfn15~=)_u}b9bPD8biY6O=gP|~U{|e3&n)w%m1SmnOfT#c6`79AEE73+ zGWqZsplCn+(>9*9a(-ew`<1^_B9`T&{(c8Po(bP`)K`-<={LYpNsr~Mj}FHk&(4JW zb9#@DI-Yfk1Ht!kJPYK@J{;E&=R-O2S_(Ed!FfTBXPH5cXQwVVL8b%Cef-65tHgrQ zfO9nDtrV4yy*6||P9%S#!frhPbK9faDzCn^sHwW~(G84TIp*zgyC>|NyuEB&#nvgW zPu)^^6>^1NgIwX)ghaqr839{mL}%J6eG9yX8Kv1Oue!Ha{``i!hu*zrp>yGi`AwFs zvis$et7bMTCXM#W3Tdybw(OO@^IPqeW?$MXs}R9?W%U?XERj)ld%d(+R={G3`55hf zmc?>wjoDlg=c{=E7R&lvY=y*8py+*;#{T#FSbsI_Q}v{+(pCR>8V z@;%n0#d0nzmQKrJ=^Q6!f|kY7I~Ch$u^g9QAuX0Imc_CH7RzS%CwSt7#j*u`6US_k z7R&cBbA-mSSiUc}(qego(Y$#2CpwFG^vvPh0~X7NrvKl+{&MO##Z*L2L8`fIZ>p!% znU$HEg-~OTGG}?2Hv{1l%%8e>I_d$i|?BF4SPlz1FA%l&AhgLzy> zG@|gdqf0|aHcQZBPogi1HzZcm<4b{+PlIl=yb=9S^Ej@_RP#96&lLU)_|(}fe;gcN zAe$wx2~{vmS*87W7>j%Qwb*hjo8_<|$HQxa91rPV8H~+xLy$Jh>G&LhZI=FI1=cX< z9}hccaT+cePd#f86S^V==&vkzVLD8@A81y|O}8Y^o!W^FAs zLzX4gn2|o@9QV~!V{8G+pSS%yo$QxP-439lu4Pu!!^@oSW z&^YtDOst(X<9z#o2MY`4%KUzpiN6{NZC7?;t(obSZ*(VewnO3v(zvSIEkf;R|W9v8ep zhQk}=E%*w)0&kH2fH%k=jGkSadrfaMo*jK9%BdUAvYno^>@-h$X__}Z8}U;d9#2MT zd8#)xEvwv-nO3fT;cefwpZ;kZ&rY!ovrSBA-6D8Q8zz>BK8Dk$#xvqTdvK={JAz&)G6N7|%Mv=K%S_7e_XlOKTcS7T53b zE!~Ls_jk^o)v?b(_N`(SCf8#gu@Vzepl`bf5!#B(?5p;}>)`XgjL_DXD=)JS`kHoH zUI#O3&8QnfYbW^_QB)8 z{3tTIqDt8?R|tQDFTOfwOwIP{3GMt1gwD6P)!$%+8^8xf(&HrveKa@R_oTVB^$=@k_0Jsyl zJnfToytc*q5S@^K;rnRkaovx=yEY%cGa;~o=Fj{iYzz`chRicc{8W~T3(c9g^g*2nCOiiC}9clj2tTnH=qa!~$|FXX4wFUI#0$916b!tn!zB2gz;x4urnd@1Q<_-$AnQNvN$4;CCRl1@b%i7QP0`@8C<# z@8EOkckpG0eg~S@!TD|Dg`Fv02OdO6ad=BjC%nrmGEz-5BO|M{3}#K!k?zSz3&_%G zw}8_&-aX~-gc$FtHJOuC+6hGo-sfOD+URJ!`_A@DEaP8+j;QgDIM8^f+b@gJ4>jIB z39QDrlW)KL@%kL_yH};7aczH)_RHiT$FKTa$LK#<8duB(?61u`w81G%gpjrPikpqW@#CMQD-}_NVF`qA|pMm6d8=XPNq9O zqG&(;(>9)+V*6!VpMya2w~p+W@Hq&EkK@`dKEB# zlG(H=cUrA)-VLF?m+4PnN`Ha{@F%#mtv>-W7?^XI#lW+*tuH|(@)g)#3X^O9m*Thi z{w%|&M79FtGI%Mro&LVCO5`hmx4=t#54ZI=V8((&Wwx&nT!t!cY$nAx|x|;UT%6b%gYfH*_%rY zi(I44Pa}$&Z~PP@>)|opDq=0S6!6AvEGLpnAkcdKQD{@|UlC+pFRG~i6+nThgOMXQ zB%-5pfZN;o%Aw=#>N=hRA<){yn`Aw_S)~f~f?1nLyYC+CVaKaGUhGpeUhIcDcYp@h zFmk<#D(n+W``E~wH!-h)DykmF4^u8Sv}Q$qJ0B)V0oQY6sFVW7=D$Xx(>#v&jt5}$ zup7U)HEDbDw!*D?es5;?-s&zZt}K?>y{{74y`5Ti?;`l3T}EFtE4z30LEk%H9g*F8 zXt>DkeOdT1vwKgpvU~UV^qk6Y@pSbeO(yaD35qXiTYn)d(7qaX9we6I4s((#ycxK2^LmSJb;2_E(>B&{VvW<{|K@nv@w-w*jUj`e;QcyB zZg>RuUf!eWI!HZV-SARlk{UzkI2~vV8H>8wVT^x6y7J4^t=3#LHMDlu`G#3k z6b{Md3O8-*kw?a~`4%B-nyne{`)o1pm>hG_%dJ_xi?5BYJwL|y>ipVw&NrC1wd$O& z*ZnrKa!a_;IG z59^!%R$c-!b7NeZ@==`m#vv<*>$KV-$Q91fzHMph^Ww{`H#*w=iiy97f6a{d%MoG2e=w|MbWMX1}5XB4=xb5f!0F zTyzvaTHNcZ*;h>~e7A7SZQk_MGH1Fc%~6r=a5}JhV2cetlNpLgRR!`CIkWo~bi@4BKM`O@CZ^ObywJT_K7@1->-oX@-MXXzlHH$Roi z=Z#N=ah+Mp$F|Am?f+Euf%AEz4SzoGU_aj+na^8(&QqPw+v`BUEUZdQcV=a0XJ=yU zHchNR!VJ&jb(UA0vT?gLE|wU#^ZoZhF>a5;Jx>%dZqHUXM?5)jT)t7=^dYA}en68s ze^{Z_7ww4ufyVg^S%LYSI~wO{+B}|o-kgOo#PpMRsWCqXSj`RR6LVlf8I8WGG5>jD z8lzD3^@&_7r}SC)tO_$uuEKrLe}#*IQ)D~ii8(Q08GPF>Zkk?NhWF{y#QXIMF+Gkk zxV&_FsWG_hw%d-joZtF%KeT6xv-!NqbHN2Qz`6|+i}wRPQ(%p=48?V9JLUMJ%rSL4 zWyOX{cZh9F@w>>E8p!8eyqiB`lSB%vX9RER~XTFBqYOJ(;f zD_?=Fav|rHwpYZQ(p=cpRSA1#B`lSduvFR#GmLi^_}=H_j>Fifdfp>)O>d zd4W0cmpQ(P-&k8M4@ATU%Ya2d(@f6xCJz0*j(zG&XX<1fAW~$d)nt@zxX=a+& z>om(8rXsAwozMT@KQutoS@Y05f9t|tsgG}o*hZV5D8gR(fD+LIy#yMc2FMEA&_)O2 zleLDvbqdO${eh;TSZj`At&Nvv(YcV-m{i0uMvh6#h^4)f{J+9mfjiw^**Qz#&nSB( zzbjSLqe=Vu>5~|jN1zf1plL`R$##uBhzYAn$$mU1j{DT}46V~gb* zM_Mdz3q8_exxUq6Ij+6M@~ zgO!rwi)UY4K5UD2*R=V(>qEN`V+-t$zNr`&aK}!7?b5_}Vcp*=ySZl6ty$!wEfRLi z84G;Ea#?A2)xnbawPmfGQHvUj-pV7p=KJWQIA7DZmMwJqGEa3>X#M=;g+7c9X1Doy zX4AmjdRRLLPje)to$%8Oj+!(k59Go4vw$QFZ%(J5P_{(%4fAm%@L_&tgu=08ic z?X+7?*JM?b?}5e(Ww&I0m5#=XAnle|#BCUl;HBm;*4QEKmiipV;=1H`(P?vx&RIf! zMvV*nPE^5d*edPEg@w4E24lC}hqi(l7ovh37k(AwxG)O+3&w8Ae9|3^3z_mp-_~x~ zfzOj8)fsdSvPpQZ;VIU6tn6Epnv&lx++DPD%H}cK$8DRib@Jck!r<8i52svY9lI-h#udyp_M3q746dW&Ttmz=tT~1abBy($hx;nm=lUv}F}J`x zqmpxsCR^>_`{kJ3UJCIod?{qw5|8_tl=- z>)wpC{V?s8;MlBr1!p0!p9)UvcSnaH^|i5EzW4Zd zwOeA(zy#<#I!xEltA=cFa``S2-p;I-%FZ*%POYdUw>AD;lggie{TnQA_Kq z=g+Z2st~U$ufEb8`$dlF{c~)>VxKL;<#3sAVg?7fpRwF%z9jyjP1s>=;n>o~V(D*V zC9=V(Hj=?vW9-BLBo}mR!%Ge9StsS#H5NqwJKu(0_%CfR)X1 z3^6A|ES+Vu#HahA*(~|}tJ2Z)M0vPj+>1)bnrF^MTfsa}EJwXy=9!E)$-$V9h3DW! zF&Zz*TDOfp=wBgps;J*?dmeN@>UHouksWAVjF}O5o|&1d(gz&dX8Al4II=(Ld7>vi zLG6wU4d0(HJoKAaVwUzdY9luuo>w_=X;tLc>#j3)%rK0LlitKWzkazN)=+z%jKe(} z?~h$*^b3hJX3rW}^Y_1))sN?yW4Gs+aTms#-tg$zv&^c;L(Q=-X`0%}`G)DtKj4|u zqgTvt2OBY6UOOB!etJcOfeTf%`Ws_v3)*`Rr%ly=+9Uo^z6~v71 zlT-WUm*<2R`4;uHo%GF} zXv0$9#*JZlZx4OL*W-!2Rm%=+@)RE&7~!fcxhpojz_i_F^FM5;x=u| zLlfRIV_Z#jFHUg3Rr8-AF>x_Q4_8dQ%ZP9%Ebf7Pwa7!!W24P(tJ@jjUa@)T|0XP1 zx!tUcvrXGo*JSz%4%BV*&0Upe+UD3AH`J}4;Z7dz8N0l1!nT=X%iPt)Eem)&r^{D! zUCvC`&?evf>kQMjKeX;ur>ktNXM{H~-tD={>x_3LjrCmV&9}Qelf0v+xjmEJwz_#O z1v6ZES529SHuBpsO1ME+)WET^UGt$xjm7#*fk>u7M5*G+B#-oMN{3dEej*A9(wtr%UdSo z58FI)LSe|ry1PS$d*;}Uu8$WQo~o{6rp&FsXYxH?=Uf)H;E5}Z$_u*~zPb4A;<`4g z@!PGwuA!uN?|+mmZQN;A;+I?f1b(&nNex2Iyc1hzu_*=L2 z8(~xqm}`_Qes8sJ(G%+{FWh99H8uE+Z(Lupbl)ESic8|wuP#}-aaYOWovU-Zux7q{ zRY~0go-SR(Vj^BSY{n<=uCES{_&TR0q-#yQQCSsf*cSE1^@=`Ly_aXJIdHggZhzyx zNYjQMcPVJ7torh>+55VtRddYnsd;8q7uUqa@6GaMUUbOQ!`{cUIBH$UD{{dzp{t>+J!1H+@5Yg0aXbW_r#Ud5kH+WvN#yKpSd@!R>Xfwgs;%El(Rn{&K- z^e5@c#20(oF1V{_C4Qy0i$Z!>95Z5M|`e>-vNq^3zlSFgP~4y&i9 zxtqth->aLKGl%)str-1T>F zUFiAO4R%kSy<5Wsv--vmpS{}E^U11i>dI*P&AWA;t%Gb$Ra2{)-(2|ZzN&FmldIcq zZ*CZL*io|Pf%{9UqLLnJuKnuJ+WF&L&F9zdp5U4?e8u>LO@*!@BUTh7G>&s86ts*@ z*kE@jG$gwd*5xB_<#HpTI>{ZuGqFt_b;YJ+UeV*dgR6_r{hz5-O;!34n;#r>c;&cN z>Ua-*_1W6_xi1`1YtvJQn;Qpx&Yu0|FU_mYZ5cA|>ET0PSI3xL@&LZ20|vjHW?yDY zW#o(9Z4v+5y)xn--EEQo>h9~G+~9j6zhUTHbHH_<<<<1-@vm-wF!mZLf5my8?EYJj z=Xt`w@G)-B*EdAeFWh>!r_dh8^L&#!&)rpTnjYqPPQiJuz zm;SYaXGg2oyy?FWH*ZP#YS#<=c8@qK^4#72!h#D&8C~l~8EeMr=R{n&);W1Db6bb! zq}oir?lXt~oczRxb5iX7Yr@^U@>)g(zVdt{tt+o&V0iuAV-|>W;fr`E#5bSUTzFUi zx!^T7=3*QB-aK}Jyyn_&Z_c~ex(0fcgm-`R;pX^%9$GX1*Q>aPUaxt?zaMTcx)|re z>YwlQ_V4OvJMP~{HGf^zwDA9}I(75Qii~nc8FGWe(;+n@yA&b27_c%U4XJ?2vNJO| zAqr5`Gb%TA28VdAJVqYgkM!k>u>7=GrI)o`l6O>~(5KYzwgc-L2Br6eT;C5j8X^YaumTKS^DT z{}1wDO`Zd}l>_Z!%!53@KPj*q_dvc=lNUq&054JOMjgO6N<{yE3(QzdqS&pN)2lT3 z_t+4@35Zqf#vk!M74r#E>{c$<+5XdNH`ZW7lK(W?jTaz~QWGp3Zv$lJ0~N(?ybSQ5 z*8XddKl6WHyRnViwfegtH)!p@19`UA-@TBNwElevIbG}DCy>W$@)wX7Y3(0^+#1Kt zZXAYuK{9MnrUE5v*`G6)bguFqM?}Pl5CX*jp zt;r8TuG89o1oD%b{5a$pn#}caOEme9kjpjsS;(U_`8mkrHF+&$hj#wemB4qK#bUQ= zZ1AjHkNPZ|(MB))es)QjI@$#MYvw&SPn`kxEAfX#cegN($4u|Eo3FXady~Ib+0<)p zy}fkmbfzt_YD^8FxZx&;=jI#P5(3m>H6GUKGm;<|N2K9pt=FgEuvYJ<5>cO)VO7mw zUDNtU+04ejbXG!0e*DkiPKefz|4wVU1(*Ii8R;S|gSFDxR2DZQ6*vB8^KjYLP8rrw z(k-p^kL{&%Q@Yg>byl4W?vrNy&tUUeqItqJ>-gzH!M(Dre^#UoOPR`A;4`t8wW~NX zH)XLV#x?x2jzpdHk)1r8leL}v1WxW^odqZBA-`D@Jw?B4L{vbdJEucpGG06nF=YmY6meg>!&YXdpuAi&r)W zMikn(qGK#*jW2^@1#YBXV%{4ScHlZpi4%3WuCkZ3IT9=X@kfEP<3*i3T=Utz1s;R@ zlk!6+R`sV*FWVtj`c2f275fq^{a)(jZ<$!>?YO@vJ+aacqF%1;Bv$%0T76=r-%Y*j z53$mR;+U#^Vx>>i^u$V^Lp@J03bE2RYW0bgzJ+>uTwi^LRx|+ya~;AG9vO_a2?V8p5|QS{gnNP=B7#e?v?|KS~&` zfoNW6D0brW1&$_86nGf%PX%T?%IGA4ClL1&xQtjH>v|2-hcNmAQHRe7(H9ELdu(*F zz}3Y41)fhlK;TD-FB14k;(-EhBEDGQF1W5#KOMw_gr4!cqPc(?C5MoX-o)QJUF z{h^IGTCV3yWSvY=htEjSSpw$}%M~0qvW~>JP@gF3)DaI6_z`0H;QS=9e861=oFW%K zHBv9hZYl^o)&Fj|##Nj2501_ibz*^2WSax2&l7qF^|Eip z)XV)8)3H&VaFo7Fbf4IO~sm~X9H*tZ$pApMCm_8WMBZNKzI3-cw zKGe%L&m$fw^ogt^+q{5!S)b1f(bAA#OnkYhU&i{Q1fE9y6#~yBW`GEk`-x?pM~JT! z`g&m1pVidMHlHURE$Xae9ogmv;-3rsCSv(pI}r}a|Mbx|pQru|(sqmg(PZ$EUU^46 zlpI;5?Ere>j1^A-Ze<3(a;wOnqm)|nNb}akdbn*^rF}haW9g38P9M)BP zYk=9Fy!9FnMg`{Q*2{W$vx*P(rYQmM>Lc-8^?{oQ;9%F{xP0s?#*4@0qZW4ef46|f zTvYg%Y6P-^I1O#;eSqhpH@Jf=s@^3|hXY|w{6)n+F*}Hzg#;l%`xM-Wv7N^e*XjV{ zEI)UapZlKkbCV8UaB}!LL>Xwu&zV8;bD0MN@N-u$?-L|Hm*YJT{M^sI4vU{F@aBP^ zEB1~$VScWAZQrE!{M_vFXz+9A*m@kn&rMu=d5bg)+32e-Xf&&98qJ!GjXRb^{9{M_#+_zOB-rwTja}I1NBUmjjNCo011UC=Zyd}7=O!SZPjrF?!=K5c||?+Ni~6WkvL$@83i zKCO4{p3dOYe&g$i6O#Ph>EP4Gx!(x#JpXw3v`Ow4PcL6})!L5vD)4EO+8o>RFMS&hlxU!>4`Z zf7lm%+F&(d!z^Pl&hrQU?;$Xs_A9OaW2jr9$-jrJ^J{;E+!u2RQ3RhxdxnxZm!T~} z$u9sLi%%QD35iwg#%p*#7N17jf+%+59RQu5*b8~9*4~GZ_iFw91TqF=S?tCaK*!?K z>b3UBr!CTC@@da%au3M8G?{#wLzBs;Srag;2ZB#~S3BQ<_%xl*8I1k&wDvfU-LLIW zKFz6ZC!aP{+fF{MHRgidAfL8OJ3mE`X$up@ZjevY`7iQmGqvsH(`ai`^~tAQugT=o z3N?8uh`ME28>GKJ9uyP3Hs2r|s8%uc~K!KN_D#8(PqOnm_S~ z-=d|sGu@V@bbc$AQXFBrI?Jb>YCf&isk<$oW|==ob9^88w0d0Uicjl;dywMOLUDiU zC4VEtiqA=+o(4b^Vx_->dda5|D?RxK)ef=JuhI0xN>5%w@oB_LKLz(6)ef=J&!=AY zhgj)XYW0bg{&h`Htn{B!PXi(fvC_}LIZ($XR{AB>%i|I&{aUR)vC_x$-T;|}Sm~YA z%XWyBezI1dSm{?|{~rpU#(S*d)10{W6rVPPcz|`Pj4{L)3C!3zichicjl-YfSNJ@x=0(crfuLqRmT*9RhP*jN;R{CPwjT=t(>^7ZywiEOJ{1Q={!M-MLSo5T zjV6|S+IV8gr&RzeK5Yi|lKZ-oSn_F0h$Wx)7;%pH>??p(|DUH`wz-ZtSJc_SIb z4Dkq|Uj>|!DDWogWt*=Oj}-dXStnoMZPd&9d|ps|S{Qzhiu>vXtoSspQB!={Kw`019d9OAZP@qK~#G(PXDq8^vq^J&kc zy0PJl)FN&f%V- z6Fl7((9^9uJl(D^Jl*Xh>Z>ZMw^o0>uEJRG#Bif)|9qn)?#tCqcO(7H7DR>GYQl`l z>PW+^YRU5~KR3U!I@Yj(4YTAwUNkJGCLP-^Fe+>M8*Ap6RR{8fS6NqhmD!KxRrZr# zd?|d&KH9V|kXKou_k$B+!6v!?86-P%@>#HRYxkZY3pR;fWjA#a3zpC+US^6w#U6wfb*B9^{`F!M6tT z2io=~$OE+Pdm*Q4@<)*8YW@ENvd-O*3tOvwp08P7Yo8178npg}15eW0vqPp0OBB0t z4&*7C91EFi)z$WMA%CFBeIe^yBiHUfsBOOpvd$%v3rp8NAGxrDTKyrAS7Z*4Rp)q_S#DUuV@$ZQSsrKf&`Pts$I^tynN^KP zJ&MPf<@sf~jaj~A8KMzl>2YSctx?V<%Cu^wT5e(OJSce3m7bixs!y!+)ta7I>FcSd5fFt~=?9_jsvTmbA4R=9 zF0s;+>sR%OmHt&tPptGGQ!m>gR(f*ysvTmbw>UA_=UAS{D_Y_f;1t-gg`w2atAC$it z@2$$;tbsUL)Y(ehU*M042MGKr@kIiYzg7HL4`RuWajlW!#HJFTFX}%?EO{!+Z%y)1 z^yOCE*R#MW^2vAu^=V??SBWLBwU=1d`HWb8F^7nyT#_{^j@C9VZhJlIy&k-U@T|0X}Xf$LfEV-duX z%j!Waxi5=n8!FnTZ>QqN(us3~eiX5+Gl4i)=&uD<{hvm?Y}4Z0@+qC#MS$`$#OD<~-@hDNBoSWjZc2Y0-u|33BiaH00 zCEpc+-?-wzx&f>H^rc?5X>o2p7yBl&j%<_sTgrt(KbUxozz$7MzCA_$9>1?XX&BOf zbR60@cyJtnud@eU_<8#|Dqf8UsK51d7@Ffo?Q(Ap zn6&ZU!nRD>cZeC;EkMl3yUOFir1dz?n2~e37X4UaMxOhPC)}Rkc`)kIwlO1z$1(!n zyjQIFdy)T(ScC-!{$T7k5JB?clz$%8<87q3>4dnxiSFhgIjED*_4PU72$G|{1FMUF z+Bsa`3+L`_A3^foo@S(sAXypNGLMlVC%Rt?^8B4-4)4W3f7i&6_!Q&a>rXGM^hQAPao9`2PgNl=T2S3$FkJ2Y-c7s(!Avr-t5ebij1<1 zbOe0#WFP=!Mz);Y`yU}Kpq?)&oaN*?hm#xNe^CE!@g8?;`#*;7g|;G5?8ff_VmW!R ziir29b2iUHPrHREBHknI21M zdo{T?WX6F~+kXN%N0XBvk5Q9J%ozJao}=|Y1@a?WeUtSyISVpNxcenk7zRe({xUb{%MP}?etI6Il22F57V~OKW(%o(?5-NCH46pft;hs^iR_{ zIr^v3CZ+1rKTYT4o`t+uYoGpUpK9`2$T}ykTH<>k4sJc_v&_XYgY!>IM^wNd;yt!{ zKuQ0!R>gPqPqV@srdhEY12S<|3`7y{QN&3k9hPpzNfh*$#in%}@6n2;nC)lFFu)v* zd~>oPE!?9Ol`+i<%P7b8*A{L`+*{fTyO7GlK(&7xj%N5o1`+rRQpBUbv)sF&>!D?MY}DLt{$ z520Rial}ghh*qCi>DN&&`$MesT$7^OCsz6h^hN23m433OCsume=2iQ|N?)(lCsz7z zH9fJ?)26Q4Ay)c)>QRq{Sm`UMr*RX7Sm{?o{-OA%@gA%Ax1+^-9CVR&8mx6OihtYA zeI@^9`IRM#Iytz;6c1B^NiCbtM1BXC&pHRzxh%!x+}d z7RMS#eWJj#h$VkjO)NRCMZ}VSdl*>xr_rZfacj>KUnbglm00p=yNPpzeh;wf|7X<8 zHV+WziaLi_NAh*ixUQq~guV~3;?~ZiK2hj7?kiqy6!9>jpTPRV1)f5EzQEIn3k0?} zFPZTqECWtSw4m_}^|H-piAM_kYSzgY_<8DOeLfc`KQwaVif20nto+dI_&q8P ztru~TXvgwN8znG#2gSJ!1y=pB{L>_NSIj!2Mg8%tBY8P1R;2u{@1$OS*RzR#F6vhk zD>C8)a)$X=0JV+k*yC z`51}I%qpjgTbrfz?^xU#pLbPJ)1mg<+9tI3Htq?>;?~AR1;?%3ih99tYkN`eS{xVD z*-_&?4nu{1$>(=|76sAmHr(1{9dc`C8r;tOMR9BC@Iu2MiumvMPs?)3>c`H! zY7>*%d#TN{;yp&#qK_-yW4G=j&eV91-+>Ez;26;#b5Ah(qx%es{uq72(H|`??021$ zO)WSs%j2f&4mcE5ajxu*Yj6b~;lfTdRwMI)h$3>IP1oe# zV}s6({SmUx4Ur4mjCp}5f(xU4LCL{zVdFSyvr2HW8g>7(cd(z%E$oH7M{Dmx$h0qr zVmCekDAzt;FkINPT6^Te9@b=XVGWv0E-X=#$%W-;GP$rGnoKT?v7S`_0&!uwKN`8P z(c1px!a_BfT$t`JM=nf{)krR^SUVoMusPcIM=p$ZEY%-!VLEq3E{yX)wVhlT?PN+O z7e?EflF5b9?xtjNVR@QNF6gP=S{%9}+1rw{WmHP5qpp;4KEEm>3_t`1u!dkx_%@d8^EWh&a3m4W= ztj1{EuM|f^thks|>S??~Ay#_&%_uI6Sn0_fsCI~zp7H6Fo>=M0DJU+CSm{UO{-Ej; zEB!6h%l;56J^fu&ePX3wrRj;4z6b6Hsy?yO52jwWPptIgwEDzK|FotjR{AZ}%XWyB z{(x4WSn1<29x5)3Sm}RATv)KN8Wk7D_|%FEv$!+Kg*8&2XkC)lIIXxa%U4WtQuMc1 z+*3DPSBeWe4_I+w7Z9h3b}l8pL|}_klU&#s>gAWg^(=}DBVVStu&1b($7LK+#f7b7 z9r?t)m3qmAkvmpgSQG0=E^H6=S)vc$5?>^6D6U(@k63vOb>+6c_d|vE;2*04pwR4fT?@Y9N+e*lyxcqRkJ8uM~J6u<8%}>Q$Ro z%ty(Eb%9=SVHT$*ziZ3SOmbmd52Uy-%g^k4&V_+y`_cKCeSil-UZ&)R@RPP)92R&P z^RW?^id9Y*7nTYVNcHbnTv#xEW_O^yV7Rc8;b+D<&^b7p#dz^t^I1F!FaOjEct5^~ ze`(L_3ZmO>>J@j)g{7N*Cal%ZEIm!JVC}gu725IGTv*~+F6=B9_QT@BCZF-K8pkY; zKPn5>8mn>m@;->wI7Y^5%=Ko01)J>6Y0H9rhgglFwdWxKStz6*9k^$9D4>uZtQi!ksFKY z&2?)hF<1$~cyo<)@A?5SSYzCOJG~6iygzlEsS6C&nA7cTcEwS=xvIi`@}~tC9wVyd zg2;yMe`=}Og-DC>hr_ie_)6C8+ttj=Tc`M2*JgMHy3Wqb(YgUw%m3y)sUb&VO zk8N#=dY+^5ESJ?eT-Nc%TFmi3aNDhT6$3SSIlh;fn*4jnw3&z^VlC?21-Yz5HAwvgti=|sztbTf)Z|}4uF&?sliM}95;A=zRQq!w>wal>L)N*g z`yn@I`!m)eZDMMF##*G^S;@bH%yryKW~@c}Rw$XV78&16$&9tAb61SDSf*`fti?i2 zW~@cpr`7%&Ag@#lSMmGNOCWCRWz=V}?9`}#>{yFnK!S<2*vg)C9=AoutIqN8VoTXp ztVPSYE6sA+5fZ}-d>j9nD8^xyuAX&TD1Jw zPNlb3z*vj?e$PC9%YkcJ@hilNFVSNyk|$6c53#D#LOqReD8x!n4nW0PBv$(I)XU!# zvC=b+oYE63{Ug-NpBk~!({``w6Dxf(^|C+2N>9#S)hAZ^8#O(#(r?i8#7e)Hdf7g) z(vy={?Gr0K?dD2Ptn_oJm+cTMJ-K#OpIGT%r=CVd6k?^fI4#)MSf0o0#~f>M&_L@n zSn;Tpuh*rxCKac}oUJNGUp=wpnVun*d=mZ06?fGDtYR&0r9MrxznfTcTAvZ83Ox;_ zir?x&Y_ZuGQ-~#ZH5ypOS}dbp9`_bv`K8Wa9r;Xd#Zi=8n&o3A`7QEiD%K*OnN+Mr zuH{iY-)h#8ywUU2pD+5!F&q+%Gx1FJSI&a6<>=UN;UQ_><7+TmIq6;qM?S;~b%znAsp^-umx zeeWL=j}dh~)#~pjP7wN&8f)<+`h)!#V=X>^hI3$HAb*18!1!FOih8VW?+-SLWD@Fu zYOwx< z739Fi;>F|Q)E~itZ9vC@iM2SYV-76S5r_kWQm|j`IWT&Pu^gKNi$2L5Sk)1+7M12~ zti|JxwRqF5Hg`zReiz&o-L#`_r_Fs=&v)M(xI5u(pk6EA?w8y%x^BD8{bH|vN%uwf zOZ;iix(3vb+49cTzi)qQ_pX*VKKkE%uMJs0^rgIw`EOKCe6gpkIJc*5Y)CKLxZGX| zf3vxBV`ARE*r?ltHe%{FK#r|@9c{-Z{N3hyF*f04n=2$P;g!z^+wY1s$~Z@d#*V+Al_A3a#u`vfoZ$V=8HU#vvyl$Nl0w> zd-AJ&kzeFY89wwyU&Q$#32)`Q&4~A1O$$wrEjr=N1h?t3Mc1v5cR6a1@e92*d#txj zaGN%7Xu>Wt#?_SYPNDm)n*R)miHk92x?|#9M!Y*=@l1b)GGr`!Dc-%})uFE?ELpkR z%2KwYuF3Qj9MH0qHP#_Z8FG(}Mr_6HQ^rnnFDY(Wz~kk+d^OkQOmVGU=bL|>VbcF= zOTKH`SkIN-zR7M+iPw?ra*XxlTUpB7-VqVtzudOEc?Sw2++(hqFp*ixl3j~N9Xm@| zp}X#Z3YVu_ZIS~$3AZI|ZyvS$V7$9&p{J@m*6H?y+G58Irw5oBqZkZT=Rbk~h0X)4i~8Zv8z|@A*3CvakhDTxnEZ z*v0V8jchP$`Zt)>1r5IH>l#XW_x?x8(#D-;Wes#sH2CIjg#P`8lK6@}B}?LWnTsOV z`>Ok|H!BO)`{rJ^e#er=f9zOt{Z3oI5k}>Jxkkz2_g4EBJ+Z#>!cB%*Q?uS&v~hjO z(tUe;HSe!4iCe$AWa-9TC5v~i&h5gQ+e@}T;OWvmEGFV_ht2rp-SySs5nt!DgmkTm zH!7)2caU_|!bJs*7vl z;`e5SclCsY_3`ww55e^_)|+F-RmCnp=MUdDKXk(b48KQEm< zE5e1?fA7`Jb08DmlKdH$oA%|Q$*ytReAP2-rhQ6IyvvMog_u`Fg*kV65IeEVU4Qr1 zg`R)iVE5$NyKS9dR^J%nvsb%%K3UamDMq9BXJNJWZ{Dr*Y#n54s+wBW{N}=M_f?In znq1v>dvn8}!+9lZ9(c5*Dk|xr=Gw0gt({-tYVK3}_5_!6Y~A>TO@*!@BUTh7G& zv$gYcUm(Au_p5o+Q-_-y2Yt?-{pK&tsR)csF&Eo- zMw`bjkl%UR?ag@?ALfyhO2WH8`fzjnKM$>$|Bs`1VOjk{p0d-~zYCAjzpnM840?*K z7^lvHb%iXw;m^N&Zgb6h@D2O@sbti$%N(T{X{BYRiO`4+Z>G}$uP}s4G%FmXS*ZaT zHTA5CA1#1O9(25N$oGWEcsY9(N)Yb|%JT&*0VlQjE z_OK1vhQ*X}nr(>fSRknto6*IP(@!HE9S?=97aN|&%b~cyuM9J80G8$epfKYm{FkN$ zOTHEVlkpOzbNIBr{?j7jBu>-h#W>JTbvX354)|kD{w?rIt^Q+>AJ$~@X?r#KkC18q z5JluJ+oQ>xlg#p;X1nnM(JrR;9}GE3lgX!*Yclz?S=#v^pLV|{ zlTWMD&JX!Coo^za_N2C*d>U<2>iAbdUZTm9A(v}1`83+TRDJSkw0|j?zG01;d>glG z*9(2aDm0nCVd_m$rf(Q+QmTFWhS@dwKFG9dsqOR)JE+O@4U5pu_al(EY1`== zMmv$(pT1$VIVqXGVJkHGS;(|osqN1}PS(!9+QRoheA!ymXBmb*F)rdZDO1O}_mRF} zS;56cY~^AkU)HMluD)Pa+(Qv#Fd%DY5mX{BqLo@quvV>c5!0Ptn9#F zo?olEf$>W{<9xsd;6A1J8e+x2JP54fAv$rbt9Xd1xGyOlhgj7gO?@|B%)-xA>FcR4 z7J6c(Z=hcOrihjP15Hn?^j&a&QG6M((pOL~+aXr^YU*Wwh?V|ntv<2R)Bi-ZL#*@{ zplzimR{CMo%l3(t{zk1nvC?nQ^u$WPmwMR_vC=aSkvcB1($fz_@nytH|0GVaiih|V zFl}Tk+wn?~4^*+Z@2DJM&l5|-VhizkR&|3pM^!$u{ltBR{t&U`2=LJ4_l-#>{;8;A zuwZZHjUUJ+O+s7`DJje zlJfg{m38ECcWe9ZVI9e%eMY_P&jDh|snNen@lAaGiOv+qiY1nxy$`VB%g&=dQPjyN z&K7tS@eqNFiRA-w8E}exkex=oSf>Fr9M&UImSol3CwF>ac7CZDZ_+5mHOcVXA$QMJepY6nM_Mh$vU#l+0@JWdzsU^`k^PJBcO#MNUfbXx|bS zi8}P}QvIP1r)o2SSn_C$i>my}=+mXX>mk%s4H$LII;HXi;sCuXCb?)rMYSd~{FpJ)7r#y>3A0 zg8o+;3m(76Fy}@#`l<^W&FY#)vu0!CjwKQQ*b%>Rr&$xZ5!}|suJyA~r)FbG?`CjU z8#k6LjRbG?=IWBTmeu3Nfwj7)duVO-KM(ts#J^o%QyU&{R7HHf&I#tKw^7+8!m!N^ zCv(+kR($~G>dV7x=R`%Ay$hP=g-?w8pkt1z_J%Kx%28c$L~O(0I4ZaM|AJ&&PCiE! zUHfila8!>6^a$$|j_TeU{%&zpW>{%4z0+j^YOfj%uv?#naor(xdo+ zb-+>m_J-$v_uQ1~f5PkQRB}{hnQ57+nHi;~H>1=6UoUukIWp5q)3e|K=I~aOYL8}q zsGiZNILlFW4o9`e|Bx*>swDrzwA~1Xqbk$tKZfsRlqUZk@&lSoj%qU>+^r%ws(bNF zuVl_4Xd6&+FdS8~*4}H_@mL%c*PN>M-vQ7$fW45P(c1eEGHnB*i1>xa;;80m`;()( zQIpA0-LJ{ysPy=Q6fB7Dq^LN$9+JxL#*^p>S+K&Ay)dyT76=r|COdER{Cw4o>=Mk zQ!m>mR(j?gQvD%T`stdUSm__2UbaK5^voBe+96i@-PF@yh(fINPeT5oa8$gvDvpXd zO%+EqhUEB#Zg&YSDL89btQ_U;+hiWi$xwwaa6yeULJQovE27w){z|5qtwg(kjGUV)zhrw z6vyK8kK(8{5MLzpn^;Hk78W0tDD)QBC3&E4SYL8fVYpTmpVSLjaa2jvOFn5JvE-=o zh$TlwJFnuX#sRDTUr)W{sBR?A5q-FYb!3~>)aMHQBI;$|?x#Lc=sCtKj;ev!CG@Ye z{xE^}P(NJY4~X*xra@nER6U3bggzEHB~jpH>Sdb)iAM!e;TQmZEhyMQna&$b!3|@)XVSsBkJXM zy^nabsQ(%9_nf1`T9Y4LY{G>gN_YvLsT|cdt$$t6PuxZZ^w@BQEbAq zepvzhvfKv~Pl%&>=}5n<<(6MozoxqN(l0AM#^~#U7uJhChR6H8vJ#fS184V2cxAPE zWc5F!vr`H0SRPp=%VQI^Pa8X>BabY`A`~83`QCW2Q|9Ecp~xng;`eYj`h@}Xd- zu2CLYjSKJ*k+!GdMbiHt-;R&(l)mN2OZ>|1%U4^mWiQz`q{`p2p z+?Vi-+WmlMK~!jEb(mqRi8RcrmORgjb1!WZk?^sLh8`J_u&TRfj=hg(Nmt$f>7M`o zwt4aMUkPq$-{#GM{GW=Bh&mV?w=~xMNsuhb$>)}O)wY}?&4~tux;C?H}vvwwPOC|2t67CkhZ>P%x>c5Z9E{&sy*6HoxKaRpLRfXO4 zT-W4b@PoQS_k-e<@|)-Xde?LB*8Fqrys(TvH7$JZPey^uH6(FBLDATY5;F&<4NgmR zq=FC1NX@nu6-~lJ7azt(-+tpQ*NmK6akJsM{)StAHudJI-bBwWxBu+A(p$0{sh1&MLke|`yk04*K_5Tyd_iEd}fILfU?-1mbT7M2h=DKH5L~OweG&u@& z3pKe1b_cxE%>B%{?(p*55zldKz)|g zI0kvA-BP9wQ~SWaQNhF#JQ=(bJ(@blD=L$|OO{8I zM$$c`EC(yg7fO0aWw25H6AoR{LyFao@Q~v1PNj!b>(|qkeWK~G4_?_cIHAy{Gw2)( zT0XXetcwCVsG=pNiCW)!dvC?nR>JuydKI&zEh?SnalsYc4(x+>BVx^~jT-7I5`lqRv?Gr2gcC9|K z(x>uwFF!A_(vPNIwnMD+cTkTP3$fDIQO_?Kg;?pIgggjqr&*rDOT`h~4xGXZ4J8)e zb@aIcuOdzmcn`5O^65TO`>6kksI#A#7aEH0BbAD4L)qwu5dT!vVO-+qB!P>F<*|x2 zJe#<2qEFQxWm`LVpMG zAc1ESOTMR?c(BlOO^(Ww^%(W3LjM$Tn!t=DtT-yJ8BzR`6<<((G3VjhQ*i{zQK{I0 z>D0^P<`FwYn^p#U zWSc{&&l7sCdr@)kxQ0gcnd83VipU2mZfQR24;TB=FFZP5;75ri=Vb9%vd$*zM~FIG zfK{wMi^m!!^jr(0c%~0nN4EJf_3|9@xj=D6eTgNvGzeI6MVC@9`KMvTMWX#l#G?eB zLM(ZvTYy!6EZ;2IW;N@K7WL<|j%;%g@r6QP&pPsZUqQY6-k&D^xu~;JtIzc~rzCdZ zN%W&a(?2?n>Uul}@bcv&1Aczii$lk7yl{Iq@U>cH2L8*(0ZYa$(JI&Azg}-H_?8=@Ql{KE^-_Dw+t`+xLY9bIan3d-mjt1+dGK%_TzWQ&o z+t}V3yx3kUUM$r(STG#b?@(`=*v0yaM+M`LLsUO@?7+Pk^Vy$ts~4T^N7X&w^u81u zbNd(Pw0ctMy0gAi$L~vZ1L6nX6^re~AUCL}OG3`vMMRZIf}j0BUJ zFiE&x8Zsn-7!jC!K=_hOCMu6oODR`rUtc8T14R4?qD?KOVo|BrT7nd~h!8L!T17-e zq>&no$g8MSks=q~^*?*B$x1SWQ9f1n^Ca_M>#VcSo-=1=&g|b=>-38KMK{|fR0kxh z+wu+7s390(f0=3shNEiW#z?9m7)~_=BTx;nUH4uC61(;4Kcri)xKZ7D^_$#{mUinE z{l{*H-XHYp;J>H8k@*j*Cm2EX1S6=PU?kNOjI_N&^#i+`^#ot1{<>FhBRdN93Ga=n z-a_>Rqikc{d>I(inQ`Z%YGwTWt za5*eX+gEQwUBT*Cdb+r-;0PD$3Q`@lM@G16-U$hFgl@4|Ew+uB?&UiMze{xm>p`&& zZ?tVO>k7V6Q@JYLVVPs8d#(D_L9UVvPd?QZ+&efU)>WtL3eGU=3J!9wuk+Ov+&RMq zZsm>6cYEC4lzdlF9$CY(U7kYkXs50#xU9hG4jw+>2GkYIchv__SFoq6dSMi0QdRXX za+jd4;9k@f%tT$m`-&rNE@D`b$A(YIuD-u$Z_FO5DOk6MY6@n$Puwu##<&}TbLWk< z6}B6Ge>V6P)fDVQH3i#u&9zZY!6|{&6kJfzqNZToKT%V#hHDBg;F^NFsHWi7cP#@% zO~KhsH3e(Tnt~tbnu4!WO~H3WO~H8?M+%->=&9@+6jA=F->QP8{;LXxwyG*v_PUF! z3f3fFbIjA;YV$1a6xW#d;1!OLBZedIg*1mZuY0f1r%rg5CHJR0dsW4M_Qdw0@uPEB zk6g4T)jEiO@woMY(}BG;U;f=iyDLBRAVrlY7B-`jluBJYpBX++`ZjO?VYCPAVx+t z2UlFtI5YoHhHcm2-Mp3Bf{2doE^~w&HSkK=-3{xK_m^gE47Fsw8Csh8&rnO&7ojzM zV{2>vR&l82sm$8JWsW|#9FD8#75qi$pN;)SpBHG4=eqwM;2tMl7v+-m3bDt(d%ePz zd;IS2P_Gbs@mDW#F4M96=6gpS&3fOgPu|hizFA*h6MM^Hr*GdR*3iDmcT<%?9E;1w z`#%=VDv0$SQ3bI)`%J1J;`xjgRS@IbAZ+IN{(51@ciYNS-wCa{;vvc+dvpEyqkE}d zZ)$3Sy(Ga~T;gyR)1AXoQ;HplNdujUi3y2bJ(ppgCW?Q2E(_QBVe%BlJ8zS5KGzt6GOaz8Ar2{DHi?MEsLvZxHq~WcR=i z6|-55ztAJ*M^saJWSA#l8^574eY;WBI>g)@FW*c;@;~ss<)Z&L$i_UNYO2=Z6Jq^$ zX+fjt|9!IOi}CI!8}qEHS&ffLVE&Ws&q!e2lWp+5$3*|f$lfltf0As>L#d|t-sfVx z;Cqlae)5UV|y@kRC-zyR}_})-qgYOlJ@qq6g6weoY?@1Al-_OXo;O&F&A*X_E z@IB0@vkkt7`N|=cB6Q{$Ri6D%ROZ86w8rEwo2Gj$;Nyc zZy$MNPO(1n$WXtBmm`m?zp#-4 z<_>&?^0*k#uj~QUKKzy4x2DP~6OLA;hjJ2uw@eU5kHBUQ7e(0jZ}16XIcWg6t)lWfPn36?Rtmo>@?_Exd;+jOPUJ zr6%}Zhi0#!&)bCe%vTmK`NhWf(&+PwSras~qi0Do-^-z6p7YC!>GO#h6g0=rfgclb z)S%f9R=}(en*GRs;eMdme6J@I$kIIsCdGX!h?A@zCtwK>c!l z*=EvQ1Mv`Pu7TK}K7W|G?S$47q$i-Sq(Evx^tvjJI$UO4pCDy9c?w9+}yKUF#( zI!5Ut=w3=sf!5o)Q|M~w-YN#?3C#EK8Owa{LFm3J2K#!0rn)Bc~8Gi2g z4rji%4*EaTcs4_87Po^m^Suw?*DUTJ^v_g$dpdrZ?}b69DL>d3kG~)Mx=*k#=6eZ< z(S2sZpRU#&0skPSr^BzukNj_bF326{=YsQrFqewo4LwxpM#N_*eFXkYrB6U-DQ(sq z)G@v3y~Eruj&yvqia{-I?h|#Znfsx}8*{&5@auS-FEIDJ3z``n;&W7=i{RIcZZY%- zUzIr2N}R^LX~culw8wJyON&M~v?C0Q4y3{{))B$ADkneaH04MN}7Y`ZV=; zD=XA8GzJt;o<7+aQ1r`RwyI({(>v|wlkV`|(W2^M(bP%4Q;y~}51ZVriygK)DQO+j z{0sEQ$MK%*7C6Vl?_F;6v1ztR^q)S)eZP|Dk@gq&>lSg~aQGdYM$?=j1GVZ0%mQV_8i{owR6d1>QkKzL1cq3_JfpEO%FEflU#C~B(yMfO2 zn;O1n-)b^_ypQT3rlk1ec;rkl{p!E39%8Cfho7F~J$Q-Z(Y=JePx)q-I9}WL2W!Uh z#vko{ZaAK!6~}V~$nmIFVrz~!fodfN#_@)FuOyCF=(U?1Z>V=DalBF95ogTt+Eqoj z;&`)*!-(TuW(ftylN7IR+&wqGekzJLuj`1a**6&VR3-6H;8hYA$SR4r!&mbviSsgM z5q<-7XsH zHo^U7fP4JMN8Kj5U%IeV>xDM%?M2jWlKX`VJH9X0otnB$EdM>-U+jERw}H-tRJ+${ zPw{w?y{Q8|MRt42z$C}O)PY5*MUJG&;xy7H`MeX3OU&);QPTvW= zs@-@x<~B#fKS}FP74|b^*9rSCWT(*Y9Mu$a%cVI9w!z$*YI6j}+{VzH60iRTiI&W5 ziFkfsZVP?C$JG7B28r?Qr{%bYTQ$YpPKfb-Mhjxac){EjiT?dDw^gD)@Jh^+sb)36 z+%^jv%q>RPU~cKc26GD&HkjLCF@Ar{?J@Cu!Q3#%$J@tm-5_D7lAS4RFt<$6KbRZp zSMmB_Zn)a>yk}a9x8nQ7T$LoW+p}rm4tnk8(r5 z?R+yge+3=E+{{_{?+bH#j*fF?ZejG9!^|z5KA)H!K{NBQ!{0@{BcRz|34fmQL$m)$ z`1N}kn*GS_VLvqc!7iA&L9>4jeg1GfH2a@~Uylcx{jZ65X!e6Ga6i!O??Pi_<_69F z$KcoFhi3n3`1N+7*}o5d`a^?ee+oVuv>%%NW8l~QK(l|Ah=*qX2I}|w#@ukd3^O;J zCoprvXDlj{5?S~nItQR%_Z*D0L?t(jXcw0t*39jBXq{7sT==jw)&FMFJpNtq>pu5D4^c7oh|zt134glsABSI$4f*T*Tt<`T z=aLV9w2H_105i98=%LEL5b+sGgV%*+D*Y^UmeQM{b<7UvVamUobbPeZ;OE@uA?V@C ze;6^DN}Ehi$K!l~nOiKh=3_~unYn@2F>}j-*37LKI!E<64f-af?;_3PnFqh_a{;tw zZVw|yGdD0jW^TB~==;vxevI`UM|QioncHJxe5Ye>IN#+)ALV9i$=vo)e}OQ!sl?J4 zA)_NY1vmdT=|}j`=2BcB%^*^0K^Tik_cTd2i)EL+jG{Q0Bj)Kk`6`GgbM6K{;mt{XpZT=hiCnHz4q4_R|o z%9_hIJe|5`FDol4KiI13;|%w_tZJ(JXl-w)2r^2`b=}9m*fN{def)D=X6w3-CM%mA zYV-WQb6kmg{uPdjuP8&!OBredRfgK1%nY@wuKil&rybfp+Fyp+@K#kIzZ)wnaDN&g zxjBcdEcu)D^C&|tvTFYsva(!csAZfsLoNAV>*o!53Dlvi3um9z|Gr`CvnLzs`u~eF z)P7=Ss14pdV;9HN7A&OK>xh}3wqjz#i>Jv?t910c<#4*n!J74{5s&<|N$$4;+~4Pr zlwp4ld9eh~zbikt`o|l#{`bj-*W>^F?n}r+Y_)eD>wi+^r`^|QsL?q#$2gYXeBY>J z8To0nZ(eFUKW%WigYwhtzI~I5{IpT10ePYF)1LZf?Yxa`=ckRjkoj{MUxzlvR~9s3 zRb#~qtL6sXO?hhnUUmNR)DjX>9FBqBB&Rc}B*o$MB$jwmlN^c8grvzOMM(~Qt*AO1 zZTgS%Rc@D<+1X)cEBHr+W@eI+Eu@_-^V0CUL*~ig8bf)%u%%?*L-RqZS&e5%V1AM9 z=SW!Tw?Eq}Nh}xk8nRJ8N;Rvoo`hZ4_?;q|(JN$s={qP?9m>Z={9Ckqgzxv0szWIm zVLdI+7R&dOJzCfY$*vaT2Q!n52h0q=yHv9p-;j7%Y#%?awu$j|AU##|XC*sd*q4!w zx=!3*B-yAh#r73s9}_m1nXFUUo9yLc`88zAJU=kAeDVB}$hL~@4I+D;SRc&ngs?MU zi|3b3HtKHi_--P5s@Na7WG@nSA=$qX_9U{igQJ5#@u)*785!zOej=8yC3~l^Um_dx-8|mSWUmvi2QR^+KZf=S#iJF{n8489*EW1% z_{ZQ&UbG!RUCML9(2#9*b~4tG;g*VwwZwrcCCQ56%8V!Vk^+~7KxobzE^#tV!=qpuBFum@l z%Uv^TP)4ixk%<4P(&M3HlrDz0DQ)JiX^onvoYRK$2j*z_Y-Nu28g#5$cQ15brOg_Y z{ggfi|20a7)3L`Ktp~K`XerSBRgB5kbne}9_%+X339Y%+YG}>KaQ#ud=4hx7z#Od} zTJx_X&^iX!!!SoP@1>?W+6eeHBLi!Tk5S_(fnRTTx>$E6Vl+FO55FFdnKPHH)Ow684Hm8}?Cy3GdbHwQ9ZlmLwIa)NdW?ucEH6t^5oMv8`@N14X0y<5PA6myu zhaRH*GfDf#55MlyWOL~%W+7s9pUV;BQvMb2YsR-5em(w<^d8~o0+!9s1?LCMypV6o zj4T`RnX1o1__LHQg4XP8CbW*JgdVP97Lew8kxSsuP=1rmWh;$qf#P+aCa2T;7UvJl zypUrbmZRdq=9qaQcb_?0dwMT3JF`J+F4hlvq*`|XX&z4+{JKw*&5cqqxK=2Bgwo)2 z@qLsY2|ZfrT;T_oKOc1}>0ITU<+ssS`j4(oWpBZ<=q-&)0L;3LI7I0q+@M3tY{)x{ z)EW=;QE9eG^k2r!BimoxuUo_|CL6zBxN(2j4#tqC7u+t!cRJRF^I~q?AAa-7{#H_d zcv7MCVAad;^|+S)FdY5SYxM6F7;DR-xIkFjI*PlKK7RyNi{nV+HzDso~e@JyI zBQCx=l@q=vbt)$YT&FU_8$-k`*XuNio6DO{#BHQEr#W%^4s|NqSH-p>Zl%RhMBEHZ z)amO~z9{QdcI`Ui$5N;AisK$D)v5eLr|U~p-NU>O%_@~#|8VZBW_`b`H>u`f){#FO zUm8@m@^|r{wwXbfb(ZQ@=3PW}E5pyYZe^}Ft}gehHK!t4->Poq+AH?Au3One1*vM~ z{UQ5*3)1Iyzj5J7-@lKopZBZpO#0|qjC60ha7^ygV{7N#-FEicNcWlxJHG#IBYQ2N zN}gpQwO6dEt^l?B&+~ZiI0q%SO-^yx6Fdni#opqClGNg&$Gc6R~;J|LDO&ux{k!R&CIJC6@}ZkSJF8+mR$#P*QqCK)jD+>q@sD*bk9CUf9TUyH(i8bCb+>3E7x?;{K86hHKB+MxI-yu#x8$DeRSG z9~b>2&#j|azMgE!%(-Vg`eSsPC?4%e>Lai`x1_*oOEzUv={&b4$9K(hbAomyI)S_V zk~*{Mq^d1B5V)&VZAp{1ow~N9)4YM4kEW%fk5j`rCpr>v&S@e)CkUT{b53x$z-}F9 zj`Y0IIlO{C_9|*intnPKzAt%h&(h}@^SK=Q%;h{cumomB(9DV!!jH)_YS8RI2tOvd zs6n$I`8nJVH2ZN40Q;fYKN5aS(outE|7sBr&Hml+>+wLdAM<_OKQ#M$3O_XaX9zzu z`%U(y`^SL-W-om2I5c7MQS=~hVHJ>Yj)|~84(wyfu3w}KT zjQmXIb4#GFQ+=9wYx+zX`Si@^jzTA?m=mNq&n=9OL*8yrXuWQ4(wrv-Hpb%_1g%+J zI$|`R!#NV?xs^cc{ebIjI5!N}?(lPe3|h0U#n768ErZs44%b3)o*VMkn7zFQty$WB zXwBOWL#L_dc$74c-%7_g_ZbR3M8)9P=RCK5@TV)kS#wg4&E##-%8&1T=61!3EzMa6VfQ zz3-UAg_GudHe4^nj1Bqm%;D0Zb5#FeX3XUBN%MG+f6sj)cc1wjYF9GbTLiy;t<8M4 zRMqEV#Eeq<324pTsix$)t1U@iz^G3-fUh(1orw%+T{yDUNlEJv-(^bX7v+zSy^SHL zgToXoias*TKYT6VFve*l9e!rJQ0#4q7~kpG8_svR@z0@_?Ck*c7f7Dlj81{Ew}&Wh z8gG;y^{Kb{$Ya1_O6~|K&#jo)+ZWu4=#Pd?=lV@;^QqZe@<4y=E%6lWEhRNz_BQMi zd%Kk9c9!zoE<*N}do=dk@C}SJ+Zd}Z{``Zw@!X) zOU^TEONLm&PFGv98F?$~ntid>mi$hnEaEh^CezMRt;vb*j{>AT=P-W`l!x-?eo|F` z#`$wZ%GR7Vf9~Ih1IV8XoRp1szZKv5Nb*aq39t@?V^k z%PqdMQ{}bzuApOEo?+sAGsw6?cYvSG?af~Y+CdK%`gPD(o4DTYhk742neX)gJ$ttSnmCU}f!v?T?ko{64TU%+2xk!O9|q4OS-e?ZC=pO-Qh^iQ@GfPIk3; z{lLnQd%^vKl|3zNu(BD#1}j@6Y_PIoVS|-r3LC6!jIhDV>VyqeHbxvjU}Yu31}npS z7>^IEELYfIWii4AE5qCy$Agtc2^*~JsIZri9W0I)urkbd@%mt8UkV$ntX9}yWs>!Q zm0^C3*9R**E{FCLMlE z?ooqgKk{yvl|i$ACH(rm14>bFq6Y#>jqX_78<$_Yckf+eJJy`!@?eH2e3%uls>!e;0gakc|e-e&n_=D}!eL28#Q> zv9dF%2|1p=2bq=KNt#*NgV36l?S_t~9Yd`>9W%_z%v>|g%8;+mY^o<|W@Q85*R0G5 zov8XTbJMO<8u^&ayNaRpi-EjLW@XQkW>&Tye!bn-pfxMoff$|dwjX}Y?hZifb8+OO zF)PD460@>MI#!vV^dQZw>`M5f)i^VuHIK@H)~qZSTC=hu(#*=H!LRewWyBy7M7{}DbQI;kA%)pdLp!DWyPf9qm_RK{JKvwuWh*U--DP;rA-#6<8fZVtZW6e zuG6>y@i{6UoQ+x8Zs-xp|2eddIRSl>@`JhYc%n#ipJra$NEL(pduC-r5p#|5oB3;+ zm6`c#qm~?XpGFh|obgT^LyWIG6xg{$@jmbb*S#M%sd^n>| zIt4fXHt9$B(0)d7fv~cb6n8Uy&Rj<8)ULn8$}X|8A1*7KbkWy@bT5r+laiS=A!A)LGCbK!d*tVN#xCt|QnF#*6ryB# z-t^{_Eby9;W4R_|h@YB}m1a%I4wf!l6LR$Y`np~7_YAGSF>^v(c5v>AY*iET#pX33 z=XA|nRyL*lP@pv-|71&RRughrT)MxSki@v=QccJQI}i3(6Vh)kSk!G_b1sGQm)!K_r?o5zEN!uuCkzO*4)=8 z#{lVSvvOu>NNuMz2P-D5pBwZc-TUmS^OzHsoLrQcl9ZI{EVd^mIf{}zlT$p2$;rtH zDV~8O^e=GQ`J&+*liMZEb#`*XR`3r2;z|$D&i$NsFxd-9x2)rsO>;M@Sq-z6hOn2? z0-0m=4B6XpB5yXU@f}_Iwa4yWr zar{uSWgSOwu1FD&I*!Pf;COJZyM&E8juVBAI*$E?T}(FS!FYXeF3Ckv$MLur&vddw zMf}}l|3=vNV7Yj`O3A)b*r?-pP{iL)w&Yq5lf7Fkf0S&@m+|;e#}RYVY@?3jbE1FL zaa<>C)N!0AY}9d-Tnlv^?-I*V$MI%iqmCoyu6cW#$wsX)wproPANP8N;?ctB7znJ6 zBTNqx$m9xja0CLVwc9@BTR8kib!xGJeFO|<_=6abW7tJKG)V9kwnmJ)IQw;1W zQDvtg+f1djrJ8ae{>o|fTFo%KWn4|D_ zQO7wn`@sjejw3Ytr@*h@Q_$>xQ23$QZ}Ksn8z%V}=JmNBXpX-gemx#&_JikhJT&`f z3qLgb_Xs~U`;Wn|`-f&fcs=(I&3??OvmcuM)$r?npxF-&&+*XgKL9@_9H~LGe*@W< z>NwKAp<}Oq9QKZ?bej$!6hR%p$&Oopa8m090Wv#$iiq^a=? zgVr(m&_k4eJZT=knX9JzGr#HRzN6-HkHN3UjPn5IR9m4lR6H0O zbE-!8vy}f3wB}vG^nMA;RQ^cl;Y!;`bA81A@asNJo|dg*k`SZ&G})RS56%;qQ{4)k zqvFBSm{TDip4k^_Lo)9|UOe-$mC%}TttHLlc@2Kur^(Ya*V>5~&C|fv;`^xWnmkRv z?x+pPuRE>-;yR92XdNF4ZBy%hUvtUmMB_)t$99KZ+$0CA1 zzs%u%IWpo`UtKnPmZR)X?Hze9r#1Ips^$3YYdPNW3yZs5w_d&P4Xb~rdbh=WZ?_NL zj@x6~ODcRteXrPVVb!}V?v3HSVjc?X75&q0)wL8K@%sBa{;})5J?}QYb@0tYZwz{Q z@RsyfGT$y8x3QZgcStu&Ub}Eh{*Z9n8y5GFh={${8r55=kBI8cWJgwSr@kX??^|3O zBWs3YW-_A^~I9d1c~Zb#Xx9kM(# zo@(!O*Syf=x;V5WKTl=V^ z8Fe%+%2ir$Z$yVIhvk=+nvf%D>vxtGw2SQeKxTPO$X97IGX`&}3BJ0W?H`$LNAO3k z`uPrzCCv6toZI2DgjK&B<+4}M9mi<2j?hh(DQ<_w+urt`Bf?c*y|K{!Ud4a4i|8I< zgt{W4Tt<}J_DHC!=ADo*N9Yy{-7#%%lzaJWgWt3*TCoRrNt^brZKIqzyMn#xt_ z4$B-%U0wAitIL_;8BH}Ccg@V3=3bQBcptWx>8h!?C2gi_{f3%(w-^q~m+h-x&vZ@8 z^9=Du$GSaZz4lm_J1jvVz^C$4(iCyQIas7U!JqE@@*= z7P_k!me9S>s$%SJXGRB$ZC69i(xXxC`uU!U;z+046J&|Z&)7D6P`0C!*C^T*v$Ju- zh&emvZ=1V(=-?X{+<0VM)Y!u8DLGZv&o7I^z0&4%Hah?52E$X?H9Na<*#lD__$KXV zLH9j%lTq5Iqft{CQtPPbTk9y#s;w!%rMBSm%l}#MXx(l{X$AS7s;#NqLjI3x3!+N) z6)cK+*RddEQ%!l_O^(v6O*NIbYj+`v5>}xy};;_(&J7(3EmVJHFarrIv ztL8X5Oig!`b##q;qPwzMma-WX<~_it(MAz_wl+J&7M zJGHRBaKyOv;|7dhJU(>7i5o{vo;@qr)iBomVf9>lUa)&n=8PL0)}`%ZUHLm}%4b*{ z)+uRGE=MO7_WQpzB-joN%6~3{X^{CUJbK$Z|NSEEwTbRG1KewrQ&!~md~;jy zviUpi_hegxu-ES3y(aFDhP@U~d#!}_+WjXQ)n041yrDL})n5Dfg>QeKHSCFBy+qGq z9PWsQSN=$j|5v_dxcSN##C2G9|LFVF=xc(1*REzBUUNyxX!N76wV(!OL*9M*HE+JW zA^qBu*m6ukhptaN-VlZAi*L3;w9N7S&xIXd_cq4YId-UV-=A`fwfW7CkVUt>@W(aV zD!|sBS#$pGl2($KTvC)`ADCE@;PobXy1B;6ieJ6oJ@OdI!=aa2P z(e~QPAydo6i8;kvjE;u>DQeboZ%?*t7CJL8CP#0dGsw7&w4NFu6=d8&|Mlgtru_^0 zA4`9#ogKCo?K|OCY;A_HAE6EH=FQP~t4V(%>_3oRCE}kXdx@~0AzQMczmSbOKdM;` zu(kcd#_y9k^t(khl|yzt|Hz^3Z>9y&!hVJ9nL#?7mcK#r1K&YnHFlEypoj-sOY^-< zs@~#EG2Z>OJV=b^W3qdT_|M2L7yW%n_G+=cf0MmijOPT|8-#74*hXO^his^@kwYd~ zTR7Qvu^enIQrKW?>0&&{A;WdPs#y)NHO!Z>J%H?3VS}yRDr~T|Ibwf+tt}EZ*c$33 zaerWIb;1T)dsf(BYcqvCmh5U_PbB+RVS}w@3ma?=^J2U`_Ajwq952Wrn<8xF zkYWCb*GCT77-1uaELPaaA(Jc)Ib@jc;`Nb3hPp>=BZmz0Lu@Z08}mzSBZus$u#rPn zCv4=9Nfx(~Y|Llz`fJFJ6Z@Z+;L#sDTTk(5xV{_gY^S#2qbU$S_drVttiECsm(lF3 z$?;ut#>_maM3X@IC1_?@LsehVyoFiI`ie;)W=Up!MX1CCvy>w2RCV7oU@{YPndt1) zr4h$nLweUa0cI(wz9Ndg%20Umd|r_*X8LIw z!$`#h5H)=B;NBT%vGmv9JQ(PabePtdc4wVNIv$fT)OyliYPc!Qe!?P@UPur9BbBbB zhcK;=32mq2FTT5q=|`Va%x<9dw7r3vcU)Hy`Mg|LF^N8xnCU=sd@lT5RG-l7Uk-n+ z@_1hm*wYlpxnj>^9UN%XcF|w_ z6{a*I>2>FOk*$N)lZ=hfSE`s#ps!N;OK2Qu)Q|(t{DMxpd^tTy&_7i%gP~)T&W7%# z^k`_ktuaDZLibiNI3M8qp5e2V?|b$e=)Nju7IZ(QABMh0=@rnL7aW9+R{lsjewdx% z+8<_TG0>WqC6JCEpyJcuzfS34(0W4lW@sHV6)_XYnrtggZEG`PG%wqOm?6sl0sMMw zCg+M)etgG=r7Il;?NYio>G+{agJCh-x*j@H`E#LlOc8XJ^5052K3eIS@asO26UIz! zHexbVjLErlJk9}_udRaC9Bnh=b*>l~R#=W&cQ5pfN`DEhW5BSOo#7fW9*>z5ru#%r z7&EmP#OOW;!LN_=!SL(XIvskX+7@a>pO;#S^o{PXmLj=Z7fNh(0@6C9`8Vc|kAEGY z@AzT#65@1#-uC8S7kb2@NFTRAMP{2p|M6Rv8+}xoZ4&*Lar4Rc7x(KHaZiw)gcWt; z{;(a4BTf4gx;2dt=PFo+@hzr5x!ql4;M|rQ_xD?J$o}r4{_x$3=i3(l>e(qU{*_8` zf$*ZAjY22e_A>VAc#dwEa%xh!b zrgeV%N-rbC@I2k!Sc=Cd`xw32g&4DE#Z~;{Z;tXmr91L=wIE%W_}5oPX~@+E(T>`s zrC%AIxbpU;A=i-|Qrl||mO=NeUFy?WwY|#NPwSAT{rkZEf4juL{P3@_M|+xqAb4&MX*)u{#lGCE~ewZG9g_(1Ff+bX}=(69Y{ zeQ%=K=LZZ&Wk_93c~+gHyrRxgv8C>vMZy1kCu+-XM@7gM;#^xgFPlv<6|MX`Z=9~9hYa-&+Ra-`vK-v4>$3ufr?j!Px-1%UUfsO3W1pXaw9|RLh`Eae+A)^ zT&pQVjChqB8DbZ5e4|#KdVHtgRXwMy`Qw@?<)2d3!}H0jsJ>xBvLj{kOruR1%t>H|LMr!)HpXurn#POPm)AiSzX#6L;v zj}-PZWIrbCzmSdVfmKty3fJ1Q4PJ$L0=8cwaXMZVC;EGX;!nq`J{SGJPw|om>?eDr z=FJ2$K3ilgf8@y_>u>J8W z%wKRkcvWxFA9$6_9RsgwnG2RA`UkJVwd>p;c-08;dVyDA{)v}^S4qBRGWqc$MT!OUSMi%fYLj7B+YluFY1B?w3dQL}9NaTkJu8V5j0$i|P1gUWLgT=2ggbVSWS6 z93_Z8ADFv9v%e62&8wiW`8u^))|A?yJhy0I7nkj#ZmR3+!$d*m- zM7>2bi6i+main|MPaKJ~r*~$sVo}7N zW@8z+6s_aav<@+~Z_`(|w-hdpg?E6htHJ5U==+=jw`(zuQ*pJeR)yfOwXKXh>ZWY;!NAN z?eLcumD8$DVPKre?fxu4Vsh>|Q&?5w8FHra$cvhAb~sbQPg>+f(W}rc{+}ji8smO1 zz`b@cbEZ7^8@BruExS;eQNM4SH02_5>%xxk%{Ew5S+W1_w^atEI*2llq=(3 zymw7w#ivw%aNu9-=dU@B^#>>06N-xxN<2kLcCTY{g2$UoiR|8#WM`4rF)(5BWOa7c z{6C*_!F!20ogL&d=S*!V3V8O$qW@AVxNs{Y`75s&lr=Y79X)P1%jW2>j- z4~pgc$zCb!gJj<>#{U`F3&rxU$et~>hx~vQVmv3wP7~_~(XxKR?nL$oVTY3atk|Cs zWWOeCFel7)sb)2Ll8tM-*+%_ATtCh>m=oq6*amajE8=neB5EM<@>H_73;SneOXdOQ zBmm_QPb~C2Z6moFi=1AG}rU-#?NqnG)&` z4i(E$f3R5Cs6U8#C>|f`4@zc+`hzlu3-t$|6|XO^iAR47YBR;7t)p##LG95te7JVg zmtZ3=A`Yb9;JIK>$aFe8*;2{KX+pMCViFRi63r|qo#bRDQJDeQUK^QHKuR)m%1pd6 zbEI_U6w;wo5kpyO(7YuUwweN!qB5(nz4Mtl)%5Z-CsCM2>_LAQQ|?r6I-Z$@Kr`FG z{R^2zJx-rV;re|7%`xlX?}7uFj&b1+r_Tt!w-z+V4}f3y1I_+i;fH4bboi~Re`xma z5b@CLKMcPf4>bG1sCc{3>`xJXX!c{Soa3R{zXE>UKQ#OIhvQ-%TTjEE zp#0B6Cn~)aTJtJgKf)}k9$LRJ(RA!_twHdr_!zZr3jBJznb11#DhDw-Uuq)!dOStY znng`POtR_+=R|y;ty$3exz9mNs*1t2H~idJKO+z4zq zY^aJ~fcOlhkuM&Wsq`}FETv7RrDI-$f0**`AkFpsOs1v##C0*uoIXK}?(=i__3?xA z0_H|B(3&$PkY;X_2ES%e!=Oi~?cNNXqx4j0&77u_=JA+0Te{DAh#9Hk7a&IW`7m@J z!3dxC8IKHA^Qs=UiBrt??TCsuYT?i*F&N|{gG@uOdAV?SN%7|1;VSMiC5iB+r5mo zflFtwU3zM*@~dXizz&Q3!jguKOLlzi)VwO$u85RERz6;pdkI-@H1jgxa{S5;;h11jVGfE6SWF6f3xV)4SL9K43T&WNlHI8pzNh^+_L-HClAoG zT5#EkN3PkX$x~ggCfZa7^5p3sOW94JN+ETMK0#;Ine=Hurp|VvWhQY#<`XR=jSQzd z{uWOa{_c(F)t@T-yxzF75_F@Z<+xflt&f+cFxQza+m9he@AK=yRKOMg@?D+|RlQ?qBvg@YCo290 zqvGGZ;>dirC&UuDc6eNN(axA1qvw~@R}X!Ce(;3BH!QfJu`qM!w&8`@?S@z1k4k?; zkN!mTsI2qoDOBli;zd;HFVnrstn}BJD*e5B)++tgBwusP6Kd_@d8AWZtb2YpN5xl$ zS@DlPb9#k7b;9%KXQg#3KW}@!j)*{sXOKVm4uN&3< z>qd3|x>4P~Zl%{y9l$uM0~kkj0I#Jwfa9i)uOB~R!uko_ss7(Icf)AZ|BK0+;VRE8 zG3)fdL*Pvm` zss3NS+m_X+>;J`4{XeQ@Y1aRXaR;OR-_A$rv;U)6bWe?~u{ff~cn6f{Ug4K>t)SX- zdV8m-|A&!L{l8ULG@}0B;O)GP*#!&fRZ@4~YN$zWEDhP%)e`(>*V5pBcD00j(Y2;; zY;Da`nYDu}9sO=OoLB_v`6ED^H!zb+F<^sxkP#tIlVQL1$uO z%H#z5#O z@v6q)abf>~wB$Qak}YcvK0|geeh8S2a#ZMXD*Z-KP4P3-U11wzN8J;)Um}siKXmBV z%x1DNccz-vc!k7cqW?F@Zu)JZY7F9D^r|U-RxA2{pBBs(&v!rBF=Billbs~S_Zit^ zgbjYSK=gl%?5)0o)M}h08+CnDvzqrp!`u+t;AcT%d*El7v*P98XS0P3el}9r;AeJW zgP)_}RlE9=}hA3LE^aT-e}elCOcEEff0-Ia`Os_(zZ(CH7A)*~i85 zv1D%(HgdKO3fn{WYGEU1t6JDo$$nPY$k~#-2{~KG#P*T1CGW?EoUL7AIdZm+2pc(D zn}z)l*)m59Ia`uPB4?{w?B6A1KP_zJY|Riha<&!;8#!CW!d^)>?)lEI-x{*V2zx!* zcCr6C5|94)*(Qod+eUqWpS`PX`0(4j1wW&kIoSiMIVeiosT?lh;F3Q{lcxV1H-{pA z1$+eB1a<{1<$z%aTC$_QpWQ@V1I3mNLdgMRTDsvn*ce3qKv{}uFkoA8Bb-%6h^?1yH5fA}$>Mh%+%YehUX`@ykzJkacKPut}Fq1hiT{Lt)A zgI}LIK(oJ2#6z>c5q`ZNpxKZ60M{P0LSL<7!l0v-9t!lb4ew3@^;_LAnj zu0!za?H-5L>$a!kllc>_cj58$fOe|>qY`f2Fvm0pE)H5)VYs5I+(9Wg&sF^$kV26NnDY07^L>uUbjg^qddGYoo&iisr6 z{45Usbmh0hug8`PzaIZA__dw`f3%9n`2cgZmC!?#zZUTsO7DO_Q|Ud>SxO&<)-hCu z%g5D%NykU4m>%%!KCgrxuKdx6(S4%sHIE193(VDWp)~_5LVS)|cN+Yffz5>0T>OB{JPI|&?8mM2E^z-H$#t7{;kjq76$zC?mMPWE~5Od>C@EXt*lT( z&=^oWdHQ5yK+!LM*{XWrOz*UxPrAc^LXS9H=_A>oL)UEJSNOfljXpNbHi`brxJt79#r?WPTs7JF zeawyfYstxS#Q5-ah%sV(Ejig38U)UFxp9BLB?s0?(+d_-e|zb31JAcDP8QQCFi!TL z6gN%xjR))tG(7ScU_VcBfpD_0%M9ZS?nL*4^=a76IN6<-pDM2_IVshb)fFA><7DJi z{7n7#<#nYb2F%I6q-|nompGYXW|ufw>pNq8XHGW$Xzz2w$^2CY42+XCs|?7TYywpV z42+Ydd9Nf+Hp*)^Ia!uBoj6&pH|LBwS=XwbF)caS?BX!uWS3b&TXC{+>u(6X@f4h_ zYuB8r_BR-Ns3PFOvsMu>)9o}X0(Pc~fdB71Rs;-?YyB?%Uu|-&VXf)|emkyJ=>9lB z-g54_*5y_E&IZ@|z2EyB1E%L4_9bAogUkpXT41U7CMvft4*Ar|4_NsLElNY;#vcI zyGhj|JmA|U{<#*ecUH}6JV~NN*w2tHIoDsv?n%ETR8w3F^9pRQC4o5swqGJ~I<7Sg zKUU19?wxfyu7%(D9REHE$qDw8y+ic(G1<6&S2b0Ou%j4XAY5yi=r4#4;03}4*IFrT zaIJ7*gKOD^-Gl6=!&K#k$vioKTuX8laIJLFAGnsRg$S;98PH zfoqkE<=|S&gbl7WUDywiJzm)0S~3p|Tq|1~PfN&_912`3RxAhC$`m%ZR-~}OwT_GJ zfon-F2d?#{c)#*9#baAs3v*ckbFBbs6AFywn`FB4SGV6eY3kHTm$+7|8)}_zuH~;l zA-I+~4e@>9TFdA-XRg(eK699BwWrUgaQz;EX08$gKPI}UL9_oZ`16z>n*HDa+z&MS z*9t#0`@sj8YeBPr3Vr@?KhW%-2frQ_=`0b1i80&!Bz4{XnyS z5&U|)(Cl9?;-T3eh0g}E(V*GygkSdq&HjlZ9-93>B(8l9TrN%SA1U1)s68<#hUygP4 z_}9U&``iFMM8#}IjP7#}{OQX70sMMwLG(W0=VInt>F1RMf3%9n`2cgRV(6jDKaDhV zEnKS=mZ|(^j#ZY@Pr#p{^z+aF3Dj1Rj*m8_u@!#Z=WEczm47>8GL_y5zmCWG0&}e( zdOtFQ3Mb863)hM<*NTH4q54UO&QW?KwB}m*q4-@moqQ8c?H4UD=7P`Df6pY1;NeL8_mqGaa2LDEuw`Ag0B_1 zof)1HOQWLlJd>98H;Gn;cQ6sH(cWRriPnOgnvkXGQLZWDV&~Ca)Y2StD_lFuvdap~ z%Q`(u@3xO-8Af4s$!{ALjXhcDu3ku)U!ALLF)fMKtl}<2w7OcXgR++oSD9ZU=2Q>O zys>9?|8l=*d|;pu7}hPr_}%D>rAV%+yshS9lircu!S z>(x$oomn@qQ+rEAkWpH$>jo~pBC}cDz`tBGv~}G;MWd*4;3L+yvaGJU`)ieBb#Ut; ze_2-9t*QuqI~q0K{b_)dbpsEO|Xxv=AlZ)1FALH}ocW5uXdbAu+(9kTv$ z9J0Jv z^(6X<<@?D_5cWZ`E5-OfBU^HmugFGi8r7`EHzX=W|2Ubi731qbdc5e*N;c+`c>T-B zMqMDbBgw|~+iYJ!_5oq{BwKPnT+fc0M;w0**^=vlOC^ct2QGC~#1A5Sxv;^dFo(wd zWsohoNH*DB#PXZS&K3IuT?xN2k!)N? z&GD#Lh};IYQLk{Xh)2Cb%q#J7)GOR3Y}6}UA?%mP#+)+8Z^m+YyzwG>^v9`Qp?I_u z8WT9x``U(&e)jv%zY3s!;W^<{$eKDknODfvN=4>X;y{(!WoBWS8DM5bLY;+WhGDC1 zWMLsmOja>eod7)PDu!m37i=@BOJ`wWtyZ)On>(LbSpJF_f>xzmd^uQlI;NS4Kr{Pz zoHVm4%=zq$VFgLMM_ z)8t^GPA|{Z4}<=x>eH-M7^C!f`1Q8T94xKp!QV^8;QWDeu<+T+IasyOu_|T)@ zUqg&$Ot_yM^Q^?B8{JKw*f2FIKnTXN+>p{f0l>agK|3m4u@ayq6!msr~`1Nza zdxE(Va>1EH^&`z(DFyy4)n^*?Fr|^pAC{?f3AAQXx0B|&g7?6mp<+z_m8~?cw~5z% znk-C@X9eOlS6U05qvFB8m@Dmue}wYygVucND70oz!So(yCe?*BkEbX6x=)jTX+DMP zapHBKU}5onRR05@M=Na?ez5QJQO^(wS;+Moz!%c^uB5slve7tQ888|QIMjz#7Yss^E5YNI&q4a>$0Pb%sY4oQ*o{a}- zV}bCjKT}*FJPY*<@1)Ne@T@$&U3zM*>KQ&r1N#~S(TydBO@cr$ zrX(c$<5_f5F8@5suJPCDc~%fz6ov7et30iYR`m?obE%%;*{x?7aq-nN9QQq`XE;9K zdWJWd^$f>*lT500gEx(+));SgbE-9EoT6Hb1H3C1QLQe1>KWc!97R+s^jp?5oYQ&4 zkENdB6~{dttTxYMovv?Q&oINRXE^s&vo>7Fn^Y$+>&TytFAb`0_;~!MZDxTD_tyU{ zE83{42#L0Qw545X^u}+;-Nv~a0^~vGp1bup-<>KIkn;NcGsg#a=>V_5_b7$&)&8pfgpRxCzPU zdT?FhW9oihH~aR_cjIIId?(G{tsdbXvHp`Z7R=kIW;MXaBJl&lY^olif1k2wU@ ztY$4m{Dx=yB@&YFY$m&9Jwllm^#(0JUEbC#-)|t|0~9}7jCVi!r{5r|S&ffL6pHxI z$i^I%YF7FdY+jG>-(<^rgeS-j68%}|0RBYmkB($ZzSEU#%*Co^HNwe$P}rA~jXFiV z{3^23gdIcnX#QbGzux+iJx7c`p6n$e-hp^wr;v>t2JU|_*$c$;b&>s~u!obqQ#?Q9 zZ5=KjW#{k*UzlD%En$lH>6VBll3#B$_qJuGbGZTWuS((^^$*2CiXLEhF9 zVIyx#@-gIX;eHi7KICmlKK2mVL&b9BZH*K*^0qL?!|N|0J5AWg+md_?d0Utt;&|k3 zNj|oc?ERwuHDrG-?Db?zKFvMh(H{@nMDb{qw9UZswos2}fJfD{^Hl`mnWUy#KuwuJ zdUmPF@m=$_oFGeyPM{^fRLrbYsOk}#r3+itBQ(ht_*aVGdW24tJ~T@Q22zgDiH-ya zbDDU~iE@JqggL>y0=u1;Inwh+!te_Et4C=1=~$pCinDS*uW0lWPXDN3-YG1?lxDr# zb6Jn@X8L@>95foVp29a~!LK^}^@?gyIvsKLg5X!Z|+Uvn{N_Ae3f z(Cps;za9@X`*D2;_YckfU>Xbiq1iuC_@UX4d2;R_n*GZ}JT&`H2tPFYF~80IK(inD zr92*J_Lsnq7n~Y2`%Nx}gNvHU#k6iD`-fVOu>UpY(>1SAVHUQFz8{%|nfX@HDkhDN zG3H|6u*||nKo3wcxORr~wr+=CPqt2n)+}s3^mQt}8rrV(6VUp_Kz&VSVFyXa_fj#( z;nxh#O2;0r8%CP*o?_tF@;n#g0fgYk_jv+>~voJdT z!!#G`L7F+&mGDQaczo|OBg=svs{DnB&ro^_{FzEmgU(XgV*nypECP{46WIADL%`Lyu7Xn7LXxN`nC~{~Ao1 z$7AMgX^xhQn2{=e3}Q4RGiw>@*ZLm#^=myFdX$PUhh{KvF6$A}7qCChMef$c23wt! zv<^|XG^KAz^NaGw$GJ8WY{6klc*UTP3G)wMUpS0$8cBzl*-$4?f9;z#|J;~FmW-=B zMcl7j#8s2Mp8mLTf7lMjk){`P>DDwpeEnb<#^;Z7;e3}H_xD?J$o_JvzrFOCfalv5 z=h{ab}H%R;nbYV;q=G39H-!1$w>iou9dV+jOP;P`o7mAya+j$`)KUB$=f>1^$2s9 z+S<(CvV2L|TjqVcvdnsfx!wembGf|N6XzP~%{*hy6;u@+(=vN&u33*T*b?@w>JfJ7 zI_zStNBAAM)WXwLCmeEy)d}4fQFX$wGp3(I}} zw~fpv;$|b=FJ0L2t!ZO?fpMwA@>i&u;Q8cINks`>dr7J@p~#+)kmN{pItQjYO9pxe zdQ*}nC))MzUpn<^*7)2E&P!bC>~N_wttW_kN2sRi2~HRGGqgZ*s=tseISshfHabUF zO>rsw)@M5qE|rfHd$R>rPf+G%flJAG{{3X{6a9TmHh$}?rs@e6i{}>zms%QTw!x*+g$*wCys*Kg z(#7!uE+shBFw`Y3l{gSA zt&RI+op&zP^y-NFWMRe)FZuU{OP#8oU>JQ~F)x8;E|LI0CaS1Gvmf~+%%z~&k9mCV z2b%q;p~ik__G5mZxfC?}N7Cm5$3wIKPWbhBpxKW+5RQjt|0>~!W`8Js9&kJ~`v<_U z`-f(KzKDlr|8v3*&HmTn*Zn}V|A>f(W`7iYA2OGMX8#X~O9fg_khv6UC^MHTht@e- zb`IhEVqv6*t2Cgk( zE(LbQT$G!leyFe#OOS(9q({heO|r~{uC8+0$Q_*_H^7bt1$Dg zqE$=+`I$>Op*5Ep46PYb4%XGoX*~RzAr(VwF7+E|9WxI)P4)jEX&(O*@asO8K@U+e z%Mqjd+yH;N@^6J-Gc%KWMJqqP_nAu_haRf@R(dZmm%=qwVVTMw1D&PxAm|LGhd~ch zdIahCXr*t4U-wxIJzV*3MNFpBx5KaFabCb&>Tzhzkd~8XF0~eZ&5&xLN2q@GK<6lZ z0Qx4S50U2aAm5z(H0u&-F4d9z%%x1erC)0^|4MTyT${sO%FMswiTv*=mm;?HqszaV zevxyjbz*#{<5Gd-U*W!BfpDpFk$;8XK&RtUvjXH&`=U;nf8`wLk4ur$Z~j#>W31EX zUp;+^OZ`CV30{O;YT`v-PjK|os5XgIQ$4|qr9G&g;AmY>aELdBh}1-HT5}@x9qI|T zuevg(C6THy>j?%~x_qm8f?cdbzg0cKzg#i6Sv|q$u1WJ(PY^Vzv&~a&4Jga$f05-B zb(-pet~0DIn0FCX7Ysk+>Vmn*a{9$tqDi(uvYhhV@BRR2(rEYJFD$K@``1(7)rn}* z=nI{Nbz>V@PGvz?{q?>+r>VSnUr24&zcyC9OVt2Bq->|F&S$n$k)vdCvLn?~;z>y@ zN=R{}4opc(c9tY3CL|Sm6Vzoi>ZgzIznBs=E-|IE!<4>lEx+`sak-NA%H1G)9+edzJ|oy1$dI|THiryHG)V_5&d-{8*@RbS&dM#aUT`7 zBgn?J(`@%3`-rf?lq9q3MfNhWydT*zR}4()uoyp>Qn1)wD%q&3#oGf@!u%K8L&=s* z15C*(mZKIR@&Gs`(uBs?Xm ztSf*em8xYXR5c?_2y0mj(9G>RpBYeoYXRc*z4$njosMbd9MH@yWGz6<*E4H@=9otK zH6wv$Kjz}O79ceH$H1@OQ_$>3oip}BvwsQv`mF}de$1hBJT&`b;n(AVW88`?tf7$vtY&>^IpG z%{ig1qrV?>Ex`V9=58?SB{OHbo{mXoOSr!$*N|HVt$EM$(3&Gw(`s zCU7jS1&DJdt_6r|YM8gJMvUe+>)^jyjT7JL%$Yuc)=cP2Xw8sJUZt5(I34HAnQYK$ zsvkSFj!AaQghoT> zsCcj|WM^!FuTJijN#K2PuOdak@z_tJyA8j?{cH zzSFTNoELNB)9RKvQahA`HbQQR~(=n*k!c;qp_ z-b-Km7W>qGUN=!~puqQf_os>A`pGDaN zzPHum=a@y6wWgwz%)@_QBh6du)42g|FD#E4Eu$ z^)8EhV|cHahr)VA|Fm0mEyYK?{{D`C?0Rp{yNz!heDly7gEkF*Iekm!TczWu;#lsG zZkD`u;gSbk}#2|1FserIVxyU4B&WR};2e3dpO zWAMhB;H%r&-ph15f(%Tey-uMK{~wrIs3^Nv>URM$Id zvW`@5si|C*?y$_U)YajRR&<}LkyQI{*Oa_z?nSwc_hEaPF5HP~ifjFbnt8Vv4&+3= zp6QyF=efz-GuG`X@Y-Wt_B>Cfc}FX^cUUlSD7U40?vbou_vo>OX6?UN*Mb0Q|7Fu1 ztx8b)FUC$I>0q(#YRFl7G|F8+-&0l`>2!PATO#u_kQL?VXN zWk{`~qHnFEJgc^*{Fd5+%P;?D!J~D%9iRrczkWDq^ zeK$Euvo_UK-m>YPMRostXVI;@Exm>rrTr?6f=51FU9;e+O{IOd8jgyJO^yXyHWfU2 zXkSgmN1F<|Z(3dO=$3a29@)KmNJm8OD%iEq)3Iw%MDX8FI-+9tEGzF2{7qV8yUrC+ zMrm1yVOelF9kVpTvJcZO6-Q2%R`xX>3UOFyydAS@OUu4K>A3us`c-or9j2x`$~wBn zJ@VnK4xK$gK|MU-)DDeg3LWLQx2v(1yShDH*5y(9tp8{hUBCSM52`&o`djMDrj|9lJ^#d^ zvi!1%<;|Bj)b>A_Ua)rI69r|RVt&_9_3vZr=ask`dQ|N#bUE{?$Jn-Jy9Nzgo@J|Z zx@}pFdA7|nUAEdxw{1hdt0s7~T_x4+q+sAKhzuNp&yuIK3 z`|$dCLtX-Bk>hIE`s~Suy8i#d$bSE~h6LMzxctQ#yan@BcKhdc6TC?R1wehX?+Q;9a zq969euU?{OF#-3q!Yh9y$Nwu|Gu(XT3*tH~yMOe3YV_ySH(%b6e(gzYIi{dP*C!rti2C%{+IjzMBQwbyAKlaHLXNLb8{_M|EXP3h z)bf1Z3+55>=xs0j@&B{;HtM z$%&<<@y^u5_!N)F5tovf7-xQ`)1PR)#^-5pUT0e^!?t?RT!?PEj^7kvKS~P@@?tuZ zuOj_{uzy2(t%zSv_LIT}+d3xfKah>N2;KC3uHF;&CR#AV`}@LXy+rmc-V=PAwUcbS zu)(%4@1mQ|mpbA-NNm=ATChOGgKgbH*LLcr>-bF*<2!~0Vm$AYX&3Pykv&`VcZTc@ zVtb#Fy>sc#$$r4LR*L0dTbL)}?T;aQv9KqS zT_S9-EzCo4JlGcIqS!{hRE@BaFEv^mFUXfF6*lsv5`~R?seEB0UkdX>+&}WAY{Evq z6y}(CIr62>2^;xRLE`vWO7?!S9Qjh1v*GoTFNOIZwvjKjO4#ej#vBqa-$-_p*#Eo) z&%W5z7K%q3Ok+abzWv6A4?oEp=SQXZSGTW@ix_rQ=V(+SCpR7y`P2=d=ov`K0V4r` zCjo3JLEmgj)$LQcMm`CaDwn70_9Y^;Vcot&5UWI0w+|{lPTgDzb}Fjv#U}z&)z$55 z=H68plK@uYURdVdRp>8OVJtNslNyCr)(}`F;gwz%U`53VxtyXmxeafg*DF$^l)pQ@ z-Km&>p@un~7)**#i=s!2IvD7gbg0po_GX<%Iu?^5)a>+ViF$o~>2r$N2{f~i$4T?O ztDJPKr`~|A>YOKLDsl7~#qq;Qb3f4RUjcu zUkbnJ2b%rm@ORMLg=YU65f9CNZRYDSxfg2J{zT~SYpw2S)l=&n_#?F*32nADTIh1TBZR@2B+|Xft1b9NMn^p>+H(yNZC0(f%ILhF8Uqj_t4gV5`il zke|#fYCN=w!8I_KcUGwJ`CEt_U@#aUEKt~UB_fWr)r%GZP-;lv|&QUq+<=QngYLJOVgnZi&_Y6 zVwOVxNcXvdG>?A+{HD*%&}lkmD`HHa2jCy1{k8C$u^oZmuKoCq4^7t^$3Al`JL%ZL z+8+mhrq(IYSy~T=HZc>Sv$em3bgW(LY4B%gJso<8*7qaE^f?oL6OVHM=38r_4aeGw zc#{|P2K>3YpM%hbMS%}7)4Bkir(=-w#N$C;Blj5reVdL!-A>N6LY@=9*8|{B(J`vl z-*Bzd;WvL@mz6)!H@dGHedKOjfUnUBNaK+D-w2%6PptdT@XE zeTn|!=z;bmZHy0R*jR?g4)aV;s{M)L{NYbA?eu+majNB_2ewN?X>>2DU(&$puF2Hf zq%f;9J?Lx2+jcj}pHdSXzH*^bn&3}#A8{Ri>0GE>I{(5x&|evSX-uJ3<=efj>KA&S zf9ln)kM*%CgLhqga8~qVWx=0sz0-P|4w{>LzD4Ui@k%5mUAk9xqx)Uc^YY$SWUF9n z=8WiyzyHZm{!F@~;DDMRc6i!^&Ya;Wd#1Ic;AP>t&Y%A4_|vF!y)F-bax~&k4nO%* z@;M*;Y4o!0e)6YmPXzI&+dVOgKjoCe)SWMRWp_6rbQs zE-g(-O-@R3C#Iyvr4|=?oJCGYQEGzQd&*Q#;5>%gbzammyy!hX>83O5hiT{b^q#QV zEPr@Wv4~$z>*oslIkFcC`wwLA!AZ1gnioAn=k;vkd>+5k+4hGQMT!1irxh>7i*PL_ z_x~;lIUj$F?B_*)?~{$+>ALCqdY9rwv&H)0MfV6BylA1Y!HZ;lJn$mSJ@NLyi)zLG z125VtY+t+x^9Q^>c#&Q72VS&KtPfrkCYFO2#fjzMMd`u@FUk?`7kCloe|US~MUwC2 zlN}|NgBM|biQ~bGFek+}coF8Y*ak1coGshnMUp>(7ttw-cR6^GY7R$klmJ1uaXo|4Gi^d9j9odq1ffvc# zJ$@y4ZjKj$QTfe_{Hdo`hlj57A}*zOP4J?+B((axDDj%Bqt_HKlKD+v(038@qW9=? z2Xnb-(9A0^3B%k2n*D|F8(sv>e$2IVKhW%dT==2ck9-a0MbPXIr_TZI2b%p(_%XRf z4VwKEMLab7e<}RX?B6f^(Cj}0zv&;E{kTUBj|ZClQ-vRz{fpo?{XnxH_m<&)pxJ*2 zeoWp`gJ%Cqvj1Cn5k6a)7vcVw%!^{6`>L0&>dW#x`b78*FIo(3*D?4`W?r-hI!62V zLK{AFm^AaE58(fSjyVHuCNMkD@y5JJai@44gKIpP7vcI2uA>L0#JuR2@SE+@S=O5)ASgSBfz|<9R5MtzW{zSwuSK9 zwIAQ{%!{@|XJ|j>n3)&72Y;sapMcKN8k6hHi$b8YwLgq>tX=CU_)VYD&_lGpKVnRu z3GkbEoC7c~Duy<^=w8GdUNi&#T;0zcXv2$^LYtU1(1sVSBhBNff#3AG2l_VM&tAls zK99q1-s_X_oA>$@^l%-28k#5AFK52eW#mP4-N(1Cc3yXa7B~d2RbF(57++f&Cw+`G z$&1d=G02U7x;ErRE2%&HEnkWk<$vEF z*Fi&R#EWA5%1s?m!A2?j5jhTFynpa!JC(#pm%mbrwfnv+cPV; zlU0rScr!k+w9c+sM%o<{)mq=jiIzQpW#6MXT1ML4Ka1=i==Ek|88j^;O+@VBAOGok zzLJl8CD%Fo*WyJlH_lgDrt*~{YpZsce5LTNR*wwIPTCfd8Sc$iidamUDTmflwo+ZD zQlImZ6h*wNGL=Rx3yU}~rC?H1nM$aYr!$qZJmEx&CVKiNP-Q#!uw{w1O!v5D1Bn#f z&Y4OH1$DVf=f_9QMb4As!HSH1WjSSI%gfsFmHK0=N}o8oc+5qUtJJzO!pn+oHMvUj zN^Hc6+6LGPGf^*3=PKnr)N_CB){(RK%&!_8a%=ebEkk?cl#bbR>!F-g54Fm42ez}? z_a17wTiMcAloglnEB}0JsWtD}OsjpLENfJ^Pbp*Q&?5J|cCBZX2U-CY!Iq=!c)EMl zjknaRn76#&z{VBx$~wAd+q%0Kx0iWA5C8tc(MLCbra8~4J$roR1?4rWisv8aDR6z{ zC$YHvoTp3W@vq5w#v?E2$1THop8pQz1+A&e3&OjwaPvPD=Naqzo1c5_TIM{XT(3tw zq;tZqR%X!en22*~}Fqt2OBju^hFFvsGNX3U+9t=$S zW9|Hnf3&hQG6vZDX6F_3vnThD?;meZh>K5-ONvWXm)eY{(-)i;4gc9a_uf8qa_LVj z_g#12`@_jUne4H<@BP^i?<~4E)qbz%hbi___YdRk_ayu0>+PAN)E<_QMcm~7ZMx9iNOWth)WK5;h8=OFK3 zvKNv5K-f69mi69n4Obw|S?Fe?Yl9jypP4xERZZ8w8$##AY_B76QrH{GP7&kTLiSC< z#<{p;Ag_>p*n3deti5E<74d&1d$spBg3Wpd>x<>JWX~7NkCFYnuuqbGml*#?WIrO7 ze?s;Q(cgKp*NX96BpcTQ>!$19^%8bFip>#r2-z#e{_INjZefG@V6KV#>p?cIZDt$w z?{NJz+h9KU?awxt&p{ENNVdEu7MRa#V)>8AmdpXn=e+1YhwRqk{R8vCJPvQKfb39V zqyAm3c)h59hwGC$9?S>xNo-Fd8}m_Y|Ag$V!k$WYf6@QX$;KQG$KOvje*3YF`gco& zJ%{Wq!bbhO`NCdE_Ece`{@n~=qyAlq*uTFedy248|1M3~sDF2duu=aG^FTbl7s!^( z3ia<~4ioC%trYv8*Tl0g2DFpn(KgUFz<>@J8$SFN^(L6ei)j6+cXv4$5HfvQCR+$8 zMX4$gNhJ!!Cm{>SB>AW$A{Bt`HIq36q$4wjRN|4!5i*%WNC(nI^e%N%r6g?cN@fn# zy*>3w5T^0E)8kso9qL8LGqVV2{_0;unsbL9r_ZD==I;cWV>ZCw0SB_K+sS_1caHC) z1kL_v_)S01>>n=t(Coh#ew*$en*Do4JT&`H!EeR`&3-T<-Yzuz6NMj|{g|ufcxd*o zf#38G&He)-9-94e_`5f+7n=RU;Wzz2v;RK$>465#{wnw}8AlD8{VU0iF*#kUNpr2c z1Egbdpiv8>&z#U3wO$V$q4j&vX2MP84xNJkyE^6!bPug%?ob>Z8$4e=0Q&nn2DNiT zdup8rZMKy!^i1eT9fNZP&K<(%D(4PufR55JyP^ANjq78W1s#JnbL3~CqjgL;9h1y| z@}R$`{r5q~Xgw3!u$OY^{@Rc0WB8s*%i)jH{?*Wi;h^3v^CDco!7NDCz%y^mO?2#W ztvm1{u5XtJzu9g&bb{`G2x3gW&{+7*cqT#{7F3EDlRJcSBEF}RVom0?&p=G7?sGO` z%xhl*ZCH@XaWdRyGyI10?7_N*1*sgTfx4d~h%x-2o0b>DrHLP`EZ5u4myf<9naE4cIJmp1Fw6)axQ&Iy6h`r=bo1QB29i?1q1c zj@e6^>&YpmG+6s_T?#Xw6NoW=egMDOhd3`_ZqozWaGn^_%x!Lg->{&;(0RK5@zA+i zPl7hg=U&o09+k6X`YcDxa2-DvF{aN2(7m;P1!Bzmz6yTxzOR8Ep<~vHcw8HEMe5sK zMqWf+f9rVB83GtMd_(9#e}3wLuZ~Q5(8seyZ>wt4=>IN8@!}ylaLvD9888{E-#{E4(4%y#q>hBEw-Qo4( zs~^kI-zIvXKl71nh0@0S;YBx7+!R`m8~Q-QGmioGQi{8SwhLZ_OINU68cHKxgn^yr zPG~vH&ZOzD%))fqdIq8 zsLowiRIF>&EwX=n=g62rog<@1bdKy>)R~rcj91$~ooe27rJ8qL zspef6)w~Ofc$;e6byGF(_ELY{s`ii_jv9IogjemNns?z5Z&J;>8zTN1ksD_)VeK)|RYTq5?+IP`kqV`?%m#BTWedoZxnc8=6xC_ojXQB38H&OfU5Y@g5 z=h}Az3I@J{+ILkim&)3A?@rRS@BWfyYTrex+IRgk90AK(SM5OUyQ)`uWN_`fybRR7 zqgr2&=4DjB9USTi*%e?5h}f3pTD5QBJ5>9w7DVavwuoJ-_TB5=+IO#2y*ePHG}B#3 zweJoO%#6yYF}3fesoHk~Tw7|qweR*%%K$_2*b7~5mnWq#qqu;qAvqcDv7V7mQ~Pek zD5ooEX#ZQOeqMTEMy(&U?|NiZEefX$qsm^zu2R&#JB-?QS*U$CuOuuYgLqQd`Jt0? zsvasn-189Cy{kDyb?>rV7jDfP7JX|_{@gJUV_OYfZIHx_7NR=0{N7yGj1l zy<5<*?p@74Q1`By>)tKkx_1Yt?%nQp0{V-(cQfni-c_r*cSqjSb?^34-MhC%-MhJ& zXGg7B^U8oLT7pjBTh3epSnbnUfQAR(|c~&%4qrACQ=UF#z3k`^&I(adJLIYx{PTqt9 zs*C4DZM36R4;B|VT{T%z<4_%~Fr)Ag*Tu`KtBY5Qx_IFkvMyeE&ey4nH-)Ot?GttJ z!d*urDi1}tq6`jC@U7cU}XZ1$?mh@CmEi0!3R7ca=A>*5u=vQQWAFq6(z zZMGt!y9FwQZ|Tj^J|^ z-l+uF(ap)nW@T>+3CMagWLDNcLISe?9a7yVYJ2scDo#~Do3(vlnWOier=u$(gZ>@z zJL{O$`vuzL`L4hCxyOl}g=ff`df4M%y{2BnJ^u5rP*V?k@nJbWtTd9E&T)`#u&`rM_CXsMJ@U^K~lq;q{CZmHJ|v zpI@y?y(@odnds?jj4lOt?`hS<~`C`1s$i{r9ZZ_+E5}1c%`y&#V ze`Fh+?Qzlnd9vRS+rLOQ=7V(8ob6*VUT`+dyYg~ywy9z{INKs&gR>P28=P&hu)*2J zit&K6ofNMZoNc*?2WLYb0&gFj4S5D^gR@~?n{9A5+yjGcURcLD>0ZcNg{; zvX6_`i`=RpvD{7eez6?6RqKU4nQY8k@%Dd8wo|NsAK9oc!^@Fd6(elqR-G5|$gM(c z8jeS9)d{g2xm9ln8@W}7g^k>*En@wpWWOeCGBbws(vTAAZ9(;%q-l@T)f8&+1CR>0B$}XjB@<-`afO zUhxV^`KE1HZff(P%wEIVdB6gtMuFf2KemXk4QL zeW((6Suk5_obPwg>#f6V>Yc?~eywq~H2S<^<^#eLgV@g68jT$ujn_^sN5pTu=&GDEc=l-GD zk2!MoL$iM({Fp$b2F?DHA|9IkHvFxd?LxCZ0e*@@gJ%C+;fH4bD)>!5(CptQ;-T5U zmHOqJtDU5|M&BvYT%#|BK7W{f?T0oKl^39IqCjea^u9A^>j2$D`@2AYPwVc`cCB-v zzpr&6bWg2|p(C}P1Z}o;uh3P{y>txD6PUB%GnP5qBhYU57#lr5M%m00X;(dKY%uWYnQWLADwdes@Dg1 z<6?Y`PD&bw@TErji}KsY(_%W;@hbYrP@Ja&J>zhtk7w_%UvMt`-sMIgo2uPT|I4_! zWc!NyMT58{WN)DdH}0) zc^cL7Ys}LoP%S_Ic-mmkO~lj2dJ+^*8|)cOJZ*$0?`!k4R+aWfJZ)x4DDkvT0U_XN zlBU&+yMNf;rfAySj(L?cZ?$Tvir*>!tN1ODRs1-ov95~W+{|f(#KSsK9lxNjTF1{% z`t_a2|1?X#hBT_`_tofEq3eA=SoxKIfPWnlHux9jvN#_6Yqzk$ zzZMJoS7hHWZ1AtS!Uq4kN9^CFWKS11_!s7?czfVqcL^K(%PDN|FUjw~zc4q(>w|xx z{u>-nlh<{V~*BUy`nSX`SXAbkP zF7)}t90!{DO9K3u5Tgdo{yFd$Xg@Ujm&0%VmZ8~?d>8gZvmYFR`4=?%XVd2o$3wG! zIs9fk(CmLr#6zj3+D;UzwjB${A(Z`d(6L3XP5ccSm=J(n>3#Z zZTQy=Xv4pdBOYp3A?kaY`PUcl8~%lfT;@$7q?v#9fIm*J8wDM&^+4z!Xq^jf_*Xu( zc{3J68~*hqY35&R;5XY-#o!b8%V$69t&XJgZ1<|p}%*aWa znb83F?Rwo3Xv3H$K^y)x1=_Hx8KjwiJp#XBRgXg({`EYx$umQKIPUGT=Nb6Zwf_tF&DfCB&97x7X?`t*@SE3y^8w~x<o{+x)9n z=eqG-ihtpJmm7VQtJaWz-9!EP!@tha#u(?KBRU0Fj~(V2KD4gHwfx~P)i!w_d6;;ed-Klgz5T zsS){lpriwluaE%S`5aBY3g?fUT}zo{aHK9x};nlu4Fj zx!ZNjSy5J6ezH+j!fCF#*;Q1R(AGMjBG8&uZt4>LAtI|@UBcf*XEm-%sJPY4kO=ov z?W0Rw^KW!id_q}U9?IHE(pg*2sI0B;-u$V~**f*cNMBi7LmO2o{A%24l_}lnM+w)VU@?eCb!B*)>h^vv$m4|vt{m}mp}l@Iy^?7-2a+E6`!6ux_kA-qct)A z;jFFisI0Al2d5q2nC+t$(ff5)f+9^L)>i%0jye)i5w$jxiCcOH+qsB^aF^&V`skIJ>q7uMf5 z`dCKJ7VVptn$Ou9Sni;ltpxABNkz`q2-GONS~*+Ke!gk$w&ruTMqJIDGK{ZHGvg}@ zoUs0Q#S7~n4E#CeZhf}?%H?jQ#-}(EN=u7NlHI8Z@kQ>Egwpur)Y8P#;-dIcM@hW* z)qu=0cuOqQa*c-`4Z6n=m>YBa;Veg;?lHI&Q_8Bq0y<|Tr;{Qr^p7(c*u8}BN zT`euo5zCK}JyO^w$*vOP2fLE21?&pHe{{21pOaW9wvQA1Jz{)qNKY31*~l&wb|4e0i~W&L_F`d=CHt4czMbqGVV97Nxh?Jw>`JoEpO76PmQN)+M%X_m zyGq#ila1Ox+}|v+9}zZcBqASzm!n3aWK|2v&K1j1BQa6fsF9c^?B9~zQ|w>VNQ@IU zY9w9|@u-m~Sruv|ejt`_B748EUm_dx&OF|oWN#Ml2QR_1FP8NR#iNa-F@a^hYi#&v z>cV#}mmf6~FAK{;23E^taUts~6<63Ycxd*Y5`Jj*hv2iq z^aIU)Fn8_;n*Cd8d|WqiCuy#mc#1UFO;kBtH0 z<#Va}h;|)69P!`RdOUPbtxKRIv{w0CMx!1l=Xv4$fq51_TbXCQ1|6l>Jq+DPYgHey zuh!?`@27PaI`)`nb%!=QD+M}6$0*Ka^3hhoZ@AJr=>9rp1GHgPxDF^bPWzEF&pfLZ z+Hk0|&?W}gr7+J@_uMi(D-V9ds=&Nrd+I(*;WyizD%PEj7{jpU!*9l;^2n0)y2$zF zdnw_Zi5ZY$WQGlWfEc4cMvQsw5p+B=&$2@s_S6^JuqwsH413Cg-|(zF=rl8aXcIFP zdXV-{C+!_S{H9OE$kKJpBE*y(tVDFKU?c!=pkB9hc+>DpoePz0@7T|a4Gzm+OHT{j@Gy)C)V_-c$wL^IDcUF zguL_6TpbTa#_S3C?98)T)88^PtO#hsr}{z<*X#Bt&ErXf-}I>%*$5qjYj$Guv<5GW z?XC52=#g6I3qSbym8hYJGHx!}zT$q-AP&Dhx6p$d_lNCZ9BF33 z88JS5ePS8LhxO%lk@JP~Vs6}DL*{i0;1Rtjyj~kUxW7%L(VzL~wbs+d%vTwC^)f8q zVKjVbZ&I8;%xiEvIz6Y)pH8$6F2%ui>7_NQp}39)_9-@G8q0>v>y{gu%=vPr_+nm( zO))R0-^{DmWo2GJ^ie}m`mWbdygW4&yIy-W6eoN`YA8rzerGe2-I+uMAH* zk+0#N-1_9}E7VYIT^ZGge9bBeC-P+lgkQRb;)}9|V#kho-daHwfP==Rn?x$ev|6)WuN_>b;hEaiocHiu-UA#>=vr2Sa1#1RP6G#Ybxe@ zqHFR$+1M0W`cgF&H{E!waZSZKI!6^19|}J91c;l<_4?H(Zl9gsGWTa+nYhub81C9} z_1M^l=Qqv$dGi@v!(AJ%?)d)yW-_|`sxny?y#2d!3)P3_nYt`4-*2TJ6K*V*TaR(Hp{k zj_kfT(N|5^KD>v11F#K#mcT!-=+_8-gX|ObOJqy_vy<$GwGTIm{$Ho%4RgO5);_Ge zE>P!w%@^Z6M(Yn2<9na%Dc;{yHtQp@w~F{PWXsxzpOGzVA6_84yXY?f2e7c)l8stJ zy4kFbWX~3_rwiH0OW@@@-bw~+JzIzJ|UJP_iMed!Ow8*H;)gw zUzpos8@XTI#rBZk?gi&`4+MzzviCt?2DJ}pm?<9)Q5k$ zUy1(JKCH_wGP6&0jz(pM{H%TG1bK>g0zLVpW~wTpu6>vU^wg;Kp(0=4V<|psA3D{I z#=K-J6@4@f%ADv(++xhB@S78*4K*lpf{FQei!n9QD@Mxj4*IHnsQh#+d{c72R@3Jg zv$9vGNt#*N5op88qUm@G zwW|>IJOL=! z=G?DPIu3ceJ)q6Hy-0KJ6gU-+X8^R}X6cAAtPJN!ocmP@ZT17Mec^m5Tt~yN{c&i+ zot8iw9<>76urgei#JOL{C{i-IS8Jl8XcJ0UaJ~Olu=)u}Q1^r}djcap4v$UQIovroL&?e@2XaELk>q*Dj zl~g(B+~;eE8LIuLt;n2Bu`d&k^8(KC3Z%a~W@24PbB-6T-C^E^oN;Di>Cm~lfAA~j zV}+!7JjhAsK9SGPtPHgknX@g1-@Ml<$17F$xdbsIw0;_z!9o9@{`|*Ni;AfR;?ybn z`7TyqSXTd%qNznz|Kgwiv{A*v>7FS+x&6nUA2*;~#a`e=U%*wyUxMBH5@GeT-4>s z{c7RbhXu?R?ZeoU3Xd1_y**s`g<$3Rc!J z=UT0O_?4(t*GtqwOlzT9h!b7^@{_n+#+)(`7s@I7PG#-a&M6~mwegZUWuKk)Bd5%N zYBk>VS3mdRWy}-%+SF={YuDAKLN7N@t;V=syt?CipqcUcPpu}FXI^1y6<-ve=@=PmSI*h2kK$kuV1!aA?{(Jo6TBI zqG8S#u1)6Ue;|SDd)Zz`;yq!5SJ>`H@Gh;_uwLP5(ck;D z-0uDTqnVYg$9RU8%X)>rm{pDF56lYlOuE@DFsuE-2D3^KHkj2&VS`!Og$-uaTG+mr zmCShqv%(x1Zy(GmOxR#nG6xOJDoeb7U{(`_J(TP!@&18XAs>PJ2eVo!Y%r^7!UnTi zENn2V5@CZ`WeFS1YP7JytZIY}W;I$IKVVj+!UnU#ycCZQ%qm~lU{*ba4Q7QoFpdYa z3Kuq*)j44=B|AtQFJM-fcjEQItj-7<%xb%^!K@^61GB{JPI4y{N`^9n*E1_ADaD``)6ha&3??;b3f4RFNfcZ2b%qBL_9S6 zF*ncsK(oIWjgkG(>>muj=^vW?_lS6C_U{yaX!ak2-}D2`{to!eAR7&u{mA!VW(Cdu ztrYi7V^&|MUg3E99%N>9FKK30k3bt{br9N4JBC_oI%b$zsr)O$tdPUbjHm}`W>)>- zH_XZj9k2UQ`C5iqAxDw9Qwg+rGmwkO%xX1hW>#C^H`{#;+Aynqh%q@}$KW>%?F6(r z6Gx5~Gb@}UF|!JzW0g5ZchbzPZi3&g$D9RixKJ*%VOIIjhFKMpW@a@7{(*Yk>ClE* zErd4AYAJM@j#)vP$G-u7)8}UBK{{qDVoaY0;5W=l)iE?me3$J(`j8vLeDmFqQB`|n3gmez`inRuKRFtb_< zZE6T^MSQM~2k&BLbr3pF`#**@F&Ch3(|)io9#1%F?o;J@4c9TqNoQs?7%}~{U*&We zW~FkvMrgmv>EcQLZz!`O?)9z9-FoC2XI2Nr_%6k)aK6ipPnR1qD|=`EnAIBE7$45) zlTN|aV~2T$5A79-^M_g8;wQ6u(obgfMR-%WTk#17LMasGtyf4+ousAz_uj87nNz(k z&8&7`XIB4(_v^X_bGL54=Ia%@mW4MlMCOzh2?& zj#(?pCY7J^w_f2h5oz`66|RU*_f@ZuSkr@4ukexf1AWyi^qC(Oe)p%GALX-pVR{Qy zFC2a?R4+87>ARIjz9wlJjr^#gEpykcKYvH%N7b*;_sEToU~lz8&X1btdi%eCG>vn; zdUZ)oHXxt_9-M zY*oiu!Q0zyJXtYe%Y%Xcq5%%OP{-E68>L!z*k(E^!w z^c>l5(ENmMy3U|v3}8-9`VGv>Hlt zLqamPTCxv_?H?ms=B1n@TjmXYMD`&O{|VW>#Ops#_Cm4!i)8N+G?(=F1GKJSmwy zMUzvM+l69-CVNWdVd1}eBnn{->kO*Auq&B8<+IKp-rs94cM7!ynS($x*N}AvF`v&& z1e#;c!QVk2=g{oOTs_wrgl7LF_|4xGH2WVBerWb9R%P;~B&)(4JNE<4@wdQl#skfM zuyu}yX8%m#hi3mF;fH4bdH7BL(Ci00=l-GDkNIu(L$kjMe$x*$`@zIH9-93p;K$@2 zHE8y4CHs1vLE1NT?8QW5@90|0%%N}%2eYRI(BIQB8=wsjQh8T~`_#a17}I{zTxakY z{PB9-51C_1KU@1xK@ZV7i2hzev$PI_9;$T&X|CTF1Hb80v8@~(lZY78r{Y{@JUCBa zW`tbs&|Do4w#Cc{IpWNrP`i-X6LQ6wRjq>_uGif}n#c1R{H9OEwhUw1kC;3i56%_a zTWiI(%=?boh5WwbnjEe(XoEKKA4kEs;ungnF`f|Id zGl=tIZroo(R)xBScu^trWTOZ7w}~|Ri=zkHJ+v`@SXBkZ`NOKdptyV6T)NKSJv6XS zF%Z*O5@M^DUv;KwR+W_GE59nGDOTk$XzS9fYUO2RRb7KV?&R>i9M<(`pLCizgEOq^ zd%xK^RzLoq09UKdk-Z)Wt$n-dV1Vm^&PU#gJ`{17RF}22kx`vPs}2OXwsnc@`K!=K z`}aFnZKwFId*9vn_XB@B^v?0Wo_zDv>jPdMxGVjYthZ*3+txWCe^BRuf>vDu3I}zG zcs;;1sB725-?6H8Qy*Qcc9I=d^#=7F7V&OC#oVrt1ye zEl2SG4hYYvPIjJi1mD?udPa4dJJZ+fD|@v~wtL#Mt(~sw7rK8@og8)kZwowDb@Inn z<>+o!yX>x`yQfut`e~;&dDRPg1l+h1OPnrvI%cn$(<<+Qyyowtm0mmWuhk*XrmtUe zc8`0+x#;kWS)(54+9ul(@Y8_m;InC4_RkvCDy-wfS>@HipQKIC9Jr%8=zFaq{+{J> z1pOj>EqFv;Zz@U)Kjo1<$+ZPm81uD@0M z?^a#Ab+tk=x`t<1;jV~BLo%x04i0sM>U$Uro0oe%~73w zwrW@Pob~CBfY|{xHB~!o8O}`iNUAA#V0yt6*W&!+^RT_FjOvOz)23%^*;+mKPRkK+ zrghcctc)oI?m-@Vl*>KFlMt1WP~aZo8Aw(C3OqxCGTakg0aXv4%?@&n95ZPg?xq!$ zu_X6WcheekajdIqQ7PRstFmW;%bD3GAmYH$+-2v&UA6Pw6(wO#mpd>ZtT1!W&;dD) zb{?zvK+pZhx8}{>H-FEAs|F7owqV%Vap7ae=1j`1w0+zu8u!$i-QH^d%&nGtPRE>_ zIV&EX{P5>#KMI`p>}}Sp-fgYwIlN&f}|F7+%!b{&9wK)78$AaJ;)#ZJ5IA&$d=bvHbI}K9dFgXBHWr)7HkD9xPgva8e`c%(*r8bUYs?jkM*ly zM*xkuZT9wAWuIPj+;C^@`q_>)lhYk#Z8OF_`p+3{+Pecgba!{L4WMJF0QdJQ=(eoW z?=Bpzy8EMq@jdg)a}VvQt)1e^DWJVuTbL1DS+!?ML4@mQhUdLMW!tUFieP)dzjn2n zW#1MWK!3lpdJPH<=+`Rr!kEcpYscn|+cK{I_$A{*CR`XcqG;xfpp2tqT>q?kFrgsG zwK!|qtq$9=)=?RS`>V^R1vqSz(!w(w?J`<9hP4ZH9&}UIRj~{Acyj;yZks#Z)?wdR zNBKRis%_;Noma{`VjZb+?~4hjEt_0+^sV_9PL&mwO)Rg!{OIbit7*Mz-leeJWg~#rG z`}Z%>UYqE8)6cy|c~-?P_vd#9t(d>>A$N`~5PR*%yw}8iw6ND=X|I*iUVG@malO~- zEkC+Fw$WaD|AjAqKQ8QvpS?t{VjS+Ag?IjJuJ3ogdZ>EmM@6?;@zBV5di2#nziw4M z7w@^GRy6vNHwU0bzYyotZTtbdsUT2_nH)-=Tom8OpWBT7*CaUcJq5q@kpG+{qV z3l8#P8gCWp4}|?2((6V1a?@IyAc3EO4%4!p3if+1}l(bE|IQ9~`v( zowVF8Y;dmWf%KnhI=AYG_aL!Z`^o=^hzI9N^S({G9^iB_-ea^pP>kn&vU`bmaISLE z-x;zui0yqw_CYb83uJEbCHaJ(h7!Pu*aQ&-p zHVd2!b60HlCp${m;9PeJ8=Pyl*dO3ri-ir&g?c{RA2?Tyu)(=j3mcqky0FKPT_x;^ zWZxxhaIPF-gL7eyinoW{sy)I+ZWZeG@N(oG$gRR$4ckk}##|5E$gMgjY~)te2phRol8db)8*@v%{zkH+#s23d zc=pAywop78u6qW@+HY+5@blbTC(c{^CdI${e|3z+aI88P2FIpiCF)O+*1UXezHH}#sU``4E~r`J zJXfy!mq?#W%vYc}J|BKeR8fOw|0?+NwI7=OHSn9iDQNb8ApFqm??9g~oI?f8{z>qg zexTVu7k)DyX!fra@zCslL-?WDj~Zp%KQ#M?z;F78X8*k+9-95Tg&&&zC*U{zK(k*l zZ?e&#+22$S)k=!v9IDk=2g!QW4$vd^MkTE<`rP6BR&9nh6Mn~`Z_+UzKz~>3GtfP> zMm=9<33Srs&2>qH{=SYG2;Ecb9Oy``M?#xzjTU+ibT1u)^8vm`7Cu|~9$CMH?xSO7 zK=;*pA#^{j*Fu}Q`;*Xi?GK~lhdCCm!(ooq6WXw=IMT6(A*I1@SkVw@GdX$(w27Gv z9k2VJ25ruXH$a;=3As|7H-+noc)PXGX5C|mN!0zEh2M#(kzGkL19R2~?KN{McAeUlYb0Q0##O&&RXmi557}~@vhyIc7XBBB4 z|7Q42pNcc3>6o2}G3@FPVg_md5%^QJR?Nw+HNN9R)3pwV&d|CS>Da+qgC{X(x&=B* z`}3hqOfht}_TNQ1)~@w*_)VY4m14d%6ET@OMlmN7k8=QKUF)H9bj(h~n;a_eq|jXL zKMXxg>od?M20V#57OvOg@u*xW(Xi<(bfUva-6zwGa6vbU%n^nctRwu5n`X}7gmj1Rw(u?*u|LJ!&B9c19#mK*o? z1UY1Xft~64O8VQ!>urujt)z{auM5>BwuQ$I^Q@e(Db61jmC{aM=hunWanS=~qLy~dVEF#y#*&6j=k;}MKkekd)|qN-Fn^F7pF+2{@-}bYRB96}%9-RhiyD2MMa4w5 zp7oV;r>?W8?T=OO+7(!jMU6Sv>+-NDs_WN)MLGOrQOW0gu&A-iy8FqZhI%51MUC+E zS1c;cGk{ps1W)?cW>GQSWu2DA}C8o4%*Qm#Wi6_0aVN|!{M3V{&i6%YVv2|tn zhZn0ChaX;1QQ0QkDhv92tCNV*4c4r-K~}(=HXuqhj(~#GNwcFalRjyd9o^cff}elvXoTzk`bj}9KRfDC`Cdz~qep$_QGIE4^t=yt z^u0-cQ|zb^nNxldw`-XlxsW+^HQ71T*ip3T?{$j56g&D@^#3l!%enbuWUmwby-zlNv+Jho@?DA@;d)|@zd+(%VS^nl z7B<+?8L@xBjxZ0!>w_KP-V|(u9qkmhFLs2v1dazg>LvOEJCZq7zH+1zMgL$&S;7W8 z$`kJw*b(M}cza++lJ(@19W9oF9pwlc>I9@%9IHgln30vsqwATZ9dEv`5%rN2|s9U`LYmEG2u6SPpiyQrKWe zxMrER2X-`3*z3ra>%b_8DKH#_pD4qqKAy3UTc1m88mj_Q)r>a(N7 zZwxzHLdQ3=BTSqyJ3Kl0exTVu0Deq#QG;fGv51Fe{|w=WX8%Fqhi3md_)Y)N?6>1@+& z*8VDJyVm$lW_Gj}I!62VK^s={9%*JrAH)9x9fLeRW=ElPyfHgc3@Tp7;Cc^cN4VC5 z*%9~>v!faCo9!-uHtQ}zjA2JB;5Xv|UuAZ*7BNn}Eu8-_JK7CxUOVdeF;7sO%C6%T zgED-^qT`de*RtcA|g zF&jwpc=o_=`rHeBn~vFs7}MuT_|1EL3Vy?mPD2}ZbQYQ?+b?Gx(`95w-^QAIy#$+~ zKVvVO!J$Z}m=?XQs)6YcuJATK^}O8d=pHdXeC1$_9q8eU9i8LB(sCYOLw2-|`tye! zji!z9;Y{7BeS!V4!)W->eoArvu%i$&M1@9bR%| zw=+9Rp;CMFkDC79TXXL^J5qDscOJZX`3ZWL7j(MtXumzPf;(B&6~Q%;Gd{7j&aPQT z+I^iJwR9d+!8v?#DOUV)0@g*LVZ1*!8F7ZPSj|)Cpy6umFd21Sz<({d&07TM2&9e z45oyFx*Vnj{^u|SRz`Ta(XA$j>7f!EaU)xRZBNdCoWe}xFBQ%oIlFf2s=-T!ZONH7 zcJcVJx1PKexlK6_DQ@&2toFTgEceWg=_|@gebm`2bR9<~(L7u0S>=INKt-_S zC_A3+UKMdmy*hi#qX#ywv)85_}Q(!?Af!=SH4hgqgs0Y zF&~%fBR}cI-AYX{yh0d}6P|Rnv>u-MUwQHIA6u4fG zcu140tCcbIRP)p)9~n(ocZ6>?!+pvEAK2JFD%YCVdvLwHAv#iSihc2cjmIlKq#Aii zf2^Iq@e0<+OLmvIljBQ^obd@M37!&9NkU3dX-P>@soRn4NpX1Sq{&Caxf!?X{HJC3 z&(nMoZTQbY-oa!qBK?7|ah~0S<|}m5HS*dDdl@Zg$babT#T&ndR4$z#>!$e+YKO4B zkwl6Z&la+85;o4uB@cOp?8DxJLf6QfFXI17%b)lDUa(p3V12Q?mh4Bw@?&JL6ZT26 z?-Aqwi0nmT`6p!06#bnid#xDHMY7Yx`hm2pudv&ZohR%NvR8}!*_G_qgbn_Kc_-a$ zRu8gq%`@Amk%#N5*#`f?JOJC^KZiwpBH5_Z!^>02enZ$lB3tqY@E=(tFNf?P@&1AT zU`~hoD zFek+0LybJiuTUdT<~E^5-fHpw@|t+|#e;TIJlba326)gRW5b8vrQXC7d2y{jHSsP7 z4?+e|%VZHDS11)(L^^>eUS$WFqyn(LW-^L^cVtG9N=Q<FSKcQWf8T3cZ`$cE%KbpIKOcV64>bFKDdM5ozXX09EYzUc zzmjaOhqsz^C|!4qc7PtSIMAqt(PvKRjasjVj?nr&XfydHbBa#Ee~Fx;I65|X?i@7~ zL%*;4%!2NzHEQkhwooUQ^=#-!9fNZP&MCs@D(4iT?kIDi*P#38_+!w0wLSrD=F87R zM{9os9f!<X=E0N!A+YM0{VS8PMjn z&qhqDj=^;>{My$-o17w*`(zl-R`?C`*^6}z!%?|Uh6^1>jA20+piK;}3t|4#g*1=9 z7yPErzR-j8cw!J^`b>vEUHfr83fFJLwJkhmeD5>E0jCWetm79TK2vMtQHN$}y#hL0 zYsHsL%xmxu(f)m;x#pbWOQug;qr&{>1H_m#3x9JSvyT^f?zX!*$F8#F#!8Lig7GRfsX~`x^Mo`@R->gpOG+ z;&GkK6{&%D8QBqa{jIBkhZ98{zBpx|KR@-rS4Sp2=%f0ov!fwmd~L<}mNXdO9W+>+ z2Xmv3Y}KBi|M9xgltt(N)ZZEUyTj|nS3j2F_2Sw@yxur^pxs0p^M@TJQ=C8SXf?&% zLEFXYSUx?lT^dRwcGQ6eb{YdQjU`UY=qte6nqfzY35pTv|GeyooW9wSQ@ib#u7NlH zvg93g9UWykoKff90c`_qZ7YL!Uwm*@bVc=?Hm%BnKi`^d&5O#mZhrbLEB(=q+h+y0 zu_9-jBZfouu!6f;%b=s8NcXlPA2?^toUvxk`!6}lpGkKV97uC?>mBCsv?E_xRsVzH{pB0Xqi1oW3jTEviY^C1CuvE>xGUE7hgzs_N2( zRn<^0VW?*}s9V)u>c5++N!Kmn6{<-W9`S0StE(&0YFL}DA|R+?ZMrwOHr=EQ|7+7t z%J>qs=?;5q)9rSTJQp2=+H_&4O*c!|rrSrg>AH#9blY@ox+qnf?nr~$bU~&z-J}ez zO{bX-*QTowwdsNy)}}icgTjbj7an{L=ZV7M`h1 zH?Y=Qo9;DdMsa~V%VQ6BxhHxOscIf7)n(Z-+~YiXQ^*Ihb3A)mM!Km@7oM@?*5+!{ zO?=|$VqKfAFvH!kvKLqp*QN_{9hvW*QxaC_a<>Tx+cY#fr{{sv+I@5P&aWCAG-1oF zA-SdFvIg%NIyR@((5i<(bEqO+Z>mVwy2J2ERFSUu8mdT_;>~A^*_fVqKl? za2Bf5?Jh=jy7WfX={i$&y3SOct}|7q>pZI;RjZ4pYIV_6t?p*3RyS_)_}cM#6Shp~ zMpf#jxQ^!QDs|H`%Cn9SL#;BZ1zBFMYSabQ)u`L=9u*xt(zRk9)hauCcOca(vuz(= z9rWi`)${AuD?9S*BTu4U*^#n|s$LnYt`(Qp<&t1I>Xr4RN^t#FPAoej@=T8W`e^r? zFFs9`%*xt5{nXLN#(Y+oarB1DLt`^0WukIjPR4*CtEh5ap(`T$xT#zhMV0HQ3Zto9 z7gWD;-ENifHr^9mo_}L?qiqfO-9@?^(0?$JK`$MB{zk=^2JU-|zFYn^gYE({Y7xC7 z`tD3eUrateD|lPSfS@-!&IGlkI0wl}%LstJ|w%d9OaSPw&-CTTuGA>hfQ=a?Dee|Gf7u zI`UNUuig8wS5f&7Rp7?bUM;J){OESxtCMN3%4J6%_wLmvu~&aZcSdRuv77eAj+;Nj zzIgwodC%miI}dFtlzT%TpExd$u1`MD!tsWCftF)0;0U5hcuyU@ zVZ!IntVgu$3)I$|KY#xv8d-tsg{w8P&(<|PvXd1fwj7z??h019^CT1%5voco zN-Rk%btXHU@hQ#}N0P(sNlZ>jq-jPUjnB!j=t^>`k+i+WHSXG4=I1lb0b@DNlIvOk zong9+sh78_TS%&H>73W%yP2Vi1nW%`+~6lKz2Tzi|eL273zerjo$)a2>T_n zhwu*y+TKpGV}$(**~30JlYcK1KeqsvEjpS+6LSSwa%KWVaL^BQf{C66Wr5>i>MV(zFnsyQK>Zcc^yQ5 zfO$Y^zTj==a+@m4%*~8ofn&a<+-+X;Svmf)`91qR@{qW;UnHn_vKNj)O?8iJd za~Wv%W1gA&hh{(KnRz_W>~D$(eIfdR=6E}OwlL>{WyIg zk6KjR4>bEH!f*P4X8%kP56%8{v>!S5Xai}kTX%#s*R8YDXAQHS-Oy%|4s&K)x9%LY zVN7&Fm{g^1^arT9d(f$Nz!+M<1{k4BEX=Y6M@S6$E z@zCaM7OayQ(=QQk`dk3N>9YztLHD^7+Pq1)zJuA*3DU8VI!5IQnK3AiV|Wv;AL0I0 z&XD0vQRL@5q>+d*?5PlbyYBOT=oGEzKpO@zA9{fHSCNi2ylEBuh7GNSHY{lmw29e= zc+;n1G^S6*VhlgR{BW!pLl7P3ye%8_kMwqNymLQ^@SE}90l(2D@SA=Vb4k^CQmX0}(m<+8iz;D+Y=L5{M zVxWg;KWfay4%Ipb{v54GLK}WG3EIR=gU;14(@FDq=EHCLd<5DsrbUP`eLfCtekeQ% zZT`Mm<{nCoYs@t~(Wqa*PM&VmUs89{(YVk0Uzy)Ne$)T0AE<1MC- zVT%qq)uz$^=BrZK^iioA4rQ#DrYt&j6#ZdcEJJ^H(L?sPn{51^<;MNZB!`SUM7FQE zhWzLQid#a*AUE!>AwSwc<9mZXAMko@^x*N~HzT%dK5nhKZT;g%&rsYHT8|t0K*KYS z0e1Ix)HiJx{AdI{uw5ETBYrf52KFv@Ld#ipCQV-}-Zm$^sk(Iu$??AUk)sKIl!UA# zv`h1&4marW;GB-Gl(ah2E2w zc;b~vs^#xqNyG=w%Zc{13btm>h_3kipRV(xYmy(0J=g2<@FT7#SI3VWmVf-HUOhSH zN8@xoIY0POo+pC%QK2VJ@uQ)hG~!1tPtMooM{O$Yjrh@wl2GDD9Rot@^P}={19L-$ zHNlT;9djyY-fGoS6}giwRz)t$T zcfGI4#5Kx$zE@e>61?Y$KVMPaGs5-Owaa@7D6^*?19|G`<>ftNT|2H8RqLYi)JYyr-}CW& z_XN_pvu>LA;P*S*ICqzIzx?4nm|NlXUng-X-h;aA9RDr}Ip2=gitA=|vsv$x*eS*f z-h*pMb+cLi@E*x$zY8@vZ|O}reu=d9Sj$V)mXY+t+wa|gUW zcn|Kyz&3bKim<_ZWL_C~kK{ApJ+sB@2k*i4xZEFj&qQH^_h9abmxK4@3LCtqzp#tQ zP7^kG&m3`lfcId|hWi8W!Q2kp;61a24c;?S*x)?_gbm)4C2a7Xo??H2_h3$j`v>pA z+zs2{Jw3#7@SYFEa_}C>pTK)CSH$as_nZ=cf4l_G&G8;EC%<`5({<+>PQx(UkrOcN ztDAbc&UPK-u(CiPv=Y#17n*9mzQydyJ z`~RDG4?a(s_r%dL#=HmhR+;zYLif}ALFEobYke>LhWDskAiMVCJC=D5@}il|9Ea|& zV^Cj~c~2l6W6XOxK*#HtUeG_#I)*g!n1S#c-jf5JpkszZn>T48w4SiD9w*JbN7a`z zV_1V2!+X{vCPw#za~jSsIsk3Xu3OVF$&3Vih?zuxXv1cZFUP#+7U%)G&m7Xsd&a_V zcuz63;XTu#4eyzWc+=-1_zmw_3T=4La>Uqm|Lfs5+u8(ec+Ymkn0}7IZ(d6%9oPI? z!btOL!S{V=n(i|ldXUz`5udL09q?ypeHZj#t!F@+7*z`{Q~Mvmx^}H`Jqh=@0y<0k zk+;LV2YEX@p8e3-Iz}<1AzGhA{7|jIikSDbroU6>JrU3*CJH)N$48Uq@!)!sP}3*w z-^siO_qt@>gZsiT@5zP!hV!0pW39P^om!Un*smh*!TBsV`uJ9@A@8}%Pu??tzW4ZW zMn`mttsXnfGkjZ$$sCbsO@#$ z^X zPx}DdfSgrBktvindmm*AW#w)eRytwH(4etm|DnL_iBDb$fNg@#$~x$Ux6l#MLk zTmJdhQfuC`nO6HgS=Oj-pKfrvYE<2~j;#YK0dqO=&t;9{ZYfu*u?#=CZ1Ef(@gGc1HC&F!uiuhz&O zY9?Q(Eby)M`zn6C{=vY1Q+7_jD_BRaI4QogIHfefkr1Ddnp~9PE=?&aNiHpkPj#dw z#nBbsJ{!)xxLxNpEyHUX){#5LJDB*)BGTuCjdN&u-yK|Q6-M(Ey4mO&9-2QF_H$%! zqWJ;cY}OhQyXiMJ+n6URrr)M)ZzPe zt|KS&f$-V`Mf^#!CyVWY*I*7pH_dC72>WwdAnVHEhr$*yzBZ)45c|hQ_Az01A{%ow z+&^mYY!S|c;A`OFNm+lu97WPdESKbLG=U(e%tm~5FJw215@V*Mw`UMK7&WMe*t*I!09 z=5yFyNj9z*X8ZSK%lx3VWUm&-J4fQ#7r*%v#iMng_Z0l*FUE!s*ARL$J>9sUay&Hqqv1E(g=T-Ah=*qXa^Z(&|4#T#KhW$yA>yIguh zLYiyC+39nJYr}1ajzBcAYG^ZAb{ZOBklK0ZOXTgSdT@3XZVjemCiMGS4~Ool^=N3b zEtR)p^lbPebF@1IXN$7rBgEMm8PFrZhaiXAObWADq_q1LB zZJ5jB(1xL?Tp+_}R*^q8PRDOTjNv%jp$(%s1Z`r#hGI>h;6dCcE)r*s69jEI&JbwB zYw}3P_SDHrCyTy*h4~2XtHrMu-_y)oPC*;CavJ)7 z>HaM`&iVd9p`@APbcZ&K26LgzdccOb9vOHL_o;G+46hlB7_-msL5$hfz0hfTyZ0f+ z{D!E4-@KL@_>JBJzv&0(0L)y@L8t3}kR!y*C7d*KoF34bI>rf|p>;ZRme#lqgvU7= ze$(f8=xiMWPQ>>uDuLgOXD;**9kUSHFq)-^&(Z$p;Wv3Z8=wulc>~(SC>}IS$G?Yl zP5-A6WBOD%MR_^~oQUsRgzHjbduum7J`hV|zg_2VJW<583<5*8-quOxnxwdMTr1hc8tdu2qNJZ%b{s8^3V3r`m9j zwi{5tHe9Bv4fo)yssdN=n^cD^`|R(mGZs~fdouRJW-^Cv_0;|;+iq1>1lt4twX4-E z`?fE~q$aqIUein}^lMj&%lAZ;=l^r#B{GLL-gtaK;hIdzq#o()2sV}C9tuAG6e_?K zy578YS<{P`U`=ZLbibdgQ?qSb^K@v8>(5tfWZ!LOWS6X(HzT;_kAFN_@eZ-0hpr$y z@+3M^oCztZ3Gpc@@$p3|iE$-K?gWp=ne0p`Nl7ukh51~HpZS~$_H}mDGVG|Q_vG}e z)ppw_)?ZHV%VuFeM>ei?)y-!8frMlYn5Q~V=hnK}RGsHV`0=5d&3cKRCHvS(b`1YO zpkD#6kiAy)|2o;Hya$QR+E4aE5&sU^`QG0ezH7UMi}Acq@%=^oM`UB3Q#TuZztykp z_8Hkb#r7|dyM_ar+{yxu-! zj~3&PB^&cgy!`~SWo@@)vX_Y0hg=`jWa0R9vNs7Exju)5ja(mG$II~}$X+LG#u#xLCP1wlwxmO$y$n}{nY~=dn3LCjT_Xr!gK9U_F*Qcjgj$EJq!bYwS=0kY= z$n^;mHgbKAi+JSvU@nE@k?SMb(bHsa7V*gS*)443`p8@}?g`JnSkWIT9&J2r)4yDw z#IIM|tuF7xPoxmN_0)vc5|w6V1&uo&gIMX!TaSUeu5Gy|2HPr zr>WX*P4S#*^qItb1DZL;Lio+!3pD#t=Zb5)L9-vVtvDW<{dW3HVP5qA*n1zisLJ&3 z|H$yqQ3*xSX8Rh6p%NM}Fo54;k>Q_&t}*;EL<@#N^JlKPK~f@tKg@3A2ew8Z`Is=lVPhzsmJ_3|i&-ya27(&PK%R+(xmTy@*j9=>THX7(Rzz zZA-A7U&^t8?QlQ1&Vyege6KS*0&8U!6i=FSdNSa*%YMc|r${{oI$7$wpi`y3hcu5z z@SIW7zZfxTQa^$i)#p<9L!|#@=ya*UYy&f--i`RtQa8b`IL}dN#ezhBkBULA9&@2S zqNLT)niCFD@>Yn=_hdad)I6)!4)<_Yr=zq$90yNZg51Kl-KK2BkE zm+PLpj1eV8cNG~UihuJPV?>*BYqMQ5e|_s6t~<_JFn#*1Z7)h`UBRs-wV2K>u$d8U z5{${+W@FT+`*IlZ)%f${KS!>(u>2>Ipau>n@D(}~-F#&VX`FV#ht@!UeT0(#_~*u4 zGWECv9mK6@6ZbjUIG^Rl{k7#k_t5y>ruRF>*BSrG@b`@WI4RB({S%-MmeK-=nr$_g-mTwYJ+2;5AD+t@LI; z&q{B(UA)rUfb*{OCV0*Noa@d$p7EMVUAcnW|31eZdx+Oea=d=2sEE&toz`5t*|F_X zjqH|AvUxn?HIphnp~`F*lh>5ktS)C*fjMZ%L8lA6z*G$!3 zFYuZw%?7VY(QNP<%>D58z-yv48@vYdO1vDrCQP%zYeKaB4_<@07>)<8(Q|XaYp&9k zgV!9@`U9`g`4f0eqqZEpX0x_Fcn#)SczfVAn3G`}yk>)DgV)T{Z15VLAA#3k4v5zW zuhDa>cnKam<29Vyvy;~6hHD7jGyVEx#`)A{yUc6o(gA`;7n9et?DN*VhJI{g8oev! z^mKGDo{nm>AuoYB0yOi2F!*U+1Pz+~$yz)#`vu3zmhn2r!TdJ&56$s!!{1ZJL$e=q z*BlSc{v7z#c%a!oLyL!I|09|on*Eq_=Ki7C-;+KAxPNH&N5Zc@AE4P^q4}ZNzZ!lu zPH6V;(&C}nk2zuHHPGz;PvSNBJoThD8}pjm==+XydhUl-IXzpTL*y}o?^xzFUqUOk zqUYau(Q(DRrVnZ6H5O>aYoejAmwh5Hjd@BI{Ho9K(9tqx60~}eo`RMWZpLcT%xgBn zKSIWfTpX3_vmG%J(!T>SD!=Ct^f2i^f*3W2|2h02(%+YkRpvDVq1E~LAZW!LXEV*tSX&w)*3kg(x?t@mm<{)BJ zpUBtY*IMN3sMlKL>x`9sihP})IIp4a=$~D_&SO`!@D+ONy7>xTdYl&0OE20i`meq! zh0Qz!hd9uJMZ!S6XxbMSjJjvI=y@%eW_wTuQ z&5x0qJJ)QEJjlDeMH7EOZbT1xjJfRtPbLZ<2#F3dg@_$RdPNc#+=e`%u_RGBH zN2<-%1@mr#4%8 zNl&WH=4I;nJ!-Qp=$`z&YO_86UpKU>&G!4@iS5;917)GwY|G3ZWyO4lteD_VE48J% zj+|FkOnw)y)Mlw}I?qaNu&L(|9R4hxAJ z5j7$zBswxGE|P9fBQ8iOR3}v9?w&T|*3r{Te{DFY+&<&R>A#-t3USW3`^L#dGZI2( zxNeLODRtf$6*4XQ#^Llo$~jFwl9OzTcDimXvc|fcQL$F5tC-Sb5(u%xCPcfUUB$6B zSDZE8#piPRqc*ij=Ysz{qc1awGrbm%$>6g<=`*#;P{v%Qw{fKkPo_sNadxS%?`sTE zCeBs8+-I-SX)^o`_47}hdwP+rHxp$~JCpsnII`| z;|}_-e!>d-PWm54f3jT|*7AMps_Ap{xXww>tyxL-Oqz?3&1^hJ;whZ8ize%;;rBP& znBzI6*_+5dS6#IMT7R!o{1Nv-(SBVu{8p8%{km#PwB?5=5Wi^HRK1IYedv%y+WpM~Q? z$wnO)wuh3f=N5sr?9j$j1`v+_B*7~!P9k0D!8DxiO_8790H9MQ^Q`+;% zC)=Ve2W!E650AH)>|L5Yne2m_J&kN!OUvHtMR) z*KE{PTcX*htET7Xpsw0%ZU3RJT9#&`t{Uc8czY|!#vBdXYsem?*?%Bg&&^p+HfjNJ zJS#l5$6o$S@n~Xhl|E1Yrfm2+WH0AaSFMEueE(b-K#L2LB_j%^iMnbcK_)5|i7yGr zT!|7nFD=P337wZ!69`4mm_es4W!27^F@sE=i&0mNF8^(}uA1=EYu(it%m_M$nE^oa zoW5RH4Gf;S0yM`QgkOD?LbD%?nB$?@pFy7wTvrX6{Uz|L_Zl?&E8xc@5;bV{;~D^t zhi1Q-J`Z?2(Ch~j=6GoKXJ~$C_CKxpq1j&tzk0sV>_4o3qd}SkPuB+Anf0SJJZRlvJk3dIC4X(p=&%koHPm#ByUa-FKD+ZGXtyoJTX|Ag_ z9scWOpEIEqcbSbCHD;XWa9y<;X!YDzAV#r`r{P!67vIy&OZGr3F0v0=@s-1*xvm=W zd6>Zy$=2qsW(8UO8q9ZiV-X)P5K+j&*S+LF{;n6pwnfH$mdagihLe5 z9-IpVX2_UuXvJ6JNi#1I`8gYs&Aj&;?h5jenM2W~-c zMe&EPL>x{yg`}5NG*3CrOIm+e7k#3?DfFlJ*FZLY3v;7W1JUNve?9K|a2lNZa^wCU zCkMumq!xTf)YW#Htt*{_52uJ&5)W#m!`c9ub3vM;-(06n`26ZI?FR zXy*#U{_GO2hCWaGb1gmj#nuHEGO^oMt)i(a*I8FIkb=BB&$DJlex89+H9|&xE zuV$ag@j&nJ1M3f34wC8<8rC~7bkJ`DYxbHP+xmotT+{o_k80{DK4|xcdp|g^zw!OU z?;d^U*jpp(6JJZ-nf9(JXH;)fAysn9?bgSXH>!{2Zzjj6pqd6+JE&$m>Ap2@Q@?#J zADZmj`dVH$*}L_#{PkZ$le$?qj{hpC{{X}4S7{2i*T&gSTKy(_O|{qhOio_6yZo;{ z>CRctdf6Pce;V*zZCu!?4;H(O+PE)`>hb-I?&(3}2P9Sh``=gijICWf&~)V*EU`J@ z>6N~Aez&m?jC~;0ntwQH^D?XdNw0SDXc`mWsSS8GdBchmyPOkG4h^=K}O{29o{Y1^q+W8xjt)_XV9XoL69J(LQq?K1$_D#*5=~$Xm zT7~VU*=s8&Cr!0)*;>1BvSCFY&6{cVnYqp}u7P0=XQ3-H%$}U<%n*0Z$#$jr+MSae zrkVvO(tRD-w-ksvYGL-pH=X;=Ihl@{C8c(!clF?88i|j|vadO7<;h@2QzD@e2_o8QiWt3g(Z`98BtFu-Psk2t3*VR@`uFLP=|L^(BcI>m3Rg&-7 zy4v|W$^U6xesJl>`AdWMTNnG)*H#Rvx0a>X*Uq0@|Nhb)e}8}Jlzpbq45Mu5d?WwS zPd3&rezv~s+6Kc~Sy^vgyt6)k*|CpnD?hEz?^nMuf7#Cc`H$|~ILaT9d-D%0ar*c2 z4)Xom8EbIZfz=g0zTYMt?$)C+*eEOaGfa#7(-BJ}EdM0gRC(e|+592KZ~d$$8n1tP zU0M0R&sh6UZrm`>>N7prTJCS3@aQLV%6m8$nuDEJn{9OT*F?LD9}Xj*|Nc-0!_oZ1)jcTdO>5s z*a=%Ej3``D7%=hln462{&hfR=J?1~DS&&S3W?GtdVvNmeHs6r*o)+{u52h zo!Qr!n#w1YH|H)o-B?~)UR=?7d2{l0XQJ~rFB!JxtlDJ*t~;|nZ^M%E?oU72yzG{5 zO6|>o)dvggw%nTWmWE9G$c(k=mK`>SCH-)&W&3Qqr7q23*_vms^<8OLDv}++*em;Z zENge!a6A{d1~1LIro(&pU?ihnZ60Yk5}vmrmDd$}{E>V2-}@)pM-v?H%6)Vq3wwz6 zOOG;Bn7#ErD&T$e;BL8(Qq8{E6KX4-=w@AneN^7EkDe@k!nqs!XnJ|`dy7sVD=(mZ z)OvYy9q*&FD9>Z=eY70=sHnqi8$7emUKQh~d*}E%ed999zntT8J%BEeF2`@HPy>bz$PYhLbEh>$77P(4FT(+X3xVQvsR9p%D zFN%pPjV-0OUOSD?udwJc_qj0KXMl-!w5*9XO|u`RMSFNL%`4ZCKBC#bBaL|t+04c& z5=%52+y`@avdNlg2Av19jX9>Rn!TCq0{3~m%(01gpGcdH?X>(V%?9_GixYg&%*I>v z*yuh;WKFdBTKs-m9!TfxvdNlgGqmv?q6L_%;N_o@_(~hk7i8bB_4gIoFKOHRhU~kv z^-q(H`4`#D26Ai~G~1tSJ%^?j*_gZG_&#J0)@*PeU(E*hNz}%J92>oc7r2kk$%d0X zTYJ9IWLIf6xX)wS>jCaFN3)S*gE>ncA98F8G#fcKvo#wzHkkY5cyOO^%?9_uoDMH9 zBHO0zZ{*k{X*P0fc+L}*5s+gOtu056jr&I{Ek};c5v_mZ*x>gcZx1;(Z)@u#$L4@$ zBgf`>%|?#R8=CzX*)^K|B-wK{8#y+ZZ{h7B$0kJE-@F8m?QtFC;GhklV-_{g>XZ#% z`&=jf{A!@J&;`YHfLJ`MfhO=tR4m9zyL3m?E0ZYr3PBZ<gCu-2_&!qP~j|ZClQ{h+Rfo6Y&77xw-HJTrq{a*Aw=l-GD zkGWm$ADaER9-rf(*}q)#L$e?Au-p$c`#;v=q1lh?>zV67vws!smk5ADYHR2(Q0d*I zx&B!oea`TGYc@iw$*?BqtFWfL-h%Iu^CkQPrT+x9ns@#VIz;*-={O0zMrv{IoIz5j z!5=F1SZKAa98J%G9xP+$m0?bk4Xt7d5U=ueropfJya!tGp8KJrWj|Y? z)r+))^zcyW7aT>60oOn<<3X+r_kS3E#d}UctLF>8GF&kpFFIEF`G!Ns$^K)Y)%-rL z>0p+VMtb;286%jA;wxY(oKG_gTE*Otc-5z1DymPBE2DC5o=V~#@U{eBQ5QUI z(fR=g)|SnL&rWVU8r%u4t30CVq)DHG$A3( zW)h-0Vl#|#&YeRu$NNit|NegP&VANOzn#QjcJ^33 zmtrb+=J#(V#|{Cy46d>;^&9oF(AL|FcPX3MrPn8ugCYVQ3|uoQ=5f7fLxpLBSq88=IDIR192h{bcA=$sdDw?cUHiOP%*#=87<3wLH&sYlPH8}n)66azmTebc_qIi97`w-bnwf;UM8`l@h zW;VVcaW0mkvk$P8o?3rkDVR%>d3~@H zT&v4ASW38NgQeV{*DY$Nx`vXfcYc^O4=4p62SjtK5`GBPy&}^_2 z)JfrZuoPS`&Nf&I=1tfJOTqjK+h8e8nhlonf@XuI=xhiqWtFxZEM<Q?tQRqBR>V1@kq$K3GbV_I~3fc56%8{@SEj+fM)+Ha{Z^U6nvI4OF=F# zvy?FCq4K%MLl2WW4_dL5#n2(rzX4itkFC%V(!U*Aag5!hnWZ$rf4z)33axTpyy&=M zmSQH&tm7*9Ri8tlqvX0HpcPA*0j*x7S)`ez%!gl%p$Zxw4%C()MvWQgEX-2YLaXPy z4l#<@%SERmI5Xdm?X!!4)LR;28UsmvIE*K{f*En z<|uTE^dBS5p93qF%Bbq3-yqy~p!mU0`kVk!4P ztC)Gvilxja&Evr}8q88wKxfH5pGM4RsW-!~Uh6IJtJk^?TCo)5O#jqb%FnSLS<)33 zmZi+s`lCbQqOug6zjEW#-?l8}Z5p2^EafHQGK>b%C!JD@zk2luAKF_K=Lt(eo{J|e zrNl#)vZP~{5*O1RONs7~rO*vH30ja_6EEmgC%4#^Up0Zq8GF*n7(kY7NBaz{fyRxrk-^|>p9c8$n{+P^g zNpS@eMRB->COg7XoxfTcZBBI-th|9J%B`H?lAPO;<8o?($2l(MYKxnr+@x|`7L=HY zqxhQ4d8w#DCUacIR%OpSyp?iXsse6WG5YYt;DW@_yKXv=8UA3mRLX5JdOS16a4zni z*nS-{k!jMSyH{C-w_®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 z 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

ospR^H558*F_se*b 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
m%$(Y3^H} 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μ(dOd7?gwF>auef@_cIz={zw9-*CLdf1G@ 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 S?~&~gI{rMiC%6c`V(woMh1SRb literal 0 HcmV?d00001 diff --git a/TargetLibraries/GAP9/third_party b/TargetLibraries/GAP9/third_party index a29026a04d..25d2a7cdbb 120000 --- a/TargetLibraries/GAP9/third_party +++ b/TargetLibraries/GAP9/third_party @@ -1 +1 @@ -/app/Deeploy/TargetLibraries/GAP9/../PULPOpen/third_party \ No newline at end of file +/app/Deeploy/Deeploy/TargetLibraries/GAP9/../PULPOpen/third_party \ No newline at end of file From f3744931744ce580ef51215d1eec90b3a3cfe1dc Mon Sep 17 00:00:00 2001 From: Run Wang <52746141+SamanthaWangdl@users.noreply.github.com> Date: Wed, 4 Feb 2026 14:26:07 +0000 Subject: [PATCH 32/49] Select docker based on Repo --- .github/workflows/ci-platform-gap9-tiled.yml | 2 +- .github/workflows/ci-platform-gap9.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-platform-gap9-tiled.yml b/.github/workflows/ci-platform-gap9-tiled.yml index 99dab34691..d0c2c90482 100644 --- a/.github/workflows/ci-platform-gap9-tiled.yml +++ b/.github/workflows/ci-platform-gap9-tiled.yml @@ -27,7 +27,7 @@ jobs: select-env: uses: ./.github/workflows/_select-env.yml with: - docker_image_deeploy: 'ghcr.io/pulp-platform/deeploy-gap9:latest' + docker_image_deeploy: ${{ github.event.inputs.docker_image_deeploy || (github.repository == 'pulp-platform/Deeploy' && 'ghcr.io/pulp-platform/deeploy-gap9:latest' || 'ghcr.io/runwangdl/deeploy:gap9') }} gap9-kernels-tiled-singlebuffer-L2: needs: select-env diff --git a/.github/workflows/ci-platform-gap9.yml b/.github/workflows/ci-platform-gap9.yml index 0eec60f1b7..a05015a5df 100644 --- a/.github/workflows/ci-platform-gap9.yml +++ b/.github/workflows/ci-platform-gap9.yml @@ -27,7 +27,7 @@ jobs: select-env: uses: ./.github/workflows/_select-env.yml with: - docker_image_deeploy: 'ghcr.io/pulp-platform/deeploy-gap9:latest' + docker_image_deeploy: ${{ github.event.inputs.docker_image_deeploy || (github.repository == 'pulp-platform/Deeploy' && 'ghcr.io/pulp-platform/deeploy-gap9:latest' || 'ghcr.io/runwangdl/deeploy:gap9') }} gap9-kernels: needs: select-env From 3b74a29cc86d1aa0b78e821062605e1ed053e0d8 Mon Sep 17 00:00:00 2001 From: Run Wang <52746141+SamanthaWangdl@users.noreply.github.com> Date: Wed, 4 Feb 2026 14:37:21 +0000 Subject: [PATCH 33/49] Correct config list for Gap9 --- DeeployTest/test_gap9_config.py | 12 +++++------- DeeployTest/test_gap9_tiled_config.py | 12 ++++-------- 2 files changed, 9 insertions(+), 15 deletions(-) diff --git a/DeeployTest/test_gap9_config.py b/DeeployTest/test_gap9_config.py index bf0104fc34..a0543c48b6 100644 --- a/DeeployTest/test_gap9_config.py +++ b/DeeployTest/test_gap9_config.py @@ -16,10 +16,8 @@ "Kernels/Integer/Conv/Regular_2D_RQ", "Kernels/Integer/Softmax/Regular", "Kernels/Integer/Concat", - "Kernels/Integer/Div/Integer", "Kernels/Integer/Hardswish/Regular", - "Kernels/Integer/Hardswish/RQ", - "Kernels/Integer/Backtracking", + "Others/Backtracking", "Kernels/FP32/Add/Regular", "Kernels/FP32/GEMM/Regular", "Kernels/FP32/Conv/Regular_2D_Bias", @@ -35,16 +33,16 @@ "Kernels/FP32/Softmax/Regular", "Kernels/FP32/Transpose", "Kernels/FP32/Mul", - "Kernels/Quantized/Quant", - "Kernels/Quantized/Dequant", + "Kernels/Mixed/Dequant", + "Kernels/Mixed/Quant", "Kernels/FP32/ReduceSum", "Kernels/FP32/Reshape/SkipConnection", "Kernels/Quantized/Linear", ] MODEL_TESTS = [ - "Models/MiniMobileNet", - "Models/MiniMobileNetv2", + "Models/miniMobileNet", + "Models/miniMobileNetv2", "Models/MLPerf/KeywordSpotting", "Models/MLPerf/ImageClassification", "Models/MLPerf/AnomalyDetection", diff --git a/DeeployTest/test_gap9_tiled_config.py b/DeeployTest/test_gap9_tiled_config.py index 1157cc5915..f9bac8dfd7 100644 --- a/DeeployTest/test_gap9_tiled_config.py +++ b/DeeployTest/test_gap9_tiled_config.py @@ -17,9 +17,7 @@ "Kernels/Integer/Softmax/Regular": [800, 500, 300], "Kernels/Integer/Concat": [32000, 16000, 8000], "Kernels/Integer/Hardswish/Regular": [750], - "Kernels/Integer/Hardswish/RQ": [750], "Kernels/FP32/GEMM/Regular": [8000], - "Kernels/FP32/Conv/Regular_2D_Bias": [1600], "Kernels/FP32/Conv/Regular_2D_NoBias": [6600], "Kernels/FP32/Conv/Regular_2D_ZeroValuedBias": [6600], "Kernels/FP32/Conv/DW_2D_Bias": [7200], @@ -44,9 +42,7 @@ "Kernels/Integer/Softmax/Regular": [1600, 1000, 600], "Kernels/Integer/Concat": [64000, 32000, 16000], "Kernels/Integer/Hardswish/Regular": [750], - "Kernels/Integer/Hardswish/RQ": [800], "Kernels/FP32/GEMM/Regular": [8000], - "Kernels/FP32/Conv/Regular_2D_Bias": [2000], "Kernels/FP32/Conv/Regular_2D_NoBias": [8800], "Kernels/FP32/Conv/Regular_2D_ZeroValuedBias": [8800], "Kernels/FP32/Conv/DW_2D_Bias": [9800], @@ -63,16 +59,16 @@ } L2_SINGLEBUFFER_MODELS = { - "Models/MiniMobileNet": [60000, 12000, 6000, 3000], - "Models/MiniMobileNetv2": [60000, 16000, 12000, 8000], + "Models/miniMobileNet": [60000, 12000, 6000, 3000], + "Models/miniMobileNetv2": [60000, 16000, 12000, 8000], "Models/MLPerf/KeywordSpotting": [64000], "Models/MLPerf/ImageClassification": [64000], "Models/MLPerf/AnomalyDetection": [64000], } L2_DOUBLEBUFFER_MODELS = { - "Models/MiniMobileNet": [60000, 24000, 12000, 6000], - "Models/MiniMobileNetv2": [60000, 32000, 24000, 16000], + "Models/miniMobileNet": [60000, 24000, 12000, 6000], + "Models/miniMobileNetv2": [60000, 32000, 24000, 16000], "Models/MLPerf/KeywordSpotting": [64000], "Models/MLPerf/ImageClassification": [64000], "Models/MLPerf/AnomalyDetection": [64000], From a42f620cdaa36b8ff3200ecf88a496785d72ab8e Mon Sep 17 00:00:00 2001 From: Run Wang <52746141+SamanthaWangdl@users.noreply.github.com> Date: Wed, 4 Feb 2026 14:47:02 +0000 Subject: [PATCH 34/49] Correct config list 2.0 --- DeeployTest/test_gap9_config.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/DeeployTest/test_gap9_config.py b/DeeployTest/test_gap9_config.py index a0543c48b6..90c974c347 100644 --- a/DeeployTest/test_gap9_config.py +++ b/DeeployTest/test_gap9_config.py @@ -36,8 +36,7 @@ "Kernels/Mixed/Dequant", "Kernels/Mixed/Quant", "Kernels/FP32/ReduceSum", - "Kernels/FP32/Reshape/SkipConnection", - "Kernels/Quantized/Linear", + "Kernels/FP32/Reshape/SkipConnection" ] MODEL_TESTS = [ From bd526dcbefcfa21b6c50015559b43fe892c5ab11 Mon Sep 17 00:00:00 2001 From: Run Wang <52746141+SamanthaWangdl@users.noreply.github.com> Date: Wed, 4 Feb 2026 16:21:38 +0000 Subject: [PATCH 35/49] fix linting --- DeeployTest/test_gap9_config.py | 40 +- DeeployTest/test_platforms.py | 8 +- .../GAP9/prebuilt/include/pulp_nn_kernels.h | 24332 ++++------------ .../GAP9/prebuilt/include/pulp_nn_utils.h | 1767 +- 4 files changed, 7200 insertions(+), 18947 deletions(-) diff --git a/DeeployTest/test_gap9_config.py b/DeeployTest/test_gap9_config.py index 90c974c347..2158287cf4 100644 --- a/DeeployTest/test_gap9_config.py +++ b/DeeployTest/test_gap9_config.py @@ -6,37 +6,15 @@ DEFAULT_NUM_CORES = 8 KERNEL_TESTS = [ - "Kernels/Integer/Add/Regular", - "Kernels/Integer/Add/MultIO", - "Kernels/Integer/Pad/Regular_1D", - "Kernels/Integer/Pad/Regular_2D", - "Kernels/Integer/MatMul/Regular", - "Kernels/Integer/MatMul/Add", - "Kernels/Integer/Conv/DW_2D_RQ", - "Kernels/Integer/Conv/Regular_2D_RQ", - "Kernels/Integer/Softmax/Regular", - "Kernels/Integer/Concat", - "Kernels/Integer/Hardswish/Regular", - "Others/Backtracking", - "Kernels/FP32/Add/Regular", - "Kernels/FP32/GEMM/Regular", - "Kernels/FP32/Conv/Regular_2D_Bias", - "Kernels/FP32/Conv/Regular_2D_NoBias", - "Kernels/FP32/Conv/Regular_2D_ZeroValuedBias", - "Kernels/FP32/Conv/DW_2D_Bias", - "Kernels/FP32/Conv/DW_2D_NoBias", - "Kernels/FP32/Conv/DW_2D_ZeroValuedBias", - "Kernels/FP32/LayerNorm", - "Kernels/FP32/ReLU", - "Kernels/FP32/MaxPool", - "Kernels/FP32/MatMul", - "Kernels/FP32/Softmax/Regular", - "Kernels/FP32/Transpose", - "Kernels/FP32/Mul", - "Kernels/Mixed/Dequant", - "Kernels/Mixed/Quant", - "Kernels/FP32/ReduceSum", - "Kernels/FP32/Reshape/SkipConnection" + "Kernels/Integer/Add/Regular", "Kernels/Integer/Add/MultIO", "Kernels/Integer/Pad/Regular_1D", + "Kernels/Integer/Pad/Regular_2D", "Kernels/Integer/MatMul/Regular", "Kernels/Integer/MatMul/Add", + "Kernels/Integer/Conv/DW_2D_RQ", "Kernels/Integer/Conv/Regular_2D_RQ", "Kernels/Integer/Softmax/Regular", + "Kernels/Integer/Concat", "Kernels/Integer/Hardswish/Regular", "Others/Backtracking", "Kernels/FP32/Add/Regular", + "Kernels/FP32/GEMM/Regular", "Kernels/FP32/Conv/Regular_2D_Bias", "Kernels/FP32/Conv/Regular_2D_NoBias", + "Kernels/FP32/Conv/Regular_2D_ZeroValuedBias", "Kernels/FP32/Conv/DW_2D_Bias", "Kernels/FP32/Conv/DW_2D_NoBias", + "Kernels/FP32/Conv/DW_2D_ZeroValuedBias", "Kernels/FP32/LayerNorm", "Kernels/FP32/ReLU", "Kernels/FP32/MaxPool", + "Kernels/FP32/MatMul", "Kernels/FP32/Softmax/Regular", "Kernels/FP32/Transpose", "Kernels/FP32/Mul", + "Kernels/Mixed/Dequant", "Kernels/Mixed/Quant", "Kernels/FP32/ReduceSum", "Kernels/FP32/Reshape/SkipConnection" ] MODEL_TESTS = [ diff --git a/DeeployTest/test_platforms.py b/DeeployTest/test_platforms.py index f46bd00284..eaf753b925 100644 --- a/DeeployTest/test_platforms.py +++ b/DeeployTest/test_platforms.py @@ -864,8 +864,8 @@ def test_gap9_tiled_kernels_l2_doublebuffer(test_params, deeploy_test_dir, toolc generate_test_params(GAP9_L2_SINGLEBUFFER_MODELS, "L2-singlebuffer"), ids = param_id, ) -def test_gap9_tiled_models_l2_singlebuffer(test_params, deeploy_test_dir, toolchain, toolchain_dir, cmake_args, - skipgen, skipsim) -> None: +def test_gap9_tiled_models_l2_singlebuffer(test_params, deeploy_test_dir, toolchain, toolchain_dir, cmake_args, skipgen, + skipsim) -> None: test_name, l1, config_name = test_params # Add GAP9-specific CMake args @@ -897,8 +897,8 @@ def test_gap9_tiled_models_l2_singlebuffer(test_params, deeploy_test_dir, toolch generate_test_params(GAP9_L2_DOUBLEBUFFER_MODELS, "L2-doublebuffer"), ids = param_id, ) -def test_gap9_tiled_models_l2_doublebuffer(test_params, deeploy_test_dir, toolchain, toolchain_dir, cmake_args, - skipgen, skipsim) -> None: +def test_gap9_tiled_models_l2_doublebuffer(test_params, deeploy_test_dir, toolchain, toolchain_dir, cmake_args, skipgen, + skipsim) -> None: test_name, l1, config_name = test_params # Add GAP9-specific CMake args diff --git a/TargetLibraries/GAP9/prebuilt/include/pulp_nn_kernels.h b/TargetLibraries/GAP9/prebuilt/include/pulp_nn_kernels.h index 7a5a2a444b..f6fb952cd2 100644 --- a/TargetLibraries/GAP9/prebuilt/include/pulp_nn_kernels.h +++ b/TargetLibraries/GAP9/prebuilt/include/pulp_nn_kernels.h @@ -21,18821 +21,7245 @@ #define __PULPNN_KERNELS__ void pulp_nn_conv_u8_u8_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u8_u8_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u8_i8_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u8_i8_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i8_u8_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i8_u8_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i8_i8_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i8_i8_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u8_u8_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u8_u8_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u8_i8_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u8_i8_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i8_u8_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i8_u8_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i8_i8_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i8_i8_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u8_u8_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u8_u8_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u8_i8_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u8_i8_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i8_u8_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i8_u8_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i8_i8_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i8_i8_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u8_u4_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u8_u4_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u8_i4_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u8_i4_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i8_u4_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i8_u4_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i8_i4_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i8_i4_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u8_u4_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u8_u4_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u8_i4_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u8_i4_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i8_u4_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i8_u4_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i8_i4_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i8_i4_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u8_u4_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u8_u4_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u8_i4_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u8_i4_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i8_u4_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i8_u4_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i8_i4_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i8_i4_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u8_u2_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u8_u2_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u8_i2_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u8_i2_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i8_u2_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i8_u2_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i8_i2_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i8_i2_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u8_u2_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u8_u2_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u8_i2_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u8_i2_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i8_u2_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i8_u2_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i8_i2_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i8_i2_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u8_u2_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u8_u2_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u8_i2_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u8_i2_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i8_u2_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i8_u2_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i8_i2_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i8_i2_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u4_u8_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u4_u8_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u4_i8_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u4_i8_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i4_u8_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i4_u8_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i4_i8_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i4_i8_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u4_u8_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u4_u8_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u4_i8_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u4_i8_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i4_u8_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i4_u8_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i4_i8_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i4_i8_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u4_u8_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u4_u8_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u4_i8_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u4_i8_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i4_u8_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i4_u8_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i4_i8_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i4_i8_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u4_u4_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u4_u4_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u4_i4_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u4_i4_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i4_u4_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i4_u4_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i4_i4_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i4_i4_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u4_u4_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u4_u4_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u4_i4_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u4_i4_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i4_u4_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i4_u4_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i4_i4_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i4_i4_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u4_u4_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u4_u4_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u4_i4_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u4_i4_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i4_u4_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i4_u4_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i4_i4_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i4_i4_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u4_u2_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u4_u2_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u4_i2_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u4_i2_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i4_u2_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i4_u2_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i4_i2_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i4_i2_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u4_u2_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u4_u2_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u4_i2_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u4_i2_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i4_u2_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i4_u2_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i4_i2_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i4_i2_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u4_u2_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u4_u2_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u4_i2_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u4_i2_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i4_u2_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i4_u2_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i4_i2_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i4_i2_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u2_u8_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u2_u8_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u2_i8_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u2_i8_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i2_u8_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i2_u8_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i2_i8_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i2_i8_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u2_u8_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u2_u8_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u2_i8_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u2_i8_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i2_u8_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i2_u8_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i2_i8_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i2_i8_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u2_u8_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u2_u8_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u2_i8_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u2_i8_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i2_u8_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i2_u8_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i2_i8_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i2_i8_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u2_u4_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u2_u4_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u2_i4_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u2_i4_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i2_u4_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i2_u4_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i2_i4_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i2_i4_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u2_u4_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u2_u4_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u2_i4_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u2_i4_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i2_u4_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i2_u4_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i2_i4_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i2_i4_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u2_u4_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u2_u4_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u2_i4_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u2_i4_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i2_u4_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i2_u4_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i2_i4_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i2_i4_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u2_u2_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u2_u2_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u2_i2_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u2_i2_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i2_u2_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i2_u2_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i2_i2_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i2_i2_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u2_u2_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u2_u2_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u2_i2_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u2_i2_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i2_u2_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i2_u2_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i2_i2_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i2_i2_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u2_u2_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u2_u2_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u2_i2_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_u2_i2_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i2_u2_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i2_u2_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i2_i2_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_conv_i2_i2_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_u8_u8_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_u8_i8_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_i8_u8_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_i8_i8_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_u8_u8_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_u8_i8_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_i8_u8_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_i8_i8_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_u8_u8_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_u8_i8_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_i8_u8_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_i8_i8_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_u8_u4_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_u8_i4_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_i8_u4_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_i8_i4_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_u8_u4_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_u8_i4_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_i8_u4_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_i8_i4_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_u8_u4_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_u8_i4_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_i8_u4_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_i8_i4_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_u8_u2_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_u8_i2_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_i8_u2_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_i8_i2_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_u8_u2_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_u8_i2_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_i8_u2_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_i8_i2_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_u8_u2_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_u8_i2_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_i8_u2_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_i8_i2_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_u4_u8_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_u4_i8_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_i4_u8_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_i4_i8_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_u4_u8_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_u4_i8_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_i4_u8_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_i4_i8_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_u4_u8_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_u4_i8_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_i4_u8_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_i4_i8_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_u4_u4_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_u4_i4_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_i4_u4_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_i4_i4_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_u4_u4_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_u4_i4_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_i4_u4_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_i4_i4_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_u4_u4_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_u4_i4_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_i4_u4_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_i4_i4_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_u4_u2_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_u4_i2_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_i4_u2_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_i4_i2_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_u4_u2_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_u4_i2_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_i4_u2_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_i4_i2_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_u4_u2_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_u4_i2_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_i4_u2_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_i4_i2_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_u2_u8_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_u2_i8_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_i2_u8_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_i2_i8_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_u2_u8_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_u2_i8_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_i2_u8_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_i2_i8_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_u2_u8_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_u2_i8_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_i2_u8_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_i2_i8_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_u2_u4_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_u2_i4_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_i2_u4_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_i2_i4_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_u2_u4_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_u2_i4_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_i2_u4_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_i2_i4_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_u2_u4_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_u2_i4_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_i2_u4_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_i2_i4_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_u2_u2_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_u2_i2_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_i2_u2_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_i2_i2_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_u2_u2_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_u2_i2_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_i2_u2_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_i2_i2_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_u2_u2_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_u2_i2_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_i2_u2_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_pointwise_i2_i2_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -uint8_t *pulp_nn_matmul_u8_u8_i8( - uint8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - uint8_t *pOut2, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t num_col_im2col, - uint16_t ch_out, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -uint8_t *pulp_nn_matmul_u8_i8_i8( - uint8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pOut2, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t num_col_im2col, - uint16_t ch_out, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -uint8_t *pulp_nn_matmul_i8_u8_i8( - int8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - uint8_t *pOut2, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t num_col_im2col, - uint16_t ch_out, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -uint8_t *pulp_nn_matmul_i8_i8_i8( - int8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pOut2, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t num_col_im2col, - uint16_t ch_out, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -uint8_t *pulp_nn_matmul_u8_u8_i4( - uint8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - uint8_t *pOut2, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t num_col_im2col, - uint16_t ch_out, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -uint8_t *pulp_nn_matmul_u8_i8_i4( - uint8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pOut2, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t num_col_im2col, - uint16_t ch_out, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -uint8_t *pulp_nn_matmul_i8_u8_i4( - int8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - uint8_t *pOut2, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t num_col_im2col, - uint16_t ch_out, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -uint8_t *pulp_nn_matmul_i8_i8_i4( - int8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pOut2, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t num_col_im2col, - uint16_t ch_out, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -uint8_t *pulp_nn_matmul_u8_u8_i2( - uint8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - uint8_t *pOut2, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t num_col_im2col, - uint16_t ch_out, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -uint8_t *pulp_nn_matmul_u8_i8_i2( - uint8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pOut2, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t num_col_im2col, - uint16_t ch_out, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -uint8_t *pulp_nn_matmul_i8_u8_i2( - int8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - uint8_t *pOut2, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t num_col_im2col, - uint16_t ch_out, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -uint8_t *pulp_nn_matmul_i8_i8_i2( - int8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pOut2, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t num_col_im2col, - uint16_t ch_out, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -uint8_t *pulp_nn_matmul_u8_u4_i8( - uint8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - uint8_t *pOut2, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t num_col_im2col, - uint16_t ch_out, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -uint8_t *pulp_nn_matmul_u8_i4_i8( - uint8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pOut2, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t num_col_im2col, - uint16_t ch_out, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -uint8_t *pulp_nn_matmul_i8_u4_i8( - int8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - uint8_t *pOut2, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t num_col_im2col, - uint16_t ch_out, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -uint8_t *pulp_nn_matmul_i8_i4_i8( - int8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pOut2, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t num_col_im2col, - uint16_t ch_out, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -uint8_t *pulp_nn_matmul_u8_u4_i4( - uint8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - uint8_t *pOut2, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t num_col_im2col, - uint16_t ch_out, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -uint8_t *pulp_nn_matmul_u8_i4_i4( - uint8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pOut2, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t num_col_im2col, - uint16_t ch_out, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -uint8_t *pulp_nn_matmul_i8_u4_i4( - int8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - uint8_t *pOut2, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t num_col_im2col, - uint16_t ch_out, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -uint8_t *pulp_nn_matmul_i8_i4_i4( - int8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pOut2, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t num_col_im2col, - uint16_t ch_out, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -uint8_t *pulp_nn_matmul_u8_u4_i2( - uint8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - uint8_t *pOut2, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t num_col_im2col, - uint16_t ch_out, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -uint8_t *pulp_nn_matmul_u8_i4_i2( - uint8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pOut2, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t num_col_im2col, - uint16_t ch_out, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -uint8_t *pulp_nn_matmul_i8_u4_i2( - int8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - uint8_t *pOut2, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t num_col_im2col, - uint16_t ch_out, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -uint8_t *pulp_nn_matmul_i8_i4_i2( - int8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pOut2, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t num_col_im2col, - uint16_t ch_out, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -uint8_t *pulp_nn_matmul_u8_u2_i8( - uint8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - uint8_t *pOut2, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t num_col_im2col, - uint16_t ch_out, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -uint8_t *pulp_nn_matmul_u8_i2_i8( - uint8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pOut2, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t num_col_im2col, - uint16_t ch_out, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -uint8_t *pulp_nn_matmul_i8_u2_i8( - int8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - uint8_t *pOut2, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t num_col_im2col, - uint16_t ch_out, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -uint8_t *pulp_nn_matmul_i8_i2_i8( - int8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pOut2, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t num_col_im2col, - uint16_t ch_out, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -uint8_t *pulp_nn_matmul_u8_u2_i4( - uint8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - uint8_t *pOut2, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t num_col_im2col, - uint16_t ch_out, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -uint8_t *pulp_nn_matmul_u8_i2_i4( - uint8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pOut2, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t num_col_im2col, - uint16_t ch_out, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -uint8_t *pulp_nn_matmul_i8_u2_i4( - int8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - uint8_t *pOut2, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t num_col_im2col, - uint16_t ch_out, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -uint8_t *pulp_nn_matmul_i8_i2_i4( - int8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pOut2, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t num_col_im2col, - uint16_t ch_out, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -uint8_t *pulp_nn_matmul_u8_u2_i2( - uint8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - uint8_t *pOut2, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t num_col_im2col, - uint16_t ch_out, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -uint8_t *pulp_nn_matmul_u8_i2_i2( - uint8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pOut2, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t num_col_im2col, - uint16_t ch_out, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -uint8_t *pulp_nn_matmul_i8_u2_i2( - int8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - uint8_t *pOut2, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t num_col_im2col, - uint16_t ch_out, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -uint8_t *pulp_nn_matmul_i8_i2_i2( - int8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pOut2, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t num_col_im2col, - uint16_t ch_out, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, uint16_t out_mul, + uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, uint16_t ch_in, + uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_u8_u8_i8(uint8_t *pIn, int8_t *pBias, uint8_t *pOut, + uint8_t *pOut2, int8_t *pWeight, + int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t num_col_im2col, uint16_t ch_out, + uint8_t flag_relu, uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_u8_i8_i8(uint8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pOut2, int8_t *pWeight, + int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t num_col_im2col, uint16_t ch_out, + uint8_t flag_relu, uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_i8_u8_i8(int8_t *pIn, int8_t *pBias, uint8_t *pOut, + uint8_t *pOut2, int8_t *pWeight, + int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t num_col_im2col, uint16_t ch_out, + uint8_t flag_relu, uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_i8_i8_i8(int8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pOut2, int8_t *pWeight, + int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t num_col_im2col, uint16_t ch_out, + uint8_t flag_relu, uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_u8_u8_i4(uint8_t *pIn, int8_t *pBias, uint8_t *pOut, + uint8_t *pOut2, int8_t *pWeight, + int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t num_col_im2col, uint16_t ch_out, + uint8_t flag_relu, uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_u8_i8_i4(uint8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pOut2, int8_t *pWeight, + int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t num_col_im2col, uint16_t ch_out, + uint8_t flag_relu, uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_i8_u8_i4(int8_t *pIn, int8_t *pBias, uint8_t *pOut, + uint8_t *pOut2, int8_t *pWeight, + int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t num_col_im2col, uint16_t ch_out, + uint8_t flag_relu, uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_i8_i8_i4(int8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pOut2, int8_t *pWeight, + int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t num_col_im2col, uint16_t ch_out, + uint8_t flag_relu, uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_u8_u8_i2(uint8_t *pIn, int8_t *pBias, uint8_t *pOut, + uint8_t *pOut2, int8_t *pWeight, + int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t num_col_im2col, uint16_t ch_out, + uint8_t flag_relu, uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_u8_i8_i2(uint8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pOut2, int8_t *pWeight, + int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t num_col_im2col, uint16_t ch_out, + uint8_t flag_relu, uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_i8_u8_i2(int8_t *pIn, int8_t *pBias, uint8_t *pOut, + uint8_t *pOut2, int8_t *pWeight, + int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t num_col_im2col, uint16_t ch_out, + uint8_t flag_relu, uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_i8_i8_i2(int8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pOut2, int8_t *pWeight, + int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t num_col_im2col, uint16_t ch_out, + uint8_t flag_relu, uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_u8_u4_i8(uint8_t *pIn, int8_t *pBias, uint8_t *pOut, + uint8_t *pOut2, int8_t *pWeight, + int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t num_col_im2col, uint16_t ch_out, + uint8_t flag_relu, uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_u8_i4_i8(uint8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pOut2, int8_t *pWeight, + int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t num_col_im2col, uint16_t ch_out, + uint8_t flag_relu, uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_i8_u4_i8(int8_t *pIn, int8_t *pBias, uint8_t *pOut, + uint8_t *pOut2, int8_t *pWeight, + int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t num_col_im2col, uint16_t ch_out, + uint8_t flag_relu, uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_i8_i4_i8(int8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pOut2, int8_t *pWeight, + int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t num_col_im2col, uint16_t ch_out, + uint8_t flag_relu, uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_u8_u4_i4(uint8_t *pIn, int8_t *pBias, uint8_t *pOut, + uint8_t *pOut2, int8_t *pWeight, + int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t num_col_im2col, uint16_t ch_out, + uint8_t flag_relu, uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_u8_i4_i4(uint8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pOut2, int8_t *pWeight, + int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t num_col_im2col, uint16_t ch_out, + uint8_t flag_relu, uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_i8_u4_i4(int8_t *pIn, int8_t *pBias, uint8_t *pOut, + uint8_t *pOut2, int8_t *pWeight, + int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t num_col_im2col, uint16_t ch_out, + uint8_t flag_relu, uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_i8_i4_i4(int8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pOut2, int8_t *pWeight, + int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t num_col_im2col, uint16_t ch_out, + uint8_t flag_relu, uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_u8_u4_i2(uint8_t *pIn, int8_t *pBias, uint8_t *pOut, + uint8_t *pOut2, int8_t *pWeight, + int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t num_col_im2col, uint16_t ch_out, + uint8_t flag_relu, uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_u8_i4_i2(uint8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pOut2, int8_t *pWeight, + int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t num_col_im2col, uint16_t ch_out, + uint8_t flag_relu, uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_i8_u4_i2(int8_t *pIn, int8_t *pBias, uint8_t *pOut, + uint8_t *pOut2, int8_t *pWeight, + int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t num_col_im2col, uint16_t ch_out, + uint8_t flag_relu, uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_i8_i4_i2(int8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pOut2, int8_t *pWeight, + int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t num_col_im2col, uint16_t ch_out, + uint8_t flag_relu, uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_u8_u2_i8(uint8_t *pIn, int8_t *pBias, uint8_t *pOut, + uint8_t *pOut2, int8_t *pWeight, + int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t num_col_im2col, uint16_t ch_out, + uint8_t flag_relu, uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_u8_i2_i8(uint8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pOut2, int8_t *pWeight, + int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t num_col_im2col, uint16_t ch_out, + uint8_t flag_relu, uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_i8_u2_i8(int8_t *pIn, int8_t *pBias, uint8_t *pOut, + uint8_t *pOut2, int8_t *pWeight, + int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t num_col_im2col, uint16_t ch_out, + uint8_t flag_relu, uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_i8_i2_i8(int8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pOut2, int8_t *pWeight, + int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t num_col_im2col, uint16_t ch_out, + uint8_t flag_relu, uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_u8_u2_i4(uint8_t *pIn, int8_t *pBias, uint8_t *pOut, + uint8_t *pOut2, int8_t *pWeight, + int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t num_col_im2col, uint16_t ch_out, + uint8_t flag_relu, uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_u8_i2_i4(uint8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pOut2, int8_t *pWeight, + int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t num_col_im2col, uint16_t ch_out, + uint8_t flag_relu, uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_i8_u2_i4(int8_t *pIn, int8_t *pBias, uint8_t *pOut, + uint8_t *pOut2, int8_t *pWeight, + int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t num_col_im2col, uint16_t ch_out, + uint8_t flag_relu, uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_i8_i2_i4(int8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pOut2, int8_t *pWeight, + int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t num_col_im2col, uint16_t ch_out, + uint8_t flag_relu, uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_u8_u2_i2(uint8_t *pIn, int8_t *pBias, uint8_t *pOut, + uint8_t *pOut2, int8_t *pWeight, + int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t num_col_im2col, uint16_t ch_out, + uint8_t flag_relu, uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_u8_i2_i2(uint8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pOut2, int8_t *pWeight, + int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t num_col_im2col, uint16_t ch_out, + uint8_t flag_relu, uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_i8_u2_i2(int8_t *pIn, int8_t *pBias, uint8_t *pOut, + uint8_t *pOut2, int8_t *pWeight, + int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t num_col_im2col, uint16_t ch_out, + uint8_t flag_relu, uint8_t flag_batchnorm); + +uint8_t *pulp_nn_matmul_i8_i2_i2(int8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pOut2, int8_t *pWeight, + int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t num_col_im2col, uint16_t ch_out, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_u8_u8_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_u8_i8_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_i8_u8_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_i8_i8_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_u8_u8_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_u8_i8_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_i8_u8_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_i8_i8_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_u8_u8_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_u8_i8_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_i8_u8_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_i8_i8_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_u8_u4_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_u8_i4_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_i8_u4_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_i8_i4_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_u8_u4_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_u8_i4_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_i8_u4_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_i8_i4_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_u8_u4_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_u8_i4_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_i8_u4_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_i8_i4_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_u8_u2_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_u8_i2_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_i8_u2_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_i8_i2_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_u8_u2_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_u8_i2_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_i8_u2_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_i8_i2_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_u8_u2_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_u8_i2_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_i8_u2_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_i8_i2_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_u4_u8_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_u4_i8_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_i4_u8_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_i4_i8_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_u4_u8_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_u4_i8_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_i4_u8_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_i4_i8_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_u4_u8_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_u4_i8_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_i4_u8_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_i4_i8_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_u4_u4_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_u4_i4_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_i4_u4_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_i4_i4_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_u4_u4_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_u4_i4_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_i4_u4_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_i4_i4_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_u4_u4_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_u4_i4_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_i4_u4_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_i4_i4_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_u4_u2_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_u4_i2_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_i4_u2_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_i4_i2_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_u4_u2_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_u4_i2_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_i4_u2_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_i4_i2_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_u4_u2_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_u4_i2_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_i4_u2_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_i4_i2_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_u2_u8_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_u2_i8_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_i2_u8_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_i2_i8_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_u2_u8_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_u2_i8_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_i2_u8_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_i2_i8_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_u2_u8_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_u2_i8_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_i2_u8_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_i2_i8_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_u2_u4_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_u2_i4_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_i2_u4_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_i2_i4_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_u2_u4_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_u2_i4_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_i2_u4_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_i2_i4_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_u2_u4_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_u2_i4_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_i2_u4_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_i2_i4_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_u2_u2_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_u2_i2_i8( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_i2_u2_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_i2_i2_i8( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_u2_u2_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_u2_i2_i4( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_i2_u2_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_i2_i2_i4( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_u2_u2_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_u2_i2_i2( - uint8_t *pIn, - uint8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + uint8_t *pIn, uint8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_i2_u2_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); void pulp_nn_depthwise_i2_i2_i2( - int8_t *pIn, - int8_t *pIm2ColBuffer, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int8_t *pWtBuffer, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_in_x, - uint16_t dim_in_y, - uint16_t ch_in, - uint16_t dim_out_x, - uint16_t dim_out_y, - uint16_t ch_out, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_y_top, - uint16_t padding_y_bottom, - uint16_t padding_x_left, - uint16_t padding_x_right, - uint16_t stride_x, - uint16_t stride_y, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_u8_i32_i8( - uint8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - uint16_t dim_vec, - uint16_t num_o_neurons); - -void pulp_nn_linear_i8_i32_i8( - int8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - uint16_t dim_vec, - uint16_t num_o_neurons); - -void pulp_nn_linear_u8_i32_i4( - uint8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - uint16_t dim_vec, - uint16_t num_o_neurons); - -void pulp_nn_linear_i8_i32_i4( - int8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - uint16_t dim_vec, - uint16_t num_o_neurons); - -void pulp_nn_linear_u8_i32_i2( - uint8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - uint16_t dim_vec, - uint16_t num_o_neurons); - -void pulp_nn_linear_i8_i32_i2( - int8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - uint16_t dim_vec, - uint16_t num_o_neurons); - -void pulp_nn_linear_u4_i32_i8( - uint8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - uint16_t dim_vec, - uint16_t num_o_neurons); - -void pulp_nn_linear_i4_i32_i8( - int8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - uint16_t dim_vec, - uint16_t num_o_neurons); - -void pulp_nn_linear_u4_i32_i4( - uint8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - uint16_t dim_vec, - uint16_t num_o_neurons); - -void pulp_nn_linear_i4_i32_i4( - int8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - uint16_t dim_vec, - uint16_t num_o_neurons); - -void pulp_nn_linear_u4_i32_i2( - uint8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - uint16_t dim_vec, - uint16_t num_o_neurons); - -void pulp_nn_linear_i4_i32_i2( - int8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - uint16_t dim_vec, - uint16_t num_o_neurons); - -void pulp_nn_linear_u2_i32_i8( - uint8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - uint16_t dim_vec, - uint16_t num_o_neurons); - -void pulp_nn_linear_i2_i32_i8( - int8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - uint16_t dim_vec, - uint16_t num_o_neurons); - -void pulp_nn_linear_u2_i32_i4( - uint8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - uint16_t dim_vec, - uint16_t num_o_neurons); - -void pulp_nn_linear_i2_i32_i4( - int8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - uint16_t dim_vec, - uint16_t num_o_neurons); - -void pulp_nn_linear_u2_i32_i2( - uint8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - uint16_t dim_vec, - uint16_t num_o_neurons); - -void pulp_nn_linear_i2_i32_i2( - int8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - uint16_t dim_vec, - uint16_t num_o_neurons); - -void pulp_nn_linear_u8_u8_i8( - uint8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_u8_i8_i8( - uint8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_i8_u8_i8( - int8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_i8_i8_i8( - int8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_u8_u8_i4( - uint8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_u8_i8_i4( - uint8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_i8_u8_i4( - int8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_i8_i8_i4( - int8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_u8_u8_i2( - uint8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_u8_i8_i2( - uint8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_i8_u8_i2( - int8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_i8_i8_i2( - int8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_u8_u4_i8( - uint8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_u8_i4_i8( - uint8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_i8_u4_i8( - int8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_i8_i4_i8( - int8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_u8_u4_i4( - uint8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_u8_i4_i4( - uint8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_i8_u4_i4( - int8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_i8_i4_i4( - int8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_u8_u4_i2( - uint8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_u8_i4_i2( - uint8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_i8_u4_i2( - int8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_i8_i4_i2( - int8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_u8_u2_i8( - uint8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_u8_i2_i8( - uint8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_i8_u2_i8( - int8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_i8_i2_i8( - int8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_u8_u2_i4( - uint8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_u8_i2_i4( - uint8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_i8_u2_i4( - int8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_i8_i2_i4( - int8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_u8_u2_i2( - uint8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_u8_i2_i2( - uint8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_i8_u2_i2( - int8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_i8_i2_i2( - int8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_u4_u8_i8( - uint8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_u4_i8_i8( - uint8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_i4_u8_i8( - int8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_i4_i8_i8( - int8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_u4_u8_i4( - uint8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_u4_i8_i4( - uint8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_i4_u8_i4( - int8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_i4_i8_i4( - int8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_u4_u8_i2( - uint8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_u4_i8_i2( - uint8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_i4_u8_i2( - int8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_i4_i8_i2( - int8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_u4_u4_i8( - uint8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_u4_i4_i8( - uint8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_i4_u4_i8( - int8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_i4_i4_i8( - int8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_u4_u4_i4( - uint8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_u4_i4_i4( - uint8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_i4_u4_i4( - int8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_i4_i4_i4( - int8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_u4_u4_i2( - uint8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_u4_i4_i2( - uint8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_i4_u4_i2( - int8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_i4_i4_i2( - int8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_u4_u2_i8( - uint8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_u4_i2_i8( - uint8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_i4_u2_i8( - int8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_i4_i2_i8( - int8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_u4_u2_i4( - uint8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_u4_i2_i4( - uint8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_i4_u2_i4( - int8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_i4_i2_i4( - int8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_u4_u2_i2( - uint8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_u4_i2_i2( - uint8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_i4_u2_i2( - int8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_i4_i2_i2( - int8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_u2_u8_i8( - uint8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_u2_i8_i8( - uint8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_i2_u8_i8( - int8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_i2_i8_i8( - int8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_u2_u8_i4( - uint8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_u2_i8_i4( - uint8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_i2_u8_i4( - int8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_i2_i8_i4( - int8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_u2_u8_i2( - uint8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_u2_i8_i2( - uint8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_i2_u8_i2( - int8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_i2_i8_i2( - int8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_u2_u4_i8( - uint8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_u2_i4_i8( - uint8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_i2_u4_i8( - int8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_i2_i4_i8( - int8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_u2_u4_i4( - uint8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_u2_i4_i4( - uint8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_i2_u4_i4( - int8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_i2_i4_i4( - int8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_u2_u4_i2( - uint8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_u2_i4_i2( - uint8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_i2_u4_i2( - int8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_i2_i4_i2( - int8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_u2_u2_i8( - uint8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_u2_i2_i8( - uint8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_i2_u2_i8( - int8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_i2_i2_i8( - int8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_u2_u2_i4( - uint8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_u2_i2_i4( - uint8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_i2_u2_i4( - int8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_i2_i2_i4( - int8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_u2_u2_i2( - uint8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_u2_i2_i2( - uint8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_i2_u2_i2( - int8_t *pIn, - int8_t *pBias, - uint8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_linear_i2_i2_i2( - int8_t *pIn, - int8_t *pBias, - int8_t *pOut, - int8_t *pWeight, - int32_t *pKappa, - int32_t *pLambda, - uint16_t out_mul, - uint16_t out_shift, - uint16_t dim_vec, - uint16_t num_o_neurons, - uint8_t flag_relu, - uint8_t flag_batchnorm); - -void pulp_nn_maxpool_u8( - uint8_t * pIn, - uint8_t * pOut, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - uint16_t dim_im_out_x, - uint16_t dim_im_out_y, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_t, - uint16_t padding_b, - uint16_t padding_l, - uint16_t padding_r, - uint16_t stride_x, - uint16_t stride_y); - -void pulp_nn_maxpool_i8( - int8_t * pIn, - int8_t * pOut, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - uint16_t dim_im_out_x, - uint16_t dim_im_out_y, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_t, - uint16_t padding_b, - uint16_t padding_l, - uint16_t padding_r, - uint16_t stride_x, - uint16_t stride_y); - -void pulp_nn_maxpool_u4( - uint8_t * pIn, - uint8_t * pOut, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - uint16_t dim_im_out_x, - uint16_t dim_im_out_y, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_t, - uint16_t padding_b, - uint16_t padding_l, - uint16_t padding_r, - uint16_t stride_x, - uint16_t stride_y); - -void pulp_nn_maxpool_i4( - int8_t * pIn, - int8_t * pOut, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - uint16_t dim_im_out_x, - uint16_t dim_im_out_y, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_t, - uint16_t padding_b, - uint16_t padding_l, - uint16_t padding_r, - uint16_t stride_x, - uint16_t stride_y); - -void pulp_nn_maxpool_u2( - uint8_t * pIn, - uint8_t * pOut, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - uint16_t dim_im_out_x, - uint16_t dim_im_out_y, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_t, - uint16_t padding_b, - uint16_t padding_l, - uint16_t padding_r, - uint16_t stride_x, - uint16_t stride_y); - -void pulp_nn_maxpool_i2( - int8_t * pIn, - int8_t * pOut, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - uint16_t dim_im_out_x, - uint16_t dim_im_out_y, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_t, - uint16_t padding_b, - uint16_t padding_l, - uint16_t padding_r, - uint16_t stride_x, - uint16_t stride_y); - -void pulp_nn_avgpool_u8_u8( - uint8_t * pIn, - uint8_t * pOut, - int32_t lambda, - uint16_t out_shift, - int32_t out_add, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - uint16_t dim_im_out_x, - uint16_t dim_im_out_y, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_t, - uint16_t padding_b, - uint16_t padding_l, - uint16_t padding_r, - uint16_t stride_x, - uint16_t stride_y, - int flag_requant -); - -void pulp_nn_avgpool_u8_i8( - uint8_t * pIn, - int8_t * pOut, - int32_t lambda, - uint16_t out_shift, - int32_t out_add, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - uint16_t dim_im_out_x, - uint16_t dim_im_out_y, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_t, - uint16_t padding_b, - uint16_t padding_l, - uint16_t padding_r, - uint16_t stride_x, - uint16_t stride_y, - int flag_requant -); - -void pulp_nn_avgpool_i8_u8( - int8_t * pIn, - uint8_t * pOut, - int32_t lambda, - uint16_t out_shift, - int32_t out_add, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - uint16_t dim_im_out_x, - uint16_t dim_im_out_y, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_t, - uint16_t padding_b, - uint16_t padding_l, - uint16_t padding_r, - uint16_t stride_x, - uint16_t stride_y, - int flag_requant -); - -void pulp_nn_avgpool_i8_i8( - int8_t * pIn, - int8_t * pOut, - int32_t lambda, - uint16_t out_shift, - int32_t out_add, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - uint16_t dim_im_out_x, - uint16_t dim_im_out_y, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_t, - uint16_t padding_b, - uint16_t padding_l, - uint16_t padding_r, - uint16_t stride_x, - uint16_t stride_y, - int flag_requant -); - -void pulp_nn_avgpool_u8_u4( - uint8_t * pIn, - uint8_t * pOut, - int32_t lambda, - uint16_t out_shift, - int32_t out_add, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - uint16_t dim_im_out_x, - uint16_t dim_im_out_y, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_t, - uint16_t padding_b, - uint16_t padding_l, - uint16_t padding_r, - uint16_t stride_x, - uint16_t stride_y, - int flag_requant -); - -void pulp_nn_avgpool_u8_i4( - uint8_t * pIn, - int8_t * pOut, - int32_t lambda, - uint16_t out_shift, - int32_t out_add, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - uint16_t dim_im_out_x, - uint16_t dim_im_out_y, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_t, - uint16_t padding_b, - uint16_t padding_l, - uint16_t padding_r, - uint16_t stride_x, - uint16_t stride_y, - int flag_requant -); - -void pulp_nn_avgpool_i8_u4( - int8_t * pIn, - uint8_t * pOut, - int32_t lambda, - uint16_t out_shift, - int32_t out_add, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - uint16_t dim_im_out_x, - uint16_t dim_im_out_y, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_t, - uint16_t padding_b, - uint16_t padding_l, - uint16_t padding_r, - uint16_t stride_x, - uint16_t stride_y, - int flag_requant -); - -void pulp_nn_avgpool_i8_i4( - int8_t * pIn, - int8_t * pOut, - int32_t lambda, - uint16_t out_shift, - int32_t out_add, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - uint16_t dim_im_out_x, - uint16_t dim_im_out_y, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_t, - uint16_t padding_b, - uint16_t padding_l, - uint16_t padding_r, - uint16_t stride_x, - uint16_t stride_y, - int flag_requant -); - -void pulp_nn_avgpool_u8_u2( - uint8_t * pIn, - uint8_t * pOut, - int32_t lambda, - uint16_t out_shift, - int32_t out_add, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - uint16_t dim_im_out_x, - uint16_t dim_im_out_y, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_t, - uint16_t padding_b, - uint16_t padding_l, - uint16_t padding_r, - uint16_t stride_x, - uint16_t stride_y, - int flag_requant -); - -void pulp_nn_avgpool_u8_i2( - uint8_t * pIn, - int8_t * pOut, - int32_t lambda, - uint16_t out_shift, - int32_t out_add, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - uint16_t dim_im_out_x, - uint16_t dim_im_out_y, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_t, - uint16_t padding_b, - uint16_t padding_l, - uint16_t padding_r, - uint16_t stride_x, - uint16_t stride_y, - int flag_requant -); - -void pulp_nn_avgpool_i8_u2( - int8_t * pIn, - uint8_t * pOut, - int32_t lambda, - uint16_t out_shift, - int32_t out_add, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - uint16_t dim_im_out_x, - uint16_t dim_im_out_y, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_t, - uint16_t padding_b, - uint16_t padding_l, - uint16_t padding_r, - uint16_t stride_x, - uint16_t stride_y, - int flag_requant -); - -void pulp_nn_avgpool_i8_i2( - int8_t * pIn, - int8_t * pOut, - int32_t lambda, - uint16_t out_shift, - int32_t out_add, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - uint16_t dim_im_out_x, - uint16_t dim_im_out_y, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_t, - uint16_t padding_b, - uint16_t padding_l, - uint16_t padding_r, - uint16_t stride_x, - uint16_t stride_y, - int flag_requant -); - -void pulp_nn_avgpool_u4_u8( - uint8_t * pIn, - uint8_t * pOut, - int32_t lambda, - uint16_t out_shift, - int32_t out_add, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - uint16_t dim_im_out_x, - uint16_t dim_im_out_y, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_t, - uint16_t padding_b, - uint16_t padding_l, - uint16_t padding_r, - uint16_t stride_x, - uint16_t stride_y, - int flag_requant -); - -void pulp_nn_avgpool_u4_i8( - uint8_t * pIn, - int8_t * pOut, - int32_t lambda, - uint16_t out_shift, - int32_t out_add, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - uint16_t dim_im_out_x, - uint16_t dim_im_out_y, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_t, - uint16_t padding_b, - uint16_t padding_l, - uint16_t padding_r, - uint16_t stride_x, - uint16_t stride_y, - int flag_requant -); - -void pulp_nn_avgpool_i4_u8( - int8_t * pIn, - uint8_t * pOut, - int32_t lambda, - uint16_t out_shift, - int32_t out_add, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - uint16_t dim_im_out_x, - uint16_t dim_im_out_y, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_t, - uint16_t padding_b, - uint16_t padding_l, - uint16_t padding_r, - uint16_t stride_x, - uint16_t stride_y, - int flag_requant -); - -void pulp_nn_avgpool_i4_i8( - int8_t * pIn, - int8_t * pOut, - int32_t lambda, - uint16_t out_shift, - int32_t out_add, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - uint16_t dim_im_out_x, - uint16_t dim_im_out_y, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_t, - uint16_t padding_b, - uint16_t padding_l, - uint16_t padding_r, - uint16_t stride_x, - uint16_t stride_y, - int flag_requant -); - -void pulp_nn_avgpool_u4_u4( - uint8_t * pIn, - uint8_t * pOut, - int32_t lambda, - uint16_t out_shift, - int32_t out_add, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - uint16_t dim_im_out_x, - uint16_t dim_im_out_y, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_t, - uint16_t padding_b, - uint16_t padding_l, - uint16_t padding_r, - uint16_t stride_x, - uint16_t stride_y, - int flag_requant -); - -void pulp_nn_avgpool_u4_i4( - uint8_t * pIn, - int8_t * pOut, - int32_t lambda, - uint16_t out_shift, - int32_t out_add, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - uint16_t dim_im_out_x, - uint16_t dim_im_out_y, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_t, - uint16_t padding_b, - uint16_t padding_l, - uint16_t padding_r, - uint16_t stride_x, - uint16_t stride_y, - int flag_requant -); - -void pulp_nn_avgpool_i4_u4( - int8_t * pIn, - uint8_t * pOut, - int32_t lambda, - uint16_t out_shift, - int32_t out_add, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - uint16_t dim_im_out_x, - uint16_t dim_im_out_y, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_t, - uint16_t padding_b, - uint16_t padding_l, - uint16_t padding_r, - uint16_t stride_x, - uint16_t stride_y, - int flag_requant -); - -void pulp_nn_avgpool_i4_i4( - int8_t * pIn, - int8_t * pOut, - int32_t lambda, - uint16_t out_shift, - int32_t out_add, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - uint16_t dim_im_out_x, - uint16_t dim_im_out_y, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_t, - uint16_t padding_b, - uint16_t padding_l, - uint16_t padding_r, - uint16_t stride_x, - uint16_t stride_y, - int flag_requant -); - -void pulp_nn_avgpool_u4_u2( - uint8_t * pIn, - uint8_t * pOut, - int32_t lambda, - uint16_t out_shift, - int32_t out_add, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - uint16_t dim_im_out_x, - uint16_t dim_im_out_y, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_t, - uint16_t padding_b, - uint16_t padding_l, - uint16_t padding_r, - uint16_t stride_x, - uint16_t stride_y, - int flag_requant -); - -void pulp_nn_avgpool_u4_i2( - uint8_t * pIn, - int8_t * pOut, - int32_t lambda, - uint16_t out_shift, - int32_t out_add, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - uint16_t dim_im_out_x, - uint16_t dim_im_out_y, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_t, - uint16_t padding_b, - uint16_t padding_l, - uint16_t padding_r, - uint16_t stride_x, - uint16_t stride_y, - int flag_requant -); - -void pulp_nn_avgpool_i4_u2( - int8_t * pIn, - uint8_t * pOut, - int32_t lambda, - uint16_t out_shift, - int32_t out_add, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - uint16_t dim_im_out_x, - uint16_t dim_im_out_y, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_t, - uint16_t padding_b, - uint16_t padding_l, - uint16_t padding_r, - uint16_t stride_x, - uint16_t stride_y, - int flag_requant -); - -void pulp_nn_avgpool_i4_i2( - int8_t * pIn, - int8_t * pOut, - int32_t lambda, - uint16_t out_shift, - int32_t out_add, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - uint16_t dim_im_out_x, - uint16_t dim_im_out_y, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_t, - uint16_t padding_b, - uint16_t padding_l, - uint16_t padding_r, - uint16_t stride_x, - uint16_t stride_y, - int flag_requant -); - -void pulp_nn_avgpool_u2_u8( - uint8_t * pIn, - uint8_t * pOut, - int32_t lambda, - uint16_t out_shift, - int32_t out_add, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - uint16_t dim_im_out_x, - uint16_t dim_im_out_y, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_t, - uint16_t padding_b, - uint16_t padding_l, - uint16_t padding_r, - uint16_t stride_x, - uint16_t stride_y, - int flag_requant -); - -void pulp_nn_avgpool_u2_i8( - uint8_t * pIn, - int8_t * pOut, - int32_t lambda, - uint16_t out_shift, - int32_t out_add, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - uint16_t dim_im_out_x, - uint16_t dim_im_out_y, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_t, - uint16_t padding_b, - uint16_t padding_l, - uint16_t padding_r, - uint16_t stride_x, - uint16_t stride_y, - int flag_requant -); - -void pulp_nn_avgpool_i2_u8( - int8_t * pIn, - uint8_t * pOut, - int32_t lambda, - uint16_t out_shift, - int32_t out_add, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - uint16_t dim_im_out_x, - uint16_t dim_im_out_y, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_t, - uint16_t padding_b, - uint16_t padding_l, - uint16_t padding_r, - uint16_t stride_x, - uint16_t stride_y, - int flag_requant -); - -void pulp_nn_avgpool_i2_i8( - int8_t * pIn, - int8_t * pOut, - int32_t lambda, - uint16_t out_shift, - int32_t out_add, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - uint16_t dim_im_out_x, - uint16_t dim_im_out_y, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_t, - uint16_t padding_b, - uint16_t padding_l, - uint16_t padding_r, - uint16_t stride_x, - uint16_t stride_y, - int flag_requant -); - -void pulp_nn_avgpool_u2_u4( - uint8_t * pIn, - uint8_t * pOut, - int32_t lambda, - uint16_t out_shift, - int32_t out_add, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - uint16_t dim_im_out_x, - uint16_t dim_im_out_y, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_t, - uint16_t padding_b, - uint16_t padding_l, - uint16_t padding_r, - uint16_t stride_x, - uint16_t stride_y, - int flag_requant -); - -void pulp_nn_avgpool_u2_i4( - uint8_t * pIn, - int8_t * pOut, - int32_t lambda, - uint16_t out_shift, - int32_t out_add, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - uint16_t dim_im_out_x, - uint16_t dim_im_out_y, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_t, - uint16_t padding_b, - uint16_t padding_l, - uint16_t padding_r, - uint16_t stride_x, - uint16_t stride_y, - int flag_requant -); - -void pulp_nn_avgpool_i2_u4( - int8_t * pIn, - uint8_t * pOut, - int32_t lambda, - uint16_t out_shift, - int32_t out_add, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - uint16_t dim_im_out_x, - uint16_t dim_im_out_y, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_t, - uint16_t padding_b, - uint16_t padding_l, - uint16_t padding_r, - uint16_t stride_x, - uint16_t stride_y, - int flag_requant -); - -void pulp_nn_avgpool_i2_i4( - int8_t * pIn, - int8_t * pOut, - int32_t lambda, - uint16_t out_shift, - int32_t out_add, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - uint16_t dim_im_out_x, - uint16_t dim_im_out_y, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_t, - uint16_t padding_b, - uint16_t padding_l, - uint16_t padding_r, - uint16_t stride_x, - uint16_t stride_y, - int flag_requant -); - -void pulp_nn_avgpool_u2_u2( - uint8_t * pIn, - uint8_t * pOut, - int32_t lambda, - uint16_t out_shift, - int32_t out_add, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - uint16_t dim_im_out_x, - uint16_t dim_im_out_y, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_t, - uint16_t padding_b, - uint16_t padding_l, - uint16_t padding_r, - uint16_t stride_x, - uint16_t stride_y, - int flag_requant -); - -void pulp_nn_avgpool_u2_i2( - uint8_t * pIn, - int8_t * pOut, - int32_t lambda, - uint16_t out_shift, - int32_t out_add, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - uint16_t dim_im_out_x, - uint16_t dim_im_out_y, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_t, - uint16_t padding_b, - uint16_t padding_l, - uint16_t padding_r, - uint16_t stride_x, - uint16_t stride_y, - int flag_requant -); - -void pulp_nn_avgpool_i2_u2( - int8_t * pIn, - uint8_t * pOut, - int32_t lambda, - uint16_t out_shift, - int32_t out_add, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - uint16_t dim_im_out_x, - uint16_t dim_im_out_y, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_t, - uint16_t padding_b, - uint16_t padding_l, - uint16_t padding_r, - uint16_t stride_x, - uint16_t stride_y, - int flag_requant -); - -void pulp_nn_avgpool_i2_i2( - int8_t * pIn, - int8_t * pOut, - int32_t lambda, - uint16_t out_shift, - int32_t out_add, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - uint16_t dim_im_out_x, - uint16_t dim_im_out_y, - uint16_t dim_kernel_x, - uint16_t dim_kernel_y, - uint16_t padding_t, - uint16_t padding_b, - uint16_t padding_l, - uint16_t padding_r, - uint16_t stride_x, - uint16_t stride_y, - int flag_requant -); - -void pulp_nn_add_u8_u8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - uint16_t out_mult1, - uint16_t out_mult2, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in); - -void pulp_nn_add_u8_u8_u8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u8_u8_u4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u8_u8_u2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u8_u8_i8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u8_u8_i4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u8_u8_i2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u8_i8_u8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u8_i8_u4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u8_i8_u2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u8_i8_i8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u8_i8_i4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u8_i8_i2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i8_u8_u8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i8_u8_u4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i8_u8_u2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i8_u8_i8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i8_u8_i4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i8_u8_i2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i8_i8_u8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i8_i8_u4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i8_i8_u2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i8_i8_i8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i8_i8_i4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i8_i8_i2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u8_u4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - uint16_t out_mult1, - uint16_t out_mult2, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in); - -void pulp_nn_add_u8_u4_u8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u8_u4_u4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u8_u4_u2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u8_u4_i8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u8_u4_i4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u8_u4_i2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u8_i4_u8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u8_i4_u4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u8_i4_u2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u8_i4_i8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u8_i4_i4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u8_i4_i2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i8_u4_u8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i8_u4_u4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i8_u4_u2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i8_u4_i8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i8_u4_i4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i8_u4_i2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i8_i4_u8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i8_i4_u4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i8_i4_u2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i8_i4_i8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i8_i4_i4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i8_i4_i2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u8_u2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - uint16_t out_mult1, - uint16_t out_mult2, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in); - -void pulp_nn_add_u8_u2_u8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u8_u2_u4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u8_u2_u2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u8_u2_i8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u8_u2_i4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u8_u2_i2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u8_i2_u8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u8_i2_u4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u8_i2_u2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u8_i2_i8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u8_i2_i4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u8_i2_i2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i8_u2_u8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i8_u2_u4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i8_u2_u2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i8_u2_i8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i8_u2_i4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i8_u2_i2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i8_i2_u8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i8_i2_u4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i8_i2_u2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i8_i2_i8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i8_i2_i4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i8_i2_i2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u4_u8_u8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u4_u8_u4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u4_u8_u2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u4_u8_i8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u4_u8_i4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u4_u8_i2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u4_i8_u8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u4_i8_u4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u4_i8_u2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u4_i8_i8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u4_i8_i4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u4_i8_i2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i4_u8_u8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i4_u8_u4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i4_u8_u2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i4_u8_i8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i4_u8_i4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i4_u8_i2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i4_i8_u8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i4_i8_u4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i4_i8_u2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i4_i8_i8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i4_i8_i4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i4_i8_i2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u4_u4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - uint16_t out_mult1, - uint16_t out_mult2, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in); - -void pulp_nn_add_u4_u4_u8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u4_u4_u4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u4_u4_u2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u4_u4_i8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u4_u4_i4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u4_u4_i2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u4_i4_u8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u4_i4_u4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u4_i4_u2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u4_i4_i8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u4_i4_i4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u4_i4_i2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i4_u4_u8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i4_u4_u4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i4_u4_u2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i4_u4_i8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i4_u4_i4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i4_u4_i2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i4_i4_u8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i4_i4_u4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i4_i4_u2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i4_i4_i8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i4_i4_i4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i4_i4_i2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u4_u2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - uint16_t out_mult1, - uint16_t out_mult2, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in); - -void pulp_nn_add_u4_u2_u8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u4_u2_u4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u4_u2_u2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u4_u2_i8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u4_u2_i4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u4_u2_i2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u4_i2_u8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u4_i2_u4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u4_i2_u2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u4_i2_i8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u4_i2_i4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u4_i2_i2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i4_u2_u8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i4_u2_u4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i4_u2_u2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i4_u2_i8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i4_u2_i4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i4_u2_i2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i4_i2_u8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i4_i2_u4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i4_i2_u2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i4_i2_i8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i4_i2_i4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i4_i2_i2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u2_u8_u8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u2_u8_u4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u2_u8_u2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u2_u8_i8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u2_u8_i4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u2_u8_i2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u2_i8_u8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u2_i8_u4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u2_i8_u2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u2_i8_i8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u2_i8_i4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u2_i8_i2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i2_u8_u8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i2_u8_u4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i2_u8_u2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i2_u8_i8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i2_u8_i4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i2_u8_i2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i2_i8_u8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i2_i8_u4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i2_i8_u2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i2_i8_i8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i2_i8_i4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i2_i8_i2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u2_u4_u8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u2_u4_u4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u2_u4_u2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u2_u4_i8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u2_u4_i4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u2_u4_i2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u2_i4_u8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u2_i4_u4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u2_i4_u2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u2_i4_i8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u2_i4_i4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u2_i4_i2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i2_u4_u8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i2_u4_u4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i2_u4_u2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i2_u4_i8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i2_u4_i4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i2_u4_i2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i2_i4_u8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i2_i4_u4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i2_i4_u2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i2_i4_i8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i2_i4_i4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i2_i4_i2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u2_u2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - uint16_t out_mult1, - uint16_t out_mult2, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in); - -void pulp_nn_add_u2_u2_u8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u2_u2_u4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u2_u2_u2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u2_u2_i8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u2_u2_i4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u2_u2_i2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u2_i2_u8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u2_i2_u4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u2_i2_u2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u2_i2_i8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u2_i2_i4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_u2_i2_i2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i2_u2_u8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i2_u2_u4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i2_u2_u2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i2_u2_i8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i2_u2_i4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i2_u2_i2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i2_i2_u8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i2_i2_u4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i2_i2_u2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i2_i2_i8( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i2_i2_i4( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - -void pulp_nn_add_i2_i2_i2( - uint8_t * pIn1, - uint8_t * pIn2, - uint8_t * pOut, - int32_t in_mult1, - int32_t in_add1, - uint16_t in_shift1, - int32_t in_mult2, - int32_t in_add2, - uint16_t in_shift2, - int32_t out_mult, - int32_t out_add, - uint16_t out_shift, - uint16_t dim_im_in_x, - uint16_t dim_im_in_y, - uint16_t ch_im_in, - int out_requant_flag); - - + int8_t *pIn, int8_t *pIm2ColBuffer, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int8_t *pWtBuffer, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, uint16_t dim_in_x, uint16_t dim_in_y, + uint16_t ch_in, uint16_t dim_out_x, uint16_t dim_out_y, uint16_t ch_out, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, uint16_t padding_y_top, + uint16_t padding_y_bottom, uint16_t padding_x_left, + uint16_t padding_x_right, uint16_t stride_x, uint16_t stride_y, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_u8_i32_i8(uint8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, uint16_t dim_vec, + uint16_t num_o_neurons); + +void pulp_nn_linear_i8_i32_i8(int8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, uint16_t dim_vec, + uint16_t num_o_neurons); + +void pulp_nn_linear_u8_i32_i4(uint8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, uint16_t dim_vec, + uint16_t num_o_neurons); + +void pulp_nn_linear_i8_i32_i4(int8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, uint16_t dim_vec, + uint16_t num_o_neurons); + +void pulp_nn_linear_u8_i32_i2(uint8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, uint16_t dim_vec, + uint16_t num_o_neurons); + +void pulp_nn_linear_i8_i32_i2(int8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, uint16_t dim_vec, + uint16_t num_o_neurons); + +void pulp_nn_linear_u4_i32_i8(uint8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, uint16_t dim_vec, + uint16_t num_o_neurons); + +void pulp_nn_linear_i4_i32_i8(int8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, uint16_t dim_vec, + uint16_t num_o_neurons); + +void pulp_nn_linear_u4_i32_i4(uint8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, uint16_t dim_vec, + uint16_t num_o_neurons); + +void pulp_nn_linear_i4_i32_i4(int8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, uint16_t dim_vec, + uint16_t num_o_neurons); + +void pulp_nn_linear_u4_i32_i2(uint8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, uint16_t dim_vec, + uint16_t num_o_neurons); + +void pulp_nn_linear_i4_i32_i2(int8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, uint16_t dim_vec, + uint16_t num_o_neurons); + +void pulp_nn_linear_u2_i32_i8(uint8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, uint16_t dim_vec, + uint16_t num_o_neurons); + +void pulp_nn_linear_i2_i32_i8(int8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, uint16_t dim_vec, + uint16_t num_o_neurons); + +void pulp_nn_linear_u2_i32_i4(uint8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, uint16_t dim_vec, + uint16_t num_o_neurons); + +void pulp_nn_linear_i2_i32_i4(int8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, uint16_t dim_vec, + uint16_t num_o_neurons); + +void pulp_nn_linear_u2_i32_i2(uint8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, uint16_t dim_vec, + uint16_t num_o_neurons); + +void pulp_nn_linear_i2_i32_i2(int8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, uint16_t dim_vec, + uint16_t num_o_neurons); + +void pulp_nn_linear_u8_u8_i8(uint8_t *pIn, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_u8_i8_i8(uint8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_i8_u8_i8(int8_t *pIn, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_i8_i8_i8(int8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_u8_u8_i4(uint8_t *pIn, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_u8_i8_i4(uint8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_i8_u8_i4(int8_t *pIn, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_i8_i8_i4(int8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_u8_u8_i2(uint8_t *pIn, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_u8_i8_i2(uint8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_i8_u8_i2(int8_t *pIn, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_i8_i8_i2(int8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_u8_u4_i8(uint8_t *pIn, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_u8_i4_i8(uint8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_i8_u4_i8(int8_t *pIn, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_i8_i4_i8(int8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_u8_u4_i4(uint8_t *pIn, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_u8_i4_i4(uint8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_i8_u4_i4(int8_t *pIn, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_i8_i4_i4(int8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_u8_u4_i2(uint8_t *pIn, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_u8_i4_i2(uint8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_i8_u4_i2(int8_t *pIn, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_i8_i4_i2(int8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_u8_u2_i8(uint8_t *pIn, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_u8_i2_i8(uint8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_i8_u2_i8(int8_t *pIn, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_i8_i2_i8(int8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_u8_u2_i4(uint8_t *pIn, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_u8_i2_i4(uint8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_i8_u2_i4(int8_t *pIn, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_i8_i2_i4(int8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_u8_u2_i2(uint8_t *pIn, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_u8_i2_i2(uint8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_i8_u2_i2(int8_t *pIn, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_i8_i2_i2(int8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_u4_u8_i8(uint8_t *pIn, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_u4_i8_i8(uint8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_i4_u8_i8(int8_t *pIn, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_i4_i8_i8(int8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_u4_u8_i4(uint8_t *pIn, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_u4_i8_i4(uint8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_i4_u8_i4(int8_t *pIn, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_i4_i8_i4(int8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_u4_u8_i2(uint8_t *pIn, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_u4_i8_i2(uint8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_i4_u8_i2(int8_t *pIn, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_i4_i8_i2(int8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_u4_u4_i8(uint8_t *pIn, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_u4_i4_i8(uint8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_i4_u4_i8(int8_t *pIn, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_i4_i4_i8(int8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_u4_u4_i4(uint8_t *pIn, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_u4_i4_i4(uint8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_i4_u4_i4(int8_t *pIn, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_i4_i4_i4(int8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_u4_u4_i2(uint8_t *pIn, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_u4_i4_i2(uint8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_i4_u4_i2(int8_t *pIn, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_i4_i4_i2(int8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_u4_u2_i8(uint8_t *pIn, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_u4_i2_i8(uint8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_i4_u2_i8(int8_t *pIn, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_i4_i2_i8(int8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_u4_u2_i4(uint8_t *pIn, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_u4_i2_i4(uint8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_i4_u2_i4(int8_t *pIn, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_i4_i2_i4(int8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_u4_u2_i2(uint8_t *pIn, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_u4_i2_i2(uint8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_i4_u2_i2(int8_t *pIn, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_i4_i2_i2(int8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_u2_u8_i8(uint8_t *pIn, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_u2_i8_i8(uint8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_i2_u8_i8(int8_t *pIn, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_i2_i8_i8(int8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_u2_u8_i4(uint8_t *pIn, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_u2_i8_i4(uint8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_i2_u8_i4(int8_t *pIn, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_i2_i8_i4(int8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_u2_u8_i2(uint8_t *pIn, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_u2_i8_i2(uint8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_i2_u8_i2(int8_t *pIn, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_i2_i8_i2(int8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_u2_u4_i8(uint8_t *pIn, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_u2_i4_i8(uint8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_i2_u4_i8(int8_t *pIn, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_i2_i4_i8(int8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_u2_u4_i4(uint8_t *pIn, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_u2_i4_i4(uint8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_i2_u4_i4(int8_t *pIn, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_i2_i4_i4(int8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_u2_u4_i2(uint8_t *pIn, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_u2_i4_i2(uint8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_i2_u4_i2(int8_t *pIn, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_i2_i4_i2(int8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_u2_u2_i8(uint8_t *pIn, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_u2_i2_i8(uint8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_i2_u2_i8(int8_t *pIn, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_i2_i2_i8(int8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_u2_u2_i4(uint8_t *pIn, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_u2_i2_i4(uint8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_i2_u2_i4(int8_t *pIn, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_i2_i2_i4(int8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_u2_u2_i2(uint8_t *pIn, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_u2_i2_i2(uint8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_i2_u2_i2(int8_t *pIn, int8_t *pBias, uint8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_linear_i2_i2_i2(int8_t *pIn, int8_t *pBias, int8_t *pOut, + int8_t *pWeight, int32_t *pKappa, int32_t *pLambda, + uint16_t out_mul, uint16_t out_shift, + uint16_t dim_vec, uint16_t num_o_neurons, + uint8_t flag_relu, uint8_t flag_batchnorm); + +void pulp_nn_maxpool_u8(uint8_t *pIn, uint8_t *pOut, uint16_t dim_im_in_x, + uint16_t dim_im_in_y, uint16_t ch_im_in, + uint16_t dim_im_out_x, uint16_t dim_im_out_y, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, + uint16_t padding_t, uint16_t padding_b, + uint16_t padding_l, uint16_t padding_r, + uint16_t stride_x, uint16_t stride_y); + +void pulp_nn_maxpool_i8(int8_t *pIn, int8_t *pOut, uint16_t dim_im_in_x, + uint16_t dim_im_in_y, uint16_t ch_im_in, + uint16_t dim_im_out_x, uint16_t dim_im_out_y, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, + uint16_t padding_t, uint16_t padding_b, + uint16_t padding_l, uint16_t padding_r, + uint16_t stride_x, uint16_t stride_y); + +void pulp_nn_maxpool_u4(uint8_t *pIn, uint8_t *pOut, uint16_t dim_im_in_x, + uint16_t dim_im_in_y, uint16_t ch_im_in, + uint16_t dim_im_out_x, uint16_t dim_im_out_y, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, + uint16_t padding_t, uint16_t padding_b, + uint16_t padding_l, uint16_t padding_r, + uint16_t stride_x, uint16_t stride_y); + +void pulp_nn_maxpool_i4(int8_t *pIn, int8_t *pOut, uint16_t dim_im_in_x, + uint16_t dim_im_in_y, uint16_t ch_im_in, + uint16_t dim_im_out_x, uint16_t dim_im_out_y, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, + uint16_t padding_t, uint16_t padding_b, + uint16_t padding_l, uint16_t padding_r, + uint16_t stride_x, uint16_t stride_y); + +void pulp_nn_maxpool_u2(uint8_t *pIn, uint8_t *pOut, uint16_t dim_im_in_x, + uint16_t dim_im_in_y, uint16_t ch_im_in, + uint16_t dim_im_out_x, uint16_t dim_im_out_y, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, + uint16_t padding_t, uint16_t padding_b, + uint16_t padding_l, uint16_t padding_r, + uint16_t stride_x, uint16_t stride_y); + +void pulp_nn_maxpool_i2(int8_t *pIn, int8_t *pOut, uint16_t dim_im_in_x, + uint16_t dim_im_in_y, uint16_t ch_im_in, + uint16_t dim_im_out_x, uint16_t dim_im_out_y, + uint16_t dim_kernel_x, uint16_t dim_kernel_y, + uint16_t padding_t, uint16_t padding_b, + uint16_t padding_l, uint16_t padding_r, + uint16_t stride_x, uint16_t stride_y); + +void pulp_nn_avgpool_u8_u8(uint8_t *pIn, uint8_t *pOut, int32_t lambda, + uint16_t out_shift, int32_t out_add, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, uint16_t dim_im_out_x, + uint16_t dim_im_out_y, uint16_t dim_kernel_x, + uint16_t dim_kernel_y, uint16_t padding_t, + uint16_t padding_b, uint16_t padding_l, + uint16_t padding_r, uint16_t stride_x, + uint16_t stride_y, int flag_requant); + +void pulp_nn_avgpool_u8_i8(uint8_t *pIn, int8_t *pOut, int32_t lambda, + uint16_t out_shift, int32_t out_add, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, uint16_t dim_im_out_x, + uint16_t dim_im_out_y, uint16_t dim_kernel_x, + uint16_t dim_kernel_y, uint16_t padding_t, + uint16_t padding_b, uint16_t padding_l, + uint16_t padding_r, uint16_t stride_x, + uint16_t stride_y, int flag_requant); + +void pulp_nn_avgpool_i8_u8(int8_t *pIn, uint8_t *pOut, int32_t lambda, + uint16_t out_shift, int32_t out_add, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, uint16_t dim_im_out_x, + uint16_t dim_im_out_y, uint16_t dim_kernel_x, + uint16_t dim_kernel_y, uint16_t padding_t, + uint16_t padding_b, uint16_t padding_l, + uint16_t padding_r, uint16_t stride_x, + uint16_t stride_y, int flag_requant); + +void pulp_nn_avgpool_i8_i8(int8_t *pIn, int8_t *pOut, int32_t lambda, + uint16_t out_shift, int32_t out_add, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, uint16_t dim_im_out_x, + uint16_t dim_im_out_y, uint16_t dim_kernel_x, + uint16_t dim_kernel_y, uint16_t padding_t, + uint16_t padding_b, uint16_t padding_l, + uint16_t padding_r, uint16_t stride_x, + uint16_t stride_y, int flag_requant); + +void pulp_nn_avgpool_u8_u4(uint8_t *pIn, uint8_t *pOut, int32_t lambda, + uint16_t out_shift, int32_t out_add, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, uint16_t dim_im_out_x, + uint16_t dim_im_out_y, uint16_t dim_kernel_x, + uint16_t dim_kernel_y, uint16_t padding_t, + uint16_t padding_b, uint16_t padding_l, + uint16_t padding_r, uint16_t stride_x, + uint16_t stride_y, int flag_requant); + +void pulp_nn_avgpool_u8_i4(uint8_t *pIn, int8_t *pOut, int32_t lambda, + uint16_t out_shift, int32_t out_add, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, uint16_t dim_im_out_x, + uint16_t dim_im_out_y, uint16_t dim_kernel_x, + uint16_t dim_kernel_y, uint16_t padding_t, + uint16_t padding_b, uint16_t padding_l, + uint16_t padding_r, uint16_t stride_x, + uint16_t stride_y, int flag_requant); + +void pulp_nn_avgpool_i8_u4(int8_t *pIn, uint8_t *pOut, int32_t lambda, + uint16_t out_shift, int32_t out_add, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, uint16_t dim_im_out_x, + uint16_t dim_im_out_y, uint16_t dim_kernel_x, + uint16_t dim_kernel_y, uint16_t padding_t, + uint16_t padding_b, uint16_t padding_l, + uint16_t padding_r, uint16_t stride_x, + uint16_t stride_y, int flag_requant); + +void pulp_nn_avgpool_i8_i4(int8_t *pIn, int8_t *pOut, int32_t lambda, + uint16_t out_shift, int32_t out_add, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, uint16_t dim_im_out_x, + uint16_t dim_im_out_y, uint16_t dim_kernel_x, + uint16_t dim_kernel_y, uint16_t padding_t, + uint16_t padding_b, uint16_t padding_l, + uint16_t padding_r, uint16_t stride_x, + uint16_t stride_y, int flag_requant); + +void pulp_nn_avgpool_u8_u2(uint8_t *pIn, uint8_t *pOut, int32_t lambda, + uint16_t out_shift, int32_t out_add, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, uint16_t dim_im_out_x, + uint16_t dim_im_out_y, uint16_t dim_kernel_x, + uint16_t dim_kernel_y, uint16_t padding_t, + uint16_t padding_b, uint16_t padding_l, + uint16_t padding_r, uint16_t stride_x, + uint16_t stride_y, int flag_requant); + +void pulp_nn_avgpool_u8_i2(uint8_t *pIn, int8_t *pOut, int32_t lambda, + uint16_t out_shift, int32_t out_add, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, uint16_t dim_im_out_x, + uint16_t dim_im_out_y, uint16_t dim_kernel_x, + uint16_t dim_kernel_y, uint16_t padding_t, + uint16_t padding_b, uint16_t padding_l, + uint16_t padding_r, uint16_t stride_x, + uint16_t stride_y, int flag_requant); + +void pulp_nn_avgpool_i8_u2(int8_t *pIn, uint8_t *pOut, int32_t lambda, + uint16_t out_shift, int32_t out_add, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, uint16_t dim_im_out_x, + uint16_t dim_im_out_y, uint16_t dim_kernel_x, + uint16_t dim_kernel_y, uint16_t padding_t, + uint16_t padding_b, uint16_t padding_l, + uint16_t padding_r, uint16_t stride_x, + uint16_t stride_y, int flag_requant); + +void pulp_nn_avgpool_i8_i2(int8_t *pIn, int8_t *pOut, int32_t lambda, + uint16_t out_shift, int32_t out_add, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, uint16_t dim_im_out_x, + uint16_t dim_im_out_y, uint16_t dim_kernel_x, + uint16_t dim_kernel_y, uint16_t padding_t, + uint16_t padding_b, uint16_t padding_l, + uint16_t padding_r, uint16_t stride_x, + uint16_t stride_y, int flag_requant); + +void pulp_nn_avgpool_u4_u8(uint8_t *pIn, uint8_t *pOut, int32_t lambda, + uint16_t out_shift, int32_t out_add, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, uint16_t dim_im_out_x, + uint16_t dim_im_out_y, uint16_t dim_kernel_x, + uint16_t dim_kernel_y, uint16_t padding_t, + uint16_t padding_b, uint16_t padding_l, + uint16_t padding_r, uint16_t stride_x, + uint16_t stride_y, int flag_requant); + +void pulp_nn_avgpool_u4_i8(uint8_t *pIn, int8_t *pOut, int32_t lambda, + uint16_t out_shift, int32_t out_add, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, uint16_t dim_im_out_x, + uint16_t dim_im_out_y, uint16_t dim_kernel_x, + uint16_t dim_kernel_y, uint16_t padding_t, + uint16_t padding_b, uint16_t padding_l, + uint16_t padding_r, uint16_t stride_x, + uint16_t stride_y, int flag_requant); + +void pulp_nn_avgpool_i4_u8(int8_t *pIn, uint8_t *pOut, int32_t lambda, + uint16_t out_shift, int32_t out_add, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, uint16_t dim_im_out_x, + uint16_t dim_im_out_y, uint16_t dim_kernel_x, + uint16_t dim_kernel_y, uint16_t padding_t, + uint16_t padding_b, uint16_t padding_l, + uint16_t padding_r, uint16_t stride_x, + uint16_t stride_y, int flag_requant); + +void pulp_nn_avgpool_i4_i8(int8_t *pIn, int8_t *pOut, int32_t lambda, + uint16_t out_shift, int32_t out_add, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, uint16_t dim_im_out_x, + uint16_t dim_im_out_y, uint16_t dim_kernel_x, + uint16_t dim_kernel_y, uint16_t padding_t, + uint16_t padding_b, uint16_t padding_l, + uint16_t padding_r, uint16_t stride_x, + uint16_t stride_y, int flag_requant); + +void pulp_nn_avgpool_u4_u4(uint8_t *pIn, uint8_t *pOut, int32_t lambda, + uint16_t out_shift, int32_t out_add, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, uint16_t dim_im_out_x, + uint16_t dim_im_out_y, uint16_t dim_kernel_x, + uint16_t dim_kernel_y, uint16_t padding_t, + uint16_t padding_b, uint16_t padding_l, + uint16_t padding_r, uint16_t stride_x, + uint16_t stride_y, int flag_requant); + +void pulp_nn_avgpool_u4_i4(uint8_t *pIn, int8_t *pOut, int32_t lambda, + uint16_t out_shift, int32_t out_add, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, uint16_t dim_im_out_x, + uint16_t dim_im_out_y, uint16_t dim_kernel_x, + uint16_t dim_kernel_y, uint16_t padding_t, + uint16_t padding_b, uint16_t padding_l, + uint16_t padding_r, uint16_t stride_x, + uint16_t stride_y, int flag_requant); + +void pulp_nn_avgpool_i4_u4(int8_t *pIn, uint8_t *pOut, int32_t lambda, + uint16_t out_shift, int32_t out_add, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, uint16_t dim_im_out_x, + uint16_t dim_im_out_y, uint16_t dim_kernel_x, + uint16_t dim_kernel_y, uint16_t padding_t, + uint16_t padding_b, uint16_t padding_l, + uint16_t padding_r, uint16_t stride_x, + uint16_t stride_y, int flag_requant); + +void pulp_nn_avgpool_i4_i4(int8_t *pIn, int8_t *pOut, int32_t lambda, + uint16_t out_shift, int32_t out_add, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, uint16_t dim_im_out_x, + uint16_t dim_im_out_y, uint16_t dim_kernel_x, + uint16_t dim_kernel_y, uint16_t padding_t, + uint16_t padding_b, uint16_t padding_l, + uint16_t padding_r, uint16_t stride_x, + uint16_t stride_y, int flag_requant); + +void pulp_nn_avgpool_u4_u2(uint8_t *pIn, uint8_t *pOut, int32_t lambda, + uint16_t out_shift, int32_t out_add, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, uint16_t dim_im_out_x, + uint16_t dim_im_out_y, uint16_t dim_kernel_x, + uint16_t dim_kernel_y, uint16_t padding_t, + uint16_t padding_b, uint16_t padding_l, + uint16_t padding_r, uint16_t stride_x, + uint16_t stride_y, int flag_requant); + +void pulp_nn_avgpool_u4_i2(uint8_t *pIn, int8_t *pOut, int32_t lambda, + uint16_t out_shift, int32_t out_add, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, uint16_t dim_im_out_x, + uint16_t dim_im_out_y, uint16_t dim_kernel_x, + uint16_t dim_kernel_y, uint16_t padding_t, + uint16_t padding_b, uint16_t padding_l, + uint16_t padding_r, uint16_t stride_x, + uint16_t stride_y, int flag_requant); + +void pulp_nn_avgpool_i4_u2(int8_t *pIn, uint8_t *pOut, int32_t lambda, + uint16_t out_shift, int32_t out_add, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, uint16_t dim_im_out_x, + uint16_t dim_im_out_y, uint16_t dim_kernel_x, + uint16_t dim_kernel_y, uint16_t padding_t, + uint16_t padding_b, uint16_t padding_l, + uint16_t padding_r, uint16_t stride_x, + uint16_t stride_y, int flag_requant); + +void pulp_nn_avgpool_i4_i2(int8_t *pIn, int8_t *pOut, int32_t lambda, + uint16_t out_shift, int32_t out_add, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, uint16_t dim_im_out_x, + uint16_t dim_im_out_y, uint16_t dim_kernel_x, + uint16_t dim_kernel_y, uint16_t padding_t, + uint16_t padding_b, uint16_t padding_l, + uint16_t padding_r, uint16_t stride_x, + uint16_t stride_y, int flag_requant); + +void pulp_nn_avgpool_u2_u8(uint8_t *pIn, uint8_t *pOut, int32_t lambda, + uint16_t out_shift, int32_t out_add, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, uint16_t dim_im_out_x, + uint16_t dim_im_out_y, uint16_t dim_kernel_x, + uint16_t dim_kernel_y, uint16_t padding_t, + uint16_t padding_b, uint16_t padding_l, + uint16_t padding_r, uint16_t stride_x, + uint16_t stride_y, int flag_requant); + +void pulp_nn_avgpool_u2_i8(uint8_t *pIn, int8_t *pOut, int32_t lambda, + uint16_t out_shift, int32_t out_add, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, uint16_t dim_im_out_x, + uint16_t dim_im_out_y, uint16_t dim_kernel_x, + uint16_t dim_kernel_y, uint16_t padding_t, + uint16_t padding_b, uint16_t padding_l, + uint16_t padding_r, uint16_t stride_x, + uint16_t stride_y, int flag_requant); + +void pulp_nn_avgpool_i2_u8(int8_t *pIn, uint8_t *pOut, int32_t lambda, + uint16_t out_shift, int32_t out_add, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, uint16_t dim_im_out_x, + uint16_t dim_im_out_y, uint16_t dim_kernel_x, + uint16_t dim_kernel_y, uint16_t padding_t, + uint16_t padding_b, uint16_t padding_l, + uint16_t padding_r, uint16_t stride_x, + uint16_t stride_y, int flag_requant); + +void pulp_nn_avgpool_i2_i8(int8_t *pIn, int8_t *pOut, int32_t lambda, + uint16_t out_shift, int32_t out_add, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, uint16_t dim_im_out_x, + uint16_t dim_im_out_y, uint16_t dim_kernel_x, + uint16_t dim_kernel_y, uint16_t padding_t, + uint16_t padding_b, uint16_t padding_l, + uint16_t padding_r, uint16_t stride_x, + uint16_t stride_y, int flag_requant); + +void pulp_nn_avgpool_u2_u4(uint8_t *pIn, uint8_t *pOut, int32_t lambda, + uint16_t out_shift, int32_t out_add, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, uint16_t dim_im_out_x, + uint16_t dim_im_out_y, uint16_t dim_kernel_x, + uint16_t dim_kernel_y, uint16_t padding_t, + uint16_t padding_b, uint16_t padding_l, + uint16_t padding_r, uint16_t stride_x, + uint16_t stride_y, int flag_requant); + +void pulp_nn_avgpool_u2_i4(uint8_t *pIn, int8_t *pOut, int32_t lambda, + uint16_t out_shift, int32_t out_add, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, uint16_t dim_im_out_x, + uint16_t dim_im_out_y, uint16_t dim_kernel_x, + uint16_t dim_kernel_y, uint16_t padding_t, + uint16_t padding_b, uint16_t padding_l, + uint16_t padding_r, uint16_t stride_x, + uint16_t stride_y, int flag_requant); + +void pulp_nn_avgpool_i2_u4(int8_t *pIn, uint8_t *pOut, int32_t lambda, + uint16_t out_shift, int32_t out_add, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, uint16_t dim_im_out_x, + uint16_t dim_im_out_y, uint16_t dim_kernel_x, + uint16_t dim_kernel_y, uint16_t padding_t, + uint16_t padding_b, uint16_t padding_l, + uint16_t padding_r, uint16_t stride_x, + uint16_t stride_y, int flag_requant); + +void pulp_nn_avgpool_i2_i4(int8_t *pIn, int8_t *pOut, int32_t lambda, + uint16_t out_shift, int32_t out_add, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, uint16_t dim_im_out_x, + uint16_t dim_im_out_y, uint16_t dim_kernel_x, + uint16_t dim_kernel_y, uint16_t padding_t, + uint16_t padding_b, uint16_t padding_l, + uint16_t padding_r, uint16_t stride_x, + uint16_t stride_y, int flag_requant); + +void pulp_nn_avgpool_u2_u2(uint8_t *pIn, uint8_t *pOut, int32_t lambda, + uint16_t out_shift, int32_t out_add, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, uint16_t dim_im_out_x, + uint16_t dim_im_out_y, uint16_t dim_kernel_x, + uint16_t dim_kernel_y, uint16_t padding_t, + uint16_t padding_b, uint16_t padding_l, + uint16_t padding_r, uint16_t stride_x, + uint16_t stride_y, int flag_requant); + +void pulp_nn_avgpool_u2_i2(uint8_t *pIn, int8_t *pOut, int32_t lambda, + uint16_t out_shift, int32_t out_add, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, uint16_t dim_im_out_x, + uint16_t dim_im_out_y, uint16_t dim_kernel_x, + uint16_t dim_kernel_y, uint16_t padding_t, + uint16_t padding_b, uint16_t padding_l, + uint16_t padding_r, uint16_t stride_x, + uint16_t stride_y, int flag_requant); + +void pulp_nn_avgpool_i2_u2(int8_t *pIn, uint8_t *pOut, int32_t lambda, + uint16_t out_shift, int32_t out_add, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, uint16_t dim_im_out_x, + uint16_t dim_im_out_y, uint16_t dim_kernel_x, + uint16_t dim_kernel_y, uint16_t padding_t, + uint16_t padding_b, uint16_t padding_l, + uint16_t padding_r, uint16_t stride_x, + uint16_t stride_y, int flag_requant); + +void pulp_nn_avgpool_i2_i2(int8_t *pIn, int8_t *pOut, int32_t lambda, + uint16_t out_shift, int32_t out_add, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, uint16_t dim_im_out_x, + uint16_t dim_im_out_y, uint16_t dim_kernel_x, + uint16_t dim_kernel_y, uint16_t padding_t, + uint16_t padding_b, uint16_t padding_l, + uint16_t padding_r, uint16_t stride_x, + uint16_t stride_y, int flag_requant); + +void pulp_nn_add_u8_u8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + uint16_t out_mult1, uint16_t out_mult2, + uint16_t out_shift, uint16_t dim_im_in_x, + uint16_t dim_im_in_y, uint16_t ch_im_in); + +void pulp_nn_add_u8_u8_u8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u8_u8_u4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u8_u8_u2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u8_u8_i8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u8_u8_i4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u8_u8_i2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u8_i8_u8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u8_i8_u4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u8_i8_u2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u8_i8_i8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u8_i8_i4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u8_i8_i2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i8_u8_u8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i8_u8_u4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i8_u8_u2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i8_u8_i8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i8_u8_i4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i8_u8_i2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i8_i8_u8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i8_i8_u4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i8_i8_u2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i8_i8_i8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i8_i8_i4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i8_i8_i2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u8_u4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + uint16_t out_mult1, uint16_t out_mult2, + uint16_t out_shift, uint16_t dim_im_in_x, + uint16_t dim_im_in_y, uint16_t ch_im_in); + +void pulp_nn_add_u8_u4_u8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u8_u4_u4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u8_u4_u2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u8_u4_i8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u8_u4_i4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u8_u4_i2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u8_i4_u8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u8_i4_u4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u8_i4_u2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u8_i4_i8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u8_i4_i4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u8_i4_i2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i8_u4_u8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i8_u4_u4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i8_u4_u2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i8_u4_i8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i8_u4_i4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i8_u4_i2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i8_i4_u8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i8_i4_u4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i8_i4_u2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i8_i4_i8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i8_i4_i4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i8_i4_i2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u8_u2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + uint16_t out_mult1, uint16_t out_mult2, + uint16_t out_shift, uint16_t dim_im_in_x, + uint16_t dim_im_in_y, uint16_t ch_im_in); + +void pulp_nn_add_u8_u2_u8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u8_u2_u4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u8_u2_u2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u8_u2_i8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u8_u2_i4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u8_u2_i2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u8_i2_u8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u8_i2_u4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u8_i2_u2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u8_i2_i8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u8_i2_i4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u8_i2_i2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i8_u2_u8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i8_u2_u4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i8_u2_u2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i8_u2_i8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i8_u2_i4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i8_u2_i2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i8_i2_u8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i8_i2_u4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i8_i2_u2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i8_i2_i8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i8_i2_i4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i8_i2_i2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u4_u8_u8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u4_u8_u4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u4_u8_u2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u4_u8_i8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u4_u8_i4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u4_u8_i2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u4_i8_u8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u4_i8_u4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u4_i8_u2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u4_i8_i8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u4_i8_i4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u4_i8_i2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i4_u8_u8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i4_u8_u4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i4_u8_u2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i4_u8_i8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i4_u8_i4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i4_u8_i2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i4_i8_u8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i4_i8_u4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i4_i8_u2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i4_i8_i8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i4_i8_i4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i4_i8_i2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u4_u4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + uint16_t out_mult1, uint16_t out_mult2, + uint16_t out_shift, uint16_t dim_im_in_x, + uint16_t dim_im_in_y, uint16_t ch_im_in); + +void pulp_nn_add_u4_u4_u8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u4_u4_u4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u4_u4_u2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u4_u4_i8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u4_u4_i4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u4_u4_i2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u4_i4_u8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u4_i4_u4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u4_i4_u2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u4_i4_i8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u4_i4_i4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u4_i4_i2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i4_u4_u8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i4_u4_u4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i4_u4_u2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i4_u4_i8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i4_u4_i4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i4_u4_i2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i4_i4_u8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i4_i4_u4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i4_i4_u2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i4_i4_i8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i4_i4_i4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i4_i4_i2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u4_u2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + uint16_t out_mult1, uint16_t out_mult2, + uint16_t out_shift, uint16_t dim_im_in_x, + uint16_t dim_im_in_y, uint16_t ch_im_in); + +void pulp_nn_add_u4_u2_u8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u4_u2_u4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u4_u2_u2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u4_u2_i8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u4_u2_i4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u4_u2_i2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u4_i2_u8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u4_i2_u4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u4_i2_u2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u4_i2_i8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u4_i2_i4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u4_i2_i2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i4_u2_u8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i4_u2_u4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i4_u2_u2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i4_u2_i8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i4_u2_i4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i4_u2_i2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i4_i2_u8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i4_i2_u4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i4_i2_u2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i4_i2_i8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i4_i2_i4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i4_i2_i2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u2_u8_u8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u2_u8_u4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u2_u8_u2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u2_u8_i8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u2_u8_i4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u2_u8_i2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u2_i8_u8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u2_i8_u4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u2_i8_u2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u2_i8_i8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u2_i8_i4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u2_i8_i2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i2_u8_u8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i2_u8_u4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i2_u8_u2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i2_u8_i8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i2_u8_i4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i2_u8_i2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i2_i8_u8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i2_i8_u4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i2_i8_u2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i2_i8_i8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i2_i8_i4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i2_i8_i2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u2_u4_u8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u2_u4_u4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u2_u4_u2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u2_u4_i8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u2_u4_i4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u2_u4_i2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u2_i4_u8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u2_i4_u4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u2_i4_u2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u2_i4_i8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u2_i4_i4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u2_i4_i2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i2_u4_u8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i2_u4_u4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i2_u4_u2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i2_u4_i8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i2_u4_i4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i2_u4_i2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i2_i4_u8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i2_i4_u4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i2_i4_u2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i2_i4_i8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i2_i4_i4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i2_i4_i2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u2_u2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + uint16_t out_mult1, uint16_t out_mult2, + uint16_t out_shift, uint16_t dim_im_in_x, + uint16_t dim_im_in_y, uint16_t ch_im_in); + +void pulp_nn_add_u2_u2_u8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u2_u2_u4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u2_u2_u2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u2_u2_i8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u2_u2_i4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u2_u2_i2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u2_i2_u8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u2_i2_u4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u2_i2_u2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u2_i2_i8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u2_i2_i4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_u2_i2_i2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i2_u2_u8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i2_u2_u4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i2_u2_u2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i2_u2_i8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i2_u2_i4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i2_u2_i2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i2_i2_u8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i2_i2_u4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i2_i2_u2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i2_i2_i8(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i2_i2_i4(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); + +void pulp_nn_add_i2_i2_i2(uint8_t *pIn1, uint8_t *pIn2, uint8_t *pOut, + int32_t in_mult1, int32_t in_add1, uint16_t in_shift1, + int32_t in_mult2, int32_t in_add2, uint16_t in_shift2, + int32_t out_mult, int32_t out_add, uint16_t out_shift, + uint16_t dim_im_in_x, uint16_t dim_im_in_y, + uint16_t ch_im_in, int out_requant_flag); #endif \ No newline at end of file diff --git a/TargetLibraries/GAP9/prebuilt/include/pulp_nn_utils.h b/TargetLibraries/GAP9/prebuilt/include/pulp_nn_utils.h index 8b9bd9c455..0aaa2935f1 100644 --- a/TargetLibraries/GAP9/prebuilt/include/pulp_nn_utils.h +++ b/TargetLibraries/GAP9/prebuilt/include/pulp_nn_utils.h @@ -24,345 +24,266 @@ #include "pmsis.h" -#define bitext(x,size,off) __builtin_pulp_bextract(x,size,off) -#define bitextu(x,size,off) __builtin_pulp_bextractu(x,size,off) +#define bitext(x, size, off) __builtin_pulp_bextract(x, size, off) +#define bitextu(x, size, off) __builtin_pulp_bextractu(x, size, off) #ifdef __clang__ -#define bitins(dst,not_mask_imm,src,mask_imm,off) __builtin_binsert(dst,not_mask_imm,src,mask_imm,off) +#define bitins(dst, not_mask_imm, src, mask_imm, off) \ + __builtin_binsert(dst, not_mask_imm, src, mask_imm, off) #else -#define bitins(dst,not_mask_imm,src,mask_imm,off) __builtin_pulp_binsert(dst,not_mask_imm,src,mask_imm,off) +#define bitins(dst, not_mask_imm, src, mask_imm, off) \ + __builtin_pulp_binsert(dst, not_mask_imm, src, mask_imm, off) #endif -#define pack(x,y,z,t) __builtin_pulp_pack4(x,y,z,t) -#define max4(a,b) __builtin_pulp_maxu4(a,b) -#define maxs4(a, b) __builtin_pulp_max4(a, b) -#define max8(a, b) __builtin_pulp_maxu8(a, b) -#define maxs8(a, b) __builtin_pulp_max8(a, b) -#define max16(a, b) __builtin_pulp_maxu16(a, b) -#define maxs16(a, b) __builtin_pulp_max16(a, b) -#define max32(a,b) __builtin_pulp_maxusi(a,b) -#define maxs32(a,b) __builtin_pulp_maxsi(a,b) -#define min32(a,b) __builtin_pulp_minusi(a,b) -#define mins32(a,b) __builtin_pulp_minsi(a,b) -#define min4(a, b) __builtin_pulp_minu4(a, b) -#define mins4(a, b) __builtin_pulp_min4(a, b) -#define min8(a, b) __builtin_pulp_minu8(a, b) -#define mins8(a, b) __builtin_pulp_min8(a, b) -#define min16(a, b) __builtin_pulp_minu16(a, b) -#define mins16(a, b) __builtin_pulp_min16(a, b) -#define avg4(a,b) __builtin_pulp_avgu4(a,b) -#define avg8(a,b) __builtin_pulp_avgu8(a,b) -#define avg16(a,b) __builtin_pulp_avgu16(a,b) -#define log2(x) __builtin_pulp_fl1(x) -#define min(a,b) ((a)<(b)?(a):(b)) -#define SumDotp4(a, b, c) __builtin_pulp_sdotusp4(a, b, c) -#define SumDotp8(a, b, c) __builtin_pulp_sdotusp8(a, b, c) -#define SumDotp16(a, b, c) __builtin_pulp_sdotusp16(a, b, c) -#define SumDotps4(a, b, c) __builtin_pulp_sdotsp4(a, b, c) -#define SumDotps8(a, b, c) __builtin_pulp_sdotsp8(a, b, c) -#define SumDotps16(a, b, c) __builtin_pulp_sdotsp16(a, b, c) -#define clip4(x) __builtin_pulp_clipu_r(x, 15) -#define clip2(x) __builtin_pulp_clipu_r(x, 3) -#define clip8(x) __builtin_pulp_clipu_r(x, 255) - -#define clips4(x) __builtin_pulp_clip_r(x, 7) -#define clips2(x) __builtin_pulp_clip_r(x, 1) -#define clips8(x) __builtin_pulp_clip_r(x, 127) -#define MacLoadInit(a_update, b_update, a_reg, b_reg, ptr) __builtin_pulp_mlinitspr_v3(a_update, b_update, a_reg, b_reg, ptr) -#define MacLoadUpdate(ptr) __builtin_pulp_mlupdatespr_v3(ptr) -#define MacLoadAssign(ptr) __builtin_pulp_mlassignspr_v3(ptr) -#define MacLoad4(a_update, b_update, a_reg, b_reg, ptr, sum) __builtin_pulp_mlsdotsup4_v3(a_update, b_update, a_reg, b_reg, ptr, sum) -#define MacLoad8(a_update, b_update, a_reg, b_reg, ptr, sum) __builtin_pulp_mlsdotsup8_v3(a_update, b_update, a_reg, b_reg, ptr, sum) -#define MacLoad16(a_update, b_update, a_reg, b_reg, ptr, sum) __builtin_pulp_mlsdotsup16_v3(a_update, b_update, a_reg, b_reg, ptr, sum) -#define MacLoads4(a_update, b_update, a_reg, b_reg, ptr, sum) __builtin_pulp_mlsdotsp4_v3(a_update, b_update, a_reg, b_reg, ptr, sum) -#define MacLoads8(a_update, b_update, a_reg, b_reg, ptr, sum) __builtin_pulp_mlsdotsp8_v3(a_update, b_update, a_reg, b_reg, ptr, sum) -#define MacLoads16(a_update, b_update, a_reg, b_reg, ptr, sum) __builtin_pulp_mlsdotsp16_v3(a_update, b_update, a_reg, b_reg, ptr, sum) - -#define PACK_INT8_SIZE(x) (x) -#define PACK_INT4_SIZE(x) ((x) >> 1) -#define PACK_INT2_SIZE(x) ((x) >> 2) - -#define MemoryFence() asm volatile("":::"memory") - -#define LEGACY_MODE(x) asm volatile ("csrwi 0x010," x) -#define IVEC_FMT(x) asm volatile ("csrwi 0x00D," x) -#define MIXED_SKIP(x) asm volatile ("csrwi 0x00F," x) -#define A_ADDRESS(x) asm volatile ("csrw 0x100, %0" :: "r" (x)) -#define W_ADDRESS(x) asm volatile ("csrw 0x101, %0" :: "r" (x)) -#define A_STRIDE(x) asm volatile ("csrw 0x102, %0":: "r" (x)) -#define W_STRIDE(x) asm volatile ("csrw 0x103, %0":: "r" (x)) -#define A_ROLLBACK(x) asm volatile ("csrw 0x104, %0":: "r" (x)) -#define W_ROLLBACK(x) asm volatile ("csrw 0x105, %0":: "r" (x)) -#define A_SKIP(x) asm volatile ("csrwi 0x106," x) -#define W_SKIP(x) asm volatile ("csrwi 0x107," x) - -static uint8_t __attribute__((noinline)) pulp_nn_quant_u2 ( - int32_t phi, - int16_t m, - int8_t d - ) { +#define pack(x, y, z, t) __builtin_pulp_pack4(x, y, z, t) +#define max4(a, b) __builtin_pulp_maxu4(a, b) +#define maxs4(a, b) __builtin_pulp_max4(a, b) +#define max8(a, b) __builtin_pulp_maxu8(a, b) +#define maxs8(a, b) __builtin_pulp_max8(a, b) +#define max16(a, b) __builtin_pulp_maxu16(a, b) +#define maxs16(a, b) __builtin_pulp_max16(a, b) +#define max32(a, b) __builtin_pulp_maxusi(a, b) +#define maxs32(a, b) __builtin_pulp_maxsi(a, b) +#define min32(a, b) __builtin_pulp_minusi(a, b) +#define mins32(a, b) __builtin_pulp_minsi(a, b) +#define min4(a, b) __builtin_pulp_minu4(a, b) +#define mins4(a, b) __builtin_pulp_min4(a, b) +#define min8(a, b) __builtin_pulp_minu8(a, b) +#define mins8(a, b) __builtin_pulp_min8(a, b) +#define min16(a, b) __builtin_pulp_minu16(a, b) +#define mins16(a, b) __builtin_pulp_min16(a, b) +#define avg4(a, b) __builtin_pulp_avgu4(a, b) +#define avg8(a, b) __builtin_pulp_avgu8(a, b) +#define avg16(a, b) __builtin_pulp_avgu16(a, b) +#define log2(x) __builtin_pulp_fl1(x) +#define min(a, b) ((a) < (b) ? (a) : (b)) +#define SumDotp4(a, b, c) __builtin_pulp_sdotusp4(a, b, c) +#define SumDotp8(a, b, c) __builtin_pulp_sdotusp8(a, b, c) +#define SumDotp16(a, b, c) __builtin_pulp_sdotusp16(a, b, c) +#define SumDotps4(a, b, c) __builtin_pulp_sdotsp4(a, b, c) +#define SumDotps8(a, b, c) __builtin_pulp_sdotsp8(a, b, c) +#define SumDotps16(a, b, c) __builtin_pulp_sdotsp16(a, b, c) +#define clip4(x) __builtin_pulp_clipu_r(x, 15) +#define clip2(x) __builtin_pulp_clipu_r(x, 3) +#define clip8(x) __builtin_pulp_clipu_r(x, 255) + +#define clips4(x) __builtin_pulp_clip_r(x, 7) +#define clips2(x) __builtin_pulp_clip_r(x, 1) +#define clips8(x) __builtin_pulp_clip_r(x, 127) +#define MacLoadInit(a_update, b_update, a_reg, b_reg, ptr) \ + __builtin_pulp_mlinitspr_v3(a_update, b_update, a_reg, b_reg, ptr) +#define MacLoadUpdate(ptr) __builtin_pulp_mlupdatespr_v3(ptr) +#define MacLoadAssign(ptr) __builtin_pulp_mlassignspr_v3(ptr) +#define MacLoad4(a_update, b_update, a_reg, b_reg, ptr, sum) \ + __builtin_pulp_mlsdotsup4_v3(a_update, b_update, a_reg, b_reg, ptr, sum) +#define MacLoad8(a_update, b_update, a_reg, b_reg, ptr, sum) \ + __builtin_pulp_mlsdotsup8_v3(a_update, b_update, a_reg, b_reg, ptr, sum) +#define MacLoad16(a_update, b_update, a_reg, b_reg, ptr, sum) \ + __builtin_pulp_mlsdotsup16_v3(a_update, b_update, a_reg, b_reg, ptr, sum) +#define MacLoads4(a_update, b_update, a_reg, b_reg, ptr, sum) \ + __builtin_pulp_mlsdotsp4_v3(a_update, b_update, a_reg, b_reg, ptr, sum) +#define MacLoads8(a_update, b_update, a_reg, b_reg, ptr, sum) \ + __builtin_pulp_mlsdotsp8_v3(a_update, b_update, a_reg, b_reg, ptr, sum) +#define MacLoads16(a_update, b_update, a_reg, b_reg, ptr, sum) \ + __builtin_pulp_mlsdotsp16_v3(a_update, b_update, a_reg, b_reg, ptr, sum) + +#define PACK_INT8_SIZE(x) (x) +#define PACK_INT4_SIZE(x) ((x) >> 1) +#define PACK_INT2_SIZE(x) ((x) >> 2) + +#define MemoryFence() asm volatile("" ::: "memory") + +#define LEGACY_MODE(x) asm volatile("csrwi 0x010," x) +#define IVEC_FMT(x) asm volatile("csrwi 0x00D," x) +#define MIXED_SKIP(x) asm volatile("csrwi 0x00F," x) +#define A_ADDRESS(x) asm volatile("csrw 0x100, %0" ::"r"(x)) +#define W_ADDRESS(x) asm volatile("csrw 0x101, %0" ::"r"(x)) +#define A_STRIDE(x) asm volatile("csrw 0x102, %0" ::"r"(x)) +#define W_STRIDE(x) asm volatile("csrw 0x103, %0" ::"r"(x)) +#define A_ROLLBACK(x) asm volatile("csrw 0x104, %0" ::"r"(x)) +#define W_ROLLBACK(x) asm volatile("csrw 0x105, %0" ::"r"(x)) +#define A_SKIP(x) asm volatile("csrwi 0x106," x) +#define W_SKIP(x) asm volatile("csrwi 0x107," x) + +static uint8_t __attribute__((noinline)) +pulp_nn_quant_u2(int32_t phi, int16_t m, int8_t d) { int32_t x = (m * phi) >> d; uint8_t res = clip2(x); return res; } -static uint8_t __attribute__((noinline)) pulp_nn_bn_quant_u2 ( - int32_t phi, - int32_t k, - int32_t lambda, - int8_t d - ) { +static uint8_t __attribute__((noinline)) +pulp_nn_bn_quant_u2(int32_t phi, int32_t k, int32_t lambda, int8_t d) { int32_t integer_image_phi = (k * phi) + lambda; int32_t x = (integer_image_phi) >> d; uint8_t res = clip2(x); return res; } -static uint8_t __attribute__((noinline)) pulp_nn_add_quant_u2 ( - uint8_t pix1, - uint8_t pix2, - int16_t m1, - int16_t m2, - int8_t d - ) { - uint32_t integer_image = pix1*m1 + pix2*m2; +static uint8_t __attribute__((noinline)) +pulp_nn_add_quant_u2(uint8_t pix1, uint8_t pix2, int16_t m1, int16_t m2, + int8_t d) { + uint32_t integer_image = pix1 * m1 + pix2 * m2; uint32_t x = (integer_image) >> d; uint8_t res = clip2(x); return res; } -static int8_t __attribute__((noinline)) pulp_nn_quant_i2 ( - int32_t phi, - int16_t m, - int8_t d - ) { +static int8_t __attribute__((noinline)) +pulp_nn_quant_i2(int32_t phi, int16_t m, int8_t d) { int32_t x = (m * phi) >> d; int8_t res = clips2(x); return res; } -static int8_t __attribute__((noinline)) pulp_nn_bn_quant_i2 ( - int32_t phi, - int32_t k, - int32_t lambda, - int8_t d - ) { +static int8_t __attribute__((noinline)) +pulp_nn_bn_quant_i2(int32_t phi, int32_t k, int32_t lambda, int8_t d) { int32_t integer_image_phi = (k * phi) + lambda; int32_t x = (integer_image_phi) >> d; int8_t res = clips2(x); return res; } -static int8_t __attribute__((noinline)) pulp_nn_add_quant_i2 ( - int8_t pix1, - int8_t pix2, - int16_t m1, - int16_t m2, - int8_t d - ) { - int32_t integer_image = pix1*m1 + pix2*m2; +static int8_t __attribute__((noinline)) +pulp_nn_add_quant_i2(int8_t pix1, int8_t pix2, int16_t m1, int16_t m2, + int8_t d) { + int32_t integer_image = pix1 * m1 + pix2 * m2; int32_t x = (integer_image) >> d; int8_t res = clips2(x); return res; } -static uint8_t __attribute__((noinline)) pulp_nn_quant_u4 ( - int32_t phi, - int16_t m, - int8_t d - ) { +static uint8_t __attribute__((noinline)) +pulp_nn_quant_u4(int32_t phi, int16_t m, int8_t d) { int32_t x = (m * phi) >> d; uint8_t res = clip4(x); return res; } -static uint8_t __attribute__((noinline)) pulp_nn_bn_quant_u4 ( - int32_t phi, - int32_t k, - int32_t lambda, - int8_t d - ) { +static uint8_t __attribute__((noinline)) +pulp_nn_bn_quant_u4(int32_t phi, int32_t k, int32_t lambda, int8_t d) { int32_t integer_image_phi = (k * phi) + lambda; int32_t x = (integer_image_phi) >> d; uint8_t res = clip4(x); return res; } -static uint8_t __attribute__((noinline)) pulp_nn_add_quant_u4 ( - uint8_t pix1, - uint8_t pix2, - int16_t m1, - int16_t m2, - int8_t d - ) { - uint32_t integer_image = pix1*m1 + pix2*m2; +static uint8_t __attribute__((noinline)) +pulp_nn_add_quant_u4(uint8_t pix1, uint8_t pix2, int16_t m1, int16_t m2, + int8_t d) { + uint32_t integer_image = pix1 * m1 + pix2 * m2; uint32_t x = (integer_image) >> d; uint8_t res = clip4(x); return res; } -static int8_t __attribute__((noinline)) pulp_nn_quant_i4 ( - int32_t phi, - int16_t m, - int8_t d - ) { +static int8_t __attribute__((noinline)) +pulp_nn_quant_i4(int32_t phi, int16_t m, int8_t d) { int32_t x = (m * phi) >> d; int8_t res = clips4(x); return res; } -static int8_t __attribute__((noinline)) pulp_nn_bn_quant_i4 ( - int32_t phi, - int32_t k, - int32_t lambda, - int8_t d - ) { +static int8_t __attribute__((noinline)) +pulp_nn_bn_quant_i4(int32_t phi, int32_t k, int32_t lambda, int8_t d) { int32_t integer_image_phi = (k * phi) + lambda; int32_t x = (integer_image_phi) >> d; int8_t res = clips4(x); return res; } -static int8_t __attribute__((noinline)) pulp_nn_add_quant_i4 ( - int8_t pix1, - int8_t pix2, - int16_t m1, - int16_t m2, - int8_t d - ) { - int32_t integer_image = pix1*m1 + pix2*m2; +static int8_t __attribute__((noinline)) +pulp_nn_add_quant_i4(int8_t pix1, int8_t pix2, int16_t m1, int16_t m2, + int8_t d) { + int32_t integer_image = pix1 * m1 + pix2 * m2; int32_t x = (integer_image) >> d; int8_t res = clips4(x); return res; } -static uint8_t __attribute__((noinline)) pulp_nn_quant_u8 ( - int32_t phi, - int16_t m, - int8_t d - ) { +static uint8_t __attribute__((noinline)) +pulp_nn_quant_u8(int32_t phi, int16_t m, int8_t d) { int32_t x = (m * phi) >> d; uint8_t res = clip8(x); return res; } -static uint8_t __attribute__((noinline)) pulp_nn_bn_quant_u8 ( - int32_t phi, - int32_t k, - int32_t lambda, - int8_t d - ) { +static uint8_t __attribute__((noinline)) +pulp_nn_bn_quant_u8(int32_t phi, int32_t k, int32_t lambda, int8_t d) { int32_t integer_image_phi = (k * phi) + lambda; int32_t x = (integer_image_phi) >> d; uint8_t res = clip8(x); return res; } -static uint8_t __attribute__((noinline)) pulp_nn_add_quant_u8 ( - uint8_t pix1, - uint8_t pix2, - int16_t m1, - int16_t m2, - int8_t d - ) { - uint32_t integer_image = pix1*m1 + pix2*m2; +static uint8_t __attribute__((noinline)) +pulp_nn_add_quant_u8(uint8_t pix1, uint8_t pix2, int16_t m1, int16_t m2, + int8_t d) { + uint32_t integer_image = pix1 * m1 + pix2 * m2; uint32_t x = (integer_image) >> d; uint8_t res = clip8(x); return res; } -static int8_t __attribute__((noinline)) pulp_nn_quant_i8 ( - int32_t phi, - int16_t m, - int8_t d - ) { +static int8_t __attribute__((noinline)) +pulp_nn_quant_i8(int32_t phi, int16_t m, int8_t d) { int32_t x = (m * phi) >> d; int8_t res = clips8(x); return res; } -static int8_t __attribute__((noinline)) pulp_nn_bn_quant_i8 ( - int32_t phi, - int32_t k, - int32_t lambda, - int8_t d - ) { +static int8_t __attribute__((noinline)) +pulp_nn_bn_quant_i8(int32_t phi, int32_t k, int32_t lambda, int8_t d) { int32_t integer_image_phi = (k * phi) + lambda; int32_t x = (integer_image_phi) >> d; int8_t res = clips8(x); return res; } -static int8_t __attribute__((noinline)) pulp_nn_add_quant_i8 ( - int8_t pix1, - int8_t pix2, - int16_t m1, - int16_t m2, - int8_t d - ) { - int32_t integer_image = pix1*m1 + pix2*m2; +static int8_t __attribute__((noinline)) +pulp_nn_add_quant_i8(int8_t pix1, int8_t pix2, int16_t m1, int16_t m2, + int8_t d) { + int32_t integer_image = pix1 * m1 + pix2 * m2; int32_t x = (integer_image) >> d; int8_t res = clips8(x); return res; } - -static uint8_t __attribute__((noinline)) pulp_nn_u4_quant(int input, int16_t * pThr) -{ - if(input <= pThr[7] ) - { - if( input <= pThr[3]) - { - if( input <= pThr[1]) - { - if( input <= pThr[0]) +static uint8_t __attribute__((noinline)) +pulp_nn_u4_quant(int input, int16_t *pThr) { + if (input <= pThr[7]) { + if (input <= pThr[3]) { + if (input <= pThr[1]) { + if (input <= pThr[0]) return 0; else return 1; - } - else - { - if( input <= pThr[2]) + } else { + if (input <= pThr[2]) return 2; else return 3; } - } - else - { - if( input <= pThr[5]) - { - if( input <= pThr[4]) + } else { + if (input <= pThr[5]) { + if (input <= pThr[4]) return 4; else return 5; - } - else - { - if( input <= pThr[6]) + } else { + if (input <= pThr[6]) return 6; else return 7; } } - } - else - { - if( input <= pThr[11]) - { - if( input <= pThr[9]) - { - if( input <= pThr[8]) + } else { + if (input <= pThr[11]) { + if (input <= pThr[9]) { + if (input <= pThr[8]) return 8; else return 9; - } - else - { - if( input <= pThr[10]) + } else { + if (input <= pThr[10]) return 10; else return 11; } - } - else - { - if( input <= pThr[13]) - { - if( input <= pThr[12]) + } else { + if (input <= pThr[13]) { + if (input <= pThr[12]) return 12; else return 13; - } - else - { - if( input <= pThr[14]) + } else { + if (input <= pThr[14]) return 14; else return 15; @@ -371,27 +292,18 @@ static uint8_t __attribute__((noinline)) pulp_nn_u4_quant(int input, int16_t * p } } -static uint8_t __attribute__((noinline)) pulp_nn_u2_quant(int input, int16_t * pThr) -{ - if( input <= pThr[1]) - { - if( input <= pThr[0]) - { +static uint8_t __attribute__((noinline)) +pulp_nn_u2_quant(int input, int16_t *pThr) { + if (input <= pThr[1]) { + if (input <= pThr[0]) { return 0; - } - else - { + } else { return 1; } - } - else - { - if( input <= pThr[2]) - { + } else { + if (input <= pThr[2]) { return 2; - } - else - { + } else { return 3; } } @@ -401,351 +313,360 @@ static uint8_t __attribute__((noinline)) pulp_nn_u2_quant(int input, int16_t * p * Common */ - -static v4s __attribute__((noinline)) pulp_nn_i4_to_i8_r( int8_t *pSrc) -{ - v4s Src = *((v4s*) pSrc); +static v4s __attribute__((noinline)) pulp_nn_i4_to_i8_r(int8_t *pSrc) { + v4s Src = *((v4s *)pSrc); int8_t bext1, bext2, bext3, bext4; - bext1 = (int8_t) bitext((int) Src, 4, 0); - bext2 = (int8_t) bitext((int) Src, 4, 4); - bext3 = (int8_t) bitext((int) Src, 4, 8); - bext4 = (int8_t) bitext((int) Src, 4, 12); - v4s res = pack((int8_t) bext1, (int8_t) bext2, (int8_t) bext3, (int8_t) bext4); + bext1 = (int8_t)bitext((int)Src, 4, 0); + bext2 = (int8_t)bitext((int)Src, 4, 4); + bext3 = (int8_t)bitext((int)Src, 4, 8); + bext4 = (int8_t)bitext((int)Src, 4, 12); + v4s res = pack((int8_t)bext1, (int8_t)bext2, (int8_t)bext3, (int8_t)bext4); return res; } -static v4u __attribute__((noinline)) pulp_nn_u4_to_u8_r(uint8_t *pSrc) -{ - v4u Src = *((v4u*) pSrc); +static v4u __attribute__((noinline)) pulp_nn_u4_to_u8_r(uint8_t *pSrc) { + v4u Src = *((v4u *)pSrc); uint8_t bext1, bext2, bext3, bext4; - bext1 = (uint8_t) bitextu((unsigned int) Src, 4, 0); - bext2 = (uint8_t) bitextu((unsigned int) Src, 4, 4); - bext3 = (uint8_t) bitextu((unsigned int) Src, 4, 8); - bext4 = (uint8_t) bitextu((unsigned int) Src, 4, 12); - v4u res = pack((uint8_t) bext1, (uint8_t) bext2, (uint8_t) bext3, (uint8_t) bext4); + bext1 = (uint8_t)bitextu((unsigned int)Src, 4, 0); + bext2 = (uint8_t)bitextu((unsigned int)Src, 4, 4); + bext3 = (uint8_t)bitextu((unsigned int)Src, 4, 8); + bext4 = (uint8_t)bitextu((unsigned int)Src, 4, 12); + v4u res = + pack((uint8_t)bext1, (uint8_t)bext2, (uint8_t)bext3, (uint8_t)bext4); return res; } -static v4s __attribute__((noinline)) pulp_nn_i2_to_i8_r( int8_t *pSrc) -{ - v4s Src = *((v4s*) pSrc); +static v4s __attribute__((noinline)) pulp_nn_i2_to_i8_r(int8_t *pSrc) { + v4s Src = *((v4s *)pSrc); int8_t bext1, bext2, bext3, bext4; - bext1 = (int8_t) bitext((int) Src, 2, 0); - bext2 = (int8_t) bitext((int) Src, 2, 2); - bext3 = (int8_t) bitext((int) Src, 2, 4); - bext4 = (int8_t) bitext((int) Src, 2, 6); - v4s res = pack((int8_t) bext1, (int8_t) bext2, (int8_t) bext3, (int8_t) bext4); + bext1 = (int8_t)bitext((int)Src, 2, 0); + bext2 = (int8_t)bitext((int)Src, 2, 2); + bext3 = (int8_t)bitext((int)Src, 2, 4); + bext4 = (int8_t)bitext((int)Src, 2, 6); + v4s res = pack((int8_t)bext1, (int8_t)bext2, (int8_t)bext3, (int8_t)bext4); return res; } -static v4u __attribute__((noinline)) pulp_nn_u2_to_u8_r(uint8_t *pSrc) -{ - v4u Src = *((v4u*) pSrc); +static v4u __attribute__((noinline)) pulp_nn_u2_to_u8_r(uint8_t *pSrc) { + v4u Src = *((v4u *)pSrc); uint8_t bext1, bext2, bext3, bext4; - bext1 = (uint8_t) bitextu((unsigned int) Src, 2, 0); - bext2 = (uint8_t) bitextu((unsigned int) Src, 2, 2); - bext3 = (uint8_t) bitextu((unsigned int) Src, 2, 4); - bext4 = (uint8_t) bitextu((unsigned int) Src, 2, 6); - v4u res = pack((uint8_t) bext1, (uint8_t) bext2, (uint8_t) bext3, (uint8_t) bext4); + bext1 = (uint8_t)bitextu((unsigned int)Src, 2, 0); + bext2 = (uint8_t)bitextu((unsigned int)Src, 2, 2); + bext3 = (uint8_t)bitextu((unsigned int)Src, 2, 4); + bext4 = (uint8_t)bitextu((unsigned int)Src, 2, 6); + v4u res = + pack((uint8_t)bext1, (uint8_t)bext2, (uint8_t)bext3, (uint8_t)bext4); return res; } -static v4s __attribute__((noinline)) pulp_nn_i2_to_i4_r(int8_t *pSrc) -{ +static v4s __attribute__((noinline)) pulp_nn_i2_to_i4_r(int8_t *pSrc) { int8_t mask = 0xf0; - int8_t n_mask = ~ mask; + int8_t n_mask = ~mask; int8_t off = 0x04; - v4s Src = *((v4s*) pSrc); + v4s Src = *((v4s *)pSrc); int8_t bext1, bext2, bext3, bext4; int8_t out1, out2, out3, out4; - bext1 = (int8_t) bitextu((int) Src, 2, 0); - bext2 = (int8_t) bitextu((int) Src, 2, 2); - bext3 = (int8_t) bitextu((int) Src, 2, 4); - bext4 = (int8_t) bitextu((int) Src, 2, 6); + bext1 = (int8_t)bitextu((int)Src, 2, 0); + bext2 = (int8_t)bitextu((int)Src, 2, 2); + bext3 = (int8_t)bitextu((int)Src, 2, 4); + bext4 = (int8_t)bitextu((int)Src, 2, 6); out1 = bitins(bext1, n_mask, bext2, mask, off); out2 = bitins(bext3, n_mask, bext4, mask, off); - bext1 = (int8_t) bitextu((int) Src, 2, 8); - bext2 = (int8_t) bitextu((int) Src, 2, 10); - bext3 = (int8_t) bitextu((int) Src, 2, 12); - bext4 = (int8_t) bitextu((int) Src, 2, 14); + bext1 = (int8_t)bitextu((int)Src, 2, 8); + bext2 = (int8_t)bitextu((int)Src, 2, 10); + bext3 = (int8_t)bitextu((int)Src, 2, 12); + bext4 = (int8_t)bitextu((int)Src, 2, 14); out3 = bitins(bext1, n_mask, bext2, mask, off); out4 = bitins(bext3, n_mask, bext4, mask, off); - v4s res = pack((int8_t) out1, (int8_t) out2, (int8_t) out3, (int8_t) out4); + v4s res = pack((int8_t)out1, (int8_t)out2, (int8_t)out3, (int8_t)out4); return res; } -static v4u __attribute__((noinline)) pulp_nn_u2_to_u4_r(uint8_t *pSrc) -{ +static v4u __attribute__((noinline)) pulp_nn_u2_to_u4_r(uint8_t *pSrc) { int8_t mask = 0xf0; - int8_t n_mask = ~ mask; + int8_t n_mask = ~mask; int8_t off = 0x04; - v4u Src = *((v4u*) pSrc); + v4u Src = *((v4u *)pSrc); uint8_t bext1, bext2, bext3, bext4; uint8_t out1, out2, out3, out4; - bext1 = (uint8_t) bitextu((unsigned int) Src, 2, 0); - bext2 = (uint8_t) bitextu((unsigned int) Src, 2, 2); - bext3 = (uint8_t) bitextu((unsigned int) Src, 2, 4); - bext4 = (uint8_t) bitextu((unsigned int) Src, 2, 6); + bext1 = (uint8_t)bitextu((unsigned int)Src, 2, 0); + bext2 = (uint8_t)bitextu((unsigned int)Src, 2, 2); + bext3 = (uint8_t)bitextu((unsigned int)Src, 2, 4); + bext4 = (uint8_t)bitextu((unsigned int)Src, 2, 6); out1 = bitins(bext1, n_mask, bext2, mask, off); out2 = bitins(bext3, n_mask, bext4, mask, off); - bext1 = (uint8_t) bitextu((unsigned int) Src, 2, 8); - bext2 = (uint8_t) bitextu((unsigned int) Src, 2, 10); - bext3 = (uint8_t) bitextu((unsigned int) Src, 2, 12); - bext4 = (uint8_t) bitextu((unsigned int) Src, 2, 14); + bext1 = (uint8_t)bitextu((unsigned int)Src, 2, 8); + bext2 = (uint8_t)bitextu((unsigned int)Src, 2, 10); + bext3 = (uint8_t)bitextu((unsigned int)Src, 2, 12); + bext4 = (uint8_t)bitextu((unsigned int)Src, 2, 14); out3 = bitins(bext1, n_mask, bext2, mask, off); out4 = bitins(bext3, n_mask, bext4, mask, off); - v4u res = pack((uint8_t) out1, (uint8_t) out2, (uint8_t) out3, (uint8_t) out4); + v4u res = pack((uint8_t)out1, (uint8_t)out2, (uint8_t)out3, (uint8_t)out4); return res; } -static int8_t *__attribute__((always_inline)) pulp_nn_i4_to_i8( int8_t *pSrc, int8_t *pDst) -{ - v4s Src = *((v4s*) pSrc); +static int8_t *__attribute__((always_inline)) +pulp_nn_i4_to_i8(int8_t *pSrc, int8_t *pDst) { + v4s Src = *((v4s *)pSrc); int8_t bext1, bext2, bext3, bext4; - pSrc+=4; - - bext1 = (int8_t) bitext((int) Src, 4, 0); - bext2 = (int8_t) bitext((int) Src, 4, 4); - bext3 = (int8_t) bitext((int) Src, 4, 8); - bext4 = (int8_t) bitext((int) Src, 4, 12); - *((v4s*)pDst) = pack((int8_t) bext1, (int8_t) bext2, (int8_t) bext3, (int8_t) bext4); - MemoryFence(); - pDst+=4; - bext1 = (int8_t) bitext((int) Src, 4, 16); - bext2 = (int8_t) bitext((int) Src, 4, 20); - bext3 = (int8_t) bitext((int) Src, 4, 24); - bext4 = (int8_t) bitext((int) Src, 4, 28); - *((v4s*)pDst) = pack((int8_t) bext1, (int8_t) bext2, (int8_t) bext3, (int8_t) bext4); + pSrc += 4; + + bext1 = (int8_t)bitext((int)Src, 4, 0); + bext2 = (int8_t)bitext((int)Src, 4, 4); + bext3 = (int8_t)bitext((int)Src, 4, 8); + bext4 = (int8_t)bitext((int)Src, 4, 12); + *((v4s *)pDst) = + pack((int8_t)bext1, (int8_t)bext2, (int8_t)bext3, (int8_t)bext4); + MemoryFence(); + pDst += 4; + bext1 = (int8_t)bitext((int)Src, 4, 16); + bext2 = (int8_t)bitext((int)Src, 4, 20); + bext3 = (int8_t)bitext((int)Src, 4, 24); + bext4 = (int8_t)bitext((int)Src, 4, 28); + *((v4s *)pDst) = + pack((int8_t)bext1, (int8_t)bext2, (int8_t)bext3, (int8_t)bext4); return pSrc; } -static uint8_t *__attribute__((always_inline)) pulp_nn_u4_to_u8(uint8_t *pSrc, uint8_t *pDst) -{ - v4u Src = *((v4u*) pSrc); +static uint8_t *__attribute__((always_inline)) +pulp_nn_u4_to_u8(uint8_t *pSrc, uint8_t *pDst) { + v4u Src = *((v4u *)pSrc); uint8_t bext1, bext2, bext3, bext4; - pSrc+=4; + pSrc += 4; - bext1 = (uint8_t) bitextu((unsigned int) Src, 4, 0); - bext2 = (uint8_t) bitextu((unsigned int) Src, 4, 4); - bext3 = (uint8_t) bitextu((unsigned int) Src, 4, 8); - bext4 = (uint8_t) bitextu((unsigned int) Src, 4, 12); - *((v4u*)pDst) = pack((uint8_t) bext1, (uint8_t) bext2, (uint8_t) bext3, (uint8_t) bext4); + bext1 = (uint8_t)bitextu((unsigned int)Src, 4, 0); + bext2 = (uint8_t)bitextu((unsigned int)Src, 4, 4); + bext3 = (uint8_t)bitextu((unsigned int)Src, 4, 8); + bext4 = (uint8_t)bitextu((unsigned int)Src, 4, 12); + *((v4u *)pDst) = + pack((uint8_t)bext1, (uint8_t)bext2, (uint8_t)bext3, (uint8_t)bext4); MemoryFence(); - pDst+=4; - bext1 = (uint8_t) bitextu((unsigned int) Src, 4, 16); - bext2 = (uint8_t) bitextu((unsigned int) Src, 4, 20); - bext3 = (uint8_t) bitextu((unsigned int) Src, 4, 24); - bext4 = (uint8_t) bitextu((unsigned int) Src, 4, 28); - *((v4u*)pDst) = pack((uint8_t) bext1, (uint8_t) bext2, (uint8_t) bext3, (uint8_t) bext4); + pDst += 4; + bext1 = (uint8_t)bitextu((unsigned int)Src, 4, 16); + bext2 = (uint8_t)bitextu((unsigned int)Src, 4, 20); + bext3 = (uint8_t)bitextu((unsigned int)Src, 4, 24); + bext4 = (uint8_t)bitextu((unsigned int)Src, 4, 28); + *((v4u *)pDst) = + pack((uint8_t)bext1, (uint8_t)bext2, (uint8_t)bext3, (uint8_t)bext4); return pSrc; } -static int8_t *__attribute__((always_inline)) pulp_nn_i2_to_i8( int8_t * pSrc, int8_t * pDst) -{ - v4s Src = *((v4s*) pSrc); +static int8_t *__attribute__((always_inline)) +pulp_nn_i2_to_i8(int8_t *pSrc, int8_t *pDst) { + v4s Src = *((v4s *)pSrc); int8_t bext1, bext2, bext3, bext4; - pSrc+=4; + pSrc += 4; - bext1 = (int8_t) bitext((int) Src, 2, 0); - bext2 = (int8_t) bitext((int) Src, 2, 2); - bext3 = (int8_t) bitext((int) Src, 2, 4); - bext4 = (int8_t) bitext((int) Src, 2, 6); - *((v4s*)pDst) = pack((int8_t) bext1, (int8_t) bext2, (int8_t) bext3, (int8_t) bext4); + bext1 = (int8_t)bitext((int)Src, 2, 0); + bext2 = (int8_t)bitext((int)Src, 2, 2); + bext3 = (int8_t)bitext((int)Src, 2, 4); + bext4 = (int8_t)bitext((int)Src, 2, 6); + *((v4s *)pDst) = + pack((int8_t)bext1, (int8_t)bext2, (int8_t)bext3, (int8_t)bext4); MemoryFence(); - pDst+=4; - bext1 = (int8_t) bitext((int) Src, 2, 8); - bext2 = (int8_t) bitext((int) Src, 2, 10); - bext3 = (int8_t) bitext((int) Src, 2, 12); - bext4 = (int8_t) bitext((int) Src, 2, 14); - *((v4s*)pDst) = pack((int8_t) bext1, (int8_t) bext2, (int8_t) bext3, (int8_t) bext4); + pDst += 4; + bext1 = (int8_t)bitext((int)Src, 2, 8); + bext2 = (int8_t)bitext((int)Src, 2, 10); + bext3 = (int8_t)bitext((int)Src, 2, 12); + bext4 = (int8_t)bitext((int)Src, 2, 14); + *((v4s *)pDst) = + pack((int8_t)bext1, (int8_t)bext2, (int8_t)bext3, (int8_t)bext4); MemoryFence(); - pDst+=4; - bext1 = (int8_t) bitext((int) Src, 2, 16); - bext2 = (int8_t) bitext((int) Src, 2, 18); - bext3 = (int8_t) bitext((int) Src, 2, 20); - bext4 = (int8_t) bitext((int) Src, 2, 22); - *((v4s*)pDst) = pack((int8_t) bext1, (int8_t) bext2, (int8_t) bext3, (int8_t) bext4); + pDst += 4; + bext1 = (int8_t)bitext((int)Src, 2, 16); + bext2 = (int8_t)bitext((int)Src, 2, 18); + bext3 = (int8_t)bitext((int)Src, 2, 20); + bext4 = (int8_t)bitext((int)Src, 2, 22); + *((v4s *)pDst) = + pack((int8_t)bext1, (int8_t)bext2, (int8_t)bext3, (int8_t)bext4); MemoryFence(); - pDst+=4; - bext1 = (int8_t) bitext((int) Src, 2, 24); - bext2 = (int8_t) bitext((int) Src, 2, 26); - bext3 = (int8_t) bitext((int) Src, 2, 28); - bext4 = (int8_t) bitext((int) Src, 2, 30); - *((v4s*)pDst) = pack((int8_t) bext1, (int8_t) bext2, (int8_t) bext3, (int8_t) bext4); + pDst += 4; + bext1 = (int8_t)bitext((int)Src, 2, 24); + bext2 = (int8_t)bitext((int)Src, 2, 26); + bext3 = (int8_t)bitext((int)Src, 2, 28); + bext4 = (int8_t)bitext((int)Src, 2, 30); + *((v4s *)pDst) = + pack((int8_t)bext1, (int8_t)bext2, (int8_t)bext3, (int8_t)bext4); return pSrc; } -static uint8_t *__attribute__((always_inline)) pulp_nn_u2_to_u8(uint8_t * pSrc, uint8_t * pDst) -{ - v4u Src = *((v4u*) pSrc); +static uint8_t *__attribute__((always_inline)) +pulp_nn_u2_to_u8(uint8_t *pSrc, uint8_t *pDst) { + v4u Src = *((v4u *)pSrc); uint8_t bext1, bext2, bext3, bext4; - pSrc+=4; + pSrc += 4; - bext1 = (uint8_t) bitextu((unsigned int) Src, 2, 0); - bext2 = (uint8_t) bitextu((unsigned int) Src, 2, 2); - bext3 = (uint8_t) bitextu((unsigned int) Src, 2, 4); - bext4 = (uint8_t) bitextu((unsigned int) Src, 2, 6); - *((v4u*)pDst) = pack((uint8_t) bext1, (uint8_t) bext2, (uint8_t) bext3, (uint8_t) bext4); + bext1 = (uint8_t)bitextu((unsigned int)Src, 2, 0); + bext2 = (uint8_t)bitextu((unsigned int)Src, 2, 2); + bext3 = (uint8_t)bitextu((unsigned int)Src, 2, 4); + bext4 = (uint8_t)bitextu((unsigned int)Src, 2, 6); + *((v4u *)pDst) = + pack((uint8_t)bext1, (uint8_t)bext2, (uint8_t)bext3, (uint8_t)bext4); MemoryFence(); - pDst+=4; - bext1 = (uint8_t) bitextu((unsigned int) Src, 2, 8); - bext2 = (uint8_t) bitextu((unsigned int) Src, 2, 10); - bext3 = (uint8_t) bitextu((unsigned int) Src, 2, 12); - bext4 = (uint8_t) bitextu((unsigned int) Src, 2, 14); - *((v4u*)pDst) = pack((uint8_t) bext1, (uint8_t) bext2, (uint8_t) bext3, (uint8_t) bext4); + pDst += 4; + bext1 = (uint8_t)bitextu((unsigned int)Src, 2, 8); + bext2 = (uint8_t)bitextu((unsigned int)Src, 2, 10); + bext3 = (uint8_t)bitextu((unsigned int)Src, 2, 12); + bext4 = (uint8_t)bitextu((unsigned int)Src, 2, 14); + *((v4u *)pDst) = + pack((uint8_t)bext1, (uint8_t)bext2, (uint8_t)bext3, (uint8_t)bext4); MemoryFence(); - pDst+=4; - bext1 = (uint8_t) bitextu((unsigned int) Src, 2, 16); - bext2 = (uint8_t) bitextu((unsigned int) Src, 2, 18); - bext3 = (uint8_t) bitextu((unsigned int) Src, 2, 20); - bext4 = (uint8_t) bitextu((unsigned int) Src, 2, 22); - *((v4u*)pDst) = pack((uint8_t) bext1, (uint8_t) bext2, (uint8_t) bext3, (uint8_t) bext4); + pDst += 4; + bext1 = (uint8_t)bitextu((unsigned int)Src, 2, 16); + bext2 = (uint8_t)bitextu((unsigned int)Src, 2, 18); + bext3 = (uint8_t)bitextu((unsigned int)Src, 2, 20); + bext4 = (uint8_t)bitextu((unsigned int)Src, 2, 22); + *((v4u *)pDst) = + pack((uint8_t)bext1, (uint8_t)bext2, (uint8_t)bext3, (uint8_t)bext4); MemoryFence(); - pDst+=4; - bext1 = (uint8_t) bitextu((unsigned int) Src, 2, 24); - bext2 = (uint8_t) bitextu((unsigned int) Src, 2, 26); - bext3 = (uint8_t) bitextu((unsigned int) Src, 2, 28); - bext4 = (uint8_t) bitextu((unsigned int) Src, 2, 30); - *((v4u*)pDst) = pack((uint8_t) bext1, (uint8_t) bext2, (uint8_t) bext3, (uint8_t) bext4); + pDst += 4; + bext1 = (uint8_t)bitextu((unsigned int)Src, 2, 24); + bext2 = (uint8_t)bitextu((unsigned int)Src, 2, 26); + bext3 = (uint8_t)bitextu((unsigned int)Src, 2, 28); + bext4 = (uint8_t)bitextu((unsigned int)Src, 2, 30); + *((v4u *)pDst) = + pack((uint8_t)bext1, (uint8_t)bext2, (uint8_t)bext3, (uint8_t)bext4); return pSrc; } -static int8_t *__attribute__((always_inline)) pulp_nn_i2_to_i4( int8_t * pSrc, int8_t * pDst) -{ +static int8_t *__attribute__((always_inline)) +pulp_nn_i2_to_i4(int8_t *pSrc, int8_t *pDst) { int8_t mask = 0xf0; - int8_t n_mask = ~ mask; + int8_t n_mask = ~mask; int8_t off = 0x04; - v4s Src = *((v4s*) pSrc); + v4s Src = *((v4s *)pSrc); int8_t bext1, bext2, bext3, bext4; int8_t out1, out2, out3, out4; - pSrc+=4; + pSrc += 4; - bext1 = (int8_t) bitext((int) Src, 2, 0); - bext2 = (int8_t) bitext((int) Src, 2, 2); - bext3 = (int8_t) bitext((int) Src, 2, 4); - bext4 = (int8_t) bitext((int) Src, 2, 6); + bext1 = (int8_t)bitext((int)Src, 2, 0); + bext2 = (int8_t)bitext((int)Src, 2, 2); + bext3 = (int8_t)bitext((int)Src, 2, 4); + bext4 = (int8_t)bitext((int)Src, 2, 6); out1 = bitins(bext1, n_mask, bext2, mask, off); out2 = bitins(bext3, n_mask, bext4, mask, off); MemoryFence(); - bext1 = (int8_t) bitext((int) Src, 2, 8); - bext2 = (int8_t) bitext((int) Src, 2, 10); - bext3 = (int8_t) bitext((int) Src, 2, 12); - bext4 = (int8_t) bitext((int) Src, 2, 14); + bext1 = (int8_t)bitext((int)Src, 2, 8); + bext2 = (int8_t)bitext((int)Src, 2, 10); + bext3 = (int8_t)bitext((int)Src, 2, 12); + bext4 = (int8_t)bitext((int)Src, 2, 14); out3 = bitins(bext1, n_mask, bext2, mask, off); out4 = bitins(bext3, n_mask, bext4, mask, off); - *((v4s*)pDst) = pack((int8_t) out1, (int8_t) out2, (int8_t) out3, (int8_t) out4); + *((v4s *)pDst) = pack((int8_t)out1, (int8_t)out2, (int8_t)out3, (int8_t)out4); MemoryFence(); - pDst+=4; - bext1 = (int8_t) bitext((int) Src, 2, 16); - bext2 = (int8_t) bitext((int) Src, 2, 18); - bext3 = (int8_t) bitext((int) Src, 2, 20); - bext4 = (int8_t) bitext((int) Src, 2, 22); + pDst += 4; + bext1 = (int8_t)bitext((int)Src, 2, 16); + bext2 = (int8_t)bitext((int)Src, 2, 18); + bext3 = (int8_t)bitext((int)Src, 2, 20); + bext4 = (int8_t)bitext((int)Src, 2, 22); out1 = bitins(bext1, n_mask, bext2, mask, off); out2 = bitins(bext3, n_mask, bext4, mask, off); MemoryFence(); - bext1 = (int8_t) bitext((int) Src, 2, 24); - bext2 = (int8_t) bitext((int) Src, 2, 26); - bext3 = (int8_t) bitext((int) Src, 2, 28); - bext4 = (int8_t) bitext((int) Src, 2, 30); + bext1 = (int8_t)bitext((int)Src, 2, 24); + bext2 = (int8_t)bitext((int)Src, 2, 26); + bext3 = (int8_t)bitext((int)Src, 2, 28); + bext4 = (int8_t)bitext((int)Src, 2, 30); out3 = bitins(bext1, n_mask, bext2, mask, off); out4 = bitins(bext3, n_mask, bext4, mask, off); - *((v4s*)pDst) = pack((int8_t) out1, (int8_t) out2, (int8_t) out3, (int8_t) out4); + *((v4s *)pDst) = pack((int8_t)out1, (int8_t)out2, (int8_t)out3, (int8_t)out4); return pSrc; } -static uint8_t *__attribute__((always_inline)) pulp_nn_u2_to_u4( uint8_t * pSrc, uint8_t * pDst) -{ +static uint8_t *__attribute__((always_inline)) +pulp_nn_u2_to_u4(uint8_t *pSrc, uint8_t *pDst) { int8_t mask = 0xf0; - int8_t n_mask = ~ mask; + int8_t n_mask = ~mask; int8_t off = 0x04; - v4u Src = *((v4u*) pSrc); + v4u Src = *((v4u *)pSrc); uint8_t bext1, bext2, bext3, bext4; uint8_t out1, out2, out3, out4; - pSrc+=4; + pSrc += 4; - bext1 = (uint8_t) bitextu((unsigned int) Src, 2, 0); - bext2 = (uint8_t) bitextu((unsigned int) Src, 2, 2); - bext3 = (uint8_t) bitextu((unsigned int) Src, 2, 4); - bext4 = (uint8_t) bitextu((unsigned int) Src, 2, 6); + bext1 = (uint8_t)bitextu((unsigned int)Src, 2, 0); + bext2 = (uint8_t)bitextu((unsigned int)Src, 2, 2); + bext3 = (uint8_t)bitextu((unsigned int)Src, 2, 4); + bext4 = (uint8_t)bitextu((unsigned int)Src, 2, 6); out1 = bitins(bext1, n_mask, bext2, mask, off); out2 = bitins(bext3, n_mask, bext4, mask, off); MemoryFence(); - bext1 = (uint8_t) bitextu((unsigned int) Src, 2, 8); - bext2 = (uint8_t) bitextu((unsigned int) Src, 2, 10); - bext3 = (uint8_t) bitextu((unsigned int) Src, 2, 12); - bext4 = (uint8_t) bitextu((unsigned int) Src, 2, 14); + bext1 = (uint8_t)bitextu((unsigned int)Src, 2, 8); + bext2 = (uint8_t)bitextu((unsigned int)Src, 2, 10); + bext3 = (uint8_t)bitextu((unsigned int)Src, 2, 12); + bext4 = (uint8_t)bitextu((unsigned int)Src, 2, 14); out3 = bitins(bext1, n_mask, bext2, mask, off); out4 = bitins(bext3, n_mask, bext4, mask, off); - *((v4u*)pDst) = pack((uint8_t) out1, (uint8_t) out2, (uint8_t) out3, (uint8_t) out4); + *((v4u *)pDst) = + pack((uint8_t)out1, (uint8_t)out2, (uint8_t)out3, (uint8_t)out4); MemoryFence(); - pDst+=4; - bext1 = (uint8_t) bitextu((unsigned int) Src, 2, 16); - bext2 = (uint8_t) bitextu((unsigned int) Src, 2, 18); - bext3 = (uint8_t) bitextu((unsigned int) Src, 2, 20); - bext4 = (uint8_t) bitextu((unsigned int) Src, 2, 22); + pDst += 4; + bext1 = (uint8_t)bitextu((unsigned int)Src, 2, 16); + bext2 = (uint8_t)bitextu((unsigned int)Src, 2, 18); + bext3 = (uint8_t)bitextu((unsigned int)Src, 2, 20); + bext4 = (uint8_t)bitextu((unsigned int)Src, 2, 22); out1 = bitins(bext1, n_mask, bext2, mask, off); out2 = bitins(bext3, n_mask, bext4, mask, off); MemoryFence(); - bext1 = (uint8_t) bitextu((unsigned int) Src, 2, 24); - bext2 = (uint8_t) bitextu((unsigned int) Src, 2, 26); - bext3 = (uint8_t) bitextu((unsigned int) Src, 2, 28); - bext4 = (uint8_t) bitextu((unsigned int) Src, 2, 30); + bext1 = (uint8_t)bitextu((unsigned int)Src, 2, 24); + bext2 = (uint8_t)bitextu((unsigned int)Src, 2, 26); + bext3 = (uint8_t)bitextu((unsigned int)Src, 2, 28); + bext4 = (uint8_t)bitextu((unsigned int)Src, 2, 30); out3 = bitins(bext1, n_mask, bext2, mask, off); out4 = bitins(bext3, n_mask, bext4, mask, off); - - *((v4u*)pDst) = pack((uint8_t) out1, (uint8_t) out2, (uint8_t) out3, (uint8_t) out4); + + *((v4u *)pDst) = + pack((uint8_t)out1, (uint8_t)out2, (uint8_t)out3, (uint8_t)out4); return pSrc; } @@ -754,197 +675,186 @@ static uint8_t *__attribute__((always_inline)) pulp_nn_u2_to_u4( uint8_t * pSrc, * XpulpV2 */ -static void __attribute__((noinline)) pulp_zero_mem(uint8_t * pBuffer, unsigned int size) -{ - int lfover = size &0x3; - for (int i=0; i<(size>>2); i++) - { - *((v4u *)pBuffer) = (v4u){0,0,0,0}; +static void __attribute__((noinline)) +pulp_zero_mem(uint8_t *pBuffer, unsigned int size) { + int lfover = size & 0x3; + for (int i = 0; i < (size >> 2); i++) { + *((v4u *)pBuffer) = (v4u){0, 0, 0, 0}; MemoryFence(); - pBuffer+=4; + pBuffer += 4; } - while(lfover) - { - *pBuffer++=0; + while (lfover) { + *pBuffer++ = 0; lfover--; } } -static void __attribute__((noinline)) pulp_nn_im2col_u2_to_u8(uint8_t * pInput, uint8_t * pOutput, unsigned int blockSize) -{ +static void __attribute__((noinline)) +pulp_nn_im2col_u2_to_u8(uint8_t *pInput, uint8_t *pOutput, + unsigned int blockSize) { unsigned int blkCnt = blockSize >> 4u; int lfover = blockSize & 0x0f; - for (int i = 0; i> 4u; int lfover = blockSize & 0x0f; - for (int i = 0; i> 3u; int lfover = blockSize & 0x07; - for (int i = 0; i> 3u; int lfover = blockSize & 0x07; - for (int i = 0; i> 2u; int lfover = blockSize & 0x03; - for (int i = 0; i> 2u; int lfover = blockSize & 0x03; - for (int i = 0; i> 4u; int lfover = blockSize & 0x0f; - for (int i = 0; i> 4u; int lfover = blockSize & 0x0f; - for (int i = 0; i> 4u; int lfover = blockSize & 0x0f; - for (int i = 0; i> 4u; int lfover = blockSize & 0x0f; - for (int i = 0; i> 4u; int lfover = blockSize & 0x0f; - for (int i = 0; i> 4u; int lfover = blockSize & 0x0f; - for (int i = 0; i> 3u; int lfover = blockSize & 0x07; - for (int i = 0; i> 3u; int lfover = blockSize & 0x07; - for (int i = 0; i> 3u; int lfover = blockSize & 0x07; - for (int i = 0; i> 3u; int lfover = blockSize & 0x07; - for (int i = 0; i> 2u; int lfover = blockSize & 0x03; - for (int i = 0; i> 2u; int lfover = blockSize & 0x03; - for (int i = 0; i> 2; - while(cnt > 0u) - { - inp = *((v4u*)pIn); - com = *((v4u*)pCom); + while (cnt > 0u) { + inp = *((v4u *)pIn); + com = *((v4u *)pCom); - *((v4u*)pIn) = max4(inp, com); + *((v4u *)pIn) = max4(inp, com); - pCom+=4; - pIn+=4; + pCom += 4; + pIn += 4; cnt--; } int left = length & 0x3; - while (left>0u) - { - if(*pIn<*pCom) - *pIn=*pCom; - + while (left > 0u) { + if (*pIn < *pCom) + *pIn = *pCom; + pIn++; pCom++; left--; } } -static void __attribute__((noinline)) pulp_nn_compare_and_replace_if_larger_i8( - int8_t * base, int8_t * target, uint16_t length) { +static void __attribute__((noinline)) +pulp_nn_compare_and_replace_if_larger_i8(int8_t *base, int8_t *target, + uint16_t length) { int8_t *pIn = base; int8_t *pCom = target; v4s inp; @@ -1210,15 +1107,12 @@ static void __attribute__((noinline)) pulp_nn_compare_and_replace_if_larger_i8( } } -static void __attribute__((noinline)) pulp_nn_avg_and_replace_u8(uint8_t * base, - uint8_t * target, - uint16_t length) -{ +static void __attribute__((noinline)) +pulp_nn_avg_and_replace_u8(uint8_t *base, uint8_t *target, uint16_t length) { uint8_t *pIn = base; uint8_t *pCom = target; - while (length>0u) - { + while (length > 0u) { *pIn = ((*pIn + *pCom) >> 1); pIn++; @@ -1227,12 +1121,11 @@ static void __attribute__((noinline)) pulp_nn_avg_and_replace_u8(uint8_t * base, } } -static void __attribute__((noinline)) pulp_nn_compare_and_replace_if_larger_u4(uint8_t * base, - uint8_t * target, - uint16_t length) -{ +static void __attribute__((noinline)) +pulp_nn_compare_and_replace_if_larger_u4(uint8_t *base, uint8_t *target, + uint16_t length) { int8_t mask = 0xf0; - int8_t n_mask = ~ mask; + int8_t n_mask = ~mask; int8_t off = 0x04; uint8_t *pIn = base; @@ -1242,44 +1135,42 @@ static void __attribute__((noinline)) pulp_nn_compare_and_replace_if_larger_u4(u uint8_t *out; int cnt = length >> 2; - while(cnt > 0u) - { + while (cnt > 0u) { pulp_nn_u4_to_u8(pIn, (uint8_t *)inp); pulp_nn_u4_to_u8(pCom, (uint8_t *)com); *((v4u *)out) = max4(inp[0], com[0]); - *((uint8_t*)pIn) = bitins(*out, n_mask, *(out + 1), mask, off); + *((uint8_t *)pIn) = bitins(*out, n_mask, *(out + 1), mask, off); pIn++; - *((uint8_t*)pIn) = bitins(*(out + 2), n_mask, *(out + 3), mask, off); + *((uint8_t *)pIn) = bitins(*(out + 2), n_mask, *(out + 3), mask, off); pIn++; *((v4u *)out) = max4(inp[1], com[1]); - *((uint8_t*)pIn) = bitins(*out, n_mask, *(out + 1), mask, off); + *((uint8_t *)pIn) = bitins(*out, n_mask, *(out + 1), mask, off); pIn++; - *((uint8_t*)pIn) = bitins(*(out + 2), n_mask, *(out + 3), mask, off); + *((uint8_t *)pIn) = bitins(*(out + 2), n_mask, *(out + 3), mask, off); pIn++; - pCom+=4; + pCom += 4; cnt--; } int left = length & 0x3; - while (left>0u) - { - uint8_t inA0 = (uint8_t) bitextu((unsigned int) *pIn, 4, 0); - uint8_t inA1 = (uint8_t) bitextu((unsigned int) *pIn, 4, 4); - uint8_t inB0 = (uint8_t) bitextu((unsigned int) *pCom, 4, 0); - uint8_t inB1 = (uint8_t) bitextu((unsigned int) *pCom, 4, 4); + while (left > 0u) { + uint8_t inA0 = (uint8_t)bitextu((unsigned int)*pIn, 4, 0); + uint8_t inA1 = (uint8_t)bitextu((unsigned int)*pIn, 4, 4); + uint8_t inB0 = (uint8_t)bitextu((unsigned int)*pCom, 4, 0); + uint8_t inB1 = (uint8_t)bitextu((unsigned int)*pCom, 4, 4); - if(inA0> 2; - while(cnt > 0u) - { + while (cnt > 0u) { pulp_nn_i4_to_i8(pIn, (int8_t *)inp); pulp_nn_i4_to_i8(pCom, (int8_t *)com); *((v4s *)out) = maxs4(inp[0], com[0]); - *((int8_t*)pIn) = bitins(*out, n_mask, *(out + 1), mask, off); + *((int8_t *)pIn) = bitins(*out, n_mask, *(out + 1), mask, off); pIn++; - *((int8_t*)pIn) = bitins(*(out + 2), n_mask, *(out + 3), mask, off); + *((int8_t *)pIn) = bitins(*(out + 2), n_mask, *(out + 3), mask, off); pIn++; *((v4s *)out) = maxs4(inp[1], com[1]); - *((int8_t*)pIn) = bitins(*out, n_mask, *(out + 1), mask, off); + *((int8_t *)pIn) = bitins(*out, n_mask, *(out + 1), mask, off); pIn++; - *((int8_t*)pIn) = bitins(*(out + 2), n_mask, *(out + 3), mask, off); + *((int8_t *)pIn) = bitins(*(out + 2), n_mask, *(out + 3), mask, off); pIn++; - pCom+=4; + pCom += 4; cnt--; } int left = length & 0x3; - while (left>0u) - { - int8_t inA0 = (int8_t) bitext((int) *pIn, 4, 0); - int8_t inA1 = (int8_t) bitext((int) *pIn, 4, 4); - int8_t inB0 = (int8_t) bitext((int) *pCom, 4, 0); - int8_t inB1 = (int8_t) bitext((int) *pCom, 4, 4); + while (left > 0u) { + int8_t inA0 = (int8_t)bitext((int)*pIn, 4, 0); + int8_t inA1 = (int8_t)bitext((int)*pIn, 4, 4); + int8_t inB0 = (int8_t)bitext((int)*pCom, 4, 0); + int8_t inB1 = (int8_t)bitext((int)*pCom, 4, 4); - if(inA00u) - { - uint8_t inA0 = (uint8_t) bitextu((unsigned int) *pIn, 4, 0); - uint8_t inA1 = (uint8_t) bitextu((unsigned int) *pIn, 4, 4); - uint8_t inB0 = (uint8_t) bitextu((unsigned int) *pCom, 4, 0); - uint8_t inB1 = (uint8_t) bitextu((unsigned int) *pCom, 4, 4); + while (length > 0u) { + uint8_t inA0 = (uint8_t)bitextu((unsigned int)*pIn, 4, 0); + uint8_t inA1 = (uint8_t)bitextu((unsigned int)*pIn, 4, 4); + uint8_t inB0 = (uint8_t)bitextu((unsigned int)*pCom, 4, 0); + uint8_t inB1 = (uint8_t)bitextu((unsigned int)*pCom, 4, 4); inA0 = ((inA0 + inB0) >> 1); inA1 = ((inA1 + inB1) >> 1); - *((uint8_t*)pIn) = bitins(inA0, n_mask, inA1, mask, off); + *((uint8_t *)pIn) = bitins(inA0, n_mask, inA1, mask, off); pIn++; pCom++; @@ -1376,16 +1261,15 @@ static void __attribute__((noinline)) pulp_nn_avg_and_replace_u4(uint8_t * base, } } -static void __attribute__((noinline)) pulp_nn_compare_and_replace_if_larger_u2(uint8_t * base, - uint8_t * target, - uint16_t length) -{ +static void __attribute__((noinline)) +pulp_nn_compare_and_replace_if_larger_u2(uint8_t *base, uint8_t *target, + uint16_t length) { int8_t mask2 = 0x0c; - int8_t n_mask2 = ~ mask2; + int8_t n_mask2 = ~mask2; int8_t mask4 = 0x30; - int8_t n_mask4 = ~ mask4; + int8_t n_mask4 = ~mask4; int8_t mask6 = 0xc0; - int8_t n_mask6 = ~ mask6; + int8_t n_mask6 = ~mask6; int8_t off2 = 2; int8_t off4 = 4; int8_t off6 = 6; @@ -1397,62 +1281,60 @@ static void __attribute__((noinline)) pulp_nn_compare_and_replace_if_larger_u2(u uint8_t *out; int cnt = length >> 2; - while(cnt > 0u) - { + while (cnt > 0u) { pulp_nn_u2_to_u8(pIn, inp); pulp_nn_u2_to_u8(pCom, com); - *((v4u*)out) = max4(inp[0], com[0]); + *((v4u *)out) = max4(inp[0], com[0]); - uint8_t inA = (uint8_t) bitins(*out, n_mask2, *(out + 1), mask2, off2); + uint8_t inA = (uint8_t)bitins(*out, n_mask2, *(out + 1), mask2, off2); inA = bitins(inA, n_mask4, *(out + 2), mask4, off4); - *((uint8_t*)pIn) = bitins(inA, n_mask6, *(out + 3), mask6, off6); + *((uint8_t *)pIn) = bitins(inA, n_mask6, *(out + 3), mask6, off6); pIn++; - *((v4u*)out) = max4(inp[1], com[1]); + *((v4u *)out) = max4(inp[1], com[1]); - inA = (uint8_t) bitins(*out, n_mask2, *(out + 1), mask2, off2); + inA = (uint8_t)bitins(*out, n_mask2, *(out + 1), mask2, off2); inA = bitins(inA, n_mask4, *(out + 2), mask4, off4); - *((uint8_t*)pIn) = bitins(inA, n_mask6, *(out + 3), mask6, off6); + *((uint8_t *)pIn) = bitins(inA, n_mask6, *(out + 3), mask6, off6); pIn++; - *((v4u*)out) = max4(inp[2], com[2]); + *((v4u *)out) = max4(inp[2], com[2]); - inA = (uint8_t) bitins(*out, n_mask2, *(out + 1), mask2, off2); + inA = (uint8_t)bitins(*out, n_mask2, *(out + 1), mask2, off2); inA = bitins(inA, n_mask4, *(out + 2), mask4, off4); - *((uint8_t*)pIn) = bitins(inA, n_mask6, *(out + 3), mask6, off6); + *((uint8_t *)pIn) = bitins(inA, n_mask6, *(out + 3), mask6, off6); pIn++; - *((v4u*)out) = max4(inp[3], com[3]); + *((v4u *)out) = max4(inp[3], com[3]); - inA = (uint8_t) bitins(*out, n_mask2, *(out + 1), mask2, off2); + inA = (uint8_t)bitins(*out, n_mask2, *(out + 1), mask2, off2); inA = bitins(inA, n_mask4, *(out + 2), mask4, off4); - *((uint8_t*)pIn) = bitins(inA, n_mask6, *(out + 3), mask6, off6); + *((uint8_t *)pIn) = bitins(inA, n_mask6, *(out + 3), mask6, off6); pIn++; - pCom+=4; + pCom += 4; cnt--; } int left = length & 0x3; - while (left>0u) - { - uint8_t inA0 = (uint8_t) bitextu((unsigned int) *pIn, 2, 0); - uint8_t inA1 = (uint8_t) bitextu((unsigned int) *pIn, 2, 2); - uint8_t inA2 = (uint8_t) bitextu((unsigned int) *pIn, 2, 4); - uint8_t inA3 = (uint8_t) bitextu((unsigned int) *pIn, 2, 6); - v4u inA4 = pack((uint8_t) inA0, (uint8_t) inA1, (uint8_t) inA2, (uint8_t) inA3); - uint8_t inB0 = (uint8_t) bitextu((unsigned int) *pCom, 2, 0); - uint8_t inB1 = (uint8_t) bitextu((unsigned int) *pCom, 2, 2); - uint8_t inB2 = (uint8_t) bitextu((unsigned int) *pCom, 2, 4); - uint8_t inB3 = (uint8_t) bitextu((unsigned int) *pCom, 2, 6); - v4u inB4 = pack((uint8_t) inB0, (uint8_t) inB1, (uint8_t) inB2, (uint8_t) inB3); - - *((v4u*)out) = max4(inA4, inB4); - - uint8_t inA = (uint8_t) bitins(*out, n_mask2, *(out + 1), mask2, off2); + while (left > 0u) { + uint8_t inA0 = (uint8_t)bitextu((unsigned int)*pIn, 2, 0); + uint8_t inA1 = (uint8_t)bitextu((unsigned int)*pIn, 2, 2); + uint8_t inA2 = (uint8_t)bitextu((unsigned int)*pIn, 2, 4); + uint8_t inA3 = (uint8_t)bitextu((unsigned int)*pIn, 2, 6); + v4u inA4 = pack((uint8_t)inA0, (uint8_t)inA1, (uint8_t)inA2, (uint8_t)inA3); + uint8_t inB0 = (uint8_t)bitextu((unsigned int)*pCom, 2, 0); + uint8_t inB1 = (uint8_t)bitextu((unsigned int)*pCom, 2, 2); + uint8_t inB2 = (uint8_t)bitextu((unsigned int)*pCom, 2, 4); + uint8_t inB3 = (uint8_t)bitextu((unsigned int)*pCom, 2, 6); + v4u inB4 = pack((uint8_t)inB0, (uint8_t)inB1, (uint8_t)inB2, (uint8_t)inB3); + + *((v4u *)out) = max4(inA4, inB4); + + uint8_t inA = (uint8_t)bitins(*out, n_mask2, *(out + 1), mask2, off2); inA = bitins(inA, n_mask4, *(out + 2), mask4, off4); - *((uint8_t*)pIn) = bitins(inA, n_mask6, *(out + 3), mask6, off6); + *((uint8_t *)pIn) = bitins(inA, n_mask6, *(out + 3), mask6, off6); pIn++; pCom++; @@ -1460,17 +1342,15 @@ static void __attribute__((noinline)) pulp_nn_compare_and_replace_if_larger_u2(u } } - -static void __attribute__((noinline)) pulp_nn_compare_and_replace_if_larger_i2(int8_t * base, - int8_t * target, - uint16_t length) -{ +static void __attribute__((noinline)) +pulp_nn_compare_and_replace_if_larger_i2(int8_t *base, int8_t *target, + uint16_t length) { int8_t mask2 = 0x0c; - int8_t n_mask2 = ~ mask2; + int8_t n_mask2 = ~mask2; int8_t mask4 = 0x30; - int8_t n_mask4 = ~ mask4; + int8_t n_mask4 = ~mask4; int8_t mask6 = 0xc0; - int8_t n_mask6 = ~ mask6; + int8_t n_mask6 = ~mask6; int8_t off2 = 2; int8_t off4 = 4; int8_t off6 = 6; @@ -1482,62 +1362,60 @@ static void __attribute__((noinline)) pulp_nn_compare_and_replace_if_larger_i2(i int8_t *out; int cnt = length >> 2; - while(cnt > 0u) - { + while (cnt > 0u) { pulp_nn_i2_to_i8(pIn, inp); pulp_nn_i2_to_i8(pCom, com); - *((v4s*)out) = maxs4(inp[0], com[0]); + *((v4s *)out) = maxs4(inp[0], com[0]); - int8_t inA = (int8_t) bitins(*out, n_mask2, *(out + 1), mask2, off2); + int8_t inA = (int8_t)bitins(*out, n_mask2, *(out + 1), mask2, off2); inA = bitins(inA, n_mask4, *(out + 2), mask4, off4); - *((int8_t*)pIn) = bitins(inA, n_mask6, *(out + 3), mask6, off6); + *((int8_t *)pIn) = bitins(inA, n_mask6, *(out + 3), mask6, off6); pIn++; - *((v4s*)out) = maxs4(inp[1], com[1]); + *((v4s *)out) = maxs4(inp[1], com[1]); - inA = (int8_t) bitins(*out, n_mask2, *(out + 1), mask2, off2); + inA = (int8_t)bitins(*out, n_mask2, *(out + 1), mask2, off2); inA = bitins(inA, n_mask4, *(out + 2), mask4, off4); - *((int8_t*)pIn) = bitins(inA, n_mask6, *(out + 3), mask6, off6); + *((int8_t *)pIn) = bitins(inA, n_mask6, *(out + 3), mask6, off6); pIn++; - *((v4s*)out) = maxs4(inp[2], com[2]); + *((v4s *)out) = maxs4(inp[2], com[2]); - inA = (int8_t) bitins(*out, n_mask2, *(out + 1), mask2, off2); + inA = (int8_t)bitins(*out, n_mask2, *(out + 1), mask2, off2); inA = bitins(inA, n_mask4, *(out + 2), mask4, off4); - *((int8_t*)pIn) = bitins(inA, n_mask6, *(out + 3), mask6, off6); + *((int8_t *)pIn) = bitins(inA, n_mask6, *(out + 3), mask6, off6); pIn++; - *((v4s*)out) = maxs4(inp[3], com[3]); + *((v4s *)out) = maxs4(inp[3], com[3]); - inA = (int8_t) bitins(*out, n_mask2, *(out + 1), mask2, off2); + inA = (int8_t)bitins(*out, n_mask2, *(out + 1), mask2, off2); inA = bitins(inA, n_mask4, *(out + 2), mask4, off4); - *((int8_t*)pIn) = bitins(inA, n_mask6, *(out + 3), mask6, off6); + *((int8_t *)pIn) = bitins(inA, n_mask6, *(out + 3), mask6, off6); pIn++; - pCom+=4; + pCom += 4; cnt--; } int left = length & 0x3; - while (left>0u) - { - int8_t inA0 = (int8_t) bitext((unsigned int) *pIn, 2, 0); - int8_t inA1 = (int8_t) bitext((unsigned int) *pIn, 2, 2); - int8_t inA2 = (int8_t) bitext((unsigned int) *pIn, 2, 4); - int8_t inA3 = (int8_t) bitext((unsigned int) *pIn, 2, 6); - v4s inA4 = pack((int8_t) inA0, (int8_t) inA1, (int8_t) inA2, (int8_t) inA3); - int8_t inB0 = (int8_t) bitext((unsigned int) *pCom, 2, 0); - int8_t inB1 = (int8_t) bitext((unsigned int) *pCom, 2, 2); - int8_t inB2 = (int8_t) bitext((unsigned int) *pCom, 2, 4); - int8_t inB3 = (int8_t) bitext((unsigned int) *pCom, 2, 6); - v4s inB4 = pack((int8_t) inB0, (int8_t) inB1, (int8_t) inB2, (int8_t) inB3); - - *((v4s*)out) = maxs4(inA4, inB4); - - int8_t inA = (int8_t) bitins(*out, n_mask2, *(out + 1), mask2, off2); + while (left > 0u) { + int8_t inA0 = (int8_t)bitext((unsigned int)*pIn, 2, 0); + int8_t inA1 = (int8_t)bitext((unsigned int)*pIn, 2, 2); + int8_t inA2 = (int8_t)bitext((unsigned int)*pIn, 2, 4); + int8_t inA3 = (int8_t)bitext((unsigned int)*pIn, 2, 6); + v4s inA4 = pack((int8_t)inA0, (int8_t)inA1, (int8_t)inA2, (int8_t)inA3); + int8_t inB0 = (int8_t)bitext((unsigned int)*pCom, 2, 0); + int8_t inB1 = (int8_t)bitext((unsigned int)*pCom, 2, 2); + int8_t inB2 = (int8_t)bitext((unsigned int)*pCom, 2, 4); + int8_t inB3 = (int8_t)bitext((unsigned int)*pCom, 2, 6); + v4s inB4 = pack((int8_t)inB0, (int8_t)inB1, (int8_t)inB2, (int8_t)inB3); + + *((v4s *)out) = maxs4(inA4, inB4); + + int8_t inA = (int8_t)bitins(*out, n_mask2, *(out + 1), mask2, off2); inA = bitins(inA, n_mask4, *(out + 2), mask4, off4); - *((int8_t*)pIn) = bitins(inA, n_mask6, *(out + 3), mask6, off6); + *((int8_t *)pIn) = bitins(inA, n_mask6, *(out + 3), mask6, off6); pIn++; pCom++; @@ -1545,16 +1423,14 @@ static void __attribute__((noinline)) pulp_nn_compare_and_replace_if_larger_i2(i } } -static void __attribute__((noinline)) pulp_nn_avg_and_replace_u2(uint8_t * base, - uint8_t * target, - uint16_t length) -{ +static void __attribute__((noinline)) +pulp_nn_avg_and_replace_u2(uint8_t *base, uint8_t *target, uint16_t length) { int8_t mask2 = 0x0c; - int8_t n_mask2 = ~ mask2; + int8_t n_mask2 = ~mask2; int8_t mask4 = 0x30; - int8_t n_mask4 = ~ mask4; + int8_t n_mask4 = ~mask4; int8_t mask6 = 0xc0; - int8_t n_mask6 = ~ mask6; + int8_t n_mask6 = ~mask6; int8_t off2 = 2; int8_t off4 = 4; int8_t off6 = 6; @@ -1562,26 +1438,25 @@ static void __attribute__((noinline)) pulp_nn_avg_and_replace_u2(uint8_t * base, uint8_t *pIn = base; uint8_t *pCom = target; - while (length>0u) - { - uint8_t inA0 = (uint8_t) bitextu((unsigned int) *pIn, 2, 0); - uint8_t inA1 = (uint8_t) bitextu((unsigned int) *pIn, 2, 2); - uint8_t inA2 = (uint8_t) bitextu((unsigned int) *pIn, 2, 4); - uint8_t inA3 = (uint8_t) bitextu((unsigned int) *pIn, 2, 6); + while (length > 0u) { + uint8_t inA0 = (uint8_t)bitextu((unsigned int)*pIn, 2, 0); + uint8_t inA1 = (uint8_t)bitextu((unsigned int)*pIn, 2, 2); + uint8_t inA2 = (uint8_t)bitextu((unsigned int)*pIn, 2, 4); + uint8_t inA3 = (uint8_t)bitextu((unsigned int)*pIn, 2, 6); - uint8_t inB0 = (uint8_t) bitextu((unsigned int) *pCom, 2, 0); - uint8_t inB1 = (uint8_t) bitextu((unsigned int) *pCom, 2, 2); - uint8_t inB2 = (uint8_t) bitextu((unsigned int) *pCom, 2, 4); - uint8_t inB3 = (uint8_t) bitextu((unsigned int) *pCom, 2, 6); + uint8_t inB0 = (uint8_t)bitextu((unsigned int)*pCom, 2, 0); + uint8_t inB1 = (uint8_t)bitextu((unsigned int)*pCom, 2, 2); + uint8_t inB2 = (uint8_t)bitextu((unsigned int)*pCom, 2, 4); + uint8_t inB3 = (uint8_t)bitextu((unsigned int)*pCom, 2, 6); inA0 = ((inA0 + inB0) >> 1); inA1 = ((inA1 + inB1) >> 1); inA2 = ((inA2 + inB2) >> 1); inA3 = ((inA3 + inB3) >> 1); - uint8_t inA = (uint8_t) bitins(inA0, n_mask2, inA1, mask2, off2); + uint8_t inA = (uint8_t)bitins(inA0, n_mask2, inA1, mask2, off2); inA = bitins(inA, n_mask4, inA2, mask4, off4); - *((uint8_t*)pIn) = bitins(inA, n_mask6, inA3, mask6, off6); + *((uint8_t *)pIn) = bitins(inA, n_mask6, inA3, mask6, off6); pIn++; pCom++; @@ -1593,61 +1468,53 @@ static void __attribute__((noinline)) pulp_nn_avg_and_replace_u2(uint8_t * base, * XpulpNN */ -static void __attribute__((noinline)) xpulp_nn_zero_mem_u8(uint8_t * pBuffer, unsigned int size) -{ - int lfover = size &0x3; - for (int i=0; i<(size>>2); i++) - { - *((v4u *)pBuffer) = (v4u){0,0,0,0}; +static void __attribute__((noinline)) +xpulp_nn_zero_mem_u8(uint8_t *pBuffer, unsigned int size) { + int lfover = size & 0x3; + for (int i = 0; i < (size >> 2); i++) { + *((v4u *)pBuffer) = (v4u){0, 0, 0, 0}; MemoryFence(); - pBuffer+=4; + pBuffer += 4; } - while(lfover) - { - *pBuffer++=0; + while (lfover) { + *pBuffer++ = 0; lfover--; } } -static void __attribute__((noinline)) xpulp_nn_zero_mem_u4(uint8_t * pBuffer, unsigned int size) -{ - int lfover = size &0x7; - for (int i=0; i<(size>>3); i++) - { - *((v4u *)pBuffer) = (v4u){0,0,0,0}; +static void __attribute__((noinline)) +xpulp_nn_zero_mem_u4(uint8_t *pBuffer, unsigned int size) { + int lfover = size & 0x7; + for (int i = 0; i < (size >> 3); i++) { + *((v4u *)pBuffer) = (v4u){0, 0, 0, 0}; MemoryFence(); - pBuffer+=4; + pBuffer += 4; } - while(lfover) - { - *pBuffer++=0; - lfover-=2; + while (lfover) { + *pBuffer++ = 0; + lfover -= 2; } } -static void __attribute__((noinline)) xpulp_nn_zero_mem_u2(uint8_t * pBuffer, unsigned int size) -{ - int lfover = size &0xf; - for (int i=0; i<(size>>4); i++) - { - *((v4u *)pBuffer) = (v4u){0,0,0,0}; +static void __attribute__((noinline)) +xpulp_nn_zero_mem_u2(uint8_t *pBuffer, unsigned int size) { + int lfover = size & 0xf; + for (int i = 0; i < (size >> 4); i++) { + *((v4u *)pBuffer) = (v4u){0, 0, 0, 0}; MemoryFence(); - pBuffer+=4; + pBuffer += 4; } - while(lfover) - { - *pBuffer++=0; - lfover-=4; + while (lfover) { + *pBuffer++ = 0; + lfover -= 4; } } - -static void __attribute__((noinline)) xpulp_nn_compare_and_replace_if_larger_u4(uint8_t * base, - uint8_t * target, - uint16_t length) -{ +static void __attribute__((noinline)) +xpulp_nn_compare_and_replace_if_larger_u4(uint8_t *base, uint8_t *target, + uint16_t length) { int8_t mask = 0xf0; - int8_t n_mask = ~ mask; + int8_t n_mask = ~mask; int8_t off = 0x04; uint8_t *pIn = base; @@ -1655,31 +1522,29 @@ static void __attribute__((noinline)) xpulp_nn_compare_and_replace_if_larger_u4( int cnt = length >> 2; - while(cnt > 0u) - { + while (cnt > 0u) { *((uint32_t *)pIn) = max8(*((uint32_t *)pIn), *((uint32_t *)pCom)); - pIn+=4; - pCom+=4; + pIn += 4; + pCom += 4; cnt--; } int left = length & 0x3; - while (left>0u) - { - uint8_t inA0 = (uint8_t) bitextu((unsigned int) *pIn, 4, 0); - uint8_t inA1 = (uint8_t) bitextu((unsigned int) *pIn, 4, 4); - uint8_t inB0 = (uint8_t) bitextu((unsigned int) *pCom, 4, 0); - uint8_t inB1 = (uint8_t) bitextu((unsigned int) *pCom, 4, 4); + while (left > 0u) { + uint8_t inA0 = (uint8_t)bitextu((unsigned int)*pIn, 4, 0); + uint8_t inA1 = (uint8_t)bitextu((unsigned int)*pIn, 4, 4); + uint8_t inB0 = (uint8_t)bitextu((unsigned int)*pCom, 4, 0); + uint8_t inB1 = (uint8_t)bitextu((unsigned int)*pCom, 4, 4); - if(inA0> 2; - while (cnt > 0u) - { + while (cnt > 0u) { *((uint32_t *)pIn) = avg8(*((uint32_t *)pIn), *((uint32_t *)pCom)); - pIn+=4; - pCom+=4; + pIn += 4; + pCom += 4; cnt--; } int left = length & 0x3; - while (left>0u) - { - uint8_t inA0 = (uint8_t) bitextu((unsigned int) *pIn, 4, 0); - uint8_t inA1 = (uint8_t) bitextu((unsigned int) *pIn, 4, 4); - uint8_t inB0 = (uint8_t) bitextu((unsigned int) *pCom, 4, 0); - uint8_t inB1 = (uint8_t) bitextu((unsigned int) *pCom, 4, 4); + while (left > 0u) { + uint8_t inA0 = (uint8_t)bitextu((unsigned int)*pIn, 4, 0); + uint8_t inA1 = (uint8_t)bitextu((unsigned int)*pIn, 4, 4); + uint8_t inB0 = (uint8_t)bitextu((unsigned int)*pCom, 4, 0); + uint8_t inB1 = (uint8_t)bitextu((unsigned int)*pCom, 4, 4); inA0 = ((inA0 + inB0) >> 1); inA1 = ((inA1 + inB1) >> 1); - *((uint8_t*)pIn) = bitins(inA0, n_mask, inA1, mask, off); + *((uint8_t *)pIn) = bitins(inA0, n_mask, inA1, mask, off); pIn++; pCom++; @@ -1770,16 +1632,15 @@ static void __attribute__((noinline)) xpulp_nn_avg_and_replace_u4(uint8_t * base } } -static void __attribute__((noinline)) xpulp_nn_compare_and_replace_if_larger_u2(uint8_t * base, - uint8_t * target, - uint16_t length) -{ +static void __attribute__((noinline)) +xpulp_nn_compare_and_replace_if_larger_u2(uint8_t *base, uint8_t *target, + uint16_t length) { int8_t mask2 = 0x0c; - int8_t n_mask2 = ~ mask2; + int8_t n_mask2 = ~mask2; int8_t mask4 = 0x30; - int8_t n_mask4 = ~ mask4; + int8_t n_mask4 = ~mask4; int8_t mask6 = 0xc0; - int8_t n_mask6 = ~ mask6; + int8_t n_mask6 = ~mask6; int8_t off2 = 2; int8_t off4 = 4; int8_t off6 = 6; @@ -1790,50 +1651,47 @@ static void __attribute__((noinline)) xpulp_nn_compare_and_replace_if_larger_u2( int cnt = length >> 2; - while(cnt > 0u) - { + while (cnt > 0u) { *((uint32_t *)pIn) = max16(*((uint32_t *)pIn), *((uint32_t *)pCom)); - pIn+=4; - pCom+=4; + pIn += 4; + pCom += 4; cnt--; } int left = length & 0x3; - while (left>0u) - { - uint8_t inA0 = (uint8_t) bitextu((unsigned int) *pIn, 2, 0); - uint8_t inA1 = (uint8_t) bitextu((unsigned int) *pIn, 2, 2); - uint8_t inA2 = (uint8_t) bitextu((unsigned int) *pIn, 2, 4); - uint8_t inA3 = (uint8_t) bitextu((unsigned int) *pIn, 2, 6); - v4u inA4 = pack((uint8_t) inA0, (uint8_t) inA1, (uint8_t) inA2, (uint8_t) inA3); - uint8_t inB0 = (uint8_t) bitextu((unsigned int) *pCom, 2, 0); - uint8_t inB1 = (uint8_t) bitextu((unsigned int) *pCom, 2, 2); - uint8_t inB2 = (uint8_t) bitextu((unsigned int) *pCom, 2, 4); - uint8_t inB3 = (uint8_t) bitextu((unsigned int) *pCom, 2, 6); - v4u inB4 = pack((uint8_t) inB0, (uint8_t) inB1, (uint8_t) inB2, (uint8_t) inB3); - - *((v4u*)out) = max4(inA4, inB4); - - uint8_t inA = (uint8_t) bitins(*out, n_mask2, *(out + 1), mask2, off2); + while (left > 0u) { + uint8_t inA0 = (uint8_t)bitextu((unsigned int)*pIn, 2, 0); + uint8_t inA1 = (uint8_t)bitextu((unsigned int)*pIn, 2, 2); + uint8_t inA2 = (uint8_t)bitextu((unsigned int)*pIn, 2, 4); + uint8_t inA3 = (uint8_t)bitextu((unsigned int)*pIn, 2, 6); + v4u inA4 = pack((uint8_t)inA0, (uint8_t)inA1, (uint8_t)inA2, (uint8_t)inA3); + uint8_t inB0 = (uint8_t)bitextu((unsigned int)*pCom, 2, 0); + uint8_t inB1 = (uint8_t)bitextu((unsigned int)*pCom, 2, 2); + uint8_t inB2 = (uint8_t)bitextu((unsigned int)*pCom, 2, 4); + uint8_t inB3 = (uint8_t)bitextu((unsigned int)*pCom, 2, 6); + v4u inB4 = pack((uint8_t)inB0, (uint8_t)inB1, (uint8_t)inB2, (uint8_t)inB3); + + *((v4u *)out) = max4(inA4, inB4); + + uint8_t inA = (uint8_t)bitins(*out, n_mask2, *(out + 1), mask2, off2); inA = bitins(inA, n_mask4, *(out + 2), mask4, off4); - *((uint8_t*)pIn) = bitins(inA, n_mask6, *(out + 3), mask6, off6); + *((uint8_t *)pIn) = bitins(inA, n_mask6, *(out + 3), mask6, off6); pIn++; pCom++; left--; } } -static void __attribute__((noinline)) xpulp_nn_compare_and_replace_if_larger_i2(int8_t * base, - int8_t * target, - uint16_t length) -{ +static void __attribute__((noinline)) +xpulp_nn_compare_and_replace_if_larger_i2(int8_t *base, int8_t *target, + uint16_t length) { int8_t mask2 = 0x0c; - int8_t n_mask2 = ~ mask2; + int8_t n_mask2 = ~mask2; int8_t mask4 = 0x30; - int8_t n_mask4 = ~ mask4; + int8_t n_mask4 = ~mask4; int8_t mask6 = 0xc0; - int8_t n_mask6 = ~ mask6; + int8_t n_mask6 = ~mask6; int8_t off2 = 2; int8_t off4 = 4; int8_t off6 = 6; @@ -1844,34 +1702,32 @@ static void __attribute__((noinline)) xpulp_nn_compare_and_replace_if_larger_i2( int cnt = length >> 2; - while(cnt > 0u) - { + while (cnt > 0u) { *((int32_t *)pIn) = maxs16(*((int32_t *)pIn), *((int32_t *)pCom)); - pIn+=4; - pCom+=4; + pIn += 4; + pCom += 4; cnt--; } int left = length & 0x3; - while (left>0u) - { - int8_t inA0 = (int8_t) bitext((int) *pIn, 2, 0); - int8_t inA1 = (int8_t) bitext((int) *pIn, 2, 2); - int8_t inA2 = (int8_t) bitext((int) *pIn, 2, 4); - int8_t inA3 = (int8_t) bitext((int) *pIn, 2, 6); - v4s inA4 = pack((int8_t) inA0, (int8_t) inA1, (int8_t) inA2, (int8_t) inA3); - int8_t inB0 = (int8_t) bitext((int) *pCom, 2, 0); - int8_t inB1 = (int8_t) bitext((int) *pCom, 2, 2); - int8_t inB2 = (int8_t) bitext((int) *pCom, 2, 4); - int8_t inB3 = (int8_t) bitext((int) *pCom, 2, 6); - v4s inB4 = pack((int8_t) inB0, (int8_t) inB1, (int8_t) inB2, (int8_t) inB3); - - *((v4s*)out) = maxs4(inA4, inB4); - - int8_t inA = (int8_t) bitins(*out, n_mask2, *(out + 1), mask2, off2); + while (left > 0u) { + int8_t inA0 = (int8_t)bitext((int)*pIn, 2, 0); + int8_t inA1 = (int8_t)bitext((int)*pIn, 2, 2); + int8_t inA2 = (int8_t)bitext((int)*pIn, 2, 4); + int8_t inA3 = (int8_t)bitext((int)*pIn, 2, 6); + v4s inA4 = pack((int8_t)inA0, (int8_t)inA1, (int8_t)inA2, (int8_t)inA3); + int8_t inB0 = (int8_t)bitext((int)*pCom, 2, 0); + int8_t inB1 = (int8_t)bitext((int)*pCom, 2, 2); + int8_t inB2 = (int8_t)bitext((int)*pCom, 2, 4); + int8_t inB3 = (int8_t)bitext((int)*pCom, 2, 6); + v4s inB4 = pack((int8_t)inB0, (int8_t)inB1, (int8_t)inB2, (int8_t)inB3); + + *((v4s *)out) = maxs4(inA4, inB4); + + int8_t inA = (int8_t)bitins(*out, n_mask2, *(out + 1), mask2, off2); inA = bitins(inA, n_mask4, *(out + 2), mask4, off4); - *((int8_t*)pIn) = bitins(inA, n_mask6, *(out + 3), mask6, off6); + *((int8_t *)pIn) = bitins(inA, n_mask6, *(out + 3), mask6, off6); pIn++; pCom++; @@ -1879,16 +1735,14 @@ static void __attribute__((noinline)) xpulp_nn_compare_and_replace_if_larger_i2( } } -static void __attribute__((noinline)) xpulp_nn_avg_and_replace_u2(uint8_t * base, - uint8_t * target, - uint16_t length) -{ +static void __attribute__((noinline)) +xpulp_nn_avg_and_replace_u2(uint8_t *base, uint8_t *target, uint16_t length) { int8_t mask2 = 0x0c; - int8_t n_mask2 = ~ mask2; + int8_t n_mask2 = ~mask2; int8_t mask4 = 0x30; - int8_t n_mask4 = ~ mask4; + int8_t n_mask4 = ~mask4; int8_t mask6 = 0xc0; - int8_t n_mask6 = ~ mask6; + int8_t n_mask6 = ~mask6; int8_t off2 = 2; int8_t off4 = 4; int8_t off6 = 6; @@ -1899,34 +1753,32 @@ static void __attribute__((noinline)) xpulp_nn_avg_and_replace_u2(uint8_t * base int cnt = length >> 2; - while(cnt > 0u) - { + while (cnt > 0u) { *((uint32_t *)pIn) = avg16(*((uint32_t *)pIn), *((uint32_t *)pCom)); - pIn+=4; - pCom+=4; + pIn += 4; + pCom += 4; cnt--; } int left = length & 0x3; - while (left>0u) - { - uint8_t inA0 = (uint8_t) bitextu((unsigned int) *pIn, 2, 0); - uint8_t inA1 = (uint8_t) bitextu((unsigned int) *pIn, 2, 2); - uint8_t inA2 = (uint8_t) bitextu((unsigned int) *pIn, 2, 4); - uint8_t inA3 = (uint8_t) bitextu((unsigned int) *pIn, 2, 6); - v4u inA4 = pack((uint8_t) inA0, (uint8_t) inA1, (uint8_t) inA2, (uint8_t) inA3); - uint8_t inB0 = (uint8_t) bitextu((unsigned int) *pCom, 2, 0); - uint8_t inB1 = (uint8_t) bitextu((unsigned int) *pCom, 2, 2); - uint8_t inB2 = (uint8_t) bitextu((unsigned int) *pCom, 2, 4); - uint8_t inB3 = (uint8_t) bitextu((unsigned int) *pCom, 2, 6); - v4u inB4 = pack((uint8_t) inB0, (uint8_t) inB1, (uint8_t) inB2, (uint8_t) inB3); - - *((v4u*)out) = avg4(inA4, inB4); - - uint8_t inA = (uint8_t) bitins(*out, n_mask2, *(out + 1), mask2, off2); + while (left > 0u) { + uint8_t inA0 = (uint8_t)bitextu((unsigned int)*pIn, 2, 0); + uint8_t inA1 = (uint8_t)bitextu((unsigned int)*pIn, 2, 2); + uint8_t inA2 = (uint8_t)bitextu((unsigned int)*pIn, 2, 4); + uint8_t inA3 = (uint8_t)bitextu((unsigned int)*pIn, 2, 6); + v4u inA4 = pack((uint8_t)inA0, (uint8_t)inA1, (uint8_t)inA2, (uint8_t)inA3); + uint8_t inB0 = (uint8_t)bitextu((unsigned int)*pCom, 2, 0); + uint8_t inB1 = (uint8_t)bitextu((unsigned int)*pCom, 2, 2); + uint8_t inB2 = (uint8_t)bitextu((unsigned int)*pCom, 2, 4); + uint8_t inB3 = (uint8_t)bitextu((unsigned int)*pCom, 2, 6); + v4u inB4 = pack((uint8_t)inB0, (uint8_t)inB1, (uint8_t)inB2, (uint8_t)inB3); + + *((v4u *)out) = avg4(inA4, inB4); + + uint8_t inA = (uint8_t)bitins(*out, n_mask2, *(out + 1), mask2, off2); inA = bitins(inA, n_mask4, *(out + 2), mask4, off4); - *((uint8_t*)pIn) = bitins(inA, n_mask6, *(out + 3), mask6, off6); + *((uint8_t *)pIn) = bitins(inA, n_mask6, *(out + 3), mask6, off6); pIn++; pCom++; @@ -1934,5 +1786,4 @@ static void __attribute__((noinline)) xpulp_nn_avg_and_replace_u2(uint8_t * base } } - #endif From 60a7e0e2945d5e7f4280401a48df5e7dc7c29b0c Mon Sep 17 00:00:00 2001 From: Run Wang <52746141+SamanthaWangdl@users.noreply.github.com> Date: Wed, 4 Feb 2026 17:46:30 +0000 Subject: [PATCH 36/49] Softhier bug because extra printf"init network" --- DeeployTest/testUtils/codeGenerate.py | 9 --------- 1 file changed, 9 deletions(-) diff --git a/DeeployTest/testUtils/codeGenerate.py b/DeeployTest/testUtils/codeGenerate.py index ff4f7757f4..39a44d9442 100644 --- a/DeeployTest/testUtils/codeGenerate.py +++ b/DeeployTest/testUtils/codeGenerate.py @@ -191,9 +191,6 @@ def generateTestNetworkImplementation(deployer: NetworkDeployer, verbosityCfg: C } void InitNetwork(__attribute__((unused)) uint32_t core_id, __attribute__((unused)) uint32_t numThreads){ - #ifndef CI - printf("Init Network!\\n"); - #endif """ retStr += deployer.generateEngineInitializationCode() retStr += deployer.generateBufferAllocationCode() @@ -266,12 +263,6 @@ def generateTestNetwork(deployer: NetworkDeployer, test_inputs: List[np.ndarray] # Create input and output vectors os.makedirs(dumpdir, exist_ok = True) - # Clean up old hex files to avoid confusion between L2/L3 modes - import shutil - hex_dir = os.path.join(dumpdir, 'hex') - if os.path.exists(hex_dir): - shutil.rmtree(hex_dir) - testInputStr = generateTestInputsHeader(deployer, test_inputs) with open(f'{dumpdir}/testinputs.h', "w") as f: f.write(testInputStr) From 5649f9667b965f7277fc24e34523386c742207a9 Mon Sep 17 00:00:00 2001 From: Run Wang <52746141+SamanthaWangdl@users.noreply.github.com> Date: Wed, 4 Feb 2026 22:38:36 +0000 Subject: [PATCH 37/49] =?UTF-8?q?Fix=20Comments:=20-=20Add=20L3=20tests=20?= =?UTF-8?q?and=20fix=20build=20configuration=20issues=20-=20Add=20GAP9=20t?= =?UTF-8?q?iled=20L3=20memory=20mode=20tests=20(singlebuffer/doublebuffer)?= =?UTF-8?q?=20-=20Fix=20duplicate=20NUM=5FCORES=20definition=20(global=20?= =?UTF-8?q?=E2=86=92=20target-specific)=20-=20Add=20prebuilt=20library=20N?= =?UTF-8?q?UM=5FCORES=20validation=20with=20auto-fallback=20-=20Fix=20hex?= =?UTF-8?q?=20file=20count=20reporting=20(CMAKE=5FMATCH=5FCOUNT=20?= =?UTF-8?q?=E2=86=92=20list=20LENGTH)=20-=20Reduce=20dangerous=20warning?= =?UTF-8?q?=20suppressions=20in=20deeploygap9=20-=20Standardize=20math.h?= =?UTF-8?q?=20include=20in=20BatchNorm=5Ffp32.c=20-=20Update=20GVSOC=5FINS?= =?UTF-8?q?TALL=5FDIR=20error=20messages=20(env=20var=20=E2=86=92=20CMake?= =?UTF-8?q?=20var)=20-=20Add=20stack=20size=20configuration=20comments=20i?= =?UTF-8?q?n=20sdk.config=20-=20Remove=20dead=20code=20in=20deeployRunner?= =?UTF-8?q?=5Ftiled=5Fgap9.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflows/docker-build-deeploy-gap9.yml | 155 ----------- .github/workflows/_select-env.yml | 2 +- .../workflows/docker-build-deeploy-gap9.yml | 155 ----------- CMakeLists.txt | 1 - Container/Dockerfile.Gap9 | 45 --- Container/Dockerfile.deeploy | 5 +- Container/Dockerfile.gap9 | 43 --- Container/amd64.list | 8 - Deeploy/Targets/GAP9/Platform.py | 2 - .../GAP9/Templates/AllocateTemplate.py | 4 +- DeeployTest/CMakeLists.txt | 3 +- DeeployTest/Platforms/GAP9/sdk.config | 6 +- DeeployTest/deeployRunner_gap9.py | 7 +- DeeployTest/deeployRunner_tiled_gap9.py | 5 - DeeployTest/test_platforms.py | 68 +++++ GAP9.md | 55 ---- Makefile | 45 +-- TargetLibraries/GAP9/CMakeLists.txt | 17 +- TargetLibraries/Generic/src/BatchNorm_fp32.c | 3 - cmake/gap9/gap9_gvsoc.cmake | 2 +- cmake/simulation.cmake | 2 +- toolchain/gap9-sdk.patch | 260 ------------------ 22 files changed, 92 insertions(+), 801 deletions(-) delete mode 100644 .github/.github/workflows/docker-build-deeploy-gap9.yml delete mode 100644 .github/workflows/docker-build-deeploy-gap9.yml delete mode 100644 Container/Dockerfile.Gap9 delete mode 100644 Container/Dockerfile.gap9 delete mode 100644 Container/amd64.list delete mode 100644 GAP9.md delete mode 100644 toolchain/gap9-sdk.patch diff --git a/.github/.github/workflows/docker-build-deeploy-gap9.yml b/.github/.github/workflows/docker-build-deeploy-gap9.yml deleted file mode 100644 index 0347cecf82..0000000000 --- a/.github/.github/workflows/docker-build-deeploy-gap9.yml +++ /dev/null @@ -1,155 +0,0 @@ -# SPDX-FileCopyrightText: 2025 ETH Zurich and University of Bologna -# -# SPDX-License-Identifier: Apache-2.0 - ---- -name: Docker • Build Deeploy GAP9 Container - -"on": - workflow_dispatch: - inputs: - docker_image_deeploy: - description: "Deeploy Image to use" - required: false - default: "ghcr.io/pulp-platform/deeploy:latest" - -jobs: - prepare: - name: Fetch branch name or tag - runs-on: ubuntu-latest - outputs: - docker_tag: ${{ steps.generate_tag.outputs.docker_tag }} - steps: - - uses: actions/checkout@v4 - - - name: Set up environment variables - run: | - echo "BRANCH_NAME=${GITHUB_REF##*/}" >> $GITHUB_ENV - echo "TAG_NAME=${GITHUB_REF##*/}" >> $GITHUB_ENV - echo "IS_TAG=${GITHUB_REF_TYPE}" >> $GITHUB_ENV - - - name: Set Docker tag - id: generate_tag - run: | - if [[ "${{ env.IS_TAG }}" == "tag" ]]; then - echo "docker_tag=${{ env.TAG_NAME }}" >> $GITHUB_OUTPUT - else - echo "docker_tag=${{ env.BRANCH_NAME }}" >> $GITHUB_OUTPUT - fi - - build-deeploy-gap9: - name: Build Deeploy GAP9 Image - needs: [prepare] - runs-on: ${{ matrix.runner }} - outputs: - digest-amd64: ${{ steps.digest.outputs.digest-amd64 }} - digest-arm64: ${{ steps.digest.outputs.digest-arm64 }} - strategy: - fail-fast: false - matrix: - platform: [amd64, arm64] - include: - - platform: amd64 - runner: ubuntu-latest - - platform: arm64 - runner: ubuntu-22.04-arm - steps: - - uses: actions/checkout@v4 - - - name: Free up disk space - uses: jlumbroso/free-disk-space@v1.3.1 - with: - tool-cache: true - android: true - dotnet: true - haskell: true - large-packages: true - - - uses: docker/setup-buildx-action@v3 - - - name: GHCR Log-in - uses: docker/login-action@v3 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Build Cache for Docker - id: cache - uses: actions/cache@v4 - with: - path: var-ccache - key: ${{ runner.os }}-${{ matrix.platform }}-build-cache-deeploy-gap9 - - - name: Inject build-cache - uses: reproducible-containers/buildkit-cache-dance@v3.1.0 - with: - cache-map: | - { - "var-ccache": "/ccache" - } - skip-extraction: ${{ steps.cache.outputs.cache-hit }} - - - name: Lower Case Repository Name - run: | - echo "OWNER_LC=${OWNER,,}" >>${GITHUB_ENV} - env: - OWNER: "${{ github.repository_owner }}" - - - name: Build and push final deploy image - id: build - uses: docker/build-push-action@v6 - with: - platforms: linux/${{ matrix.platform }} - context: . - cache-from: type=gha - cache-to: type=gha,mode=min - file: Container/Dockerfile.gap9 - push: true - build-args: | - DEEPLOY_IMAGE=${{ github.event.inputs.docker_image_deeploy }} - outputs: type=image,name=ghcr.io/${{ env.OWNER_LC }}/deeploy-gap9,annotation-index=true,name-canonical=true,push=true - - - name: Extract image digest - id: digest - run: echo "digest-${{ matrix.platform }}=${{ steps.build.outputs.digest }}" >> $GITHUB_OUTPUT - - merge-deeploy-gap9-images: - name: Merge Deeploy GAP9 Images - runs-on: ubuntu-latest - needs: [prepare, build-deeploy-gap9] - steps: - - name: GHCR Log-in - uses: docker/login-action@v3 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Lower Case Repository Name - run: | - echo "OWNER_LC=${OWNER,,}" >>${GITHUB_ENV} - env: - OWNER: "${{ github.repository_owner }}" - - - name: Merge Deeploy GAP9 Images - uses: Noelware/docker-manifest-action@v1 - with: - inputs: | - ghcr.io/${{ env.OWNER_LC }}/deeploy-gap9@${{ needs.build-deeploy-gap9.outputs.digest-amd64 }}, - ghcr.io/${{ env.OWNER_LC }}/deeploy-gap9@${{ needs.build-deeploy-gap9.outputs.digest-arm64 }} - tags: | - ghcr.io/${{ env.OWNER_LC }}/deeploy-gap9:latest, - ghcr.io/${{ env.OWNER_LC }}/deeploy-gap9:${{ needs.prepare.outputs.docker_tag }} - push: true - - - name: Set package visibility to internal - uses: actions/github-script@v7 - with: - script: | - await github.rest.packages.updatePackageVersionVisibility({ - package_type: 'container', - package_name: 'deeploy-gap9', - visibility: 'internal', - org: context.repo.owner - }); diff --git a/.github/workflows/_select-env.yml b/.github/workflows/_select-env.yml index 8c8f007608..1085c7eaa1 100644 --- a/.github/workflows/_select-env.yml +++ b/.github/workflows/_select-env.yml @@ -45,4 +45,4 @@ jobs: echo "runner=self-hosted" >> "$GITHUB_OUTPUT" else echo "runner=ubuntu-latest" >> "$GITHUB_OUTPUT" - fi \ No newline at end of file + fi diff --git a/.github/workflows/docker-build-deeploy-gap9.yml b/.github/workflows/docker-build-deeploy-gap9.yml deleted file mode 100644 index 0347cecf82..0000000000 --- a/.github/workflows/docker-build-deeploy-gap9.yml +++ /dev/null @@ -1,155 +0,0 @@ -# SPDX-FileCopyrightText: 2025 ETH Zurich and University of Bologna -# -# SPDX-License-Identifier: Apache-2.0 - ---- -name: Docker • Build Deeploy GAP9 Container - -"on": - workflow_dispatch: - inputs: - docker_image_deeploy: - description: "Deeploy Image to use" - required: false - default: "ghcr.io/pulp-platform/deeploy:latest" - -jobs: - prepare: - name: Fetch branch name or tag - runs-on: ubuntu-latest - outputs: - docker_tag: ${{ steps.generate_tag.outputs.docker_tag }} - steps: - - uses: actions/checkout@v4 - - - name: Set up environment variables - run: | - echo "BRANCH_NAME=${GITHUB_REF##*/}" >> $GITHUB_ENV - echo "TAG_NAME=${GITHUB_REF##*/}" >> $GITHUB_ENV - echo "IS_TAG=${GITHUB_REF_TYPE}" >> $GITHUB_ENV - - - name: Set Docker tag - id: generate_tag - run: | - if [[ "${{ env.IS_TAG }}" == "tag" ]]; then - echo "docker_tag=${{ env.TAG_NAME }}" >> $GITHUB_OUTPUT - else - echo "docker_tag=${{ env.BRANCH_NAME }}" >> $GITHUB_OUTPUT - fi - - build-deeploy-gap9: - name: Build Deeploy GAP9 Image - needs: [prepare] - runs-on: ${{ matrix.runner }} - outputs: - digest-amd64: ${{ steps.digest.outputs.digest-amd64 }} - digest-arm64: ${{ steps.digest.outputs.digest-arm64 }} - strategy: - fail-fast: false - matrix: - platform: [amd64, arm64] - include: - - platform: amd64 - runner: ubuntu-latest - - platform: arm64 - runner: ubuntu-22.04-arm - steps: - - uses: actions/checkout@v4 - - - name: Free up disk space - uses: jlumbroso/free-disk-space@v1.3.1 - with: - tool-cache: true - android: true - dotnet: true - haskell: true - large-packages: true - - - uses: docker/setup-buildx-action@v3 - - - name: GHCR Log-in - uses: docker/login-action@v3 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Build Cache for Docker - id: cache - uses: actions/cache@v4 - with: - path: var-ccache - key: ${{ runner.os }}-${{ matrix.platform }}-build-cache-deeploy-gap9 - - - name: Inject build-cache - uses: reproducible-containers/buildkit-cache-dance@v3.1.0 - with: - cache-map: | - { - "var-ccache": "/ccache" - } - skip-extraction: ${{ steps.cache.outputs.cache-hit }} - - - name: Lower Case Repository Name - run: | - echo "OWNER_LC=${OWNER,,}" >>${GITHUB_ENV} - env: - OWNER: "${{ github.repository_owner }}" - - - name: Build and push final deploy image - id: build - uses: docker/build-push-action@v6 - with: - platforms: linux/${{ matrix.platform }} - context: . - cache-from: type=gha - cache-to: type=gha,mode=min - file: Container/Dockerfile.gap9 - push: true - build-args: | - DEEPLOY_IMAGE=${{ github.event.inputs.docker_image_deeploy }} - outputs: type=image,name=ghcr.io/${{ env.OWNER_LC }}/deeploy-gap9,annotation-index=true,name-canonical=true,push=true - - - name: Extract image digest - id: digest - run: echo "digest-${{ matrix.platform }}=${{ steps.build.outputs.digest }}" >> $GITHUB_OUTPUT - - merge-deeploy-gap9-images: - name: Merge Deeploy GAP9 Images - runs-on: ubuntu-latest - needs: [prepare, build-deeploy-gap9] - steps: - - name: GHCR Log-in - uses: docker/login-action@v3 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Lower Case Repository Name - run: | - echo "OWNER_LC=${OWNER,,}" >>${GITHUB_ENV} - env: - OWNER: "${{ github.repository_owner }}" - - - name: Merge Deeploy GAP9 Images - uses: Noelware/docker-manifest-action@v1 - with: - inputs: | - ghcr.io/${{ env.OWNER_LC }}/deeploy-gap9@${{ needs.build-deeploy-gap9.outputs.digest-amd64 }}, - ghcr.io/${{ env.OWNER_LC }}/deeploy-gap9@${{ needs.build-deeploy-gap9.outputs.digest-arm64 }} - tags: | - ghcr.io/${{ env.OWNER_LC }}/deeploy-gap9:latest, - ghcr.io/${{ env.OWNER_LC }}/deeploy-gap9:${{ needs.prepare.outputs.docker_tag }} - push: true - - - name: Set package visibility to internal - uses: actions/github-script@v7 - with: - script: | - await github.rest.packages.updatePackageVersionVisibility({ - package_type: 'container', - package_name: 'deeploy-gap9', - visibility: 'internal', - org: context.repo.owner - }); diff --git a/CMakeLists.txt b/CMakeLists.txt index da4765b40e..4c8a024c15 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -35,7 +35,6 @@ elseif(platform STREQUAL PULPOpen) message(STATUS "Building for platform 'PULP-Open'") elseif(platform STREQUAL GAP9) message(STATUS "Building for platform 'GAP9'") - # set( CMAKE_MESSAGE_LOG_LEVEL "DEBUG" ) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) set(ENV{KCONFIG_CONFIG} DeeployTest/Platforms/GAP9/sdk.config) include($ENV{GAP_SDK_HOME}/utils/cmake/setup.cmake) diff --git a/Container/Dockerfile.Gap9 b/Container/Dockerfile.Gap9 deleted file mode 100644 index f7c93b66be..0000000000 --- a/Container/Dockerfile.Gap9 +++ /dev/null @@ -1,45 +0,0 @@ -FROM ghcr.io/pulp-platform/deeploy:latest - -ENV GAP_RISCV_GCC_TOOLCHAIN=/app/install/gcc/gap9 -ENV GAP_SDK_HOME=/app/install/gap9-sdk -ENV GAP_RISCV_GCC_TOOLCHAIN=/app/install/gcc/gap9 - -WORKDIR /app - -# Install SSH keys to access private repositories -RUN mkdir -p -m 0700 ~/.ssh && \ - ssh-keyscan iis-git.ee.ethz.ch >> ~/.ssh/known_hosts && \ - ssh-keyscan github.com >> ~/.ssh/known_hosts - -COPY Makefile ./ -COPY toolchain/*.patch toolchain/ - -RUN apt-get update && \ - apt-get upgrade -y && \ - apt-get install -y \ - sudo \ - rsync \ - build-essential \ - g++ \ - python3-dev \ - device-tree-compiler \ - bison \ - flex && \ - rm -rf /var/lib/apt/lists/* - -RUN --mount=type=cache,target=/ccache \ - ccache -z && make gap9-toolchain && \ - rm -rf /app/toolchain/gap9-toolchain - -RUN --mount=type=ssh \ - --mount=type=cache,target=/ccache \ - --mount=type=cache,target=/root/.cache/pip \ - ccache -z && \ - make gap9-sdk && \ - ccache -s && \ - rm -rf /app/toolchain/gap9-sdk && \ - rm -rf /app/install/gap9-sdk/build && \ - rm -rf /app/install/gap9-sdk/.git && \ - rm -rf /app/install/gap9-sdk/nn_menu && \ - find /app/install/gap9-sdk -name "*.o" -delete && \ - find /app/install/gap9-sdk -name "*.a" -not -path "*/lib/*" -delete \ No newline at end of file diff --git a/Container/Dockerfile.deeploy b/Container/Dockerfile.deeploy index a75b841636..65265a6eeb 100644 --- a/Container/Dockerfile.deeploy +++ b/Container/Dockerfile.deeploy @@ -128,7 +128,4 @@ RUN pip install -r requirements-dev.txt -r core-requirements.txt -r gapy-require # Copy pre-built toolchains and emulators COPY --from=toolchain /app/install ./install -COPY --from=toolchain /root/.cargo/bin/banshee /root/.cargo/bin/banshee - -# Remove unused files and clean up to reduce image size -RUN rm cmake-* core-requirements.txt gapy-requirements.txt pyproject.toml requirements-dev.txt requirements.txt Makefile \ No newline at end of file +COPY --from=toolchain /root/.cargo/bin/banshee /root/.cargo/bin/banshee \ No newline at end of file diff --git a/Container/Dockerfile.gap9 b/Container/Dockerfile.gap9 deleted file mode 100644 index a94987ffb7..0000000000 --- a/Container/Dockerfile.gap9 +++ /dev/null @@ -1,43 +0,0 @@ - -ARG DEEPLOY_IMAGE=ghcr.io/pulp-platform/deeploy:latest -FROM ${DEEPLOY_IMAGE} as deeploy - -ENV GAP_RISCV_GCC_TOOLCHAIN=/app/install/gcc/gap9 -ENV GAP_SDK_HOME=/app/install/gap9-sdk -ENV PATH="${GAP_RISCV_GCC_TOOLCHAIN}/bin:${PATH}" - -ENV TARGET_INSTALL_DIR=/app/install -ENV DEEPLOY_DIR=/app/Deeploy - -USER root - -# Install Python build dependencies and git for pip installs from git repos -# openssh-client is needed for ssh authentication with private repos -RUN apt-get update && \ - apt-get install -y \ - libftdi-dev \ - libftdi1 \ - doxygen \ - git-lfs \ - openssh-client && \ - apt-get clean && \ - rm -rf /var/lib/apt/lists/* - -WORKDIR /app - -COPY toolchain/gap9.mk ./toolchain/gap9.mk -COPY Makefile ./ - -RUN --mount=type=cache,target=/ccache \ - ccache -z && make gap9-toolchain && \ - rm -rf /app/toolchain/gap9-toolchain - -RUN --mount=type=ssh \ - --mount=type=cache,target=/ccache \ - ccache -z && make gap9-sdk && ccache -s && \ - rm -rf /app/toolchain/gap9-sdk - -# Install Deeploy Python package -COPY pyproject.toml requirements.txt core-requirements.txt gapy-requirements.txt ./ -RUN pip install --upgrade pip && \ - pip install -r requirements.txt -r core-requirements.txt -r gapy-requirements.txt diff --git a/Container/amd64.list b/Container/amd64.list deleted file mode 100644 index 692a058097..0000000000 --- a/Container/amd64.list +++ /dev/null @@ -1,8 +0,0 @@ -# SPDX-FileCopyrightText: 2025 ETH Zurich and University of Bologna -# -# SPDX-License-Identifier: Apache-2.0 - -deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ jammy main restricted universe multiverse -deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ jammy-updates main restricted universe multiverse -deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse -deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ jammy-backports main restricted universe multiverse \ No newline at end of file diff --git a/Deeploy/Targets/GAP9/Platform.py b/Deeploy/Targets/GAP9/Platform.py index cb37a28e91..79f0e6ac06 100644 --- a/Deeploy/Targets/GAP9/Platform.py +++ b/Deeploy/Targets/GAP9/Platform.py @@ -243,8 +243,6 @@ class GAP9StructBuffer(StructBuffer): allocTemplate = BasicAllocateTemplate.referenceStructAllocateTemplate deallocTemplate = NodeTemplate("") - -# SCHEREMO: stdint is included before pulp_nn_kernels.h because it is supposed to be included in there, but isn't... _includeList = ["pmsis.h", "DeeployGAP9Math.h", "pulp_nn_kernels.h", "DeeployMchan.h"] diff --git a/Deeploy/Targets/GAP9/Templates/AllocateTemplate.py b/Deeploy/Targets/GAP9/Templates/AllocateTemplate.py index 32a3e40c37..4d4ddac7c1 100644 --- a/Deeploy/Targets/GAP9/Templates/AllocateTemplate.py +++ b/Deeploy/Targets/GAP9/Templates/AllocateTemplate.py @@ -7,7 +7,7 @@ gap9L2InitTemplate = NodeTemplate("${type.typeName} ${name};\n") gap9L1InitTemplate = NodeTemplate("${type.typeName} ${name};\n") -#gap9L2AllocateTemplate = NodeTemplate("${name} = (${type.typeName}) pi_l2_malloc(${type.referencedType.typeWidth//8} * ${size});\n") + gap9L2AllocateTemplate = NodeTemplate( "${name} = (${type.typeName}) pi_l2_malloc(sizeof(${type.referencedType.typeName}) * ${size});\n") @@ -20,14 +20,12 @@ gap9L1GlobalInitTemplate = NodeTemplate( "static PI_L1 ${type.referencedType.typeName} ${name}[${size}] = {${values}};\n") -#gap9L2GlobalInitTemplate = NodeTemplate("static const ${type} ${name}[${size}];\n") gap9L2GlobalAllocateTemplate = NodeTemplate("") gap9L1GlobalAllocateTemplate = NodeTemplate("") gap9L2StructInitTemplate = NodeTemplate("""static PI_L2 ${type.typeName} ${name}; """) -#static const ${type}* ${name} = &${name}_UL; gap9L2StructAllocateTemplate = NodeTemplate(""" % for key, value in structDict.items(): ${name}.${key} = ${value}; diff --git a/DeeployTest/CMakeLists.txt b/DeeployTest/CMakeLists.txt index 1fbfc8360b..b7f3535790 100644 --- a/DeeployTest/CMakeLists.txt +++ b/DeeployTest/CMakeLists.txt @@ -67,7 +67,8 @@ elseif(platform STREQUAL GAP9) else() # L3 mode: Use flash with readfs files # Data will be loaded from external flash via readfs - message(STATUS "[Deeploy GAP9] L3 mode: Found ${CMAKE_MATCH_COUNT} hex file(s)") + list(LENGTH HEXLIST HEXCOUNT) + message(STATUS "[Deeploy GAP9] L3 mode: Found ${HEXCOUNT} hex file(s)") message(STATUS "==== HEXLIST ====") foreach(f ${HEXLIST}) message(STATUS " ${f}") diff --git a/DeeployTest/Platforms/GAP9/sdk.config b/DeeployTest/Platforms/GAP9/sdk.config index d4e4db6565..8d6fb6b178 100644 --- a/DeeployTest/Platforms/GAP9/sdk.config +++ b/DeeployTest/Platforms/GAP9/sdk.config @@ -29,5 +29,7 @@ CONFIG_IO_PRINTF_FLOAT_EXPONENT_ENABLE=y CONFIG_PLATFORM_GVSOC=y # CONFIG_DRIVER_CLUSTERDECOMPRESSOR=n -#CONFIG_CL_MASTER_CORE_STACK_SIZE=14000 -#CONFIG_CL_SLAVE_CORE_STACK_SIZE=1000 \ No newline at end of file +# GAP9 cluster stack size configuration +# Uncomment and adjust these values if you need to modify stack sizes: +# CONFIG_CL_MASTER_CORE_STACK_SIZE=14000 +# CONFIG_CL_SLAVE_CORE_STACK_SIZE=1000 \ No newline at end of file diff --git a/DeeployTest/deeployRunner_gap9.py b/DeeployTest/deeployRunner_gap9.py index d0a44ebdf8..b41f505b4d 100644 --- a/DeeployTest/deeployRunner_gap9.py +++ b/DeeployTest/deeployRunner_gap9.py @@ -12,12 +12,7 @@ # Define parser setup callback to add GAP9-specific arguments def setup_parser(parser): parser.add_argument('--cores', type = int, default = 8, help = 'Number of cores (default: 8)\n') - - # Set default GVSOC install dir for GAP9 - for action in parser._actions: - if action.dest == 'gvsoc_install_dir': - action.default = "${GAP_SDK_HOME}/install/workstation" - + sys.exit( main(default_platform = "GAP9", default_simulator = "gvsoc", diff --git a/DeeployTest/deeployRunner_tiled_gap9.py b/DeeployTest/deeployRunner_tiled_gap9.py index 50c0c6e7bc..cde8e1e1d8 100644 --- a/DeeployTest/deeployRunner_tiled_gap9.py +++ b/DeeployTest/deeployRunner_tiled_gap9.py @@ -13,11 +13,6 @@ def setup_parser(parser): parser.add_argument('--cores', type = int, default = 8, help = 'Number of cores (default: 8)\n') - # Set default GVSOC install dir for GAP9 - for action in parser._actions: - if action.dest == 'gvsoc_install_dir': - action.default = "${GAP_SDK_HOME}/install/workstation" - sys.exit( main(default_platform = "GAP9", default_simulator = "gvsoc", diff --git a/DeeployTest/test_platforms.py b/DeeployTest/test_platforms.py index eaf753b925..577be29cb4 100644 --- a/DeeployTest/test_platforms.py +++ b/DeeployTest/test_platforms.py @@ -16,6 +16,8 @@ from test_gap9_tiled_config import L2_DOUBLEBUFFER_MODELS as GAP9_L2_DOUBLEBUFFER_MODELS from test_gap9_tiled_config import L2_SINGLEBUFFER_KERNELS as GAP9_L2_SINGLEBUFFER_KERNELS from test_gap9_tiled_config import L2_SINGLEBUFFER_MODELS as GAP9_L2_SINGLEBUFFER_MODELS +from test_gap9_tiled_config import L3_DOUBLEBUFFER_MODELS as GAP9_L3_DOUBLEBUFFER_MODELS +from test_gap9_tiled_config import L3_SINGLEBUFFER_MODELS as GAP9_L3_SINGLEBUFFER_MODELS from test_generic_config import KERNEL_TESTS as GENERIC_KERNEL_TESTS from test_generic_config import MODEL_TESTS as GENERIC_MODEL_TESTS from test_mempool_config import DEFAULT_NUM_THREADS as MEMPOOL_DEFAULT_NUM_THREADS @@ -919,3 +921,69 @@ def test_gap9_tiled_models_l2_doublebuffer(test_params, deeploy_test_dir, toolch double_buffer = True, ) run_and_assert_test(test_name, config, skipgen, skipsim) + + +@pytest.mark.gap9_tiled +@pytest.mark.models +@pytest.mark.singlebuffer +@pytest.mark.l3 +@pytest.mark.parametrize( + "test_params", + generate_test_params(GAP9_L3_SINGLEBUFFER_MODELS, "L3-singlebuffer"), + ids = param_id, +) +def test_gap9_tiled_models_l3_singlebuffer(test_params, deeploy_test_dir, toolchain, toolchain_dir, cmake_args, skipgen, + skipsim) -> None: + test_name, l1, config_name = test_params + + # Add GAP9-specific CMake args + gap9_cmake_args = cmake_args + [f"NUM_CORES={GAP9_TILED_DEFAULT_CORES}"] + + config = create_test_config( + test_name = test_name, + platform = "GAP9", + simulator = "gvsoc", + deeploy_test_dir = deeploy_test_dir, + toolchain = toolchain, + toolchain_dir = toolchain_dir, + cmake_args = gap9_cmake_args, + tiling = True, + cores = GAP9_TILED_DEFAULT_CORES, + l1 = l1, + default_mem_level = "L3", + double_buffer = False, + ) + run_and_assert_test(test_name, config, skipgen, skipsim) + + +@pytest.mark.gap9_tiled +@pytest.mark.models +@pytest.mark.doublebuffer +@pytest.mark.l3 +@pytest.mark.parametrize( + "test_params", + generate_test_params(GAP9_L3_DOUBLEBUFFER_MODELS, "L3-doublebuffer"), + ids = param_id, +) +def test_gap9_tiled_models_l3_doublebuffer(test_params, deeploy_test_dir, toolchain, toolchain_dir, cmake_args, skipgen, + skipsim) -> None: + test_name, l1, config_name = test_params + + # Add GAP9-specific CMake args + gap9_cmake_args = cmake_args + [f"NUM_CORES={GAP9_TILED_DEFAULT_CORES}"] + + config = create_test_config( + test_name = test_name, + platform = "GAP9", + simulator = "gvsoc", + deeploy_test_dir = deeploy_test_dir, + toolchain = toolchain, + toolchain_dir = toolchain_dir, + cmake_args = gap9_cmake_args, + tiling = True, + cores = GAP9_TILED_DEFAULT_CORES, + l1 = l1, + default_mem_level = "L3", + double_buffer = True, + ) + run_and_assert_test(test_name, config, skipgen, skipsim) diff --git a/GAP9.md b/GAP9.md deleted file mode 100644 index 5361e55b67..0000000000 --- a/GAP9.md +++ /dev/null @@ -1,55 +0,0 @@ -## Using Deeploy with GAP9 - -> ⚠️ **IMPORTANT NOTE** -> This is a work in progress. The GAP9 support in Deeploy is experimental and may not be fully functional. - -To use Deeploy with GAP9, a custom Docker container is required because the official Deeploy Docker image does yet not include the necessary SDKs and dependencies for GAP9 development, because they are not publicly available. - -### Build The Docker Container - -To use SSH keys for accessing private repositories during the Docker build process, make sure you have an SSH key pair set up on your local machine. By default, the Makefile uses the key located at `~/.ssh/id_ed25519`. If your key is located elsewhere, you can specify its path using the `SSH_PRIVATE_KEY` variable when invoking the make command. - -To build a local version of the Deeploy Docker image with GAP9 support using the upstream toolchain image, run: -```sh -cd Container - -# Build the Deeploy image with the upstream toolchain image -make deeploy-gap9 DEEPOY_GAP9_IMAGE=deeploy-gap9:latest - -# If you want to specify a custom SSH key path, use: -make deeploy-gap9 DEEPOY_GAP9_IMAGE=deeploy-gap9:latest SSH_PRIVATE_KEY=/path/to/your/private/key -``` - -Or, to build the toolchain, Deeploy and GAP9 images locally, use: -```sh -cd Container - -# Build all images -make all TOOLCHAIN_IMAGE=deeploy-toolchain:latest DEEPOY_IMAGE=deeploy:latest DEEPOY_GAP9_IMAGE=deeploy-gap9:latest -``` - -### Use The Docker Container - -Once the image is built, you can create and start the container in interactive mode with: - -```sh -docker run -it --name deeploy_gap9 -v $(pwd):/app/Deeploy deeploy-gap9:latest -``` - -Before running tests, you need to set up the GAP9 environment inside the container: -```sh -source /app/install/gap9-sdk/.gap9-venv/bin/activate -source /app/install/gap9-sdk/configs/gap9_evk_audio.sh -``` -Install Deeploy inside the container in editable mode: - -```sh -cd /app/Deeploy -pip install -e . --extra-index-url=https://pypi.ngc.nvidia.com -``` - -```sh -cd /app/Deeploy/DeeployTest -python testRunner_gap9.py -t Tests/testMatMul -python testRunner_tiled_gap9.py -t Tests/testMatMul -``` \ No newline at end of file diff --git a/Makefile b/Makefile index e253be546f..fb9a9a302a 100644 --- a/Makefile +++ b/Makefile @@ -24,9 +24,6 @@ PICOLIBC_RV32IMA_INSTALL_DIR ?= ${LLVM_INSTALL_DIR}/picolibc/riscv/rv32ima PICOLIBC_RV32IMAFD_INSTALL_DIR ?= ${LLVM_INSTALL_DIR}/picolibc/riscv/rv32imafd PICOLIBC_RV32IMF_INSTALL_DIR ?= ${LLVM_INSTALL_DIR}/picolibc/riscv/rv32imf -GCC_INSTALL_DIR ?= ${DEEPLOY_INSTALL_DIR}/gcc -GAP_RISCV_GCC_INSTALL_DIR ?= ${GCC_INSTALL_DIR}/gap9 - CHIMERA_SDK_INSTALL_DIR ?= ${DEEPLOY_INSTALL_DIR}/chimera-sdk PULP_SDK_INSTALL_DIR ?= ${DEEPLOY_INSTALL_DIR}/pulp-sdk SNITCH_INSTALL_DIR ?= ${DEEPLOY_INSTALL_DIR}/snitch_cluster @@ -39,7 +36,6 @@ MINIMALLOC_INSTALL_DIR ?= ${DEEPLOY_INSTALL_DIR}/minimalloc XTL_INSTALL_DIR ?= ${DEEPLOY_INSTALL_DIR}/xtl XSIMD_INSTALL_DIR ?= ${DEEPLOY_INSTALL_DIR}/xsimd XTENSOR_INSTALL_DIR ?= ${DEEPLOY_INSTALL_DIR}/xtensor -GAP9_SDK_INSTALL_DIR ?= ${DEEPLOY_INSTALL_DIR}/gap9-sdk CMAKE ?= cmake @@ -56,7 +52,6 @@ CHIMERA_SDK_COMMIT_HASH ?= b2392f6efcff75c03f4c65eaf3e12104442b22ea XTL_VERSION ?= 0.7.5 XSIMD_VERSION ?= 13.2.0 XTENSOR_VERSION ?= 0.25.0 -GAP9_SDK_COMMIT_HASH ?= dfabdddd0e78b9b750a0eb46eee85d5a2c9ae853 RUSTUP_CARGO ?= $$(rustup which cargo) @@ -68,8 +63,6 @@ echo-bash: @echo "The following symbols need to be exported for Deeploy to work properly:" @echo "export MINIMALLOC_INSTALL_DIR=${MINIMALLOC_INSTALL_DIR}" @echo "export PULP_SDK_HOME=${PULP_SDK_INSTALL_DIR}" - @echo "export GAP_SDK_HOME=${GAP9_SDK_INSTALL_DIR}" - @echo "export GAP_RISCV_GCC_TOOLCHAIN=${GAP_RISCV_GCC_INSTALL_DIR}" @echo "export CHIMERA_SDK_HOME=${CHIMERA_SDK_INSTALL_DIR}" @echo "export SNITCH_HOME=${SNITCH_INSTALL_DIR}" @echo "export GVSOC_INSTALL_DIR=${GVSOC_INSTALL_DIR}" @@ -90,11 +83,9 @@ emulators: snitch_runtime pulp-sdk qemu banshee mempool ${TOOLCHAIN_DIR}/llvm-project: cd ${TOOLCHAIN_DIR} && \ - git init llvm-project && \ - cd ${TOOLCHAIN_DIR}/llvm-project && \ - git remote add origin https://github.com/pulp-platform/llvm-project.git && \ - git fetch --depth=1 origin ${LLVM_COMMIT_HASH} && \ - git checkout ${LLVM_COMMIT_HASH} && \ + git clone https://github.com/pulp-platform/llvm-project.git \ + -b main && \ + cd ${TOOLCHAIN_DIR}/llvm-project && git checkout ${LLVM_COMMIT_HASH} && \ git submodule update --init --recursive ${LLVM_INSTALL_DIR}: ${TOOLCHAIN_DIR}/llvm-project @@ -405,36 +396,6 @@ ${PULP_SDK_INSTALL_DIR}: ${TOOLCHAIN_DIR}/pulp-sdk pulp-sdk: ${PULP_SDK_INSTALL_DIR} -${TOOLCHAIN_DIR}/gap9-toolchain: - cd ${TOOLCHAIN_DIR} && \ - git clone https://github.com/GreenWaves-Technologies/gap_riscv_toolchain_ubuntu.git --depth 1 -b master gap9-toolchain - -${GAP_RISCV_GCC_INSTALL_DIR}: ${TOOLCHAIN_DIR}/gap9-toolchain - cd ${TOOLCHAIN_DIR}/gap9-toolchain && \ - mkdir -p ${GAP_RISCV_GCC_INSTALL_DIR} && \ - ./install.sh ${GAP_RISCV_GCC_INSTALL_DIR} - -gap9-toolchain: ${GAP_RISCV_GCC_INSTALL_DIR} - -${TOOLCHAIN_DIR}/gap9-sdk: - cd ${TOOLCHAIN_DIR} && \ - git clone git@iis-git.ee.ethz.ch:wiesep/gap9_sdk.git gap9-sdk && \ - cd ${TOOLCHAIN_DIR}/gap9-sdk && git checkout ${GAP9_SDK_COMMIT_HASH} && \ - git submodule update --init --recursive && \ - git apply ${TOOLCHAIN_DIR}/gap9-sdk.patch - -${GAP9_SDK_INSTALL_DIR}: ${TOOLCHAIN_DIR}/gap9-sdk - mkdir -p ${GAP9_SDK_INSTALL_DIR} - cp -r ${TOOLCHAIN_DIR}/gap9-sdk ${GAP9_SDK_INSTALL_DIR}/../ && \ - cd ${GAP9_SDK_INSTALL_DIR} && \ - python -m venv .gap9-venv && \ - . .gap9-venv/bin/activate && \ - . configs/gap9_evk_audio.sh && \ - make install_dependency cmake_sdk.build && \ - deactivate - -gap9-sdk: ${GAP9_SDK_INSTALL_DIR} - ${TOOLCHAIN_DIR}/snitch_cluster: cd ${TOOLCHAIN_DIR} && \ git clone https://github.com/pulp-platform/snitch_cluster.git && \ diff --git a/TargetLibraries/GAP9/CMakeLists.txt b/TargetLibraries/GAP9/CMakeLists.txt index d05858e586..c32a89066a 100644 --- a/TargetLibraries/GAP9/CMakeLists.txt +++ b/TargetLibraries/GAP9/CMakeLists.txt @@ -11,10 +11,6 @@ file(GLOB_RECURSE PULPOPEN_SOURCES "../PULPOpen/src/**") list(FILTER PULPOPEN_SOURCES EXCLUDE REGEX ".*dory_mem.*") list(APPEND SOURCES ${PULPOPEN_SOURCES}) -if(NOT DEFINED ENV{GAP_SDK_HOME}) - message(FATAL_ERROR "Environment variable GAP_SDK_HOME not set.") -endif() - add_deeploy_library(deeploygap9 STATIC ${SOURCES}) target_include_directories(deeploygap9 PUBLIC @@ -27,12 +23,10 @@ target_compile_options(deeploygap9 PUBLIC ) target_compile_options(deeploygap9 PRIVATE - -Wno-implicit-function-declaration -Wno-sign-conversion -Wno-sign-compare -Wno-type-limits -Wno-attributes - -Wno-incompatible-pointer-types ) target_link_libraries(deeploygap9 PUBLIC pmsis) @@ -41,10 +35,16 @@ target_link_libraries(deeploygap9 PUBLIC pmsis) #RW: Set PULP-NN version and bitwidth for pulp-nn-mixed set(PULPNNVERSION XPULPV2) set(PULPNNBITWIDTH 32) -add_compile_definitions(NUM_CORES=${NUM_CORES}) # Option to use prebuilt pulp-nn library (default: ON for faster builds) -option(USE_PREBUILT_PULPNN "Use prebuilt pulp-nn-mixed library" ON) +option(USE_PREBUILT_PULPNN "Use prebuilt pulp-nn-mixed librar with 8 cores" ON) + +# Check if NUM_CORES matches prebuilt library requirement +if(USE_PREBUILT_PULPNN AND NOT NUM_CORES EQUAL 8) + message(WARNING "[Deeploy GAP9] Prebuilt pulp-nn library is compiled for 8 cores, but NUM_CORES=${NUM_CORES}.") + message(WARNING "[Deeploy GAP9] Disabling prebuilt library and building from source instead.") + set(USE_PREBUILT_PULPNN OFF) +endif() if(USE_PREBUILT_PULPNN) # Use prebuilt pulp-nn library @@ -83,6 +83,7 @@ if(NOT USE_PREBUILT_PULPNN) #RW: GCC not recognizing -Wno-typedef-redefinition defined in PULP-NN CMakelist target_compile_options(pulp-nn-mixed PRIVATE -Wno-error) + target_compile_definitions(pulp-nn-mixed PUBLIC NUM_CORES=${NUM_CORES}) target_link_libraries(pulp-nn-mixed PUBLIC pmsis) endif() diff --git a/TargetLibraries/Generic/src/BatchNorm_fp32.c b/TargetLibraries/Generic/src/BatchNorm_fp32.c index d12f89a293..1e94d63dbb 100644 --- a/TargetLibraries/Generic/src/BatchNorm_fp32.c +++ b/TargetLibraries/Generic/src/BatchNorm_fp32.c @@ -3,10 +3,7 @@ // SPDX-License-Identifier: Apache-2.0 #include "DeeployBasicMath.h" - -#ifdef DEEPLOY_GAP9_PLATFORM #include -#endif void BatchNorm_fp32(const float32_t *input, const float32_t *gamma, const float32_t *beta, const float32_t *mean, diff --git a/cmake/gap9/gap9_gvsoc.cmake b/cmake/gap9/gap9_gvsoc.cmake index 51fea8de8e..8ba89685d6 100644 --- a/cmake/gap9/gap9_gvsoc.cmake +++ b/cmake/gap9/gap9_gvsoc.cmake @@ -7,7 +7,7 @@ set(GAP9_GVSOC_DEFINED TRUE) macro(add_gvsoc_emulation name target) if(NOT DEFINED GVSOC_INSTALL_DIR) - message(FATAL_ERROR "Environment variable GVSOC_INSTALL_DIR not set") + message(FATAL_ERROR "CMake variable GVSOC_INSTALL_DIR not set. Please specify it with -DGVSOC_INSTALL_DIR=") endif() set(GVSOC_WORKDIR ${CMAKE_BINARY_DIR}/gvsoc_workdir) diff --git a/cmake/simulation.cmake b/cmake/simulation.cmake index c3356855ff..89b11bb00b 100644 --- a/cmake/simulation.cmake +++ b/cmake/simulation.cmake @@ -82,7 +82,7 @@ endfunction() # the GVSOC_EXTRA_FLAGS variable. macro(add_gvsoc_emulation name target) if(NOT DEFINED GVSOC_INSTALL_DIR) - message(FATAL_ERROR "Environment variable GVSOC_INSTALL_DIR not set") + message(FATAL_ERROR "CMake variable GVSOC_INSTALL_DIR not set. Please specify it with -DGVSOC_INSTALL_DIR=") endif() set(GVSOC_WORKDIR ${CMAKE_BINARY_DIR}/gvsoc_workdir) make_directory(${GVSOC_WORKDIR}) diff --git a/toolchain/gap9-sdk.patch b/toolchain/gap9-sdk.patch deleted file mode 100644 index 55b0ae95d8..0000000000 --- a/toolchain/gap9-sdk.patch +++ /dev/null @@ -1,260 +0,0 @@ -diff --git a/.gitignore b/.gitignore -index f88e015f5..282fb4a39 100644 ---- a/.gitignore -+++ b/.gitignore -@@ -8,6 +8,7 @@ BUILD* - junit-reports/ - reports/ - gaptest_reports/ -+.gap9-venv - - - # SDK generated folders -diff --git a/configs/common.sh b/configs/common.sh -index 67d0628b5..54bb2e200 100644 ---- a/configs/common.sh -+++ b/configs/common.sh -@@ -80,7 +80,7 @@ export PULP_CONFIGS_PATH=$INSTALL_DIR/configs - export GVSOC_MODULES="${GAP_SDK_HOME}/gvsoc/gvsoc/models;${GAP_SDK_HOME}/gvsoc/gvsoc_gap" - export PYTHONPATH="${GAP_SDK_HOME}/gvsoc/gvsoc/models/:${GAP_SDK_HOME}/gvsoc/gvsoc_gap:$PYTHONPATH" - if [ -d "$GAP_SDK_HOME/gvsoc/gvsoc_libs" ]; then -- export CONFIG_GVSOC_SKIP_UDMA_BUILD=1 -+ export CONFIG_GVSOC_SKIP_UDMA_BUILD=0 - fi - - # gaptest -diff --git a/gvsoc/gvsoc_gap/gap/gap9/soc.py b/gvsoc/gvsoc_gap/gap/gap9/soc.py -index 0498f93d2..165e6cece 100644 ---- a/gvsoc/gvsoc_gap/gap/gap9/soc.py -+++ b/gvsoc/gvsoc_gap/gap/gap9/soc.py -@@ -438,22 +438,22 @@ class Soc(st.Component): - self.bind(udma, 'i2s1_ws_out', udma, 'sfu_ws_in_1') - self.bind(udma, 'i2s2_ws_out', udma, 'sfu_ws_in_2') - -- self.bind(udma, 'sfu_stream_in_ready_0', udma, 'stream_in_ready_0') -- self.bind(udma, 'sfu_stream_in_ready_1', udma, 'stream_in_ready_1') -- self.bind(udma, 'sfu_stream_in_ready_2', udma, 'stream_in_ready_2') -- self.bind(udma, 'sfu_stream_in_ready_3', udma, 'stream_in_ready_3') -- self.bind(udma, 'sfu_stream_in_ready_4', udma, 'stream_in_ready_4') -- self.bind(udma, 'sfu_stream_in_ready_5', udma, 'stream_in_ready_5') -- self.bind(udma, 'sfu_stream_in_ready_6', udma, 'stream_in_ready_6') -- self.bind(udma, 'sfu_stream_in_ready_7', udma, 'stream_in_ready_7') -- self.bind(udma, 'sfu_stream_in_ready_8', udma, 'stream_in_ready_8') -- self.bind(udma, 'sfu_stream_in_ready_9', udma, 'stream_in_ready_9') -- self.bind(udma, 'sfu_stream_in_ready_10', udma, 'stream_in_ready_10') -- self.bind(udma, 'sfu_stream_in_ready_11', udma, 'stream_in_ready_11') -- self.bind(udma, 'sfu_stream_in_ready_12', udma, 'stream_in_ready_12') -- self.bind(udma, 'sfu_stream_in_ready_13', udma, 'stream_in_ready_13') -- self.bind(udma, 'sfu_stream_in_ready_14', udma, 'stream_in_ready_14') -- self.bind(udma, 'sfu_stream_in_ready_15', udma, 'stream_in_ready_15') -+ # self.bind(udma, 'sfu_stream_in_ready_0', udma, 'stream_in_ready_0') -+ # self.bind(udma, 'sfu_stream_in_ready_1', udma, 'stream_in_ready_1') -+ # self.bind(udma, 'sfu_stream_in_ready_2', udma, 'stream_in_ready_2') -+ # self.bind(udma, 'sfu_stream_in_ready_3', udma, 'stream_in_ready_3') -+ # self.bind(udma, 'sfu_stream_in_ready_4', udma, 'stream_in_ready_4') -+ # self.bind(udma, 'sfu_stream_in_ready_5', udma, 'stream_in_ready_5') -+ # self.bind(udma, 'sfu_stream_in_ready_6', udma, 'stream_in_ready_6') -+ # self.bind(udma, 'sfu_stream_in_ready_7', udma, 'stream_in_ready_7') -+ # self.bind(udma, 'sfu_stream_in_ready_8', udma, 'stream_in_ready_8') -+ # self.bind(udma, 'sfu_stream_in_ready_9', udma, 'stream_in_ready_9') -+ # self.bind(udma, 'sfu_stream_in_ready_10', udma, 'stream_in_ready_10') -+ # self.bind(udma, 'sfu_stream_in_ready_11', udma, 'stream_in_ready_11') -+ # self.bind(udma, 'sfu_stream_in_ready_12', udma, 'stream_in_ready_12') -+ # self.bind(udma, 'sfu_stream_in_ready_13', udma, 'stream_in_ready_13') -+ # self.bind(udma, 'sfu_stream_in_ready_14', udma, 'stream_in_ready_14') -+ # self.bind(udma, 'sfu_stream_in_ready_15', udma, 'stream_in_ready_15') - - self.bind(udma, 'stream_in_data_0', udma, 'sfu_stream_in_data_0') - self.bind(udma, 'stream_in_data_1', udma, 'sfu_stream_in_data_1') -@@ -489,22 +489,22 @@ class Soc(st.Component): - self.bind(udma, 'stream_out_ready_14', udma, 'sfu_stream_out_ready_14') - self.bind(udma, 'stream_out_ready_15', udma, 'sfu_stream_out_ready_15') - -- self.bind(udma, 'sfu_stream_out_data_0', udma, 'stream_out_data_0') -- self.bind(udma, 'sfu_stream_out_data_1', udma, 'stream_out_data_1') -- self.bind(udma, 'sfu_stream_out_data_2', udma, 'stream_out_data_2') -- self.bind(udma, 'sfu_stream_out_data_3', udma, 'stream_out_data_3') -- self.bind(udma, 'sfu_stream_out_data_4', udma, 'stream_out_data_4') -- self.bind(udma, 'sfu_stream_out_data_5', udma, 'stream_out_data_5') -- self.bind(udma, 'sfu_stream_out_data_6', udma, 'stream_out_data_6') -- self.bind(udma, 'sfu_stream_out_data_7', udma, 'stream_out_data_7') -- self.bind(udma, 'sfu_stream_out_data_8', udma, 'stream_out_data_8') -- self.bind(udma, 'sfu_stream_out_data_9', udma, 'stream_out_data_9') -- self.bind(udma, 'sfu_stream_out_data_10', udma, 'stream_out_data_10') -- self.bind(udma, 'sfu_stream_out_data_11', udma, 'stream_out_data_11') -- self.bind(udma, 'sfu_stream_out_data_12', udma, 'stream_out_data_12') -- self.bind(udma, 'sfu_stream_out_data_13', udma, 'stream_out_data_13') -- self.bind(udma, 'sfu_stream_out_data_14', udma, 'stream_out_data_14') -- self.bind(udma, 'sfu_stream_out_data_15', udma, 'stream_out_data_15') -+ # self.bind(udma, 'sfu_stream_out_data_0', udma, 'stream_out_data_0') -+ # self.bind(udma, 'sfu_stream_out_data_1', udma, 'stream_out_data_1') -+ # self.bind(udma, 'sfu_stream_out_data_2', udma, 'stream_out_data_2') -+ # self.bind(udma, 'sfu_stream_out_data_3', udma, 'stream_out_data_3') -+ # self.bind(udma, 'sfu_stream_out_data_4', udma, 'stream_out_data_4') -+ # self.bind(udma, 'sfu_stream_out_data_5', udma, 'stream_out_data_5') -+ # self.bind(udma, 'sfu_stream_out_data_6', udma, 'stream_out_data_6') -+ # self.bind(udma, 'sfu_stream_out_data_7', udma, 'stream_out_data_7') -+ # self.bind(udma, 'sfu_stream_out_data_8', udma, 'stream_out_data_8') -+ # self.bind(udma, 'sfu_stream_out_data_9', udma, 'stream_out_data_9') -+ # self.bind(udma, 'sfu_stream_out_data_10', udma, 'stream_out_data_10') -+ # self.bind(udma, 'sfu_stream_out_data_11', udma, 'stream_out_data_11') -+ # self.bind(udma, 'sfu_stream_out_data_12', udma, 'stream_out_data_12') -+ # self.bind(udma, 'sfu_stream_out_data_13', udma, 'stream_out_data_13') -+ # self.bind(udma, 'sfu_stream_out_data_14', udma, 'stream_out_data_14') -+ # self.bind(udma, 'sfu_stream_out_data_15', udma, 'stream_out_data_15') - - # Riscv bus watchpoint - if self.get_property('fc/riscv_fesvr_tohost_addr') is not None: -diff --git a/gvsoc/gvsoc_gap/gap/udma/CMakeLists.txt b/gvsoc/gvsoc_gap/gap/udma/CMakeLists.txt -index f24f248da..c070d4370 100644 ---- a/gvsoc/gvsoc_gap/gap/udma/CMakeLists.txt -+++ b/gvsoc/gvsoc_gap/gap/udma/CMakeLists.txt -@@ -24,6 +24,7 @@ vp_model(NAME "gap.udma.udma_v4_gap9_v2_impl" - "i2c/v4/udma_i2c_ucode.cpp" - "hyper/udma_hyper_v3.cpp" - "mram/udma_mram_v2.cpp" -+ "sfu/udma_sfu_v1_empty.cpp" - ) - - vp_model_compile_definitions(NAME "gap.udma.udma_v4_gap9_v2_impl" -@@ -38,6 +39,7 @@ vp_model_compile_definitions(NAME "gap.udma.udma_v4_gap9_v2_impl" - -DHAS_I2C - -DHAS_HYPER - -DHAS_MRAM -+ -DHAS_EMPTY_SFU - ) - - vp_model_include_directories(NAME "gap.udma.udma_v4_gap9_v2_impl" -diff --git a/gvsoc/gvsoc_gap/gap/udma/sfu/udma_sfu_v1_empty.cpp b/gvsoc/gvsoc_gap/gap/udma/sfu/udma_sfu_v1_empty.cpp -index 821fd25f8..39c7e1c7e 100644 ---- a/gvsoc/gvsoc_gap/gap/udma/sfu/udma_sfu_v1_empty.cpp -+++ b/gvsoc/gvsoc_gap/gap/udma/sfu/udma_sfu_v1_empty.cpp -@@ -15,7 +15,7 @@ - * limitations under the License. - */ - --/* -+/* - * Authors: Vladimir Popovic, GreenWaves Technologies (vladimir.popovic@greenwaves-technologies.com) - */ - -@@ -25,13 +25,104 @@ - - - --Sfu_periph_empty::Sfu_periph_empty(udma *top, int id, int itf_id) : Udma_periph(top, id) -+Sfu_periph_empty::Sfu_periph_empty(udma *top, int id, int itf_id) : Udma_periph(top, "sfu" + std::to_string(itf_id), id) - { - std::string itf_name = "sfu" + std::to_string(itf_id); - top->traces.new_trace(itf_name, &this->trace, vp::DEBUG); -+ - top->new_master_port("sfu_irq", &this->irq); -+ top->new_master_port("sfu_pdm_out_0", &this->irq); -+ top->new_master_port("sfu_pdm_out_1", &this->irq); -+ top->new_master_port("sfu_pdm_out_2", &this->irq); -+ top->new_master_port("sfu_pdm_out_3", &this->irq); -+ top->new_master_port("sfu_pdm_out_4", &this->irq); -+ top->new_master_port("sfu_pdm_out_5", &this->irq); -+ -+ top->new_master_port("sfu_pdm_in_0", &this->irq); -+ top->new_master_port("sfu_pdm_in_1", &this->irq); -+ top->new_master_port("sfu_pdm_in_2", &this->irq); -+ top->new_master_port("sfu_pdm_in_3", &this->irq); -+ top->new_master_port("sfu_pdm_in_4", &this->irq); -+ top->new_master_port("sfu_pdm_in_5", &this->irq); -+ top->new_master_port("sfu_pdm_in_6", &this->irq); -+ top->new_master_port("sfu_pdm_in_7", &this->irq); -+ top->new_master_port("sfu_pdm_in_8", &this->irq); -+ top->new_master_port("sfu_pdm_in_9", &this->irq); -+ top->new_master_port("sfu_pdm_in_10", &this->irq); -+ top->new_master_port("sfu_pdm_in_11", &this->irq); -+ -+ top->new_master_port("sfu_ws_in_0", &this->irq); -+ top->new_master_port("sfu_ws_in_1", &this->irq); -+ top->new_master_port("sfu_ws_in_2", &this->irq); -+ -+ -+ // top->new_slave_port("sfu_stream_in_ready_0", &this->in); -+ // top->new_slave_port("sfu_stream_in_ready_1", &this->in); -+ // top->new_slave_port("sfu_stream_in_ready_2", &this->in); -+ // top->new_slave_port("sfu_stream_in_ready_3", &this->in); -+ // top->new_slave_port("sfu_stream_in_ready_4", &this->in); -+ // top->new_slave_port("sfu_stream_in_ready_5", &this->in); -+ // top->new_slave_port("sfu_stream_in_ready_6", &this->in); -+ // top->new_slave_port("sfu_stream_in_ready_7", &this->in); -+ // top->new_slave_port("sfu_stream_in_ready_8", &this->in); -+ // top->new_slave_port("sfu_stream_in_ready_9", &this->in); -+ // top->new_slave_port("sfu_stream_in_ready_10", &this->in); -+ // top->new_slave_port("sfu_stream_in_ready_11", &this->in); -+ // top->new_slave_port("sfu_stream_in_ready_12", &this->in); -+ // top->new_slave_port("sfu_stream_in_ready_13", &this->in); -+ // top->new_slave_port("sfu_stream_in_ready_14", &this->in); -+ // top->new_slave_port("sfu_stream_in_ready_15", &this->in); -+ // top->new_slave_port("sfu_stream_out_data_0", &this->in); -+ // top->new_slave_port("sfu_stream_out_data_1", &this->in); -+ // top->new_slave_port("sfu_stream_out_data_2", &this->in); -+ // top->new_slave_port("sfu_stream_out_data_3", &this->in); -+ // top->new_slave_port("sfu_stream_out_data_4", &this->in); -+ // top->new_slave_port("sfu_stream_out_data_5", &this->in); -+ // top->new_slave_port("sfu_stream_out_data_6", &this->in); -+ // top->new_slave_port("sfu_stream_out_data_7", &this->in); -+ // top->new_slave_port("sfu_stream_out_data_8", &this->in); -+ // top->new_slave_port("sfu_stream_out_data_9", &this->in); -+ // top->new_slave_port("sfu_stream_out_data_10", &this->in); -+ // top->new_slave_port("sfu_stream_out_data_11", &this->in); -+ // top->new_slave_port("sfu_stream_out_data_12", &this->in); -+ // top->new_slave_port("sfu_stream_out_data_13", &this->in); -+ // top->new_slave_port("sfu_stream_out_data_14", &this->in); -+ // top->new_slave_port("sfu_stream_out_data_15", &this->in); -+ -+ top->new_master_port("sfu_stream_in_data_0", &this->irq); -+ top->new_master_port("sfu_stream_in_data_1", &this->irq); -+ top->new_master_port("sfu_stream_in_data_2", &this->irq); -+ top->new_master_port("sfu_stream_in_data_3", &this->irq); -+ top->new_master_port("sfu_stream_in_data_4", &this->irq); -+ top->new_master_port("sfu_stream_in_data_5", &this->irq); -+ top->new_master_port("sfu_stream_in_data_6", &this->irq); -+ top->new_master_port("sfu_stream_in_data_7", &this->irq); -+ top->new_master_port("sfu_stream_in_data_8", &this->irq); -+ top->new_master_port("sfu_stream_in_data_9", &this->irq); -+ top->new_master_port("sfu_stream_in_data_10", &this->irq); -+ top->new_master_port("sfu_stream_in_data_11", &this->irq); -+ top->new_master_port("sfu_stream_in_data_12", &this->irq); -+ top->new_master_port("sfu_stream_in_data_13", &this->irq); -+ top->new_master_port("sfu_stream_in_data_14", &this->irq); -+ top->new_master_port("sfu_stream_in_data_15", &this->irq); -+ top->new_master_port("sfu_stream_out_ready_0", &this->irq); -+ top->new_master_port("sfu_stream_out_ready_1", &this->irq); -+ top->new_master_port("sfu_stream_out_ready_2", &this->irq); -+ top->new_master_port("sfu_stream_out_ready_3", &this->irq); -+ top->new_master_port("sfu_stream_out_ready_4", &this->irq); -+ top->new_master_port("sfu_stream_out_ready_5", &this->irq); -+ top->new_master_port("sfu_stream_out_ready_6", &this->irq); -+ top->new_master_port("sfu_stream_out_ready_7", &this->irq); -+ top->new_master_port("sfu_stream_out_ready_8", &this->irq); -+ top->new_master_port("sfu_stream_out_ready_9", &this->irq); -+ top->new_master_port("sfu_stream_out_ready_10", &this->irq); -+ top->new_master_port("sfu_stream_out_ready_11", &this->irq); -+ top->new_master_port("sfu_stream_out_ready_12", &this->irq); -+ top->new_master_port("sfu_stream_out_ready_13", &this->irq); -+ top->new_master_port("sfu_stream_out_ready_14", &this->irq); -+ top->new_master_port("sfu_stream_out_ready_15", &this->irq); - } -- -+ - - vp::IoReqStatus Sfu_periph_empty::custom_req(vp::IoReq *req, uint64_t offset) - { -diff --git a/install_python_deps.sh b/install_python_deps.sh -index 89d9d66d5..3b55961c6 100755 ---- a/install_python_deps.sh -+++ b/install_python_deps.sh -@@ -60,7 +60,7 @@ then - pip3 install -r tools/nntool/tests/requirements.txt - fi - -- pip3 install -r tools/audio-framework/requirements.txt -+# pip3 install -r tools/audio-framework/requirements.txt - pip3 install -r utils/gapy_v2/requirements.txt - pip3 install -r doc/requirements.txt - fi From 06289bfc702930e2083700149f18ea2e8a4b6f0b Mon Sep 17 00:00:00 2001 From: Run Wang <52746141+SamanthaWangdl@users.noreply.github.com> Date: Wed, 4 Feb 2026 22:40:11 +0000 Subject: [PATCH 38/49] Fix linting --- Deeploy/Targets/GAP9/Platform.py | 1 + DeeployTest/deeployRunner_gap9.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Deeploy/Targets/GAP9/Platform.py b/Deeploy/Targets/GAP9/Platform.py index 79f0e6ac06..49d676af46 100644 --- a/Deeploy/Targets/GAP9/Platform.py +++ b/Deeploy/Targets/GAP9/Platform.py @@ -243,6 +243,7 @@ class GAP9StructBuffer(StructBuffer): allocTemplate = BasicAllocateTemplate.referenceStructAllocateTemplate deallocTemplate = NodeTemplate("") + _includeList = ["pmsis.h", "DeeployGAP9Math.h", "pulp_nn_kernels.h", "DeeployMchan.h"] diff --git a/DeeployTest/deeployRunner_gap9.py b/DeeployTest/deeployRunner_gap9.py index b41f505b4d..ace2d8eb25 100644 --- a/DeeployTest/deeployRunner_gap9.py +++ b/DeeployTest/deeployRunner_gap9.py @@ -12,7 +12,7 @@ # Define parser setup callback to add GAP9-specific arguments def setup_parser(parser): parser.add_argument('--cores', type = int, default = 8, help = 'Number of cores (default: 8)\n') - + sys.exit( main(default_platform = "GAP9", default_simulator = "gvsoc", From 82de2e1263df6af9ce246c14fda30e7b8ea248e3 Mon Sep 17 00:00:00 2001 From: Run Wang <52746141+SamanthaWangdl@users.noreply.github.com> Date: Wed, 4 Feb 2026 22:54:36 +0000 Subject: [PATCH 39/49] Fix Linting 2.0 --- .github/workflows/_runner-gap9.yml | 2 +- .github/workflows/ci-platform-gap9-tiled.yml | 2 +- Container/Makefile | 52 ++++++-------------- DeeployTest/testRunner_gap9.py | 34 ------------- DeeployTest/testRunner_tiled_gap9.py | 24 --------- 5 files changed, 16 insertions(+), 98 deletions(-) delete mode 100644 DeeployTest/testRunner_gap9.py delete mode 100644 DeeployTest/testRunner_tiled_gap9.py diff --git a/.github/workflows/_runner-gap9.yml b/.github/workflows/_runner-gap9.yml index 450f27ea95..7f556a8e59 100644 --- a/.github/workflows/_runner-gap9.yml +++ b/.github/workflows/_runner-gap9.yml @@ -51,4 +51,4 @@ jobs: export CCACHE_DIR=/app/.ccache pytest test_platforms.py -v -n 4 -m "gap9 and ${{ inputs.pytest-marker }}" deactivate - shell: bash \ No newline at end of file + shell: bash diff --git a/.github/workflows/ci-platform-gap9-tiled.yml b/.github/workflows/ci-platform-gap9-tiled.yml index d0c2c90482..3c13699433 100644 --- a/.github/workflows/ci-platform-gap9-tiled.yml +++ b/.github/workflows/ci-platform-gap9-tiled.yml @@ -27,7 +27,7 @@ jobs: select-env: uses: ./.github/workflows/_select-env.yml with: - docker_image_deeploy: ${{ github.event.inputs.docker_image_deeploy || (github.repository == 'pulp-platform/Deeploy' && 'ghcr.io/pulp-platform/deeploy-gap9:latest' || 'ghcr.io/runwangdl/deeploy:gap9') }} + docker_image_deeploy: ${{ github.event.inputs.docker_image_deeploy || (github.repository == 'pulp-platform/Deeploy' && 'ghcr.io/pulp-platform/deeploy-gap9:latest' || 'ghcr.io/runwangdl/deeploy:gap9') }} gap9-kernels-tiled-singlebuffer-L2: needs: select-env diff --git a/Container/Makefile b/Container/Makefile index e62be5d383..cd07d8632b 100644 --- a/Container/Makefile +++ b/Container/Makefile @@ -5,62 +5,38 @@ # Variables TOOLCHAIN_IMAGE ?= ghcr.io/pulp-platform/deeploy-toolchain:latest DEEPOY_IMAGE ?= ghcr.io/pulp-platform/deeploy:latest -DEEPOY_GAP9_IMAGE ?= ghcr.io/pulp-platform/deeploy-gap9:latest -SSH_PRIVATE_KEY ?= ~/.ssh/id_ed25519 - -.PHONY: all toolchain deeploy deeploy-gap9 push clean help +.PHONY: all toolchain deeploy push clean help help: @echo "Makefile for building Deeploy Docker images" @echo "" @echo "Usage:" - @echo " make toolchain # Build only the toolchain image" - @echo " make deeploy # Build only the deeploy image" - @echo " make deeploy-gap9 # Build only the GAP9 deeploy image" - @echo " make all # Build all images" - @echo " make clean # Remove all images (optional and dangerous)" + @echo " make toolchain # Build only the toolchain image" + @echo " make deeploy # Build only the deploy image" + @echo " make all # Build both images" + @echo " make clean # Remove all images (optional and dangerous)" @echo "" @echo "Build Variables:" - @echo " TOOLCHAIN_IMAGE # Name of the toolchain image (default: $(TOOLCHAIN_IMAGE))" - @echo " DEEPOY_IMAGE # Name of the deeploy image (default: $(DEEPOY_IMAGE))" - @echo " DEEPOY_GAP9_IMAGE # Name of the GAP9 deeploy image (default: $(DEEPOY_GAP9_IMAGE))" - @echo " SSH_PRIVATE_KEY # Path to SSH private key for GAP9 build (default: $(SSH_PRIVATE_KEY))" + @echo " TOOLCHAIN_IMAGE # Name of the toolchain image (default: $(TOOLCHAIN_IMAGE))" + @echo " DEEPOY_IMAGE # Name of the deploy image (default: $(DEEPOY_IMAGE))" @echo "" @echo "Example Usage:" @echo " make toolchain TOOLCHAIN_IMAGE=my-toolchain:latest" - @echo " make deeploy DEEPOY_IMAGE=my-deeploy:latest" - @echo " make deeploy-gap9 DEEPOY_GAP9_IMAGE=my-deeploy-gap9:latest" - @echo " make all TOOLCHAIN_IMAGE=my-toolchain:latest DEEPOY_IMAGE=my-deeploy:latest" - @echo " make deeploy-gap9 SSH_PRIVATE_KEY=/path/to/key" + @echo " make deeploy DEEPOY_IMAGE=my-deploy:latest" + @echo " make all TOOLCHAIN_IMAGE=my-toolchain:latest DEEPOY_IMAGE=my-deploy:latest" # Build only the toolchain image toolchain: - DOCKER_BUILDKIT=1 docker build \ - -f Dockerfile.toolchain \ - -t $(TOOLCHAIN_IMAGE) .. + DOCKER_BUILDKIT=1 docker build -f Dockerfile.toolchain -t $(TOOLCHAIN_IMAGE) .. # Build the final deploy image using the toolchain image deeploy: - DOCKER_BUILDKIT=1 docker build \ - --ssh default \ - -f Dockerfile.deeploy \ - --build-arg BASE_IMAGE=$(TOOLCHAIN_IMAGE) \ - -t $(DEEPOY_IMAGE) .. - -# Build the GAP9 deploy image -deeploy-gap9: - eval $$(ssh-agent) && \ - ssh-add $(SSH_PRIVATE_KEY) && \ - DOCKER_BUILDKIT=1 docker build \ - --ssh default \ - -f Dockerfile.gap9 \ - --build-arg DEEPOY_IMAGE=$(DEEPOY_IMAGE) \ - -t $(DEEPOY_GAP9_IMAGE) .. + DOCKER_BUILDKIT=1 docker build -f Dockerfile.deeploy --build-arg BASE_IMAGE=$(TOOLCHAIN_IMAGE) -t $(DEEPOY_IMAGE) .. -# Build all images -all: toolchain deeploy deeploy-gap9 +# Build both +all: toolchain deeploy # Clean all images (optional and dangerous) clean: - docker rmi $(TOOLCHAIN_IMAGE) $(DEEPOY_IMAGE) $(DEEPOY_GAP9_IMAGE) || true + docker rmi $(TOOLCHAIN_IMAGE) $(DEEPOY_IMAGE) || true diff --git a/DeeployTest/testRunner_gap9.py b/DeeployTest/testRunner_gap9.py deleted file mode 100644 index 9335bdbad8..0000000000 --- a/DeeployTest/testRunner_gap9.py +++ /dev/null @@ -1,34 +0,0 @@ -# SPDX-FileCopyrightText: 2025 ETH Zurich and University of Bologna -# -# SPDX-License-Identifier: Apache-2.0 - -from testUtils.testRunner import TestRunner, TestRunnerArgumentParser - -if __name__ == "__main__": - - parser = TestRunnerArgumentParser( - tiling_arguments = False, description = "Deeploy Code Generation Utility for the GAP9 Platform (no Tiling).") - - parser.add_argument('--cores', - metavar = '', - dest = 'cores', - type = int, - default = 8, - help = 'Set number of cluster cores') - - parser.add_argument('--profileUntiled', - action = 'store_true', - dest = 'profileUntiled', - default = False, - help = 'Profile Untiled') - - # Set default GVSOC install dir - for action in parser._actions: - if action.dest == 'gvsoc_install_dir': - action.default = "${GAP_SDK_HOME}/install/workstation" - args = parser.parse_args() - - testRunner = TestRunner(platform = "GAP9", simulator = "gvsoc", tiling = False, argument_parser = parser) - - testRunner.cmake_args += f" -D NUM_CORES={args.cores}" - testRunner.run() diff --git a/DeeployTest/testRunner_tiled_gap9.py b/DeeployTest/testRunner_tiled_gap9.py deleted file mode 100644 index c1bd72528a..0000000000 --- a/DeeployTest/testRunner_tiled_gap9.py +++ /dev/null @@ -1,24 +0,0 @@ -# SPDX-FileCopyrightText: 2025 ETH Zurich and University of Bologna -# -# SPDX-License-Identifier: Apache-2.0 - -from testUtils.testRunner import TestRunner, TestRunnerArgumentParser - -if __name__ == "__main__": - - parser = TestRunnerArgumentParser(tiling_arguments = True, - description = "Deeploy Code Generation Utility for the GAP9 Platform (Tiling).") - - parser.add_argument('--cores', - metavar = '', - dest = 'cores', - type = int, - default = 8, - help = 'Set number of cluster cores') - - args = parser.parse_args() - - testRunner = TestRunner(platform = "GAP9", simulator = "gvsoc", tiling = True, argument_parser = parser) - - testRunner.cmake_args += f" -D NUM_CORES={args.cores}" - testRunner.run() From adfe9f3a08812073aa2b124c38117154f220f070 Mon Sep 17 00:00:00 2001 From: Run Wang <52746141+SamanthaWangdl@users.noreply.github.com> Date: Wed, 4 Feb 2026 23:11:22 +0000 Subject: [PATCH 40/49] Exclude prebuilt directories from license checks The prebuilt pulp-nn library headers already have Apache 2.0 licenses but lack SPDX identifiers. Since these are external prebuilt binaries (similar to third_party code), they should be excluded from SPDX license validation. Co-Authored-By: Claude Sonnet 4.5 --- .github/workflows/ci-lint.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci-lint.yml b/.github/workflows/ci-lint.yml index 75163aafaf..5226fda558 100644 --- a/.github/workflows/ci-lint.yml +++ b/.github/workflows/ci-lint.yml @@ -64,4 +64,4 @@ jobs: - name: Check Licenses shell: bash run: | - python scripts/reuse_skip_wrapper.py $(find . \( -name '*.py' -o -name '*.c' -o -name '*.h' -o -name '*.html' -o -name '*.rst' -o -name '*.yml' -o -name '*.yaml' \) -not -path "*toolchain*" -not -path "*third_party*" -not -path "*.git/*" -not -path "*install/*" -type f) + python scripts/reuse_skip_wrapper.py $(find . \( -name '*.py' -o -name '*.c' -o -name '*.h' -o -name '*.html' -o -name '*.rst' -o -name '*.yml' -o -name '*.yaml' \) -not -path "*toolchain*" -not -path "*third_party*" -not -path "*prebuilt*" -not -path "*.git/*" -not -path "*install/*" -type f) From 67e7e5b2e2ae57154ea9f17ec7a5f0348bea10a1 Mon Sep 17 00:00:00 2001 From: Run Wang <52746141+SamanthaWangdl@users.noreply.github.com> Date: Wed, 4 Feb 2026 23:54:55 +0000 Subject: [PATCH 41/49] Fix coderabbit comments --- .github/workflows/_runner-gap9-tiled.yml | 2 +- .github/workflows/_runner-gap9.yml | 2 +- .../workflows/infra-generate-ccache-gap9.yml | 54 +++++++++++++++++++ Deeploy/Targets/GAP9/Platform.py | 2 +- cmake/gap9/gap9_gvsoc.cmake | 5 +- 5 files changed, 58 insertions(+), 7 deletions(-) create mode 100644 .github/workflows/infra-generate-ccache-gap9.yml diff --git a/.github/workflows/_runner-gap9-tiled.yml b/.github/workflows/_runner-gap9-tiled.yml index 1f1fceca78..d456f9f353 100644 --- a/.github/workflows/_runner-gap9-tiled.yml +++ b/.github/workflows/_runner-gap9-tiled.yml @@ -39,7 +39,7 @@ jobs: uses: actions/cache/restore@v4 with: path: /app/.ccache - key: ccache-ci + key: ccache-gap9 - name: Run Test run: | source /app/install/gap9-sdk/.gap9-venv/bin/activate diff --git a/.github/workflows/_runner-gap9.yml b/.github/workflows/_runner-gap9.yml index 7f556a8e59..d5d8d8e4c0 100644 --- a/.github/workflows/_runner-gap9.yml +++ b/.github/workflows/_runner-gap9.yml @@ -39,7 +39,7 @@ jobs: uses: actions/cache/restore@v4 with: path: /app/.ccache - key: ccache-ci + key: ccache-gap9 - name: Run Test run: | source /app/install/gap9-sdk/.gap9-venv/bin/activate diff --git a/.github/workflows/infra-generate-ccache-gap9.yml b/.github/workflows/infra-generate-ccache-gap9.yml new file mode 100644 index 0000000000..b189bfd708 --- /dev/null +++ b/.github/workflows/infra-generate-ccache-gap9.yml @@ -0,0 +1,54 @@ +# SPDX-FileCopyrightText: 2025 ETH Zurich and University of Bologna +# +# SPDX-License-Identifier: Apache-2.0 + +--- +name: Infrastructure • Generate CCache GAP9 + +"on": + workflow_dispatch: + inputs: + docker_image_deeploy: + description: "Deeploy GAP9 Image to use" + required: false + default: "ghcr.io/pulp-platform/deeploy-gap9:latest" + schedule: + # Runs the workflow on the default branch every day at 2AM CET to keep the cache fresh + - cron: "0 2 * * *" + +jobs: + generate-ccache-gap9: + runs-on: ubuntu-latest + container: + image: ${{ github.event.inputs.docker_image_deeploy || 'ghcr.io/pulp-platform/deeploy-gap9:latest' }} + steps: + - name: Checkout Repo + uses: actions/checkout@v4 + with: + submodules: recursive + - name: Build Deeploy + shell: bash + run: | + source /app/install/gap9-sdk/.gap9-venv/bin/activate + source /app/install/gap9-sdk/configs/gap9_evk_audio.sh || true + pip install -e . || true + deactivate + + - name: Generate CCache for GAP9 + run: | + source /app/install/gap9-sdk/.gap9-venv/bin/activate + source /app/install/gap9-sdk/configs/gap9_evk_audio.sh || true + export GVSOC_INSTALL_DIR=/app/install/gap9-sdk/install/workstation + export GAP_RISCV_GCC_TOOLCHAIN=/app/install/gcc/gap9 + cd DeeployTest + mkdir -p /app/.ccache + export CCACHE_DIR=/app/.ccache + pytest 'test_platforms.py::test_gap9_kernels[Kernels/Integer/Add/Regular]' --skipsim + pytest 'test_platforms.py::test_gap9_tiled_kernels_l2_singlebuffer[Kernels/Integer/Add/Large-5000-L2-singlebuffer]' --skipsim + deactivate + + - name: Clean and Upload CCache + uses: actions/cache@v4 + with: + path: /app/.ccache + key: ccache-gap9 diff --git a/Deeploy/Targets/GAP9/Platform.py b/Deeploy/Targets/GAP9/Platform.py index 49d676af46..d40c2c4440 100644 --- a/Deeploy/Targets/GAP9/Platform.py +++ b/Deeploy/Targets/GAP9/Platform.py @@ -293,7 +293,7 @@ def getTargetMemoryLevel(self, node: gs.Node, tensorName: str, ctxt: NetworkCont class MemoryGAP9PlatformWrapper(MemoryPlatformWrapper): - untiledOps = ["add"] + untiledOps = [] def __init__(self, platform: GAP9Platform, memoryHierarchy: MemoryHierarchy, defaultTargetMemoryLevel: MemoryLevel): assert isinstance(platform, GAP9Platform), \ diff --git a/cmake/gap9/gap9_gvsoc.cmake b/cmake/gap9/gap9_gvsoc.cmake index 8ba89685d6..62bd7d9b9f 100644 --- a/cmake/gap9/gap9_gvsoc.cmake +++ b/cmake/gap9/gap9_gvsoc.cmake @@ -6,9 +6,6 @@ set(GAP9_GVSOC_DEFINED TRUE) macro(add_gvsoc_emulation name target) - if(NOT DEFINED GVSOC_INSTALL_DIR) - message(FATAL_ERROR "CMake variable GVSOC_INSTALL_DIR not set. Please specify it with -DGVSOC_INSTALL_DIR=") - endif() set(GVSOC_WORKDIR ${CMAKE_BINARY_DIR}/gvsoc_workdir) make_directory(${GVSOC_WORKDIR}) @@ -16,7 +13,7 @@ macro(add_gvsoc_emulation name target) # GAP9 SDK paths set(GAP9_SDK_HOME $ENV{GAP_SDK_HOME}) - if(NOT DEFINED GAP9_SDK_HOME) + if(NOT GAP9_SDK_HOME) message(FATAL_ERROR "Environment variable GAP_SDK_HOME not set") endif() From 67bbbb56d1d2d4349f63046a3ca09329954b212b Mon Sep 17 00:00:00 2001 From: Run Wang <52746141+SamanthaWangdl@users.noreply.github.com> Date: Thu, 5 Feb 2026 01:33:14 +0000 Subject: [PATCH 42/49] Remove unwanted changes from GAP9 prebuilt library commit - Remove TargetLibraries/GAP9/third_party from git tracking (this is a CMake-generated symlink that should not be in the repo) - Add GAP9/third_party to .gitignore to prevent future tracking - Revert pulp-nn-mixed submodule to original commit (a9b4aaf5) (submodule was unintentionally updated to b69ec23e) --- .gitignore | 3 +++ TargetLibraries/GAP9/third_party | 1 - TargetLibraries/PULPOpen/third_party/pulp-nn-mixed | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) delete mode 120000 TargetLibraries/GAP9/third_party diff --git a/.gitignore b/.gitignore index dc93328e4a..cf8c24d228 100644 --- a/.gitignore +++ b/.gitignore @@ -51,4 +51,7 @@ DeeployTest/Tests/**/*.json DeeployTest/Tests/**/generateTest.py DeeployTest/out.txt +# CMake-generated symlinks +TargetLibraries/GAP9/third_party + CHANGELOG_GEN.md diff --git a/TargetLibraries/GAP9/third_party b/TargetLibraries/GAP9/third_party deleted file mode 120000 index 25d2a7cdbb..0000000000 --- a/TargetLibraries/GAP9/third_party +++ /dev/null @@ -1 +0,0 @@ -/app/Deeploy/Deeploy/TargetLibraries/GAP9/../PULPOpen/third_party \ No newline at end of file diff --git a/TargetLibraries/PULPOpen/third_party/pulp-nn-mixed b/TargetLibraries/PULPOpen/third_party/pulp-nn-mixed index b69ec23ec8..a9b4aaf597 160000 --- a/TargetLibraries/PULPOpen/third_party/pulp-nn-mixed +++ b/TargetLibraries/PULPOpen/third_party/pulp-nn-mixed @@ -1 +1 @@ -Subproject commit b69ec23ec81595ebbec694f4a28d84022858af83 +Subproject commit a9b4aaf597c030ce24bf65a00b5f3ec84a1528c4 From a0e65a6cf46a63761dae2a55407c67a5dfaa4555 Mon Sep 17 00:00:00 2001 From: Run Wang <52746141+SamanthaWangdl@users.noreply.github.com> Date: Thu, 5 Feb 2026 10:46:46 +0000 Subject: [PATCH 43/49] =?UTF-8?q?Move=20pulp-nn=20to=20targetlibrary/third?= =?UTF-8?q?-party=20and=20correct=20ci=20workflow=20sel=E2=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/ci-platform-gap9-tiled.yml | 2 +- .github/workflows/ci-platform-gap9.yml | 3 ++- .gitignore | 3 --- .gitmodules | 4 ++-- README.md | 2 -- TargetLibraries/GAP9/CMakeLists.txt | 11 +---------- TargetLibraries/GAP9/src/Util.c | 9 +-------- TargetLibraries/PULPOpen/CMakeLists.txt | 4 ++-- TargetLibraries/PULPOpen/third_party/pulp-nn-mixed | 1 - TargetLibraries/PULPOpen/third_party/pulp-nnx | 1 - 10 files changed, 9 insertions(+), 31 deletions(-) delete mode 160000 TargetLibraries/PULPOpen/third_party/pulp-nn-mixed delete mode 160000 TargetLibraries/PULPOpen/third_party/pulp-nnx diff --git a/.github/workflows/ci-platform-gap9-tiled.yml b/.github/workflows/ci-platform-gap9-tiled.yml index 3c13699433..0043f8d3e9 100644 --- a/.github/workflows/ci-platform-gap9-tiled.yml +++ b/.github/workflows/ci-platform-gap9-tiled.yml @@ -27,7 +27,7 @@ jobs: select-env: uses: ./.github/workflows/_select-env.yml with: - docker_image_deeploy: ${{ github.event.inputs.docker_image_deeploy || (github.repository == 'pulp-platform/Deeploy' && 'ghcr.io/pulp-platform/deeploy-gap9:latest' || 'ghcr.io/runwangdl/deeploy:gap9') }} + docker_image_deeploy: ${{ github.event.inputs.docker_image_deeploy || github.repository == 'pulp-platform/Deeploy' && 'ghcr.io/pulp-platform/deeploy-gap9:latest'}} gap9-kernels-tiled-singlebuffer-L2: needs: select-env diff --git a/.github/workflows/ci-platform-gap9.yml b/.github/workflows/ci-platform-gap9.yml index a05015a5df..079f13c2a5 100644 --- a/.github/workflows/ci-platform-gap9.yml +++ b/.github/workflows/ci-platform-gap9.yml @@ -19,6 +19,7 @@ name: CI • GAP9 required: false default: "ghcr.io/pulp-platform/deeploy-gap9:latest" + concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true @@ -27,7 +28,7 @@ jobs: select-env: uses: ./.github/workflows/_select-env.yml with: - docker_image_deeploy: ${{ github.event.inputs.docker_image_deeploy || (github.repository == 'pulp-platform/Deeploy' && 'ghcr.io/pulp-platform/deeploy-gap9:latest' || 'ghcr.io/runwangdl/deeploy:gap9') }} + docker_image_deeploy: ${{ github.event.inputs.docker_image_deeploy || (github.repository == 'pulp-platform/Deeploy' && 'ghcr.io/pulp-platform/deeploy-gap9:latest') }} gap9-kernels: needs: select-env diff --git a/.gitignore b/.gitignore index cf8c24d228..dc93328e4a 100644 --- a/.gitignore +++ b/.gitignore @@ -51,7 +51,4 @@ DeeployTest/Tests/**/*.json DeeployTest/Tests/**/generateTest.py DeeployTest/out.txt -# CMake-generated symlinks -TargetLibraries/GAP9/third_party - CHANGELOG_GEN.md diff --git a/.gitmodules b/.gitmodules index ea01f2734d..f8bad9fc4e 100644 --- a/.gitmodules +++ b/.gitmodules @@ -3,10 +3,10 @@ # SPDX-License-Identifier: Apache-2.0 [submodule "pulp-nn-mixed"] - path = TargetLibraries/PULPOpen/third_party/pulp-nn-mixed + path = TargetLibraries/third_party/pulp-nn-mixed url = https://github.com/pulp-platform/pulp-nn-mixed.git [submodule "pulp-nnx"] - path = TargetLibraries/PULPOpen/third_party/pulp-nnx + path = TargetLibraries/third_party/pulp-nnx url = https://github.com/pulp-platform/pulp-nnx.git [submodule "CMSIS-NN"] path = TargetLibraries/CMSIS/third_party/CMSIS-NN diff --git a/README.md b/README.md index 4944c8c51c..a9f6251876 100644 --- a/README.md +++ b/README.md @@ -67,8 +67,6 @@ python deeployRunner_softhier.py -t ./Tests/Kernels/Integer/Add/Regular --toolch python deeployRunner_chimera.py -t ./Tests/Kernels/Integer/Add/Regular ``` -For the experimental support of GAP9, please refer to the [GAP9.md](GAP9.md) file. - To restart and connect to the container, run: ``` docker start -i deeploy_main diff --git a/TargetLibraries/GAP9/CMakeLists.txt b/TargetLibraries/GAP9/CMakeLists.txt index c32a89066a..c61cf163bd 100644 --- a/TargetLibraries/GAP9/CMakeLists.txt +++ b/TargetLibraries/GAP9/CMakeLists.txt @@ -70,16 +70,7 @@ if(NOT USE_PREBUILT_PULPNN) # Build pulp-nn from source message(STATUS "[Deeploy GAP9] Building pulp-nn-mixed from source") - # RW: Create symlink to PULPOpen third_party if it doesn't exist - if(NOT EXISTS ${CMAKE_CURRENT_LIST_DIR}/third_party) - file(CREATE_LINK - ${CMAKE_CURRENT_LIST_DIR}/../PULPOpen/third_party - ${CMAKE_CURRENT_LIST_DIR}/third_party - SYMBOLIC) - message(STATUS "[Deeploy GAP9] Created symlink: third_party -> ../PULPOpen/third_party") - endif() - - add_subdirectory(third_party/pulp-nn-mixed) + add_subdirectory(../third_party/pulp-nn-mixed) #RW: GCC not recognizing -Wno-typedef-redefinition defined in PULP-NN CMakelist target_compile_options(pulp-nn-mixed PRIVATE -Wno-error) diff --git a/TargetLibraries/GAP9/src/Util.c b/TargetLibraries/GAP9/src/Util.c index 453ea9d21f..710b9ed521 100644 --- a/TargetLibraries/GAP9/src/Util.c +++ b/TargetLibraries/GAP9/src/Util.c @@ -13,14 +13,7 @@ int deeploy_log(const char *__restrict fmt, ...) { va_list args; va_start(args, fmt); - int ret; - -#if defined(AM_PART_APOLLO4B) | defined(DAM_PART_APOLLO3) - ret = am_util_stdio_vprintf(fmt, args); -#else - ret = vprintf(fmt, args); -#endif - + int ret = vprintf(fmt, args); va_end(args); return ret; } diff --git a/TargetLibraries/PULPOpen/CMakeLists.txt b/TargetLibraries/PULPOpen/CMakeLists.txt index 0b9a3247e7..b0d47b7b37 100644 --- a/TargetLibraries/PULPOpen/CMakeLists.txt +++ b/TargetLibraries/PULPOpen/CMakeLists.txt @@ -39,7 +39,7 @@ target_compile_options(deeploypulp PRIVATE target_include_directories(deeploypulp PUBLIC ${PULP_SDK_INCLUDES}) target_compile_options(deeploypulp PUBLIC ${PULP_SDK_COMPILE_FLAGS}) -add_subdirectory(third_party/pulp-nn-mixed) +add_subdirectory(../third_party/pulp-nn-mixed) target_include_directories(pulp-nn-mixed PUBLIC ${PULP_SDK_INCLUDES}) target_compile_options(pulp-nn-mixed PUBLIC ${PULP_SDK_COMPILE_FLAGS}) @@ -54,7 +54,7 @@ if (platform IN_LIST PULP_NNX_PLATFORMS) else() message(FATAL_ERROR "Missing accelerator flags for platform ${platform}") endif() - add_subdirectory(third_party/pulp-nnx) + add_subdirectory(../third_party/pulp-nnx) target_include_directories(pulp-nnx PUBLIC ${PULP_SDK_INCLUDES}) target_compile_options(pulp-nnx PUBLIC ${PULP_SDK_COMPILE_FLAGS}) target_compile_options(pulp-nnx PRIVATE diff --git a/TargetLibraries/PULPOpen/third_party/pulp-nn-mixed b/TargetLibraries/PULPOpen/third_party/pulp-nn-mixed deleted file mode 160000 index a9b4aaf597..0000000000 --- a/TargetLibraries/PULPOpen/third_party/pulp-nn-mixed +++ /dev/null @@ -1 +0,0 @@ -Subproject commit a9b4aaf597c030ce24bf65a00b5f3ec84a1528c4 diff --git a/TargetLibraries/PULPOpen/third_party/pulp-nnx b/TargetLibraries/PULPOpen/third_party/pulp-nnx deleted file mode 160000 index 234971fca4..0000000000 --- a/TargetLibraries/PULPOpen/third_party/pulp-nnx +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 234971fca4a0eba5e8b703e9ccb62b7764dac7fa From 3dd6ec11a295af3649e46f986fc69e06c18f9798 Mon Sep 17 00:00:00 2001 From: Run Wang <52746141+SamanthaWangdl@users.noreply.github.com> Date: Thu, 5 Feb 2026 11:20:09 +0000 Subject: [PATCH 44/49] Trigger CI From 09c70abf22422fa9728c8663ddeeed7e0dc5f85d Mon Sep 17 00:00:00 2001 From: Run Wang <52746141+SamanthaWangdl@users.noreply.github.com> Date: Thu, 5 Feb 2026 11:36:50 +0000 Subject: [PATCH 45/49] Register submodules at new paths in TargetLibraries/third_party/ --- TargetLibraries/third_party/pulp-nn-mixed | 1 + TargetLibraries/third_party/pulp-nnx | 1 + 2 files changed, 2 insertions(+) create mode 160000 TargetLibraries/third_party/pulp-nn-mixed create mode 160000 TargetLibraries/third_party/pulp-nnx diff --git a/TargetLibraries/third_party/pulp-nn-mixed b/TargetLibraries/third_party/pulp-nn-mixed new file mode 160000 index 0000000000..faed38c72b --- /dev/null +++ b/TargetLibraries/third_party/pulp-nn-mixed @@ -0,0 +1 @@ +Subproject commit faed38c72b029b69dcab98571d228a66c3263891 diff --git a/TargetLibraries/third_party/pulp-nnx b/TargetLibraries/third_party/pulp-nnx new file mode 160000 index 0000000000..c4f6ba351e --- /dev/null +++ b/TargetLibraries/third_party/pulp-nnx @@ -0,0 +1 @@ +Subproject commit c4f6ba351e30b31125baba35896db394804d819d From 6fb9cd23dc00538aab3effdcf77295b9b025e231 Mon Sep 17 00:00:00 2001 From: Run Wang <52746141+SamanthaWangdl@users.noreply.github.com> Date: Thu, 5 Feb 2026 11:51:19 +0000 Subject: [PATCH 46/49] Fix CMake add_subdirectory for out-of-tree sources Specify binary directory when adding third_party submodules since they are not subdirectories of PULPOpen/GAP9. --- TargetLibraries/GAP9/CMakeLists.txt | 2 +- TargetLibraries/PULPOpen/CMakeLists.txt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/TargetLibraries/GAP9/CMakeLists.txt b/TargetLibraries/GAP9/CMakeLists.txt index c61cf163bd..ca4c3ffbeb 100644 --- a/TargetLibraries/GAP9/CMakeLists.txt +++ b/TargetLibraries/GAP9/CMakeLists.txt @@ -70,7 +70,7 @@ if(NOT USE_PREBUILT_PULPNN) # Build pulp-nn from source message(STATUS "[Deeploy GAP9] Building pulp-nn-mixed from source") - add_subdirectory(../third_party/pulp-nn-mixed) + add_subdirectory(../third_party/pulp-nn-mixed ${CMAKE_CURRENT_BINARY_DIR}/pulp-nn-mixed) #RW: GCC not recognizing -Wno-typedef-redefinition defined in PULP-NN CMakelist target_compile_options(pulp-nn-mixed PRIVATE -Wno-error) diff --git a/TargetLibraries/PULPOpen/CMakeLists.txt b/TargetLibraries/PULPOpen/CMakeLists.txt index b0d47b7b37..1a510c945b 100644 --- a/TargetLibraries/PULPOpen/CMakeLists.txt +++ b/TargetLibraries/PULPOpen/CMakeLists.txt @@ -39,7 +39,7 @@ target_compile_options(deeploypulp PRIVATE target_include_directories(deeploypulp PUBLIC ${PULP_SDK_INCLUDES}) target_compile_options(deeploypulp PUBLIC ${PULP_SDK_COMPILE_FLAGS}) -add_subdirectory(../third_party/pulp-nn-mixed) +add_subdirectory(../third_party/pulp-nn-mixed ${CMAKE_CURRENT_BINARY_DIR}/pulp-nn-mixed) target_include_directories(pulp-nn-mixed PUBLIC ${PULP_SDK_INCLUDES}) target_compile_options(pulp-nn-mixed PUBLIC ${PULP_SDK_COMPILE_FLAGS}) @@ -54,7 +54,7 @@ if (platform IN_LIST PULP_NNX_PLATFORMS) else() message(FATAL_ERROR "Missing accelerator flags for platform ${platform}") endif() - add_subdirectory(../third_party/pulp-nnx) + add_subdirectory(../third_party/pulp-nnx ${CMAKE_CURRENT_BINARY_DIR}/pulp-nnx) target_include_directories(pulp-nnx PUBLIC ${PULP_SDK_INCLUDES}) target_compile_options(pulp-nnx PUBLIC ${PULP_SDK_COMPILE_FLAGS}) target_compile_options(pulp-nnx PRIVATE From c4768e195c2905ca7c69371248eb619631cc66a4 Mon Sep 17 00:00:00 2001 From: Run Wang <52746141+SamanthaWangdl@users.noreply.github.com> Date: Thu, 5 Feb 2026 21:21:31 +0000 Subject: [PATCH 47/49] Change CHANGELOG --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0b53ef188d..dd2c68517c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,7 @@ This file contains the changelog for the Deeploy project. The changelog is divid - Fix bias hoisting in generic GEMM with no bias [#126](https://github.com/pulp-platform/Deeploy/pull/126) ### Added +- **GAP9 Platform Support**: Deployer, Bindings, Templates, Tiler, DMA (L3Dma/MchanDma), target library, CI workflows - `pytest` and `pytest-xdist` as dependencies of Deeploy. - A `pytest.ini` for the global configuration of PyTest for the project. - `conftest.py` to define CLI args for PyTest for the whole project, it also defines a set of global fixtures and markers. @@ -93,6 +94,7 @@ This file contains the changelog for the Deeploy project. The changelog is divid - Calculate non-kernel overhead and show total time spent during profiling ### Changed +- PULP-NN moved to TargetLibraries third-party folder - Each CI workflow has been simplified to call the pytest suite with certain markers. - Structure of Tests subdir for improved ordering - Structure of .gitignore file for improved ordering From f0be2ec697061b8d7c26a372a5116d705995bf20 Mon Sep 17 00:00:00 2001 From: Philip Wiese Date: Fri, 6 Feb 2026 15:43:46 +0100 Subject: [PATCH 48/49] Fix Changelog --- CHANGELOG.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ea96ad1c56..871dcb66cf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,12 +5,15 @@ This file contains the changelog for the Deeploy project. The changelog is divid ### List of Pull Requests +- Deeploy-GAP9 Platform [#143](https://github.com/pulp-platform/Deeploy/pull/143) - Update CLI interface Across Project, Fix Tutorial, and Remove Legacy Test [#157](https://github.com/pulp-platform/Deeploy/pull/157) ### Added -- +- Added GAP9 Platform Support: Deployer, Bindings, Templates, Tiler, DMA (L3Dma/MchanDma), target library, CI workflows ### Changed +- Update `pulp-nnx` and `pulp-nn-mixed` submodules to their latest versions +- PULP-NN moved to TargetLibraries third-party folder - Aligned CLI commands across the project ### Fixed @@ -50,8 +53,7 @@ This file contains the changelog for the Deeploy project. The changelog is divid - Fix bias hoisting in generic GEMM with no bias [#126](https://github.com/pulp-platform/Deeploy/pull/126) ### Added -- **GAP9 Platform Support**: Deployer, Bindings, Templates, Tiler, DMA (L3Dma/MchanDma), target library, CI workflows -- The `publish.yml` action to build a branch and push it to PyPi. The action is automatically triggered when a tag with the "v*" format is emitted. +- The `publish.yml` action to build a branch and push it to PyPi. The action is automatically triggered when a tag with the "v*" format is emitted. - I created a release of [Banshee](https://github.com/pulp-platform/banshee/releases/tag/v0.5.0-prebuilt) so we don't need to rebuild it over and over. The `Makefile` now pulls that release depending on the platform. - I bumped the onnx-graphsurgeon version such that we don't need to use NVIDIA's PyPi index anymore. - `_export_graph` assigns their export type to the tensors before export. @@ -117,7 +119,6 @@ This file contains the changelog for the Deeploy project. The changelog is divid - Calculate non-kernel overhead and show total time spent during profiling ### Changed -- PULP-NN moved to TargetLibraries third-party folder - Rename package name from `PULP-Deeploy` to `deeploy-pulp`. - Each CI workflow has been simplified to call the pytest suite with certain markers. - Structure of Tests subdir for improved ordering From 36cf5bc5572f3e91fc1839641f4410dafbe6fbd5 Mon Sep 17 00:00:00 2001 From: Philip Wiese Date: Fri, 6 Feb 2026 15:49:11 +0100 Subject: [PATCH 49/49] Fix formatting --- Deeploy/Targets/GAP9/Deployer.py | 4 ++-- cmake/gap9/gap9_gvsoc.cmake | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Deeploy/Targets/GAP9/Deployer.py b/Deeploy/Targets/GAP9/Deployer.py index cf7382d0ed..f179754c2d 100644 --- a/Deeploy/Targets/GAP9/Deployer.py +++ b/Deeploy/Targets/GAP9/Deployer.py @@ -32,10 +32,10 @@ class GAP9Deployer(PULPDeployer): """ GAP9-specific deployer using cl_dma.h API. - + This deployer uses GAP9-specific transformers that employ ClDma (cl_dma.h) instead of the low-level MCHAN API used by PULPDeployer. - + The key differences from PULPDeployer: - DMA: Uses ClDma (PMSIS cl_dma.h) instead of MchanDma (MCHAN hardware API) - L3 RAM: Uses GAP9 APS256XXN OctaSPI RAM accessed via pi_cl_ram_* APIs diff --git a/cmake/gap9/gap9_gvsoc.cmake b/cmake/gap9/gap9_gvsoc.cmake index 62bd7d9b9f..5a6b205376 100644 --- a/cmake/gap9/gap9_gvsoc.cmake +++ b/cmake/gap9/gap9_gvsoc.cmake @@ -21,14 +21,14 @@ macro(add_gvsoc_emulation name target) if(GAPY_RUNNER_ARGS) # L3 mode: Use gapy with flash layout and readfs message(STATUS "[Deeploy GAP9] L3 mode: using gapy with readfs") - + set(GAPY "${GAP9_SDK_HOME}/utils/gapy_v2/bin/gapy") set(FLASH_LAYOUT "${GAP9_SDK_HOME}/utils/layouts/default_layout_multi_readfs.json") set(FSBL_BINARY "${GAP9_SDK_HOME}/install/target/bin/fsbl") set(SSBL_BINARY "${GAP9_SDK_HOME}/install/target/bin/ssbl") # Build the gapy command - set(GAPY_CMD + set(GAPY_CMD ${GAPY} --target=gap9.evk --target-dir=${GAP9_SDK_HOME}/install/workstation/generators @@ -63,13 +63,13 @@ macro(add_gvsoc_emulation name target) # Convert list to string for printing string(REPLACE ";" " " GAPY_CMD_STR "${GAPY_CMD}") - + add_custom_target(gvsoc_${name} DEPENDS ${name} WORKING_DIRECTORY ${GVSOC_WORKDIR} COMMAND bash -c "${CMAKE_COMMAND} -E copy_if_different ${CMAKE_BINARY_DIR}/*.bin ${GVSOC_WORKDIR}/ 2>/dev/null || true" - COMMAND ${CMAKE_COMMAND} -E copy_if_different - ${GAP9_SDK_HOME}/utils/efuse/GAP9/efuse_hyper_preload.data + COMMAND ${CMAKE_COMMAND} -E copy_if_different + ${GAP9_SDK_HOME}/utils/efuse/GAP9/efuse_hyper_preload.data ${GVSOC_WORKDIR}/chip.efuse_preload.data COMMAND ${CMAKE_COMMAND} -E echo "==========================================" COMMAND ${CMAKE_COMMAND} -E echo "[Deeploy GAP9] Executing gapy command (L3 mode with readfs):" @@ -81,7 +81,7 @@ macro(add_gvsoc_emulation name target) USES_TERMINAL VERBATIM ) - + else() # L2 mode: Use traditional gvsoc command directly (no flash/readfs) message(STATUS "[Deeploy GAP9] L2 mode: using traditional gvsoc without flash")

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 xg1uxq(y-FiNRe7@HZ9tNIgR$f^N$G1AYNJX8&^ zf>#5)k0_}+6V*`*p!*&J{ZZw-VXFat^u!LT3AQY^IM2InpglLa(01BZRO`EDrDesw zo|dKq_6=Qg-4FU(w!0!TD>5Tog;Wi2S(fKQ&X1}AHVsw-tVr`(+rBE!?|(-%z(ZH! z{9^vkbAGK_HNXnTU^T$Bp=y9r8Ry46LEok$_gy-Q=`Xr_s2bp*6P*QiZ+0hDbluLb zu&0kxeQQtfC7fTKb%m|L6-vLzG3y5J+*4J$bN8+PNTEvIgVg}9P^tTOpH->5;7jEE z(sNM@kbaeeYJk?EU*s$dSHF`T&TDlq2*0pa_k!?YYjsmKK<&Q$s%YG|J3oFeBDFIs z(^2TGaptBKe7n|~vIUf1ON)=)xA(Wlz-fLq(6{?*Q_sA4e-$Cs|F~p z8lcICssUlJfV_`IH9&j=|60m#_RQ(|x2n??FD;lgD{k?$nKKKPE;dhdFPWj{&&=0GUWT5z zL5b&a(El!s-?+gCgPifZT8f>top(wx7{5#@#^dr{DPBzR#kBx`M9(ex#2LRf8fOym z4@qE*NW?!S@t72Y@iWu&Rz8szF^L#F1Z5Mi1$bJDAEf+2DaIWc##s1dQXV0JdJQ6e zltd?uTZs7gBzkCUM8tn2fiVsd?<5gH;~64;hQ!rUyqn_3q__JmT5nm%Ga7{5Ykd0_muOWO;^FH3qqY5@jF-v<~! znTb*<{*iHL`Lij$M~cDtt&olvE5%>{#P*;T;3v}dp%!4Rbo_mbVuFVT+k^4LxF(-W z3K&0lVu=`xAI1$uj9P#l((#E}fM#hv>eWn^wg=GRo1 z@d0W3o}suyig!~SB(>j1F~+mS@(xg3Asz1>6h}zyk5IftI^SNWc)4^wfbo+V*mo#y zmd;ny0+eg_^-}zRv^+3=W2EyDj9r&_>{E0s0Fx5Y7fS5veX`oUoQQL z{f#8OUOK+7r#M>LU(^EhO7kb;z0&%oQf!rC6|uBFcncnp_CJB*E-6MWz?-G*1>=`1 zeIH=_8m03A$KH17cm?A(LE1hre$7%0#;;!5KC$O`9gf)pUx5j=S+30N4eOu_ z?8b<(&tULCg_)UgsVM%&$hr%v`Ee4D6_L}b`LQLl0&`}S)u)r{`0)~SX3ftPfSFk< zbjK>+QOuU4xw5ilPX`yrAU_7`u|jujn>ZrK05yi|F^G`!gd9R+v>fB%SXn^Eq|F4d z#yCF)@0nR`J%-P*GJlNTn}w~O#eq9);!q(!&f_s?5ZlK5RvFR9@WD8?y&Q()jB!2L+gx+i%ljz3;qjwrwI}fH&|0x(f zE3|fgF)mN*TfjvNMi1wgVDxZq2}Tc$j9~O0f~GNDOnU0S1*7*a_1%K8f>wDG<(!m< z7Wn|`t3`Wgksl-Fp+){SDGx33^Q1hq$loF5p+){4DGx33^~h`e3AD(gKCZ|^i~JEO z4=wV&QXX35Bj`I3^$+7oi)BKKHVdRYw8$@)^3Wo`TFOId2VSTG$^q!`ERxo;J zNQ>_sT5K~0`b8dE^3WpxGtzd1<=|KpuXP}4mBvX$ZL$=P46eHXNa>&etF2}TdUBN2=qtLc}-+q{Wlvg&Qn+4?yp8LP(5YN+fllKZzY`LS9%_M3(LT3WXl)ie1Ld>4#fs-zb{<3G(bt$@~ey)BYH z1g)`qCh8LeuZQ2F2puPB{Kib=3nb0z`(^QUF%~bI>#5YAh}wYLp%?LdA2bT6(ew%Q zx4CvueBAOEbz!>TwhIk%6GXAhrWmFanRr6`ex|mTz}>K9o>xlhri?B z1r8VL_6IpV9ESKmftaXUXA=%d>Vg#uixg$oSVei0`YSs9ugKq#P21<rj3`f7m8E>@VT(W)Oe3R(hjY9v#B;|DmDjR}(JJ-^G~) zeK&5Xj-Prt{%-p8IM)2L>-hcbM!sLe@ps=C#=BR}P5i-l&3U(U0o8EHUNx$z6fV6n zFWEce_kp-W<-Jn!@=d60sU$Lv`S*g*Yi_r`*0j5gyZ3$$`Yx9IfyuXb;qFl}FH$AH z2wLW70~oxt#4#Z7;#Rko)E|jIZa?z=jTT*Ba*nMk>qaH4bGF6jc}r>WmYI%u`V{r4 z+2_<*Zz}O#m3*&!I~RU{C@eBYF|J~+y{q@?<65dZZ&Ko_RTpu1*WRRTOldly`hR3W zY(K1yIINVyy*GPANZSj(wTJb-)^KB$AGyd^-M7M zj*bWkJ33LZcc_1!*l#}(nijjK>Y<5BRShwJcaV3l@y~k48>*>EA80Jxy#1hB`6N~F zYuMJXX`sdXe9`m1iVB13IjZkI6k+rQ->7qJ^R2!`*W>W%zo{!~Eq*yRuQf01Yh#s| zS3ukOj3*M+5%=hPL2p{xUhUfxn7zrdDY?&CxYhn@jUzU@e_xJM9dXp)@hjdEbD%j{ z4SqARr86kC|9FjexifCJ&$C&H*pJ#_?VBRnI=xk)la+?5nk{POTZwVUyoYOFY&~jk zFFM+nw<^V57OYfxZ&Cg`qQ|;*WA7`fXOl(sH|d(*0FSpZH=lUCcl4o-sJwx^)5*S# z9f_r(y6^{0E4CJI^Swp>$FD_p#UG4&!G5UkSpUo3)|g#66(=i-Tod;+dD2sJZPqz( z@BJd4y&G-h*}Kg@s@2-Mpw&@E_4hXEcg(MG29alPLRwC)mpprKPTY~MZm6Ys?=a8a z+PTk>XYU(>1Ygl3WtH&k^}@5)MxMQ6{V(U)JLg>J|BPpET(sLaPa zdjkhOdt)k^D>@dqOZ^5tdkub*lv2O1E1|ZNwrEzFFVrP`d;gire6H}$rw@mpefrDy z>|OLw@2X?rZ>(y`b#DmDByX??^6bt2X(Gn{*mxj$_OkImc=p1>SNQdkSFd_wTA%ux zJq2VYs~jsT$wam#@ZG_PN}8 z*M2Uy-VJc;z2*|P-oVet?KP8IZ^7_xz2$K0z3Wo9-g3D0-gT*4Z#mq0@4D2jw;XQ0 zcU|JvyZI`2*LN>*>&@BHwI%0EbL;IIbn6YYFPpn+F6&7K-FgjvvDA~qi=Kq4@lj8r zIrjcD)%ZkD@{hRnE(-5lc`W?wO7{eE>ot&D@0!nc>m7Vg{O5P;T|{oZ#~!+Sr8Uc~ z1cc}3x<>|0_=Z!>{topy6$T1?TX=-e~3T$zOV{ z((5cqZ&*-v)xcJ7O?S&LPp6RgXk=7kbD!rlEX1J8T+#vE&Yv3t|hbzcUXcQUX0 zsVn>Rs*~sR!ND-PY`jvT6AT{*o!8?V+QJy_rx?TQ@m;)y zK5QXI#wEJvpUJHi9=;N_SMv{2d%K^Wn!Cf1lU1Bu zSlfHR;XFlTh>6lGfQN6bK4HkicK{x~jti^vaSz}2M0acRSL@*$IBa#k zN`H&bU-R%?{S{Z|GyTWIH!d61`KH3dH|T|b(!;l6$iuf}$ivq_9=@fk2d}VHoiEfS zJbbTMov;4N9=_rVyS%h-4XX1+dAt`@=QA400?LfW0HdkQROWB=FWqqNyy2Sn&kt7T zE9pC58r*l@5PbH0>Bh6?7j6E3s}@mpK5?&3*GFSO5M3Wf2aUn?QNCNp_3=knzCMb( zb#{F;UR7M<-P)b>%N}_5rlb`(Y8>$HP08Enq^f))3N`QEHp#p9Z;9?>XSbmj7-;ME z=y#o3V9M$zfAMhg?ybpO7@qiGq}>pS3Q}0ldfb$ zqt28P?b%*M&CFZR}nGJ7?}@ygyJpI{6{HXDaF61SmyEm zNbv+3BjFRT(f5fIKSML-(b$KWzng^2*X*Mh9&3CuDKC+L|B;AaB@v2;yKMS=UcQYq z1}577m4wXm{f*)p>HGX|iXWEt?<~cw(&zOl#b#+f_`OW&`vkvNC&l3RYVq)#P29`3 zSo(fP(|oyR;8=HVnDhdMc8{ixB0@of>eQ7n7)9;6tx zGQ|8&irc00>lnpyO}sZLULlv8 zV(@!%%|P&bLDJ_1elJ9d!SA8&k61tWy&mcK2ETVwI{t8M$u&B`?|mR`ANW1^M2h7J zh1cPDJ@9>)P`B|4yxxqdR3* z&}_qc^D>g|^4`3Ru4BC3P>H=EOmGP4V<_P)zSWGY^k?6G#h=E?;T`E!zA{%0r9%CMgds@{db-Xpu)> zC^)?jpvUm<3w@&C^zMPCae7SX8wIC_ephgMUC`I@He=~{5u6@a8o}v33_XswIR$+K z*XUmbrziXHg0B>;G92A^h1oR}HUjjXu>!+coa2-eI zso?ZhLf^vk9_VRYw?j|o`V(mCCor+PdfHCjLFc%rrMDhhv?p32sZCdN#6slv3V8H8hiGHq~%(AW2g@itlcz8r%L)xNi$CG8+;o!O8FIp{>0A9neW!uY^wKx&e9)*PlSAaBZh^UvPR3(jlol z|1k1tT!R4?oZb`Ab9p|R&Q0;&snFWzhPs==hxd7CZ8=?}1;00y&RN0l#gi8NUOMtl zzWf@}g5Lv|EBL*4q0@PrbI=)F-%ZyF!S5AIx&m6`_gGy$jo)iWUekfpR|tOZHfW7u zTOjFsB)wYF4@h-?uA~;^(M3_;99P+$9#CTeV-OO^j`Swj=Y<< zw?Kb~YdhL3<2oJsyIiB*o?!V3puflSUk1NNw=Bc?@KXA-e0bTt$A9=e?W@SASGoi+ z1`jFld-y+sn5esF6Anr0jui`ws4gDyd*`U{qORbI{ND4ltgmVB!3)-fzxCQHy|C#G zYPUiJ^oll^@G7e`$$@ud&l{z8kfWPRNA>x3kE-2MnnX;XEpfE);Ej5*`2~3J_GVPf zA-C6Xc<`zopJMeIO^ZyYl(Le>uFec!W867k+(D)4HPzC%S$OcOnWm726JeP*DGgrV zAyY`0cY@+Gow78%9Gl6AzS5`k>gra-keN8DYU?Nk4!qHCs3Z32Gc$dA_V`7;T)P?G zyPX+f9`fBKst-%_?ftP|!)sxg6O|n=^=6z}Xx>+tsjl|vtHQ2T?1z2EK0TJBdOp(k zt@V)a?v7o7Ci6Dm+V`#f9X&}!&W0_mht$9dz0d!z26yf+a{Ei^DYhZ%b)T_2aYddd zsd-z`mOy9A{=zKKcm3@xRhiDftf-gzlhlBB4a@SjS9x9JtJ{&87j^lqXr_->2(&eb8Y z6*YSYUQKwxSDvXfACBsZKh)%UWY5Nwo-&6gq5NaZKBcr=^UqcKly&8re=hmr#%Ad| z-5~)h8Zt6%QCT^84e4c6A+KAn($f1=GPBz9qK@xKD)weNPdHV77xTsK*qD&ya1`60 zOZAzutXnG|tTb0gkx%eDiObi-ceZax*fZdbJ5s;4!rHRH?bYWOI(svgrBwM}ub6BN z>AuSDMECCZ3r=O+zpGN`E*+t-GPRK_uD86Q434-SWla*sstrH>U>sG+qtWVgZ+>;Y zw|0{;xYg!fcwVnozC)vR!MZYMLs^r@_s&ODU*j(2Fm)izfvIkxVz0J)+gs|MKiS%L zz`DNUpl5Dua#LDic226@uAA>(8RRI*2z43C3`%LBKeKLh zO1CbC{IKes%DUfKm8*W2q_{?PKHcv*9C`NXVvn~xit1xrrSB^Hc$ZOEW}-1RjIbGK zM2(HAojq@;#E4qP%40QuU*+}>N^oBnkmBpAA--gDqVIGhaV4Wh`I;(v)Zf}^T>m$U z@tV4aI)2%m{JlQ2tJ6j_TV6tSXZlH3d}mR0B-OEj!))=9sN?x-ylFAXaq|k&OgY_& z@BCLqUP5R4>cWbiwJjUmZ=Ag)qO#Lkl+s+OmiOvwlk8btt{v%Bo-pO-W4bb|d!kZR z)A^)a=OY`ryy_t#?#7-J62vElcstDNL>M z)hLm+-t?+HVdPpnM)3u^bX6N)JYV(x`@w3ZKC!#K*Hn;wzvcTQ20Xes*ZwNr(_B{i zm`T}DZZ4lxH(FPE-=T3veWsu2d~4{hvC+@>^nSm% zvR2Ov8>{;Ig59f3@$O2)Y}NRLMV)zLzxyg<+|*Kxgf*5WQNK#VfN;r{weW&A25W$0CBqHLUUjl);6-BQ&VtrTvKt=?Wu%bxM^t^&mcDxwZl z#P1Z}Q~H*Ks^%>TwW@!n&b`6qH=fotp4NmaMef&J#z!fBl*Lnt|8g0|>uCNe%um34 z!=n^G%3=rR>&EM8eo25bD#)FgOPm+YrKodryvIn7^HXf@%y;z#X=;E!9m@eaqqD&? zm3WP}__0g_E|a3qQk|GSUE5~6*OQugyq=Edz6G&FD!18lQa!o4q>l0vt&tTy>%QTj zbFQ>??ddfI8@kr#uXC3MjVnptlwl~-D+c=6xG}|7xmC%nY%lF8@hyFUj_cg59y1`nMV9(r#%RR!@6Ru+xwT)Aj0v00Cg)f?z&DkUu6 zKrW4?bVd)(Yrc*882Zf0qiOyviotY?vS{-=D;GW7y3*}$2z8GNh*Ix(oX&vXCaU)w zpfh0aDD}4WL{!Zq_T~?YF);dWQUuL+a;IhbKBy!F9nHY~S3rxtHpgT~DsK zxVm(|`hHEB^Hj#1hCb`*6ca5mREb!l`rmGGJI~x!lvI#*zs031OKMybOIME{(fL4E z4@O8eQh)HY;xiT~#sJlGw?a$yj%e&pO2})=J7Fzy;ksA5iCB2Uo0gV!J!>3mIySbg z?LQcCB!5rT+EW{1Dk^Mr&D-p6K5aAE3g^I$dqrN=fw4-JX_Vs0sruxTV4vZSv>k8E zD9F2i*Z2|cynBPIJT|4uXj6QRr~G_7KlF?9?C`w8d%<$k&F-?RZ}ypp8fuK`cdsS{KLv%#W>GhAEAF#@u!~2U#ZgHq*PVjq>Py7ekP83KV)W6A4RW~vy^M* zsT+=2!ZN2QzOutglhZ>e)DzYl z$J6@8)7q;1$5K!C6XT;4Kg#0C)YJXMFn$%yUxoR%VZPx}iXUb1Jj~aPFQNG*!OEzs z-I+hrJxbA|6y;Vol$SX>J!(O}@nefeS#O;b{ghJr<3r=TR|UBla|`)iEGR;zpA zLcLm6XSv@(S6iyX7Vq&D6w$XvJvi$pPfBR}N1Fdn6}k&J;#iZP6Omk>*1gNs z)v?;Kwr73hyq2}C8wxAFf9CsdQJ-<{N`1y>^*WFI1%1Y+JLMy!xw5H5H?PUt9c4Oh zOi4I?^cfrvO=Uh)AD!_jbjBO$&tJLmxqsx0m$&4RzZ5zP=XmDe%vDXlvMh7b8Shs^ zJWq<5 zp@d4G2RM}NcqqgslL8KrTNdvR&H# zS16Xf1P@bODDCfYiVsTX$4QD~q~*Vh`O^9LH;Rj;_PrF}DaB_gPLSH8j?{h9d_8U3 z0ck$GBF9PRE4(6QP6KtMP;W$hKM@pi zZ*V55Qv2l;w@Wd+B2P){6MKf&;kcC|YL5wZ8LrH&4DStj8E%CYP}1lXMpiJO!#oVb z!e9qhzR9d%4y-+MVl-dY36cRB3@;hZ0}{N2`BH|(%$CgT4=?0aIKIK&#Tb+;a4QUY z!QRQ-3d1%Sbn;o;3bx?#+zLZZ{y}bqeG(iK;p7dg4Q1ve3-{t=;EG1Fuw7-8%J3u$ zgMipF@o`*2vS9Za$-+uSF`VTx_zEY2P``^;{NivBxBry=AT?9ZX_qHi*kk-SI!*=4 zg8odfEGMD0<2{i2VZpMDfu?anOa;(19*F4yXbfo3g!4?WEa+ne%Yw0O!Lnd%Td*uC z)K3eR1+@-Cweu2M<%?8Wr98CA_eptZkq@9{h~+?wyd8P%x&STm1yUYb1gpV#j%hr90{Q7&UrooVU^T` zTu&uEr_*?Xz`ROnDqO6d>F)4FqIBQ5Lmuo}Oob~MyFIAIx> z@G7a@KXhluE+Yb(hOZ|4d zw1RjHMs|?PVdHDQOuvw*H+%-4KCCK2so5L$YK#)Ow=l!{nu%Nv_vqC_h7i^Cg5Cpn zLq=(kvth@;q1e10r!Q!YUR`4{5Cib--n^hBWAMNhpK-aRb-yX8FRR~K^mL8)C?sGii6=Y5f?CJ~=8CQ%LEpNOZ`YBw<&uk`Nee>Hwz^WliD$V2fi;x5Mc z-`kL$nPkq3a^+;9=21Rz7ygM6$G2y8rqi!0v(nc%94TJazni%h7TYUw+c!LyTEEuk zIhh3R!dHHmB{#`jU0faCnebALHz6tRNFYX_M*0(Vv0@=r)uLzXrW6_%3w}G%J@>;U zSEMe8wa};w8WAVzg1C#}sEekuhT*9TFOAvI_)A^u$pak+t?NB=3$r7Wx2M@t<3U|) z2%4vNZE_im{xtsLk5Orfy1=OPmr7mu5p@yyd8rHf7HrFix@g*@mY>u`bb`Gg)?!=n zk(#_P@&PP59+6g`7MENwkGKoV+5hUdg1fL1cR?flQ!|rdGc)t(jLY_4zh`IrJ!W6%ut}`Vy&&^(OPb8+B2Z%BhQRMqTjH#CK>k z@svhgbhgyf(cHHnGC4M_$!<@rAnGFb_%|FK>mnX-{4$w~ zP+}^={xRmlNX*5^&(B=+tj%=QY_Mi@+PwDMilWq$i^}xzL|sG@bx}{$MI2EV8gp@7 z)}ey5W%DBP>hn%#=`(g%ZwUT%aLQ|TS6o(W7W(SYywiCbT}FdWGTYQEyi77Pt-La-^ZS%pVb@?wvt&OQTwLxPG&0SaKEG%!t z{fD#oBAkWM$vKPD)H4zx!Z-_jYacSs!g0KVXtcIgP!=ugaE%9PVISfw(m_`eQ>4+A zYjv$9Co6M@=t_;M6qF^n%7}6>mbK;mo?_31bS2{~1YP+BIg518S=bu#;?j!pTGBJg zO*3I@F4fxjtM1g?;?7KG6J7lyj-1Snu*W3(*8Nvv_seIGI@WfqUPhcnN=46lq72^t zYB`I~X1U^syaLO0b<%|-*XF+z+B|b|oK^m#mH0B1Xd;jnr-vgg=)ZQtxa|We#$&S{DaIq9^uhl~o0P>A7fCT59c`j# zmVDx@#W*ScA09JosRf z=Gi61M=6irnDL2wc1@t?7b5N^@z&r$#67#r(*FF7=F9BK`xL(`eI6fC+#-E{0~Gg3 zF<6V!()z$!6ieSHSc?K_K3EHk)$qxrjG;J0YJVNY_eskKYk}v@qCHp(Jl7TR6pH1s zb(P{D;h_ziOv-GE@0DV(77s|r3s{SJ((=Gs;Q6z7KUfRB)E=xwsx;q4F@Db}+TTI3 z%vON4I3w*ZSPMLF7wuWi4{1JFizU+X;n~$AE&qOs-8t<9C`O25T`^iosgQHD|zD%#h}v zqj-(9yiX}UF2!IiBBb_UEefRb7pw)It&8=8wZLyhMLe3~bJFt0Qk*NDpI|M(SBUmE zl3p$?4;)Q}6yHLz>_In!;;W_QgS7~fVhhFW!75vUNlBsjw6uNmD85J99@P9OkiHL$ z-8~^4uV5|wr1oGfDx?^!#c!nLYdgkXhGQwfVqiK$@3}HdF}!Ej@GJ!%GH1AfSt|#@ z$NbsY`UO@_Z17$y6Tt@hHMcIAmSE%Zyto7#!xx+cZ^Osyhd2r0*2SubnA!5p93fx~ z1dZ!#y_lJ-Pd}1m~@$Zzan0=V6jhXv(F{Fci zDH;~Tz9#k=n;DG(Bemf@yXe=rY_u2smf$BIht|%+L(tkW&R7Z>d%!e}`c=VCB9EFPqCK?8qrQm9 zLyLSMo!f!~fEIc1lOhi-@|mOs&vBpB23oXvNXkQtJo*vATQoz{7!W4(CxV{{g}#>O z(XR-80)3j`Cmww*8=v#T4_aq%c=Yn7<%+O!wZLE?` zmvp|QS4f(E3NZLyFZ6AEIk?{v>_senpMswNt0XkzClYvj#!q~c>k_oFa7{lZ9ONf3 zmMQp&addtOeggN#qSi${Y2ir)AL5V{zMOZFw{hJAoyzqG&}m#xrSnDb6Un4Q=JLE9 zc}?d-YoFD_(DQhk$I*U1*Ka{PxPA|9@EE*9YE)-U@4|TXY)4TUxju^8l1bxFPAiG5s5tGCp7i~ z_g;dZV9W#tsAuBVX> zS<3Znie&P`2M=s;}F0}tH*C(Ox;Tm;E1V7OOt??6I zIVV9^>i=*O{5!(oLS6j@oCNN9#Y9~>n=a-g*3dO_7xgW47_;|MH#saPF^}#+zQz~9 z{>8fRw_bZ?N&4q5YDW*#1}C(^gjcZ*h>ue{^ka0`U(u85lW^s8c~Yg)b@_6fL>$$x z5Yr$hK{N!%C-}e9r%j8SLGAF$GoM}4BKgM4a}r^uGr{z0-|(;>e;8b{lByi*)rEU4 z7iPIHRZ}T*r6ND7@i*TP26w9Q6B5J7KPqSUD0ouE?@OqpsuZKC8bWvr)wf6-W$%P% zmGGxZ-xKpf)1L8DsnP`;s-nLYHh$bEhbZCi`WOL(#5Z-(#4-f5-~yC#qNl< zmkc?pMwcd&FO@BE3}YskGgZftnB(zBz)cjU+3hvSzL}sV(saU?D(p2PAZE=xSCuu> z0#c%Bi(n?A(p1kV19%77mkJJ4O~(WM;}2g~$!H0`n{+C?s8Z_v!pKz$UQ``>>tBes z_a%pcpFow2*Hurlf%#VLt_q*1gk{5#Dm1NX>&;5z7T^BI{NO{SE;5A#+12>i{`3=5 z?W*U`%#&)P<5E{D)i{@2sZQv-Uym?&7W7y4ZEJhTUJ+BHu6;vS+#2)J_Po{w%bn>j z`zp8Tea0SQ7v8iKy-Kw)s%l@XNeUbLH6_SCux}Gl80&O>uNH6Hp0~--mP{2a^!EMf zTkUP0AfMj@mcq2c1NB|aj-KSASE8KuEj8Y-$Vp1gmX^-A-5rNpkNP~X>532fR@Yi$ zj`=*N5(~1nd*fawXDTE8l0M>Qa;93ImSFFFCCZ_i(h|3l$3Uy*PIb}|N);&1>Nn=q zW(+LovOQ?(uk{6glvrQod&fT{zTGfd7Y=`_#uJ5y29DLf+|-(|>tsdF(V$efKESWV zlWR*)wSHlLs;D&br@D5;*c4}LUP_uV*yn%Vuw#CtBPi!YMsxDAtR1;(d6mUltzPpH zu^P6-s6}my`VUlHeJ0p<%~Trw|6StN%J@gpAMur+O-$H(dRHHLRN0*=_U_Q&z|P#l z)WFQD@+hT$&aycsm&d6FA4%+SPR*n@e}BiCu$Q z84)_e4u5)HzfWfv_;}o;=>7ECKWKV~{bWxjYH%ECRsv|agH%EBux0MBP zkE(*a!d&0wJ*s|)-vk%ZvhSl;`iuUdvZ8v$=HAUKyj>k94tcTz=XT9qW$SEX{!}G? z_ZW;}{HczSKh+}cPqm8qQ;iC~llfAKs`pgwp7~Od zPn8cIRZAWk#r>#ab>nq4%A>jpMW5H}Y{)1JEUFpU+P%N1$CI4mI%P{qi?qk4cI7rb zl)g1=<7lORms;+pL!J9hd&HvpMcvNBZ^Y)2C)M$HY^`}wSsfeI^7Hy-Im>esDw~t5 z{Lh{5sP0Khc;mq|pMQ^1R#{u^V{TN-vUlY9%6pPf+aq)RshqNnKfl(#S0%n=fZV7~ zCDpdICA+Kq?y1NuN;;it%IeIGbrdl_sv3p;8l8?cb%cZYQK?rsxgXX3^C|YcrunCL z-M{O}5PO-9{OXQbCjM%NC!w@yjd{)3L^z5}itbZNfAPn0HRX+Es8CV*i?SPxK_iWm z>PVl@q+{fY+^VB@rp zEx%P<#TZ{})#03-RENL4I^V2oS`r>=u4>-YybXR-DOd2LviUzsd+;c2|KP9i%i%|5 zyNn-|?J|B;wqgCK=3e4QmA<88OFHwTTK>zpJokwn1A2`&61lToTv<(7ipNT|8R$3s zyMCt}Mz4Y2X-8AfQTJnd{jsuQOYfEyRlVMmyV^TC$dAgjsIzUw9f9^PJM*Ke@VnVy z45XeTl6sC<>N$qoGX6{Uqtbs&b$Zm`t8`r()a7UWKDKPst-E=?a@C{rm36#{~mwTItg2~=-Q{ri;8NV2tTS) z@}mlX9~IR;DI2R8sQyW*=X%9J97HLdNte9mAMm3(Mt)R_m>(5+ZHx#Ab%zH z)53*`YIZicQY}bS7tr6**G8$|IZFM{A?kk)jT+A!s3z*hui8qr7S@XX=c@j##lP&{ zd;jUyAR=`YSG?b;77RN*Gl~38U&LVN@L@ zl&YhIQgxJ2s*V!+|FQQya8Xrx`*&uTflL8KN7pTKQL!vtovZj~iyekPgNQ?m3Wy5H zC>3v6%NE;9t*hVwqC$xdMuojt)>5zAdW(vRbW}7lGE6jbt%X9@ZOx?(U3Syo^F8Mt zI3`xRZ=cb>L`PujxxA#!mi-S&__Y6 z4K1|x%ds}7H%;(V;tu%4O57bI6313}`l3#eXSAVK>5G@N71mFm@A%QB5vb_Md}&?q zd}&>)ekHF9)~*)}F^JlM=u`i*L!c*LK@_Lxf;iJQQcp1{qJ9*?iE4av^a14dZ3{7+ zW>LLO;U$O#wMHq3>)UF$i|SuE_6_7VBj@5hc|(di^#-C&#eGfGssH`WWg~$^)Bc;# z5(?2OE~*`By%l*BdFrB?q1K~u1We%+d+Lpg>jwW~tu?bKEeEkzu2J%%2V|Tt(=2DA z+zDsEC9TTrPQHI~?n+Z+X=;8PRAf?9GS0J@ju%IqI&G+pQCGhm z<$m+^dD-bjj(X^m+;86#>|Xfz)gjPy2{FYfA?0z3dgER{ZF+~F_T$5TaV1*hr+)1v z6~(cNcH0Ppdh)zMI~QQkB46-Rrys%y_O_q;>Ipwz`S=p`j$_EX&7d_Lf&X3Arzct90 z;*5N>VN2wehU$h#DH@L3^WqhwQD4%Y8I8J*MolY4zUD2Vbygtm|U^@4gQP_O{0e6{f1PwK=eVRs47e>ynjyEMn&~HE9l(_eHq+$FE3K;0VCeZrL z#=mE9-mk~__Xy7CT7CR8U)l4>imHyd``P_BB26WXM5L+k#nrC*jpi$ItG4ab*!_14 z?!UbY)Ioo=yN@2(+7#V6yJNj+XDeb%okDLk6#ZPOh%ps=W<+Q5$jt7{`|Tea%u2nP=@CoRrPF6jQr%OgPj%aD5$>r|kuzzDK9hsn7AcAMeB}Bzd1h9u z&xke33EF;&K5eA%d`!4V$%HqV(XdIwohQySy90Ai!lr47G|8svg=ZyuA?zB-UILq9 zF7U)-OBG1=oyd3s?=wX{9to5lyjK-AhG&JoV-+^>%#KR72R6;G@Wgp$H_*#bmUwKb z9?7P=GKv?#6X%)T)BC=cMlNYiJt zRGxTd4bu9EXD0L9NYm#&Y5B>pX+B4+e;VvROUHwFW>559)?Cx)QOPErS&el45YH@7 z+W()xHcB>W`ZP<|BWe185YxN;C9tcc^%2iZ*61OgS(&uI#4|HW`$L*O)1`dU^s!0X zUkRJEvw5;8#4~eA`$If4;{J$y;+bubj(>l#r2?hx6VJ>c*~Bw@S2`b0!w!_%*Z;z{ zNc*qB9wC({O&^)ZMw&jsQhCz!p?P6Z-zL~a()E21_6Vsw#g=+nYG3ceUMijM4`I)g z?2lnLOYQR%>z6o$W2F5Z1ACj4PqC!}rR`0G?T~DWEp@ZBz3H$|O8XxP`;=tI zz%G-He*)}I>G~#~*{jm^M?A9#sXlbA(LAWwAL5xkA=O9Z&~JadGUB08nuvY=3SQat z%f*(O-pdWrV@olf)_-D4{U^2*#CiVi*iv+vf!B#^Qt-*B?-G2n2*Ucc{s3XU9hDK* z`;c>l_4emLzbp7;)W!s#jM|srlkGrXF8E}72xFd>k_~;V;BS$ph2T69R(TP{f^kCl z2@C%S$xm4LFBfylE|n)N$|p;H!ot5)@)H*RJjqX3_$mI2;A0UM{szfUSon#jFUk`Z z{y$58!oq(Q`X|9xvjdA|35zm|BtK!{zen;D7JlNFi1iQ_e(DPaAFi432!1lCPZWH( zc)}yOpZZ3@hogR1@Zp}v^&!`>MH>`+JJJ)q;d<`BoBTI$yp!+* zjw8`d1>dfO@DI7ajPN9mn+Z?m_#9#M6D*-!3%=bv!d&b@Sxs2y+f@Mzy`pCFPveUo zBdl}mVsI=4$1Y96O9{{9>?b^G3llXz8z^62FG&$CxqiT zjzAk1d^@@)4vy!3(&iC-JNm{z@a?>WXY(>dh!M+@Mwj5*O(LuxpGOJL;^j#fF*uRq z0JK@b!=rBsL~N;v4cZ@GU>n~wp14RZ{_|X z!f70L5njsi-+%|-#<6h-@a-H20#C@{*h=`nI1VFx2gf%MzLVo`gNKLP&;DXd!Toiy zrP#g4zZDOU-YJQM?wKWO+UVLDM~)l``0KA6T`qFDTVT^Of=FV0bV;H+R_uDlb64@_ zV{`>y$-^tdy1uV3LqD`F`dg>};)kVQpgh3;=i$xJ6^Mw7CwO>MLAK+3JN{qr@TO1w=6Xf(*YN$~L)f*DiXNz_MNc}^ z`G_O*4S0CB|Fpi)l)5S;vb?bXEW41xw5Xx=$KV-?*ib_vkH@`D+&j`Ls^4dt2M!%H zj94@&M2%`_gL2Vsrd&iZrY;v>3K~bJKQJwhLZm9LS`>E31a6|o<3-iIh`>0p7C}m#A{Gp727m~plcr&YsfyWe!rhTZ$ibWxn z;Oed3Yf=Nw+UwsMnX0A*1XoxP#pa5W(CtB#sga>v>8SLCQFT7yhc&sj`_&!Jo!^-f zGIY2Sc3684QKtM38@p4~^Z~&k^T#W$4=TPlQW^h7@_VYMj>ncNf7xL%=WVLpsTI{5 zd)AE4EVa~asoOx&N3_6?Oq%7C(Y;__W^QJ+qryB~>DjEB=R&!t$kClA&^Ok1_}{cXu@Y1O+PGOGT=4Bn%yX*~|r z|3nmGLlq1$>3V185%ovod$fT{l&fl0oON%tLk-Hb=fAUN4;_mN%f1V0F|=vk z6v{=_h%80QMOwjacC83erEVJ(T(#GGDDK@I>u2s8nW`0cBC1s3a6?FBTSBJW9Aqqu zYe8fw)qiHxSH+g9N`}T!g^@IloYhR~HLvG7M-!7CMtrG!C>*sqGMuD&lxnZ{M(&O{TIzHxa(n%6L42u{ zoIa(a^3Eu?ulw&(I?DED_osB^;7UgeFr$4dpV6+_h8fEzl>{gqQGBUR#Fz51_)^^q zC^8Slms%C$F1SSLsPMlHojksjh%|vH6W>yNsi43c-PZ)fP-GpgtrkoX#Fj#gsnN=_ zc=x@?;PDH4wCRzK#-$>*RB|MaWqxH!W_xOONzaA>nbxBf1;Z8VF^Vl!$74%HpO7?; zy4SnkPo3Br-rP#B7+dM}r#w;$*O;067=1Iw{ zO@-yf2aL*uAG(l`n< zPx;m&ORfI@PveM3ma31*!xbzdOPxk!spj=9Ya7>ufQ!^wl2zKaZsgj?LU&1EXo0Tn zVH(IHrAK4L|mx=>y|jgRyn=K8xtN=wZ0xPrT$>=*fRX^sYThd ziWV27LE|Xd6A*WBd}@8_`FQ9Y8GF#52PQQoH&$NZzaeer;m9Kqsg0@DEj_!+l8u=^ z@c$owPe6TZ!_l~wj_+qa`z6NIKN3%Bs;+Nzz|j=foV!1-k>aaTuq9quhySZp@j>BS?Ko*$6k86qD-unzS!P zkh-qHyEYP65YskdV_eVX$V$z0vt1|~oi3|Cn7uo^G<40W_0aEIp z{>LWO{A(UT%E6V5D6&xh5u_ZY6hn$fkm_E5czcK-wJIiL(3v3jTEvjLNZY7|Vn~&< z7*Zeq6>EfsA#rIiy2~-7s#y%Fd_<01A;pmT+Q^ZXKnr4X2D123ZHOba>`9F5wcvhY zWM4@md(EQ>kJ8AVk`ytkC)t*o|FGu2KtU8K#E$BmZQX)#{%DGGWM*=SH6|;4+bq_< z?L6^5MUYy)zA7=U)VHR4{axtdJ0kT6QkS%F*3V#zeeHTHtiHbDe_8CP-@Yba8x%Wg zRRUs14YnMo*inDFOzfzeUi(I^9oyrry{`^0eDl~*tX(2rTusVFv7;92v7?fDJaNB6 z>?ms06PTjWo&WsUQMM(vB@r_svfN81PoJ7SWm>ikl15q6vfSC()70tu8%A{eQWDRx z760`EYD{SZKp zWYf5NO0pk=JrD0XdEz{i7|H$>GTx<^7%Xv~3C+z2n|LNolKl#0(8~vwIM1X<%HIe7 zm-UQfy^=%7zXR_pdEz{iQWOo(XBX2>Xu!F6n&!33i&ae`jHn zwg68S*Em5#4431o(aV)5ao$y zvR&F9@k|1x{hJJ%G!I01;+dS5jt}FR(2FRRIM3v9$tIr3PU-p~p2;0jeSQM_X2~X= z34K#9)<-;(+oXKrnY=3H6VIeevWaIBER`po$#c^6N<5QhY5$04Lc0E9dn;j&lFAd$ zBum;K;+c>Rf+*i#?5KC8<4bx*FG=eop2L@ zDMWpUXVNX5AL5yi4ui<=FLqRqRQ?Fc%X(GEU_UG6x5GB#y}Vc-UHkMsyRb>mC|xQ~ zdPX-&_F34Yr1F1*Jx|J~Ij`+fKIs|BJS5_D(VU~$9_bmCN$uYXTjse@?5JF+Jn0#Y zlFE~|(Q4`Xrr1%$^$_c)*il}oJjIUMF4?4KL~|>mJjIT(N%g1LQBx$FVn>Bb^`Y2N z0n+iL*ijp#`Vh~=D_wuYGdU<-uf!u6FO{b`d^z^iJ+NtRM$}Ir`t6UGB4S4cqE27U zOX)v$)Ma=n|A`$nm4%5Sk)Ij#k4JH0nnM4H9rbs_j>2padrfb{buG9m&4l$f*iKl# z-v8d%QPj=^SB3gm!Bsg(81o#IjuY0oDt7eKf~!K@UBM|Jtn%VYo#ZDh{2xkw!ouGr z`3VdEc(i%JJ0L9lagv{~@aF*wZU||uh-C?jGS5qX!opAei{N@3Cp?1h4D~aD>oJ|M z&h?=FMsPi-uM=DkS^MZi^6OlW(}XeSLdlNvHe(cn3hA5(t_N{%#qlI8>J}>b2@C&H zV8IP3r84>$N?4Ssk^F>(pZZ6^B{@iV46jcH#wNkVAYH#3!nvQgiGqufO!!*v-$D2~ zj`tHD&v6Uk>p3>!-av3M=srwvF}_Lcs5UA;nXe}R*Q(%Rj3BJ<3~6}@F2;j|buLCV zu;606O8#klJ&lC*C#8=F&*1)(68Fx~SBF2?hO9lU%i;b@Ni(7ps0Bav_{ z_tX8e;9`&#nc!2HbV`E|wD3 zITv)FCpZ@y2;aiXKTmiG#~%^S;K?_(|D+qwT$DxbsgC*=Pxj=O*d-@)-Y^54lZ#UK{iM;5|&asNQVck5*){_MZ+ zyk|)kI2rfk^55G8B7%i7ap{tKmM9ame)h93F)p%}XZBHn|8XwHzgg_4{x}wKIMnFQ z6?6qGCE$O5<>)e!%iRK-?u$i2x6aaH{6`n5*qMd*7sJ0Ol72P>%R+xYWNgcGQi-zFF+3XE9zsN-Nfr*e+s6O;&Bh!r-Zwi!r%>F2=M; z)AZ6`uZgtzd;d2s#!r5_?GW^kf|}oMeX}q%D!6dLs==mAd|96vHKe}O0iMRLAZQo` zhwq0r(vY?{I(MJiHS=9xQ_+!{!%gqBymfqE``+arG_*7~_Z(fZH?GXIa8*#@qE*3A zP#TQo25&Fh=Bq0(%`t=&#z%#GHqLHnou$2)`sc7rt!~D-iVtSkwTOdC-4@Mr*3=!N zMSxuaTfJh7l9J?jIAq>9#e9XD^txZEd1A%H>KgC+=HDyoyO!XJ?~Ot1o8Q}A@3hY9 z+0r;qd;7;`;$^IOt8i}A;F`>yR<+!#sF^{C8TE5x{%-BCIk;jqVnH>YniVmZl#sgi zhaXnU?=oqK7!~@4R`$7rO6R|w*Q^HKg(yjGqdQHVJw9p0W-aKTy=u+*Hr4cTlsCzm z>D!qXPm!D&s%n$e03~Y2!;a(4$E|6tvqFxIRy6+(L)_f_T_}O5Ot;#*Dtq2-IHo;6 zx@T3acI9-_6?-a%gCF79cftB*twSq5Y#$IEvc`#7?HYUJp|~_~Uxql63a>E)X+>Ff z?TWKT^)Bp1vBeNqI(}c|k^F<_59Hum-o|8OlY66aUb52~KQhzoulf6%N|R=`Bs)8k z@dbKRYm(R7;>a#j2c0xVq|S_QUDsSnQGr?)w3LMeoe4@PRf{vR{imWL9&RobGo%hUU|Y_WLn^ z>v1#`sVC-PM#b67d1$HZnv>ibe$>^LUfQ|FFz5I>$FZihBiClF>0X_(?);vvQbVj8 zFP}{20g5N?bYZhc&3+GS@M0DuR=M)2Xk~j*>aeqj?%-a3rIJznS9`JIv3UFoJ!dbN zin=c>+_ZP4yU=fv`%ftF%dY15kAHIZfQbGnmq<8tS_Hw8@!PpV0- z@E@jVLBBRsn7+86me<(b2fA$c+siGU*d4{{t!kVGY-R1ZI9xxm&~iEZlDp(eqsiX_ z%@s2=SI(|_6-PS?DKBqeWb9}S^IcCnDP&|V= zH)d_@*nj6=lH;?I&=wszg$ZSj#kK|3RCBuJ1_&2n6CugVjI0pv|4)Qhj>~BiSiI2$i7$Yma z$Lo)suj=^T$=78bK*P-w=T*-OTyTEY@`U3FuGtNF~=PKf1b$=dS3>#XfC_-;p%-#W-i3vw+Rh_qX)om*b)%kZ%e% zAwEc)@6t8=_654q4r`G`bZuys=j`s7GdAdZDCSt4-4jpXjOf=BA_7tG;V~zB<$kB5 zwf!Y??1DOK0Xx7Cd)$s$_=&Ca@3)`8d5tL2ZbiRBSIB*Ig;)#|aV0f-`)e~DN4pM~ zlYal3h|H>_^!S;novHaO7EoTMFDbIpaUi=ay`*)WYi(0$OIiIME4X4|YeGxA9qs53 z(GoWp!)oS-pcdPrD+YaWK`VID?r!>c%>6r)ExetbVeM>K9JMs9yU{PQ$ldwdP}a`S zy7YFo(jQU&#))>eimYkW&iwvpuSglAL{_@jSVl#*{B>uXa^&Z8j>^qF0~^<~x@ zi~gde(pO=oUR!E^tk=F3ZH8L>z0~6Cl-A1Jn3R@ew7!J4Rdce}R2a_$wXe%B%~*H7 zv~8{9Snk@9>*apCrm)GQb{@M-zkP+`>c8JE#w@jUPykabS~ht8(Aansf3s0COX<9vC0Dsew|Vx;+uqxIQ!suF+X%{BVupI`=rJ7o(m>zRq7%%;psDm#?RewvXF9 zj$deI=k2c&pT+EKo&SSZJaLgNd-1<@e(dXtGdg@@K+it)6rsa1nUpC5p_q{jWy5#N|qwZdI)AUi< z?wcl$y2EzU1pJ@uzJve52^*!|%Wj$sCHyJwtm%`~sY|n_Ovzq?$>eEEmM)t%HEWq| z@(lgW3AQCAaSu$c@5=nK_?DEOXl9{a^sNw27KL6Rtdned6;LAC^jJ%J@jUT(IG;%N zt;nEvMn059~m^*WroJA8!*6VyHjOA3rMD zbgiD0?8jh#DA`+KhvHocPdpyZ4m<-1`_};S{O1d>9a8yMU`I;!F4*fNdmrp4B>OGc zq%F-8kB1}AAH9bRig_;be+%$H??q!#eh1qk)$auCd})9F2wR>n{0w%MbUx0(E|csp zsJvtwv8^+b?GL+Ks?R{!Hfeh_e=N`c4u?(eH+ixsG=KcKwEPcXzbY+H^T$SMeh3CqC7W~#tkU{Or-0@P#Qy#cHhoJc>`vHIr0eGou&E9r|5M=S zr1F1;P47uX{$F74k(NJC`O^0MaBSyE`2%3bNarIMc8PR-(ERZM$-WA9t+ad??7OA) zi<;1HfAgu=qC6!Zmig-W)c)hg^go|!W8p+>as(F&l46tMxY%qgpa_pzq6au(HfTh*{IA z)a2>3#N_F;v`U*)Y0Xn8YYO?Muz)PnsTwQ*3JZF}K3oTv3(m>Y**Xa_dn#Ww{bwo% z5w!XU%8p<@TKi;hzEB6+#x%;F#x_LjnZnA@9!{gmvw$>{r?Wk_u_f80tc?X_nLLBl ze+H{RTMeyYGSzhQ3|b>Un(XkB$wTO{>dl}+eX(C?&205H+7gQ@L$?)ln5j6AIAdde z+hn%BNo?0=^quvk%kIACwx8ervt@|+l6fy?KQUKB{e_tOB(8#(`=q&kG55KWFy05U zYmYF#d!%%Xa1h7TuZZvTj}sou{nS3h+-EJ}5bm!dtj~QK(Z`9oPuz6(&eaiCd2z<0 z5p#H>B)^@?++R;+blgaOC-P2Gaxw68rvrHplGy z_e75KQ09g?9Iv4AI$kH?CkX3vlRF91g9Q@Jj|xnBWCDLA;WH9u-_+~NhM_%)c}?Q@ ziEqiv2q*LP)4hfGmi$@5`n;x(Fg?srLi-Z)nnQsnq;faihlsh%2=XuB{&Wdbth)*N zTxJfH*XQ{jC#=s$lCIbU9n*a3gvES4+X?G)lQg$FA(Q*-3E#r;PQpt#{+EAejq&K; zDc(tcb9U5B(3L7^8Z6PJ-(R^b_~ml9z@~dNk)cRLP+?hSjd_xtKmKR{%Y$%t$cg~%p9L1dF9gYk{_;L-TL zdNjVqKK((%KFstD!%W|><3|gl4Z}?_QTW1oVwufTR}gwUtc_;;x@Xr$7pCkQO7nhd z(fx|UYql)3bSi5K5Jh92Ru^%O=KLz=PqEi+>YV{ZY!a>TMWby`NXj^6hnME|Djo?} z>Y9$fqZR$Z-n5WBrj)2*>gqg0_d?BYpE2a&v5L0)XXffn+TMH3p+~A_cSna5S$Uk3 z!)npbOf>JO&hrbd*&Xuk7$vMFEN1&09Cd}U0JX8yC0MMQZ!wjb2WK64DPoOkZnY}?Z4>)DytsFnO2UlZSB>Nxi1puFOE@=Mv{(hZP$&IOTdf#ktL~g_tU~NjPcWH=dVhS~cXhpep zwFI+@rvrn>AFFyJtkrj@Yft36TCvs8a3s%{@!RxFw<*Za7i)`~=*)^wj@63x+W)$< z$WZ9-j~PmT-!n?LvKBhoTJbpFGb=yGEXdglh(rRvz_$XQQ<{chKqgSxrcH+tnTgSPo8-&U5t&$pH3pYY-RI`aK@Z)N%8c8?BX%kLgt&X(Ve zckZ2t<@>jDHWQ()6i0#T%BC8t-=#j zm*zfxjVUEwD?b-?|ITuQIccP)%ad1x+0t82Vh^6uXWH-uAo~h%K7Qvb?Un7-S=Ct; zEiLWuwjL{5kdQbap&rW3?Q`Abrn_mrRE~TQ=InCX(l(^EN4Ge9NjqGgSZ&ZWgSvj2 zL0fl)!BwuFehF{qNw*mh4o2e}vnTNtIW(NtZgb$9GyGzv^~$FbDe}Ru5c%L~=r%u% zm?=+pm*f|o_be~*7UdLG7iZ%ew1IwEWq-8?8a)AKlgDfh==~OL&Sw`)>(5;%OvGQ| z=NAec-4_bWyDylM&R!@iJByjx|6R54;RjX<-R9)fu2gq`f4X~ve>R%|pxzI03#bQF zzjxhG5x+p&IA*9i6n|r{^Qlk9_|&Cn?_-yCjfMiUF|8)ekzu~l_ekTz9WifyTIcF? zHb%!~=FKZju1)KyuBiw?aIWq~wKzkm-tRkLO%GqxncfjI{JpA$4UO)1em+O_zhK;+ zT;_^&H55LSke^v$fu=)IYt%2U(TdyAB926LRcfU@_WIPGW7?Wd%w65%$cU+_Y}ns8 zd%V+qjel;w^OUnKt|+5*UgzArn2^^VRzl`njkXJwiM6UBWKGirb-+e@hhtAlifd$& zIkwxQn%;*}!gkCR+~;TNUN-6>Gp^lX7N0sI9M|lV=hb0x__bV6M`YugeM(V>72z88 zH>e}F;hLrVM*LEKr*A9Ex9o-jJMzPE&9de3%a+GA%a+GA%$CPB%a+G4@~xe_w<3S5 zVW0Al|6qTuY^*^m2{)*P;|yxRI79v;?uC;UYvuC|)b_N(6oa?Og`#reWsJa`m1k4BCxWv!Yn2M)Xr&_PT2i4`BaEc& zK6+IEX1`4+5s4DhQ9^|sfKt;*g?{}TOocwdYpdL`X@?gI^hR?G)1S|y`LVtDYs4SE z1rFQC^yhnHuso{zPuJDw{V=y=!k-a;=+Bw@{51bdW3Z6={Iq^zu#o!vw0>f+kox?z zOJlG=eg4KvVz4w z&UNlc9g?OE%vai7ElIv;+Z<24W;~^+K|M+fqOgp>mcCIGmW%o#7KLT^AVgFdq?k%f zO5xstimB0vh$=yf$%#lCh{SS9M3pgDSxme2C@lN0LKKz|ETczZaehST-&2?|Fc>dKf^LlA{! z2%@kIK@^t3h{7@$QCJ2e3d>+bVF^YQmS99-2}Tr_;PZ>;6UX4y;ZF>S+ZIbRQYTj8 ztq*YRy1qCjWRG9d7rTVzuMX?g3eax2&Zj*aZ>y>O(*IHrIIXYeM1v zi{}LLykd0e%O z6jv2D7O@`Tdjq^*)TLxvQrejMK~8Lbd{4PX8VE^ea$2E+U^RN89p%thDj^<6F2<~< zl+=5Ou~3X2umrz__$yb`z-aU{PJ>n!Z%|E122W6yw|!IArmW3*@pNa$@9ErWC)+&^ zx~oHkmiCmi)_HC575*cX{Mej$%UsR;pxqsJW@&3uPUihP%|?%Fe3_%Dv1lZ=`~i!Z zz!*tjkkA*|>|QA>L(u|H7<#;#f2Tq9KaGAatD=2#*5<5D>tAY^n?EnZS)UpjUmH*D zp?-h$F>R0%WnJHx;PwW@q#$};#f-<4iZ{NeRG34Rd}mG^M)K6od8*%j9D$eOTQOo& zRFCDiX|I3kS6h(a(Ki|^}hQQ_2U{vz4vKFJ9&*ky?2;_ z#UJxGCulG3^HbFhzerD2@f+n8XU_(?*ZIe*=I89{)UiDnlj0_>eFjg%5v9-IS=_ef z89WKs^YJj+9X<@>p&8>LeP2v}{z}N&u}Vm3xDs+jI7T|KQ=;AKRE&pajE8zumbFt+ z0#RA6KvWikKT3hMg1hnmwTB!H!@bW_idOQZq84sbY@6JE0pOxNtsJ?Z#>D$DR{RWq z_hP*Gxj}u&=+jDqa7A2ca8#+LD-5dnJ}}#!GPuoY0i#zU4h(8M8sqe6jMv1r0f)tZ zEBssGXX7{XgY&ZZDf8%6C~rV{jMy}Chxmj4@)Ja6fqyIfTjAfz{NTb6N2UPfjVO-~ zO-2_4D8tO|bmE_(G`w5k-3sriO%$1BMX|@B7Cvv+PG+$CvBIQc*gN8OLn(;PFC zMSqF(XdjoM?uh2x+8-mg6#Zo^qQE>&@zeAuFi+vB zVjPQ~cG1Xvx+Jgglqb8Sy2x5|zBvC|e2QpE%gu0?2L!qY2aeQI?~T$b$KfgBzoRI! zCx42#2T{=Oi4so{+Bl3rPw}S+Z5%yC^e6=xVVS;U^MLNE9y~>)pKhER;f#y-F78eX zjR{}ew6OXyvwz%Xt$4js-{{+)ov04_h24Gp=jFBWjR_rP5barLNkczY{Cy=Sy2q7K zrkd}LLO(Ww^<(zWp(E4n8Hs+3qTOY(9<(>w9gCC6Bi?EL)Q{zRRTljvYcqPWigt=| zCG}9eXX=>$Qk^-b!9%^%CW;Po=Gz-Vs|;`Tj-YS7(qGH3FSo6UD4n==RkUqWM{vMS zbNnA0sAW?mqKO`@_*1-Fz__OH@$4D2<7d$K%zD}DvLw-n6o?TisBc_z6h)KQfzdAd z;xX7+gprnFj>+S%7|AiNJ-Pp)ac%7D<^+1ey6eoRzXFTO@z4%WES-VH^=9__*lYhh zR#o0gzDzZYb$1@Z6Oa`@aD|74Nl)S4DG`Jb`;jp!fYX=T*_SP&{#7)l2lEnk5Un z2Icq*kHJ4_ke|Y^Ej?eOI*tPncGQA0Z0d`kV-}0{jM$!vvmbfm*6v^HP z{{hK<3-(Zb{+ZTy2zIw*zX$ucWPbqrRXTYr@%S$>^ip28e~;gD;^jBi_ea>PrSthG z*i)qaI}3Y}bbP*m-6Ywh%duTLpQOvtBiVyskC%=&@v2&+^Gm#{BB_2f4;(3#4}(2G zDo?yBnU{A1Y^${VWXhN7N4%;rn493qqL3~}qLfd(szzyh#H*^2Y~oejAzg1jf$fv> zQ(@CQxmf=q*fbw1>?N>^q+_+etbUBVo$B%ebR;fJ2f021tq|5PQnj4R)TCe-rEnB%9{M#z^&vhrLL$ z=fKXEwx0~!D;DhyI6yFpVEiPmHKE6bVVtL_jG4qJRW`dEk(#jG{D^ zxJT@Wn&~Nn=aPCav77$#zt#%vN7_PO=aa(wiT85RW?SG zqAgKbRv$*Ovg!OZT9&PH3N6EkU2OZjDvW}~>dY$0>pGdQh3dgIHi%Ni$XxsgFh(3# z+n{YmP;tiCVmz^FtcHvMhVO$=Ey|uoD`Q7xDr1$g`Z7WpLu^MleU9bZIHAtQc9WCw z7^BO^*lIQ#ZGsNA^J8GQa$JS2^F$x@Gk@17aSY_;(GTsiriR9Ps z^#}`pw&W)){3|6tVd38_`3VdEyTF1kcTOrpSdj@B`_)4xvSIl<;-DOc&wt9Aoh5jSEBZ z1_eKGAljzj2QseRL|(p?{6FNljqoIn8K-VC$BAgmf*;6Y!RVD{+&ND6U>b0O6PSnN zBzS-y64rTr-4ZsUPY}GmQG|6~Uz~&)S54O?d6xV?;`P}h;bRj1vxEnt-HY;J5+<&@ z-~lEOzKO4MGhv+v=!g48!2=|2yTEry_zA*xzASy;5FEwv8Nv>ZhoBD;S|oPDG2Bnj z34#aM3M{yPOe4d|%Up}LEckvDCsAmT+(pd%gA+O4Lw+5fB&;8|1hiS9 zOOgUCjsxkr30;!A$)Cj6(@6Mcjt>G4{t3q?$)C)z4eed%lH3d|_^iGD>L$i88yqEH`>u15JO{%E^sK9_J86S2{?(t=`rXd*Oh^`>KEFUwuDP2%)K z##HR(E>5`|cX5i!sg7UIU3@j1@7K4+UEE8NU>JAtz$M(pR>oc2<#;D__us``+}q1t zY%TmUckx)*QQ|Ik&aS!~ckx*E*KrqpU*azAKmPWm+{Mm?jJF8>qQqT1T=8&-QaZcy ztNDuuhs11uQ}7oVckwM^EoSUHK0Evf@finLc5H6kS(|3tl7E~yjHTw&&aO?{o55f7 z3^!?O9yWFyx-Td%XXX=F@i z{6z2@SK8w?*Bte|J78XRn&!VdY6yIOro0aE#R7{?Umi{oZl7J9Cs-4w}QVI2>#;4i};JgTHNkRm`AKdt>|=A)jsbV zL!#Rq4bi6IhLEZaTHy*iaTbdZFQ(QxzRlV~GdR_U>V1(rGv1$><{l8>7v}WE2gdCH zfAJ*d7#hJ-v=D!>kvNNM{jI>x#%GkXO8vq>S4-^iBDLsE!$swg*IN$DG-VX*>DU}N zep__Jyl|HXoW(+8?c(gr23KfWPui)4&4`aPA}XU&9aIMGm?Kf?>E{!wo3uf1_wpI@ z9$Qr&`Sz(j-p5Wij*PCG-7(BGqA@w!nd7P`9-_3l5|Z+w!(%j4s=XuW>{X3117_X7 z^E30_{UeK0DpYfao!E@T1neo&fqiNBg*hOCOLEyQMQIoRIP+SWa5 zW@27?Ex3%y8E#`>?w7fY8(bTbvyzN+we|0Ty|@6%G(JZS<20)4e{WEiYkscs?-rNQ zk?J1cpWdG8-t>=i8M~ZeX*<%)S2jH2!z|?YKixLF)ftf#kH)a4OA} zq!s^x+KJ9&tWDL5EKy&K(28548{3G}*i+fiSU0=M0qu)>a-40>rnqibStqDa72Bdn7p%vaeRgKm~HDEKA+Bv(CzC*S5em-X^7KJH~SzMxs+yV43SVKiD?T^Z!Pl+kEO>Pn`Z zOBs!p=&rexvm1r}2M&Q{>9c#5TUf{U~ze(w2$)G4^8a zM^SWcD&-U^121BK6ghLT*9XCNyqNp(Cz;b|9pL@Au5oT&TvJ>{afs3un-g1Ip!(l! zcSoPOqcQq^`*5(iYs)8=)s@&vv=fD#k+XvCT8`pw1%F}3@%w>63v_|Y2tH#u{>s2< zG=kH}SdH0Ey1(OhcJBFS+da{AZ+F+3r1rSEjq{qoX$(=)<8xy3q8X<#;mp#;q;$?{ zjPBz!{*rCEk4;&G8qi@3w4$o9r%fBQ(w?`zF2QZ} zkBQ63j+PliInHz(hi+#pIE}lb+;%OY5##p1h|_pQznsQ0iPPx!FXl8_{=;ef=W!at z8K-f%vC*Xla!#Wsx{uSi01fyABVHq(C)m@3;4tE=s4KU+l(mA}_%)oy z&?4_;IE`itDOH;N3%~qjln-A<1zrBjC_GIV{Dbi{QQ`j&a~k!hi2)5&^fWQ@)4GM* zToFk{i#wA;UDm}3bB{mf3AExn#J3FHdwLpEh|?J5K6Y!_NM~I_N1%UwTv}WP^NCW(4cU?BHh4CQf5qv9Cxw@ykALHsfW3pRIq#hWM|Be6MCXVK4_0 zuTiiXFYcpw-_(IOFT`r3{%L(3#%6W+nQw0#tulP^g7_Zb3+-!pjiCVz=J?-!1772Q z|K^`D5)T8nk)F2@Z|zrReBm~=-V;k_;uky2?Dw@7{(0QSWizHsUkY`&h)GkYES>6} zIw@k=jA`yHa2BRan=*aLlHOO87Xk4elbqibZX@Z3@Wi=|8zq~jcS!R?TC$1THUdq1}8D1%$rW0gt*3V$yBVKajO*C;EpT_%Pp15Y5%>D8pL)K(l3tNs! z^$_g8(aU9)IJc4JqlEn!!1I#56?Q!4nRw!waT6u`*T}Ha3u=})x6y}rBVoS+FhI)R z1v^Eu_rXq-?6+WlB-w{x-#{<5S>iFrWbPJm8)fd}$FPs~P6Sw#Kfq3*m-sAMluz;d zx894)qI?E>vvfX*+n6Zr-xsj&k&Xv(8`~xO3fMcP^BD+R<|c-~woAu*1T8O}@2g>N zmg*M}LK2Mz6*f-w+t}gN^{)fnqhkaby-W=HV zlAR2j=8i>q;x@KP`HNx8+`TNyH}{pl6*kQWi{)u%1O!Tv$euRLpnYW!j?7cNHZ>6s$UiC25I|SV0TOQ6R;;q$NyJUUfMo! z8{4G%61Q=qbi9b$I8oZ)ov_oT<%!$q3hCP);x-0I*AsCYNrOo2FL4{^N#!ZlN}aSn z#BF?DYA?iX951y8(um8&oUK?NX~fk_`J@rIL9$6BZllzmiQ8Bw@=zU zhQKb7%8!6ONvhw~u%}4*#BDq-*`x_~o3y?Ouph^tsJ{*P4ynBow{ekle2CjvCgl^i zaie62jezM^(Ag&nRLApw^5E+M%=}N()z`o&~JZS z$2^p$v=saF)m+DZV~k*K6UejGW86)O_g z&?SsVHpM#+*Qnq;K0sLS@2KAroX7Em^>%lZu-=AF5!U;UdFW>a=aF=D1?RC7{hQ!C zQs3Gi=kY%DsX}9~ov!f%!QgoQs`@)H(*ipMIra)gEd0m)BT_$mIPC{I}UpOgHAh5r*^!AT58za^F> zEXs_R{Dg)7ay&=kK#BDb7Uij56r9J$34f2D4C)^R=W!%qolrsjwBS5apDQ?z58!$c zoX2qV&4Tkdo$x5W&Kkl$;P?~5VH{K6D>#qsgvW4yB>Hf1z6gstyCgqh;m?r#goS^( zir`+;YS)$2oL^n3bGq%xL}K0jfx>?p}kSon#5B-TS%`00BQ!FfDGcpTqu4BDpP zJU&YJI_^J3cs$2`Xpce@F&OxU8@QkJF9qlEDzr_ZiMW~Y4|$o72v5@2Nq92HHnd;C zd0a$Tujo?3I_L3e!c%$q7Qzu6lb)sEJa!SD&iw)C2Lv8USm!+22wFPmyp6;hXq67ZKJukF|t<%>7JP&(3iI?kj_Jyh6e( z)>srTLwb0E^JqkWA~=s@2*>a;$%JD$t|A=A@hM;tf9*8+|jE!E;QJ@Kxw%1m`h_u+DkxB%I0j%Z5HD_!f?*6JEmc zO2SzjKTX)p@pFWia=f4LGLFO1Zv~n7Q3uLS9E#^d^uy?OSb3@wn$IQt#|N;{hol8*J(SQyF5*9q3co!6Q3cmgq+b3b zNRFHq$^Z9hH{vTGR`~1rj|#R)_2EO?-=*D{92EkdV+d1kgwCS%&B8^ihK24cOeX$g zl+{-j#}pe2(^d^_XemrxWpx~hJC^+h(`4iqv^Q+hUJUOcOHB(1cI*#18m{;%wIlw)6&2%@hUQbLYRMtQ zjjA(Je)T(=>6}uS8a1q9BQzTkfvtLPeYCo|+o<_An7z<%++?Qt1n(kRL&IU~`ymfQ zQzX?dSSxtISaE2a658sEhIZql#-{%ld9Kkuh0-{tNPKddoyXf2bysR7p@{!>BC6Zvt*m;qVb}O3Tl2(&q3_1Mm%UfJQi)pSbbG*k ztemL)X}Bq6mo*aHEB`39sL@#MPy^nM>Ux8;95>AMIZvgfy9%!|gpgulLxs9LFj(^+ zZaDvD)lS>d&^F(ph9jN(a~n@(6f|`_6nI05t1~0T$rTq{6RYA~P+Y8bltp(P)GVa9 zs0}(|N>8P2ReJ-|)#A-yD83lAsl4tnA6HyFe7Y&Ovi?AmD|>cFb>N8ZWNYfk44T6( z&B#v*pPRxtiq5m4-7zzJIf}{uUvLyTH!-6kW6SaC48~DxWgNx4e~_biytVyk@~&+Q zauVBSk55>YP?YFiKk!nHVur(&oM}r{*GC!(=5{&SlUiIJr#1*`DeH)%c=kKTQOr$q zn*$bkHdzwCNg<5B4 zbav**_}b*AMLpHNiVD(OY+`zg2O1C7EsR?{7Qd69o|4Bziysxt1K~Q+wjJWpvLgjkc!A97U}Zii=mg3B^Tl6kYpM@?0~MJc(c_7PdigvHCmDQS7O5 zr%uY$%9lZL@m44-XExLDpVN72vX>Q!7E_%Gxr2L8Kn6jK;S5lkRmanY05 zr?^F7;~8x*N>ZnzDmpvWvaoJJeX2RAdP7f>_dwjD`iIpk|6uQU z@Wjit3)9oK#n&a819~zX?xnjV-RRm$^t-W-gK~GZ$I@<(P}gBZjM= z_r`a;HsaK`woa%!&go@byz!FYUOfCtxT`L4M_l39K*h9eV6P5Tohv+P2N-`~E{;vQ zNC&FUu`QZ%3cyb+yh!6P!nw`4BkpGBfxkzI(Mqhv#dTk=#CY|~5w2}6Y&jf?RZj-? z)-)n%n}fVb@H#H8X>>U1b17@F&KVxRqaW7duGb_b#;XTxe6JxdGkkteT!sHNO6mNO zDLr5((a`3 z-+~U~Z(fRoI{5ME^wjNOEY?@#@2Wna4LD=(UY~I|AwGMy`}+a&@-n=0D_-tXVjP(| zAO$0QYH5tR8mz@VT6#A|a=}`B?w_l~7+`kvqr|x0-`=alXfj7`U;E6;Z?42x@wG~f z75ytQ7WAvcXbzaplo;u1U{?aJh_Fq#Dk}Sw7>h4fVtnx{lo((1?_Y`W#mgu$zIYiW z#uxilVtnBeB}T4u_+3_FY~9rAP4T8MCB{}=iLtv^iP4kT$6BO&Ot2PzN$s*vKl%Ew z4nr?%@nCB!Jzdl$v=MLdXpsXN$|FpOUu;@4QYl1uZrIu-MIMFB5xH}V$4_Sn|uc>i?sEN?H$dPuhcGt>fd^AV#o7Wo%_~C zFpP?x*TuNyc}?r5?Qt!{?OY4-nt(=g{F5(hK`(xd7NX%5G1^_Mg(yb4OSKUBNcUwe z#EAH97*|Z;{b?a~r{!gYqfZ~944B&!UzNf5n^9*1Sf5Uslz1u$}2LT#k7V#B~^F;+?UuiK{qCveDTo zb&~CYy@Ou#vcz>5S7UBS*bf2ZNOmRcze)CEuw^dZR@etHAHx&pD&B{A9%26)V5gM- z0_=hGa+xKI@(O;9lD!Ldm1OUO-7eX0!6qFFp12NUvt+-A44EtS0qkIUq0W*;>A-Jy z??q%$PLLn-TRd?cMw)LI_GbWI$^HxMrPBF34_nq<9ri|PdpE(p zTe2On!=&qrbQm9$@`?-<6I(=`dzV z+b12yjZ%Gyt2kXc9<{JfO8L*hJ}>3h!Ty_ceqM$BtWb@ z$4l#<1bd2;Y5#r%yH+Y61$%&Wyq&OPr0tUqBh8tM`Vdz!MrvORV81HanXqXd zSd?F2j7VB4~4X`aT zt{tl%XU8#xKvwrYBA^~6m{IAN8Y9z?WGuz0Z2wpoTgLk1QF&>%7!|QE954>h z}F1_$hXwSU+Lm-zoVC3;#jMPgwXr zl>CH+|0;}Uf-^=~_#-4gVd1}7@)H*RY{^ep_(>;O@Gu*tGK58$4<$cg;s1N}7pbok zJWtYK6Ff%h^90YZneg}cNus_|@C>Qn6+A;5#t^|XJVy9xUj8&;@E|A=r(N(28Mkm0 zb1S*%uf_QyEcT^9@)H*R4U(U*@YhIw!ovSIV8LS?g}z&yJHn#OOvz7J_-~f{goU4U z(ZqTP3;%<_f+tx+cr@R~r5IO($8gN_6vuMR^c2B$pj3wTD0qfX6TX)Fp9j9-I*xPE z9tF>EC*kY4|3aD6en;$X`l+8p{%WlkO93s!vMmQd3jk|F^~NEj@^J~7Qr+0 z64rT!&r0|u!aC=$mGCsa&c8``3i=AcIm{wFgO|yd@CFG}JZ(|NCt()*S6`OJ_|-Xz z3i=trQFIZ$k*~j=u+G0aE#WZSD++%a;YePd;`9psA;sejwsZe}!ciO#M4updhVuwV zbN>^-BF6I5{uw9J>hXJi`XU zI?wQ334cgf=Nz6VtaA>>px+Sq7Q$(KoutnyIETbl7PwKu$0gh?;eqI9MEMrNI$x3W zTm?t*QNlVm?<8R&Y$2T{oWXGf`U=4_%piOV_b&w=yoBQ%@@H{e4?Mxm@gBlUIqsw~ z%Q*go{5lRspCIBw=Mv85WlDgB=Hf?$Z{z+mROWV$&jAk>*Lev1IouyW_`f&~CVU6S z|8fo??nnN^A>`+RE*A^|y<9`OsK*jvBrlOv1X=jYkuXXS5NQ5N~sx+SHUkBXV=mr;5+(vAkdO|JXYp zxTwl}|DOS7KvY0bGPcZxM6+_0qo`~V49E-!LyH86I;3ONa$C2{w(Kt3dJ&w#Orb;v zq{O{Y)Y@LRLxE9t7z&7HlN$AIR31w%&J~! z@SilnX6;O^n{*?C-4JxB9U0-S7`6 z|9O;D7I+K%6PwS=o;^_kV@#4e{1f}$Y+NYAKhek1n$l-c9B+X|Op}6>+maiPHkcyX z$w_gbN-6z9O~0yrE9gXC$GLYJ_C_|rKhe$0qshVYpD79YE9F0DApg0{>ozg}xp$d& zyqf=-R#PLrX*A(D*lYF+=k++E&i&f z;C2dKFC5H&?o{)i^D-kAu34xiw+-e$yL(KRiaa8uYD-;KZgOzC0v-`p2z7%w&?b58 zU0;DmOh^9n(Z5Un^ODVdYu+3G!J3o|5IkO9ncxw#<;CBRR*rzzA&%$z`0Bt<& zvYJ`?Gp7;d(O*P`n|jl~yy@HtrTAkbXvCK0gdJwvQ(h0d@}IM_`jdyyh@fsl>f}~2EWPq&jU}|GQKt%aovbC;#k2kQU4F55k3D^XvAUp&+#rA zF+`;iS)M1QNV<|FdH!?fVE%LeVr?uM<1?85?7sFE@C)-X7Ud?_WnnBD(+QuYUfoFx za-VhNy@VWS6XidD4#%Y{cTD7C(UAP-%Qz-38Q)Rx-uTZ8Y*&&0Jb0goJKTz{F#mZ8 z@}J+^{6K*^nvL@EN3QJ6fBR@gG~#=I2v2TCwsTy1_Cn-8gGO}X_YUWf|Lmd>^Wc{l z7~i`j-#P=1i49pLDSG%NMvr&q)Ht< zs+a06nFM_!@rU@ZC7K$KSwfj{rcw%t~43C?6S$w zW!E?vx@qKOXl(I_$70@lUXwKIlRJt>hXAhN!4E;x`skvEAhF%tBdmG8n$#F=A_HF1$Vad?`YBF>nlA-U8 z!Z?OxXpCcUQPjt~Tok|K8bPb`Fn(ba4aRNtk98MwQ5-r(^`y!eo4SuQ4rW7dtnZ$E z>1=4>{3>1Me2u+v@C|-ey?8Qo{k2PmPIee^hOQmX*#`>A(600I&}8Tl&(L^`^sL_g z5>JXwewLD=C%{dSo{?p6Q>5E%U!$Ai%K0V`p%Y5-xNNvfPYzxZ-nVm(LY;G^lAE1S)Eu;bUUs$@ix7Wtryzc z&=&ce8nngS=wG2dk-nH#Cxi4G-0sD7AvQ5D#S8gF(OYddI$DJL??+qYn+~Eq1J`fZ z#P~#iT!-Q9;}B&}MKy9xG+kR`lL09zLvvrhMEfIQ z{}7)j@`}VKUYHXdD(r9K6Wi&_e04HN*P%`MZ@hg2+7Uv3;uA$LM&c7MmlJ(j*uJ^w zFM9J4pO`JoCqD78us-4we=W2V(S8uuA^7%v5A6fOeBu+saXpvMCqD6VIngtP`;U|p zO&NH6c|XSTJ`?(1Nlr9f)93g9I&z{5h5bWbilUb!c`0TLUS~2$q+v>z0f_gAzth2vF+eN7%M{Qd^C!-VY{jW+qY@cDjdlSd102ck_rGravRv^U_7 zwRF^q|=b^fMjZjpV%$)Za8z&32qUP<#csN=YrxMkQYUrm$C#$5M zOcdV8xzDsI>UO%U5XHpk`2_Z;gBjr zsJS$%dqVYD969S*-M=bZNNQNtGwm#O&#GLemi4SYGc4;_-CgSLW_zB2qw0SRI%QAA z%)!^nP|rhpanWn=ZoC#bi}=r&^ZX*t6P#NkEz^U-v{$H;=JhV2PMX)rXN)h0G_Mn9 z&+DXleY{X7&Fkb##+fwIynZqN!+fDXY2Ke$BfcEcyiOj+oE0QLVcv%{?{kAtC(Y}# zg*s_oPZa8;d7Z{Q&LUQmp2+qsjeVR&yn!_M1Da^e6_SnpC&z-X<~smD@fxiXZb!N9m4utt3 z_84!*G0s`U8Kmh0CZ>6$6PVsXTH_d7p#2uIdK=X>-ADSntiBS*FJI;EBX3)8*OoKd7)cg`r1zdUCYbEuxe`fnh;i0Mkw8l&iqF@ZCRlLdVnX^l~& z-^p+;@gYI~nlu4hm`;*j%=Cbu{V~q)`gB1X1)U*i`b`XH6dxqLge_C$5;aCqWf2Jo z!xVw>hck-ALUTrue(U0Qui8bbBfXsIR?;h&o`!LQdm+w-=8U51bEtjmv6ku@i&#SX zestL2hX_6+xu(4rXB6d` zVcg|#^5j8AasEXa#rdrJ~Of>AVqQ8bg=;m(rqwY41)C*qF%X$sPw69VoDmE^f|&MJ=SxO7qhmWgcJ>K`AOnJp5Ys z)V}K--xFKc#aPFi-TjG61f{67Jm*oi`4*|`VA+#_lJ$65=Pit6d`kwSNPJ>iJ5rt# zT9;Vf9b^>S9nXPC4o3SN&#CXWEg7 z!+r2O9B2yMHGPrI+nsWrV_DAgN0-cb-jVKOZeP%doM+EV<~%oKAm{lBuiI+P;frf6 zb}yxPntSWA{uKB{W)2{2(h?&V=SSz3%Nu7P1Nszlo>whwZdEq64|0q7a8aBZO-av{ zNP4b}MMhSY$HeBW?BpCI0p28KT3Ri6F|{#@8@NT&`AKoH>tlbut6hK3-ZHPZ&X*mV zCQ(Xqr9&>YMcKXB)x@4}k25@>m$!H}$rV$ZLJDdnd5ftj#K&-6uDHJ`q~w`%@|NPJ z5Xn;~S0Iy3oxi`SMxB4EsYadexu-^*KXp&Y8uk8rLVVTx?+GbY@4qKRr`~^0jXHn- zo*K+o%1`a7!TcKC=h72~ah{oFL@lP2QO0vhd2N~9w^k(<<6OjIY=oUX0_FY+<~;OM zA{GO2jS7EAc)m55Ql3>}v7Az#JJpou?9AyP7E>16d`1l;7EfCIEx}p-i)5rcyAqzk zPG}B_SDW(8uPFAf%P%@-U$xHZ$Z=E^XBXS_V?0)rd=cg2X7|#&+x2=cy8+2;BjvIg zk;_&(JeQ4MQ8cC_lWmk|rtJx&Jby)EG1pv}5w_Sqx~Z}mR}^pkv^Jr`RBx$Yl9!cl z30l-uIZ#zrc%9UNl;>7mf3s6fc}`o>ZMy&1dNt*_JP{+1+ljRtX+td zXN%(be`?BeM>)}otvuz~^S`u|=RQh#PN=llp7Ie>o~_vzFpH6zgCdy4xI-C~I`&V- zEH3`qn8im&WEOn{X3_8uWEQ>tRhY$LDbH8OEDokT_bgUNBdcu$W^ogo{DK$xtIT2( zyj&^e8Gf#y7s){pSDa#4)S zYBgtqS-c6XWM0ewm_>LuCJD*UMi;Y~#gd=tS0BMs@%~Bs;p$0Q0t8x#;Uw*wFiiQ!BpC1#F zpLIO>`5(kAx?frH^EaMZG%{w9{kr6v$}EnM{2c3I7OPnDvwC#UZ=t5)2*F=)h|5D! zO@7Ws@-vu4N`9tu`e5=iXBPQ6eK7giq-?;iqwuRfq&}B^UpuG6L-7iepZO;Y&MaQL zsXeTUS$ki7LhTqP4C{YSt(v7 zRqm}-lb`<>ZF|SFG$=V7$Ufw6*f;K<_`e!(`f zbKuYs3c1f1nY!O?7|ea%Qs4d3#4}fTb`^-l5zp4rdgLwL|UN5vCL)&i@yElEq z{RBx|mtqske-=Fyw_yf;GBr5A1}YQRqS(Yd70FA3w|@gc*QR-!JQa`N+7fTS20^)4 zyuBOZ0inGgZL82eh<3lweg|!lK{}2$dEc3= zxBmoDAw0jtELw%f_a)lvg#AIx;%7pe@}EVIL?5)pyzczCL0W#XQ^?w0|nhH=})0*go=9Y!uol zXg?yn-iTQg^P-ob9VfirR-k=M?^^%;Xp8yebj?0WSU!0wz976l$y2dMcs#@`8ieg# zgLbX3KFWWt7S=aX{_`io{-gZon}zhv?uzq3|$@7Qr zZjgc>}9qku|?ImVW^hhLTkvyMx|8BI`;#w_l ze@y*_`F}*aN@(|?T`L@~#4I)m^S?x!@;3SM-0<2HnL|&sHw*p8plzg!Q|e@p#-SZ6 z%qM1%SP(w{2DI~q60s6y_7NSSz$C|JfpJ5BW7Z zgf@99J}#`En8jVf{vc+N7#_Yo#4L&)ki;aO6qd((((OnLBjrQW^aviqr5VPN^PDfj zFsei$ixFmN#^EX=H$sv#qZd_2K9<`&B*|H&>og}ul{aK2hZ-8E&K<#hk+F>orBhiu znGufaS_HOnD9Nby5mKFnJZD;5b!aQes z1asAY>e^K|!mG=3p5p=(!&s8DY7nW#XsfBtT86W_Cse1zku#jty{0aWwng=olV6b6oEbXFNK@J$D#XZ0Qgw06Oi=?>*;C#h;`xCFo>!f-8oKPpt>lb4ei96!UA8IH#o#qUd+_n9HoN%MM~P$$jnR-sOs*F}!; zMbtURNMj-A7;hu3K@v0ubB>Y5Q_eA#;Pt{e#(5ZbImehldNO;0UnKo)rq7WMW}3!X z&M|&Q`es&7#QB8pf6{!LmkM>#yq+u6N%MN4P$$jnN1%CjGx?bD{Y;wo@egp-N%Q)2 zp-!6DDPNT@hcvINOe44on&{ljImU}+H-CcTmwPH2a6EEPMSp0X-F$%Rx3gsi;n?J! zicZqsVRbRP`D3cjV)dCgetC8?c|CJa#TBG6e$Z4)dJfZvNozie4!rick0P-y+&j^L zae!-o((~DUDfg3m0Hz7Lg!Fe=pVvuizKBNzO+I71PCO6S{uz%k3SoAXG=vp$8;d_Op- zp2X_pugE#ZGo+JQeE@pg-Aw!A829@g(@UXmPhmQr>Wi3uinPWt?jTJckTC^eOyKO| zOhMm4I-T{&B%Q%@fuLU}y_nVeNNawH-WXfB4i0>fS_k!oZ%efBcwHs@hs_O zY+Z2}b2!JCKst-nH<7-VY4TL`Th4S7=@m?OlD09evWqL3Hew9n{)+TInP)n0qWb-; z&r_ryV7ig|e4pvPRM+&!q_zE^<}z#drCes7-Aq1vx970?=92yort?WZ$n-y)X~dhe zfBP=7=Yn23I0X!08tHQbpD^^R6TLh!WJ^(M3*Ud-h}Q_lF$^P@WEziPS=#AZy(g`U z{x)d0Y7zfFMZa9$5av-|z6~^cC78x5@m*YrmHwA-M_LX|I7Egpjh{`qsP7_v@;sbr z44-*1rZG&jX}mnsI3DL-+8%alyD+<%yDZA~XWZm__C=|_WB2L(3Jc)72&R!Z#v<#Q z3DDz0-z-|X2K?df0C%`9Vou=nlIFq)JGm_q+nC)M_in_#y!|T2NZHMo&28RU+IYAK zu8Zz)T`aQho{)dMc7G8vpo_HpW_T_ZHFh@d%0BTYcrF^U8e&_QDqh>A{tCO-d+R=y z0zN?A^4z=52Bh5;MQP1-<#K)6XG-|g0VVvfq#X0|i)${+m@3I0{cg=p@?I>f2$kv& zkmF+WA!XgiQDs}Fs{Q0qN8OaTkM#BB%GwH@eCU*ZN1`J=VC_UnPWAAsepg;w?yjVd z@+&)mjOHVCiS{)!_7L@0yRU3>prqIjxP^XDwi#irP0qct#}PN#Yrw7hc+coYqq263uJ$R#*BTXia7Ris|u_$XdM^`$7wm0rJwuBv+(H43%eD}cHVt#Xx zmfw6`v|>1l{ANmSE=;X6wJvS7C~B6o`y?&Dd9!kw@|(+bRc{4#g?EG=YX;BQ*PORE zA*-;Z+uwIav#}#}QhJp+&SJ+lZE{l#*F^^<=cl(>N)nxIUB(_~=VE1S73Lj{K9?YS z9vaMV?%!rFjeO^HOJI3JYeQ_>!tN(LZs^G}WO*aK`6g+=l4A;7)XccU`16x{Vy7d$ z+27FZ@EB9JuJr=)Q1(dI3G|`oIKy!I(38=JKDCTKEYM#-AJTl#hw6OLhw6NhK2+}y z3Q@g3s6_St0)6Po=tIn}S@UPmhfnC!$~vmjsw`!)=WJbDm8Gf`{9&`oA7%^uVXnR3 z9sz>#(){5H)ibf}$jOe5uE5O9#P#v532PQ2nd~tnINL`dVeNXPt1*|dLTi}C2$wQ> zqea&jbJEzJ+@vNrTXf2pUez%%rSyxaD^FPCR|o%o{2{Il+P#({kGg6M_`}6;OiYEN z$vv8*N$O=BO`eCN$zzg#R$WSas(p0+lYy1pd!IZVXX;4rNDQ(>miL<~Ga|D3o+>N3 zPHJfBX^kuIZ>wD#zO+BHJNDG^9Vv}1wj=3@9jUpcjfHaYXKpjBjixGdqlFkm#Ss`? zlGqiic%H`bb{#UD<@G$nc_97E8+y7F&n#nYd1GrwLWIe7y=R_x`hcl7&S~vQ&C7D6 z1l(CE1ti@Fj(EJJj80YwMCH*!R+91Gv=SdqAm9ec+0q@=}B{;*%>$cQ6>&k5gecTsONJGpcR(K!&n(?Yc10AT&{^%km20c zjuFYZI5W{ZAptyepVhVw8P0knK8^~KxPxn0vRisndUZyh1zC?V#w7a!N|IL!|4))j z|01<*luy6%FXx)LBHgC<9PcpMws?kqRib*+(lBc~2*e)Z9pIW6m)v2jj7>|=TNs+T z0|a92rhyh`YxvTLN}l1o-t0^awG3G8$ZPIRiQ8>VZjW7I>NAy?dzwxsM*BSK)3-P8 z18+--HE_Fgb6~l%yr&|+CA2l-KxA9@YmngVuyp@!Qgv`#{UAq3`a+J7YTy!) zM9FDGs$59J(YQY4MTfcjcN2TBaES#jx2F-82-5MsK{v(YgJj}wk>2dIRKquMDBTyD z>@-q!INcX&a+<2+SaPL{?W;8h(o$-XTsfspy72L+Tp}JbJ+3tk5oC7KlDdrR+ecJUH*dwF#=@GXddzg69jf0+w7)iE`+O(`O zJ3TNXN2L?<4<@PSx4)9q>8sG>p{NrUe!Cv6$9A7>mK+u)&!4}7zKt9{@$V^V&Nqckd>GgE*u>bxdxdr~X4DC7y7cm# z&|ZRe6n$~5PAu=4^4EBqE+I_Dbvxev0Ys{&tNkNLBfe*56JrzS32kB%8-=zV?N(fq zViU`I-ht~$y!`~kCZSF5WrK0eh)o7*8-$n8u0i_@uHmqWv58ONdJu2_2I3=O{!3`j z#Pu9DvApL{p}iY38in?Lv<>v7v^p82gShPx+V7yyys3~|5M&` zj<9~pdwxKeUxRj(us?`R#1HKUxA!+_&k&xEm(boRJfE+jT_?16qdi;bzaMS7&d(-; zL~LS-@Op1Y8xY&z{9|Y*3db9|AdBaT@mpE@oV<6`Zi38)j;mxGAP$$jnokE>7ulEXd(!4$i`;4<= zq66?>GNt*XLE7VEzxH7glje0A z-#G8Nn)G$-$)ItL`zF%wEjVvT<16P4X{_YDVH(a8oHwMfN6s7ilb*zuNn8)-4Vy_% zW_21vId4e(4(AQW<6OaCC#3l{-z?Ng^SYYDtet+KixbiDuL^?ONc9AY+UjYHf?I*Q%*FzINf{V^u^8JW%` z9m6!`HuDVUUsHVns}E2;j%g1Zvz!_9A#G;$0@ATeuZ12L&-ByKJkMG6P)uO;HtMhK z!zdi5eEH;u%J<3LRA0#YXHz|q=~qZ6G2H|`&cbvj)svaN8OQtWcQb8-=Dgub(kZN- zOL`I0CrPI=eOAyO7%Mn?7)&~i^)U;2E$MVtZy>F)hwXyy6|@`19Ns5L&@%e2B zJOOKys7y&SIC~16}Z7E0N1dv&6hA%<)zN^MC}!Hvj&z_^ED zM7=M~!=Wk_;g6Q54d>ERSQZe!!HMS4-v;fL&v+UAa(P3TM}7G=(CpjrzU@P7EQT8C z2l%7);_w-k=R5{0{gH4-S`JM(Ebw{AHT`tT#ks<{Un;IcInLf?!mElLGnc!5)5#6EZAJdBiXqlEWT{(G>OukpYxzpXYxy|JD9Lc zzVr5hoVQjb$&OdmMCVrPj&_${;yDn8`7N^kefTAIxpj90j&-IE6!vdw-JGy7besHW zJMx?vX&9M|L}ze@ivDzTLRR>0hc#h)e%tgcBsw2+BG36AsnQr`PB=imied2vuTE>u z)|^Ae!x2d(v61G=isrW!M@MuI`6Z71Wwf%^19{E~Z}*<4+LzxBuJ8k8)Q3^2XPER*OkLR`ERO-W(fbuCn?d z(Yej6I8H}fQ*Mt3KCd_#8Z4mcya86u09?Un8SOo`5ORXWj9M*fJz z1Ks3KeB#+?N_5u8yAqwJu|(%z(6!oHT&u-j^)tAAW-!s2_{2_)Pb3~F*J{)IJjD6L zBJhdsNKvh`G^My@g<-D~k(ep*tAutWIwyYxKJh3Lozwp=iO%mK(Rm3HomXVoJiIa; zW?O~VN;S!udnBeJ*?9s+zUvK3PvheIO&ylBWkJb7)`rxat;`p(wMF)PQ`g_>RLR7=CEe!oW7E??CLTVOD0_bC z7FjZ5aiht{9GS$ZL__pIM%SP-Vy{3YBFlMVGpNKvF_w4w8JC!ByU90K;1aEdtf5?@ zg>i|a;EWi3D2=Xp{gXK(E{R(9HF1e0zKJ7niSB|k;%I~UAI2q))f@jcxWqV&LmtE> zdN3|gKg=01T^)zm_;YLUa~O-B(+#FMU%(||95NuyS>qCmJf?$9jKDbLmSs$@OIJ1= z*PTr6vk;r8H-k&mfk`X{op{<4Bi@y#IrDMoYSNtF8{bi|yhFdnv`Q5uw(hn|k-=zMuDj zb6>afR)}Z3bZKg`dnjMmhfvZ7l>x0*&Fi3I0SbzDU&p-Cz&h)b$PQ+y=8eNGE)uX|{c%IsCgxwbqonYPRJe_w*ZVB5?%NpYKr zCZw$rmjt(+16<}n_@V8x(ePr;@bK!tE4^D`83I2zM40>0`-p|=GKR#(U z(mT2zp851-PfD+u7(;(BhJlNm@IOS>=>lR5gR*|Ui?U8#j3LW9RmY~_XE7#e?~{Ue zUey0^<139B`HQVMMyf2W6}j7*yLwxd(TAgr>n-m@BzGj(Cip{O8K<&|=r&P9KiWKlzs1z_N z6b$}U>CqUQJO`w{9xS{8WWE7C=AcJ7dW55md-%?kHsZbbj;MfR!62cYm6UbQNODoF z1j=x%SNIoE&q?fzfip#Ljry+j*6L?<@+)pl$~s>p(T>p>pOoE4>16#+CB@gIv*|Ou zLJB-V7>>SxGBkPCpk9OeP|6V0{u=bxp}&sEef;9UbB<*D9;kiPYf!I2y+*AskZkvu z+(YmsZipNDyAiqXB~8%VG8gD-P_03gr#825X?LbLR~OsAu?~n`Te_T9r}ZL~p?+9u zGdn)$+|AD0^o*P=Kj~cI#P6Kix{kDKzbR;4sH4vi2A_!+J9jrFr6iq<=}X3WTW~<+ z=We15lcdo#7U{7mxP2~B8gxW_Hdz`yHCalZ5b&$?>tA_}pS!sOVwEG%ajrQ38hEVp z&k*XF_c1SnEoiKtn%2DdXZW2HlABZUcbU%+?98iYXI}FkKJ7?}Go_hpmsFaoV#6~t z7dxNSd&VKH`APh~sR?wU?423a-8A)$%EdoC^PR`L=ihkt+MLCn`Q6~T>!p#7H6r`M zAKSTMO-$I9?(4i-^ycNirDLgXUHG~gcBS}Jq#l4>ml(7DJbs(=JdSp~a&fZnTAx*x zz0s4Rl9m|FiL}&QAdP3d)X_Xj@5WppHV;@|65RGh4!lz^e*G-ykV&)q3+)aqj!?KDQe`Z{L{eRtU7dW>7^h$#%px(_bI zbo<8dBvVXG#N=rv%RRSDo;zdKj9HVzX3m;Ba}KWP)7O~vD}VZ$@a`W!_)u2-s_Y+1 zwg0j1 zIbXJAuUNTqZuYF1^RidSb7o~{FUO_&u<-2pVaw6NT1J@oca${io5B>X9sCZJF@>)W zetBw;lChm4Lr6@anAuC0G|mY9m!o|lQz$Y~^nLEV{EKLuuYQE~W_-uYCdL$EC?9MS zQ}|P%ZAbf@(0&Z=Wj{hIS-7idw3a{^@Xa@@Yi7Ct!jyGZo{e=F+6n-omPs9{HA{?*(4{f?0 z%D0!8Lh^*+ZDIl?0 z6L-Pe#1!5vEN?p6sY3fZXlDz{n~k=ZK^=kiJYj!Dp`9nJkC?(ogf=mS4-3aj3ff`@ zIx&N<3y+6yDcz3581jtfC~U(e7{hrN%V?fANRMfZp-Kg^nBYsNGcyj61r5(uslXAK zL`EGl8d2p6HTF=Y-9}&!)t(xG$WS+xaMU%!Oc`}hBtQ6{`W!7CHc8B*T&FhUqoiwjs%;%8&#Q1VZ^ZsXr zI%!__#`%c%C(Y{-RM+0Ck>>SOp-!6DR|$2}yiUwNUk+(rZ-M44;3q;K(!7rs#wvba z(!4%dsFUXPJA^uEUZ*jSvxek*##uue`#5VT;dQ}TLmD$VYe?fQXAM{4+`(BxAG}65 zYdD$oP3(zWPkJ)bM@WC0=}L_2d_R-s+xBarPMX&ng*s_oKP=Qq^ZF!=+ni-2pE17Q zNb^2cp-!6D^MpESUf(3tN%K0LBRI?0M*3#<80q~EXAOzx=d2-}hi;q7`p|DoIBVER z`W9CIjP!J-@s*Br+pSFRg66ED4~|XlZMdHF4A!TE^mmw6xx<-E-+<$nvxae`!&u!y zT6-{?NzZ2WM$#H<_%L4kBk_fwQGG7!j}PF3eBmV08XFfYX!6tMY}^jg-(~l05_G4a z`vmQc@r3uEENCNXjWslrzLPDJytg@1=!W-woGAnUIGJ=jt4}AL!1QL)aZJ}i`z>Vp z6{>6c1Zi!*nQ_eWWu`*&{g6TRM0Vd*R8L}hFKG+YZO}ZUxrgd^v-(UN?>wXVZfL(0 zRu@^r0;;F7`We#nVHlGE;{(_Jq&3!1^*KyuebT6|=}n|H#;%35#tVKZ=(B?M!acv!$@n7v5K^f^?8x{XEW^|0DV8xlb|_Y7z)iZ zn(4PqoHYz5ox}P^lKu~-uLXCAcOD~UG^2dEjAr$n$iKNm?Wv%b3r+#}mWNIBlBdrJ ze8OGOY?B34&x3hu&i%s_n{kF7yWI}ZgHbd3i{>p z25zYjO?1n*f!fpX9_~sqnkQnVSCY|OG3BD%;p~~SId$mDXbzVz${o(0r*^+QcepZ? zJuY@SyU@>&Q-&@-LteQocewu|+~J-&AhsOuG!+pqk4s?&# zT{na~JeJUv(@ET6f9!PA`m5j$LH{|loaVhFaEGnKxWj`(xx>7q(Dy1w;tr1va)(EP zN8%3OidYs<87Qgj;hWY$_7Ew@hXwX zXd(|CKJ8_)*F>TZ5A}BTBdIwMjA;1#Y4I9?Xc&dGW>A%m=JT>=PgKAdljNShJFsv6 zj3i2H&bJ1g=(7YTHyRTbF$VEq^gvZadjxVYmqjVX*%A?m)o@mqD9SWu2)&aG=W8QWi^9E-1V$> zMRzER$g`T;+D{(oJYmR8NbFx60TywE)#fprMXa{erQ{+XRTR+KqMOm$*P4 zOJ0eJ$JKcy^6QA#-Ybz`M@&h#xp`*xrQ6CqubM@4TeKr4< zN#2$wBq;Zo>doGZr)TAEBcDXMc$%)arT>6)ap=l>ZoaA4 z)EVcn!UuIxo_Q#T7^88B72ptC($bIz$=ng`7Uh91JmcSZf5fF<8;4jhVnVZC;1I|D z135(Be-#cfT;&kczAA@!pdF)-V{t-aUZyq%c@F0gt1Y?7VT*!Q4zWG?q@|8L5>1># z^{-HyWPeiF|w(=ziR;R zYl7YjeZO&cciE&he>;cRm(pG5U+W)NJLrN)nrH?W%|{g?<6IP<+GiMt_^TIl7j;Jl zd~$7;_U0goIBt+ceB-r1v%|azK8NHU=ru?p8Z3cHw9Q3REMN<&*H{cBCWkv`jyV4n7pdM?R_T(T9ncEM&+!xyuBl~Il)%pk(y@hw}>2Kz9}aT z=koL(xE;1d+nO3PJ8;hCZiinpho~EoLv#on;+TIhhv@Tf4)NKhnv!SWz`h^12Ijaf z)k<({-vjOwj_hz;FQxe=+|vB}_k`$Zelc!o{=P7cC z;fu)aaFtt!MfTal+zziUiTOZRd%Je-ZUBe4Vwufz>@W^7*wSaAb9YlxSW}rBU2Ai1OEx$}@96HPqi?JShj{35oWGKslbipBZ82=j_ zBCVM?M7sTYImDH-X3m^H2Z@C9!e@ogS~++AY#@kp=g+mxvn^jfkG|O)KJo8BY0fu= zL(CieGL~_ORYE%%+j$t*0olZIm&F`jy4*q62KoHu5FSFCE-g?_A)5^9@5(6yjkkXU z@eu!_8s9qq4DF|J9ga-~i8#bf_)eO)?GWpP_G4)K;F=km7>7vLv3a{3LiEnthW4-N zOKo)`ZXX;Wt|_sJc^i@!25>Ii%xgN8$Pmo0zxZ7<`Y;+rNkC6XyQ`?L_**UY!imr?~YJp1(h#T`jafN1OaT z*kq8tgb=;Yh(kOk>>tWqCjS}UpK_P|gy$~+ZMvq&=TAhNa_xBgMzl+W?IR8`Qs_So z?a4xa@-{ppY;PFalZ5*dhbVfp5r-&pZZT*t6}I1ucAKz1@;2Ndv{TT|7hZ3~A+`$h zm!Taiyxvxz-Jy3qzWdP@Il>3grYt%B`2Q1a@|EFj@-{pnJRaf@`-J{$(0*E2p9Ae* z3hSfXWs9(X9!L8#VgHSkyWAkGpK_Obg*N3bhYR;7Z^H&*{lpQ%Wsus@t`i;~afsxF!k0%JB3+B*?QXPlaQ&6HKSn!P z=>JEw2XJka&+kKfgK)eOhe*5zpZ_J=D}?2_Vc&`zA>}Tg5tcUw?P)@rybY^`HgSk? z!tyD1`Cj38|2Eo`;m6k>iZ*#b@iuuI&K8z86YZ5kdk)%p!t#hi6mzAc&^8PEi}(+R zus-4tHwbOw5Q)p->n9FT%rz&@@PP1mcu%?=iA!9G{xsc5fxXg$|l{r-11;ZFirv@5_F#|u%H&F%P7{RFFZtC)xd!mXGhRG@nr}2vFl2w#0 zOmj?B`^zp~aVVWg_#LAQnPuQ5a+hgSTwtP>yR5ET1q2zLNb3=Emx<@QT<$X6=PGlT z8S|&^z%caz;wKzMIuL8A-;Wu}r^C^nm`Zh#y%NU{#26LB$?UccN2(Lq`pYiUg4Y~oDP+A+~ZS{pCu z_Z6H?%)}VU*~F(wYschCj9r{fq;Zn7i7PNhayIc{(i)rCMLLijBjjbsxir!;E300) zyiUHky#Bh-pER$x33bxEeyw=K8?ev#_K@bwPo%o`-i zC(Y|8pgB88AOgQHY2GJDsFUXP*+QK(uUmvVX|iQ1 z-=Cy;pH)JgG_S7{>ZEzSTBwuebvkEoHnEHJ6!sV&#`%`BiS!!)?t^$Yj?LSqu|BoX zBe98;mCk(-i7n>2%SWhwJG(Fa#)7knRiwYe>b<0AGJS^hET(7T_~mTkQqtN3SV@|} z9MaRIH8!!0wB~)d7O#EIBc3L$edhDPIKZ_Z>G^D3Ge}1;P5$m&Zy^0$R&OA!@rCVz z?iI8f#t_~oNYFC{okIFfw#*FDn%`k9>AP6nAMXSGqL_{obiSZpARW#6)RQ(c-A_7( z>4_L~IGboDy@1spCmqLhCp7m#?4r7v)u-VY=WJpa=>%54gY-hCpCfHzx*3}L8Xll} zBCAtIJI`IF-&yfxW<&G+kVEw(*1v%27N(DoPG-6bn&&R}Q~i6a9);tb=Put1?YD^4 z3rVLk{WxijO_VSua2_#G(5fe*#v?{io!~4?*@CVnt#NzDNNah+X9Vqqafa6?3woZQ zErK48afY*rD@bc>Vi)OUY#XLytl(_oOwt;g_z>xPS)U5h%bBi%9=C$&r>SmZ`ZP3W z6VH;qkJW=P4sh;pGBo!@j3uo-#+{^Bvi^Ii|NTspC!*g2Okc<&^4w*WN6cY;;?SS7 zi5Aiivid)qQ^dQ%fBPe{=Yn23I0X#h6zOvVpKuybCwh5e$d;nimL$D$BVG#_$1sds zl2d#R%K|buIMKT3Z-aKrXY4`0T;34oQD43dG<)87{KGhmp+@>4{%D(U_zd$$oQIWO zN$zsXl#6qUG6N4)`f$)6an8j!#ju%I$|)YhI_Yt-Q`=YJ6v+V*smSBW^Du-Q60_D! zfJ5SVceo=COu7)_W@JPDM2yDoT%@Aba$f(mL)Fdyq}+RrHRXV+bD54=WXnn z!Nlcfqa%}y!xERDzRJYqzBegz*)0_=ZP9hHtr-ax_ZwN_a_Hv9cjQ%+xqO|Lxg30~ z@n~;z?%q}_{0z7IOmDWNWyP87K1%Uv_c%*XQk%IdWm0TOY=4{LD2#$9+}Km@nd!t1 z);fC^uU;s79vngto>Dyx^T^W>?lRps`oh!Dk#Rxlav?ko_nn^|rFSWw;uew7lgH(i75B8)G9& zWl!WSFRL>3l}tk3@_1=mNr}13sCfPnY0LYgYlqN;s;^=3=@=(-HH@`g@A0tUYIv!% z<+qwtS3`X)Pg^ee=SW-5`kGt~9~+S-l!UZpFGIpV%+=6aAN#N2YItGVvOdX`wp;_R z!CEPOHMy(q!}VSIYk}8H%SBxck+xjmN?YcxhSxf6nU6!?WLHC^E&F=JuK3<&71Q+ajw5szTq3Xo+jhIgs1d zzq|XX!ot6uFEm)X=T3V1+PFGRc->*_e#!qDIUO!|gL_1M`2trjT|7t>j* zQjtYdHcIZbC79!)B12UwlD61A^w6-a{vVMs+%{_S@ka8gLYgx9R3S~-3C0kvgNbKy zSemjv)|IAQ>S7Fo$>k8Kpu`!1Hyk-l8Hu3G=@9SoY#*Hckf$k^{%=nzb2=QaIvuK6 z%5mg#n8SPylU#h^Z`ivg8m%b3xw-?R75#Nx)aTItLS$Bn(Hh&CI>Xdp3fvyLxw>_r zOBwxPRNi{H9B%StS;`~398#9@fuUK-Uo&0krcW5b<*?Y(Jm_*b7SG8)(&fRd&*jW19ls3N2&Qnu;vr7y zcd1V4meQ-qQs(FKzu&Ku)Xx+?_)Kxb*ojx`a>zbY=<%6iU~9K|$?3GzIGl@Xmjos4 zgv()qwHhvmy_(Bmv+8oVKFW4{e`$jWpJNL>U+>AF6lMB`AwQM3fFCyxa zTtuBVe&Ne1#zupYCO#UU{4Pe+Vbm1HCM`$#m@7y5f9ln9@~|A`q0B#>v4=AMRH5_P zP)h#Y!L#U}U%M>dIKgX|-aPIK_{RUdhW@>mI}eY2gF77_dXCbQf2BGd=435Xoep!d z-gxQjb2_{)eC5nJVPW%D*uqvUmse)b%nqM7GknghdGqg^Gk0Zn7{10EHqm!`eEO#F zg}Jys$0o)XT7`BpW{AFbbor!Kn7;(=Ncy5xomh6VLuk|Gfk5pVG<_TV1GE$H9W9%f z&!L!=Onl)Ce0R*}6JPkE(6*yZ*PGbHvXkjr5pO>M@qo}KzL2gHv5EN{o)FqKn6Vev zVfg%CK|F-(IK2HEh*yO9FQHAI5^Q4G$pgat-I%dSn7<$GPN97e?Rs2uVH5K?d`f5& zU-(m8SK;$NfbgI%($$G&Cx15hB4XLe1H$9^Bl=Af+J8cOlhFPP+ADEd=BG;`Tl743vJ>Hn}p@vNcSK7lAdKJH{seOUmp1!J|%1)@rAv@ zAz#1|6d$G4BNlY?;G znYSrB*=_I|nn5C;!#jle#21SEFJ&k93d;{iJ4o0b%1*vbm{03oD(ny93ys3@Lwup= z1512ip0GT=rF1(IKS=x`O=`X-UELcwn%_SUgE@6$cNre*^$k@n#mF#4CS+VhkGlPfmdgRPt z0me1X3~nN=9arSj%b7vZ&u|^aCC&`e7|5AH$}Z*1An`k#8C*-6t}$b}8)H6axJb*a ze9=thhlT#6d4GpcC(Y|sLY*|PzaZ2}^Lmp|C(Y{@^FpNDQ_h!>=KaZwjMqu?`aGdd zn%6Jpd02ryoT+?WxG!mb-wvTpn%9XH;@d!)*S#^0@j7WFe2(MB^)G25GG1%;0pKCpa^Bgfut?ntDi2Vw%`<&J3!Y;AB>(F_bfdx4Al=6<10n%BuIjQ1za>%`{pI%!^i0Gcy{lvm344{6@#IiXIP*LMkZ(!72`sFUV( zE6$aEH?zmvOL_{^ci1j;ANctA0^Kd+JKf}GGZ)No;ywBl&h8sxV z&gz>;&tSTp^mmy4E9sd`t2xTEm`=cP&6&Z6Nox;aIx&C@tdKU7)|kN^g03g6@q`49+8+!urIKUc_`g=~Si<2>KXljUVhMt@#<= zfH8#Y4AL4uSVCIk2Z=%Ex>3*_f<7&14~#jye=F(5Y~Kz3N+^d zGpK$)Th1e-wf*oh>HApy3^dP9K1=lnSX~N${yx)Qq;s_Tj352%2M;e_0Y>oQTz2~a zS7b~m%~-ko;pNhd6+imX1x|%4R%N+AF;Ck*%M zL@z@O(^8b$!f*9(PQ8-s-bYIJ-bfS2mWq zXGD+BK7n3=5&MnrPI@!=J(Ug&egaJ4w*x{h=3)rm@bm|b`-u;9&)7Yo=R{Eq91LTT zoLn@cB+Oo4Sk)BVMQosRX=_YT+V1hn%juuVjz=V;Q*T&e=#d^R4BrzJtJH^|Rl*NT zW%taEs^6l7gAYWDvW%6Ym)*iz0>B8?If)l6dn#0_Kiq>v;ZLGEmr}(&4Xof=r>-(l z@!0Pcuyu;0>?zY%ZBh1Z(N8+wkmy_#;D8??mR0wz>?m`mlx39w+!Ju*W+}MC7`yXe zS=r5!^7_pKivBYax)7)f=jwl0CLd`3EK)oSxOQsL|56UH1JiWGBB9T^SQ- zReUx}!ELz}O`XPAqj_Mrg47=*DIe~%Qm^a^gGctE;CAENt%(U%AEYNM#Ydx?%N-fY zn8%~1SIHh8(LG(c`_AplKN5U2@&kGF;V3ORxtx-d_n%ihJEF=SGf8;f0~-^4knQ@p zTjwIhaUgn=)tH=Vaz}Qu^R0m@rSQS1$YV-zo&+v1oqP*-?5cb-uhaQXbxTC^Z}*&B zkPQ`vU;MvLc zL|1ll1s(zX3h^cRt<^oaPL99o-{bc8x~}rBDr=Rsth1x*SncBJ3p*F4>|T?Qu-;*` zmAd7+>qp~?;J0u^@K$7&ephOW@lS7056h4@%DO&d;i8kt?H0RP88cTWZ}^L30cAK5 zYogpUi!?eUS$gal>`==ZiL+J@1})_Iy#%pU)Q=`_C7Z_Mdl8{``DV z$>-;nOxU(&$@PyEaK{lOxOw_4by{ps_&mU`3Cj1qG(rCUs}m>zP5J1>36z4S%(b7E z=RbN{Uisn#W$GI@$+K}gb!A_OG$2)5jaesC?B02Fjqp(BCmk{UrXF*4 zYGq$%&-U;2wM~_a=YHYQ=cPfd9!$#wbjFOnf zb!85JNpa*w<)>!8L;i(I@lT?h<;tTy(m0di{drVt`Y*-@<4C_DrYo_hyzxM`rLV2k zVk`I2xWig&f2wyZt~tKGRVq7h1CHbIl0160F5uDD^RhQw45L~y4Auy8F?4?~`kU)w zC>Mq5l+vj>*=wpU|4G}TnOVxZdvvlrO{cu^fQJIBTltN%dijob^{dt@b?@k911f*4 z*2yb3NJ^a-=5*-ghc`;foqyKLZ`eGP6-y=g;mtbvj%*Kkj$W_irb@~KZ|Ib>{yO=- zUrWl_=cKZ;XMJstd0FJ}e!Zf&>%;7m9PuRqdHue&5xK+4qUZ6o(YeCs3*4lpb(9^a zPqc*wB0JJY%VG4zEixC^&XCI7L!`38??`1{)1*;}HaQ&Gkv>`~qc3_yqKAwgccF&t zdarrX*hG2bn^6Jx+%6?J!^-Qn)H&=ZifQg=L;MNVem1J!?>}LA?g`8nu3#WP5+EK17H9YbYxc{gDe<=6Q!?dwZ_F z2K5@$Yfz`W$TH7F$@cDC_YgPqFQlwU^he0pgfX_vJ9IUu)}UI0Y7MGwRf+*Ar^QG& z_4q|lx4-wXG}Xn>u!yHA+Y?>fVcA8w!>+0>XIHtkyrZM-SZHQ{{EmdKwoW)9jZJh| zYz~lzcF+osf>u~N9l7oi(xyem@KaQ4>>?q%7$N2WBHomRBV0>FU^7vNp z7pXd>Y0-*Q{b=XbNtNA6kA0kG>M;eGdot=Xn-}j`s`qRHx8Hc6e_``hWqnX|cf}|5 zK}!;>wU+SY9XK=3Fs+X5Omsk=D>ZEK4{oy8`pCFZ)Xn! zE!}rcst${59`rUOJ$-|Vf>Ya%y4W{r?^x?19OT<>X_9}9k^Q#&FsiTD-Tq?t?3+Hh zaEUvvVu=cts9=c-EwNy$?!G~O;xB^~qFo73t~J)dF%YkpXWRy9zWSI@6RL3NN{kU7 zMZGE1To?Dasc6bNX}a)e>dm!@)Sq&T4@lzUn)0%16lq#_uCTHwZ>=tok0;%O+~GXk zIe0tuI}}gPXf+YDzg?KL-D0f> zRMVB&J3iaukHH+$dp@{=eVCV}GKZcwfjJCaGyqpatT*w@N=Ft;SGF5n)L|AQ9e+e? z{t4EchgLM) z+8%dH%R_W+*{j>A*RhyBfam^``DGzp*;@*c=!{8e$rB{o;+M5_WpC}QPW360ZQ09umadHcNKtmB zE5EFzE2BT^u5{&>wRC0lcSC@V_ovXgl>B=2jI-F_FG&Nnh zLv=M=?dGt`CCt@OFK~zStCnZjGeOTlFrE$V8NsIvHKDnyt)ruMad6^}1f0neP9HN^ zZ0wPS;_L2^QDH?CY+6x zjmx6C-zq|QF*cDU^&WrU+p&0StUgXJyoh6e|HA>={hMy^mq%o!;XGHZ(c^GHPmLX@EDZlGq6q@n> z*?SwXsIGg9`!K+OlpqmBLyfT-iLu7&jN(TV3IoDOaIi=Kkw9d0lGrr2wJC2(d%Y@x zhA5_@BN9XUYRXM*ug!H*lG2o`s7Q!0h8Q%)m^_k_)TY*wl%(9myld@!Hf$99NX*xL zd!9#G|Nq%@=FDNvo?*^!);a}8+X#`iJOVCHWn(#BH9D&Jcs z$If|V)FwQ0y?6%W-`0(IO`&IPk=KsTTmr-LDlxZLoT% zG_7Fzw1o>7nAfiGF=wxZpN*>JN-~JNG;R@}_NuLuAqg~WW+~U>f}FPaOCaxP^#ar@`2nw3tOhSb9MtOXqrMlP1Z zP1QevcnH_mRE>{Uj8d&GL9KflKFEQ%#v~W%aY)Y!Rg*z{TB{#Ht!JNZL#<~K{|fbR zemE@_nYGM3ELD?14A<8G0d=lc??%n6E4f&W{SZ1s^gL=CuII=_GKd~re^K=-5M%Lq zxvF1>2-oUAp}qsx`{W|CmOtozQdy0^Vg>$a>|XzOs5!V^CKs#mKE(an@%RXJyH=Ay z{EhbeB!l>YR+B+=@`HS_SdBrbd0kl5Ls4(l_HQ`qTx~o(4uiGvH}Lk_{*Fg&({4Wr z^%-sdrlL;Ojt3b;ojE0gcv8E+WYqOqor;>*iq-yp7qy;!oQ2wSS69_~JEz}TW* zudOG8n67P~4B}2)<5k;d_MpyaGHcnYJsvWMx~Cx-#4XzWkwJ{rjt?2c6WZ}3gE&GP zPX>|KnAQE0K|HI~WDrMaw8GOB z^IWOY&gYL%(_=-g_s72dK-(VuLi4oq`6|?r+W0}JW3=;mDC!2SrpMtu+W1kZ@71<< z1M0=v`8gi7&g_ywbZFZngSb+w$sn%Owik!`N$v5GK@8CDpA6zc?f8*F+@Re*8N({A zrbnF4Fw?^@R9n9owayHyBgvnAF^oUJcrN!~ANuz|{IRW{Y~~;LINHgJ%4l>O@Ws&e z&t~Q{3md#X(wYV5C<#a1_fS%hdUEq*VWB5zKAUN+C$?`FTfT_zq1Y?C7%wdP1U87h z6StittOG@CvGhO`hKhY>GZQrw`_^NDXqzP514T%3-`UKB4=<9Z_d}%LuVNd? zdMmckfjL$AA(m5{=j0oh%M{zlc~r5DcVNy`Y~vDYzCptxJP?OS&AesBol)Cm+vv~h z@PIa+T8*ctuG$W@>Yvs6)T$qb`CW~tR{arLpIY@NXnktcU(CMwUXNP!$s(yfwdz-C zeQMQzQtMNzKKVq&9uCH9s@f*C8Z%DoQ>%WW)~8neJgrZy`kVt5+xQsuF!{^iT&UQ_ z5!7H9xNr_tY$NAm#Wt?MYl~tV$&M?wF_!u|dE3XSM@rp6{SB$f2dUo+wc0oGL8?!! z`tN9cYSsTx>r<;f*?q-M7D21yNv+0g(E8M>{~N7Ot@`vSQ`@0deZFQWcJf2&>*Zs- z2d~G9ZG49s+yxiD2U1zhrO=9PY^Agv2b2z@o+ihS zr#4xmug!09>&S-&`VpfjUkv%6x%qSIzf)frB0OkG3uF83x+XCYQA4qS%HMwTRCmw@VeBvAIr^+z_IA>K>Gkp)0*WnUqbsP%WcggW<*iVz1p6cOq zq<#nb>hGG{#5t}QMi=x=b7lWt_A{i`eGjYIH@U?y%n6EByk65HpV{Q~TQB&glBRPtJqq)TViIG6iO0^Wm>{OTCxbqqBB*)(^ zHT@047fYQ2ebe`(PKQ=m%{lDfBl~3BZu-8|i>dFG`U-d;{uu91`rsVdzDQQHd>`_E zigPsI)`)|PDOoH$%`vs((ZNFh}iP)2DPZ|@u`X_+lVt)1mODu0hrS; zjfnf;I-IsfG5&FT6Y-Br6SnnrDaHR>$A4?gpQ4HX+Awa3DztSRtM-Abv+*ECVjjk{ zWBd^Rc)vJ(&f^^K$DKZ?-H_Yif>Q*4GxaRN(fx9cQzn9GR7t{Fza~O zmbl|N#X1Vk@p%%Co`w^t(XWtw46*L4Y}{LyZF{tk>G^n&CMFZqxq!>#7?#w6eC9X7IW~f4w32gd zB-{94P$YD6Uxk-sW|E##S)b~dq8GP1HcfA|9uPJI(dWAi(EsoS%yOUTuoTYpt;mY|>8=%iflj&qQLB7+g4*2m zpT?2%ZcSF1!Wz%?&YEPoy$C~ z$g{a@`N(Kq^NL?b!bwL1na7zREx3kaD@sRzd2EkAmF`N+K{|6A&Xc#|J2mRDF6*N~ z-V?r{`yE^1w3wM(cc6~WYWKySzkJEf=P-}AeQwO-+CG^_i{`Z$qP!Nr0Om3D0$z(>DdsUrFpq`Z$<3F^JRUyS z8ky5Rt19Khfo8!x!fkQ&`OKp&ZRcDIvztLVcDU>Vi;R2m|W*0njZsx9?&Wp+}@t?7wx@l{3`>pk$9=qb& zhTdNrGQTd{n;PwcKXZOq!f8kO+`Pn+;N79|VI^UakB+EFI?~?IvA1wf(Q8$^-Pa8M z=+je=rKxSt4BvXL*RQHkG(mMYcI?_ z4x``V_u;pAG4AoE-`6-IxliOC$MkTIH3^Z}A4zEHN2ew^5_@z$p$Ts)7st~f@&erB zbs-!6T<^(<%siG<5j5C1HM3~u))n@kWpQrjnR_}Dei}E_Qj)qINzS#aZOC#4Db4pY zOZk50DBj25AN&r#x%G8;9^MPy5zON{{3{3dXaV;q$VY1y-}%Y+eD3V`-@vOP-u3<4 zncu$Q$!^bJ{wLhZW-fL{&J}KpX=fI8sx;@+9`5l`?Vc~}wy3zr-#=ZC_p1k8GxDn) z9b3Ap+fQ^h`$Fc#HLlHhaYjPst?ohonV!7TUfiQhbM|J@+YD*W2kLV=@jCu5?y)c8 z%C^z{FYb}wvHA?toOSLo$xL(Z>`8M@m{GiQb(Awl~>hbP>4z@4)$6)#0s`m!#->tgJXCv)!nf*_pSP(BugAW% zuf?}LyQ(fkaF5pHw%DPa=e|Pf^YvxDntg`cqk1I^#w%HHH}@Fr^72&!j=sgeboJsM z)$8XvtXa|Py8!AnbPv|->BT+{`JeW=kxY07`^bc6lYK_ex3=>3kzbVdZrXCn7Gh3b*gQ_0*`&s!fA^pO?Jmjn!cdGUeNO?W{*;zbF%Yg zVIMu+pTkP_ksc~?k?iB%?hj;TzVlA4<|PSyQLB6W0w|r8HowDr8)z-xmRw}MbC*`XgcUm5 zME0=|*L36}^PPEJN7a9VxL&LOg8E*5$S)R|@2sQZvR8nyR_#g{TJzXrEX95k)AWEUXJ<+ZF{AtAJ^`W`Ofq^QsbHL z%s4Ka`ha%-%y$mejwkb-$7#2x|6-$d|70IKwDDvgtF+@q_L0}8)&1>4 zO|D1PWFLF3S6L0RkNAp8_jeaZW ztJc5A_1gGrf8b1|!jXoA6KOjE_Z+qiF+mj^9D&MD$SNt{!rLW?A5+eC4=V#MJU0Hm1>Egq$f zEBnrd7Dq&EllygEHne~vxyH^72`E#*kb;tw{G%ivC8H@J)QRHhV8X28V99WA+)_P< zdL=}YL=cyNU3iWvCX&xr#YA%6QhtxuQ=8{O3$=O9y-97(A1=(ZiixbEHqYC4Fuy4# zl5?wKBJaUGs+h>7)Fu;oiaJuBH+7hs757GMmu;h2>r<;fb5_-OYSpKgn(9-lei-I< z)u&ed%jFpU{J17O#g^_eHJ7(9ccv zsa2m|j;c?s`uA#mYSrhwsF=tnsjrd049<^=iJU-f0vDWD6%)xhS}~F9@qAHCq)&y@Y0 z)JalXa9%6FM=Nx=Q}#32pCz^MeoT>?ytQH?^(^R9yzOi`hWxbRAjwRtjA)&MT!Fqi z4y7EECT~mMc*R6^P=8nUKZL$IUFyL&$HV7JodhzfJ02P@7ET4(cq~AAvbR zc`#1aw8(`vnaDi$O%8IUrgu^Ek8>=Y)C9+{gkf$`8W&Ewb*!c{HGPk!ZJ2Wu6S<7q zWFkML&X?PFVlEnght#Riii!LMb%E?RQM;u+2z~WJsSmTiNb2ix?kgs80`;A;KL=Xn zJd@Q{93=Vdo6N`f2KC)?d?&{*mO2A-Nci`pz5`lukat0=jOZV*|9v^;e(HOrUPk?I zQh(umB;LsUU-E$*Y#vtr!1OE@p7NO5KM^0vza`Y7ws$TcIT3v1rDQ~(z_!enYq3f0 z6aTF-e~Kpl`zOXNQH8dSW7R%z^*wm76EP2C+7aXNGSVj>xdnInbM1!Q4i}sv_&cg+ ziHq)^kDM$KNI^q(^O4j0<0Ea;E|rfQi~HpM$d|Uu<|EVNBjEQKp`0Kip9B3kWW@gB zboxNXM>dov3HQh1?B#>&TZ*%mM><|kI_`N^_&;8cOzBJVfQ)>#dVlS@Vt7CnXZj7P zKko1J8(N$SAINfB@r06w2G5BfMZ*O$9WIbry9e82GT*bWUScFw1_sX$K59Hr9J>ep zjZaPefVt2WFW($jztQ(pv`C4zX9tHnnj(%y8x0~Qx}xF+qyEsbEc@!0;(V4`3)fe_ z==1*oo`>;6DmK9X@g@K8>V4o1S9V%_4eJBF!V8kuNWHl-H9GQ@h|Qx6Usgc4Z^h3n z6))XjjA(60fDh!B8w}6uzGrUeqW`0>WRJzyVhQ)YU@zSZAIR++cN_*GS>3t!v;ThVlgTHdwWZB_7ZOpnZBPV^w7%e6QydTyp9857Qn)TNCTIVs3{+xHl%-uZlHE#`goR49R$f z-5dSF^5EY1@TVsk&v$S1AT_$(Dcu|E`g3oLJMxNhZ){JmPpB`quj;Vu$gWQIlvk%# zltv&mI?S1u=37Mv$4&9o8p{X=$6=1$a4=2if`4PX!+Wqf!TqSe?%$Z^?Vn|AY7qX7 zUon<3_j6+zR|e1N!@qHW#xnX@Q)O=S7r-+52PXBK8~v4H89xL6#&zejjGvo-;{|BO zUMyo@{*9jj$te6AAAo=3b)TMO6#k7_%D?e1Z@0oXs><1(OaI1kNRv*gtQU?^?I0Pe z;@gIut!>VWPOEj4gcW5KzS5F#GI@z}MfP_1Kc98Q58Q3(+Usq+H?29nt^)5YD(fms zLJO-$G{+ur985ao+1IhVEh>N6r)L}C=xD#Pj*izn)AsG_PF*n%EI2ye{yUW>{r#tv z`u!K}=y)~B#vj&SoNS!(-=C|a#Y8wdA`Laj zQj%a>O|o%ZvG1+_06zt?@n<9(;oc`ajMb2ex1NKJ9YZc3_b zI51a}ol{CZeoAv0k6c5@6sige=BDf9;W!l=f+QlwV|rD$%BNnfy=W8A;o z96v9r@q9POlGGlmu^QAbs78Q2^ojrGsJC%u;@_w?ddBzZ<_ORDV#}!W+#F5McwaBi zc>7f#8~gW+f86wpkH*jc1nu~r{dvaU3(xq)@QnAYatDS66!hsBUkt~1|Fv+7@6R!Q z<9{umzq!XT9^V5i2@Q{Qxrc^DUFGWL8W-(@o8z;lo8#Vd+#L7zOEt>BIs!uqABJaq zTFyJ|b2FXobaPCdklc8CPF{6YU~oHfrB4|R`1Tat9REGe-Lijeipz6r+kmjT&b-3B zXyi(dFfg+vn7Pu)XNHLx4IYLijvf!gejIAI{utl6?90Qj_gn=JL(EZab7ZPC=c!-S zdsEx~XZYzW_DTw>a$om%1YYy?#WtVgCRrco{HXTgZj$r3Zfj>fK>fkh*oX= z?@-hGLN1bNWX_kWcSAg()%#I@pw-W#X11VQq@N?bc~niNk$yO;ejQ>QuIs6~4WhIA zNhC9+hiQ-RuUPNU9{;rg291wF|4U3^lK#tM&AAq}PzD>E~Fe-9P;t>8YdE)6em+cKkP^UZUMU z{Tz2_`%9)VNjo0fQHu*MVuM!W3Dms)Ef=d%i+Y6i`*{ZSZ?yeyK>dVPH=))U+=Hlj ztzT{LCDdj5^B?tDt$rOfueYl4Z=x>O&JQw;R|2o+=4nqt9f53+WjY^F4B(2Y_8Y#cP{E&?fjaD`mk2#qps1mulAfj z`(hLqVLX?~cuW^&6#LAa?uSwAMHou{Py%m~LX^y*;N(osP$FxBj57`W#H~z=KQX=+ zc_@fJfyLqV8S&evJZIoXUeRRo+_cjrfoI zc?p@*HtEAC%_}F02d80`lctM@BSA!AASp;n+a%Ez{G^};1=u)^2g}47xl86CsA=Nh zi=!lO$ek6(nU8U*>~YMb>0%EAsVI)U{59|a*(9%Mf{F5XByTvienJYpi|UBx3-V$M=LBIirRBhoKT@rdK7&2!mHZCr<ZfXb zYSm|stQt?P`b)Jwwd&VFD_--2HilY_c~9$8t9}^fDs^Afsy|liQ>#AbI>m$DOFdNn zGC1cc9+Cdmibv$!t9V4tql!m#;x$C^h#l0|%IyST?o~V@*>}Yw3I=hc9K-ok@rd+4 zQ#|4z%**O|Lap|Bl-8$KeVf*&R(*%or&j$f(27Ug#WCjla%wf^nAWFO{WDshTJ@PD zsVjSl;RNugZM4k55f7Xc*H@}lVm@K+9vf%YV!fiz_C$0;$ze%k65SaMrxBye3N>r zd0&_xly*>?oZ=6tr^_*`HT?@s3%^EljPPqTb-Ol(nfHoo45R+G+-4rN$ub_GHhDw~ z-XAI*qv?C8O-^wM^>^fU1cMkS^_%R+OC60lLGg(E9#wdP?AJr93~9a>Ry<-j&Qp~S z9Yvii$6rtFl)999meh|ytITQg%F3^i-$7ED(-U!SDo*icXmuRo*iV()$z*@F)Z3|D zQj;^jI!)>W?9Y*!Iny_NSL(^o;ptLmQqProA$5k-hp9~-@sy_Zoaw=sD-@eJL(_%S z*>XF-p`Ir-nP#PrYx+G+hhm;lV@7HEZEBNijKQ3vSjL^yCg*pSnqU`}0L(dxM-AJ&OIsvOkXcds5q|?~(coXASXg=3lI#{9W+rf|r19CXr7={!O43 zO#NcvQxa3Q5hp6c_yt}^-@#mmX++$X>u{Tuw`uNDaHM<{MMvN zQ>MaWQ7wu!oI0sL*3f>*UX1rg_s<&M(nsdB-n;vUqrnT#Sm~b?A0bkskvr`_Z~0*I zhBKZm&i6ysbbMs&x`q{?3?q;i9nn}^jNEAwhOzq^4y7FP>=)GG1=FU-l_$OAf7|ZC zh!Yi=(@S5e+Yfdz(tnmD4tIb!tX`#5?gNmcyiL+0A!>FsYKXpSFRYcWT!(KYXpV`tejTNmo7%`jdSwZ0u*W6$f zBWt?upgriHaqKj|U>~r_&-cI)i+$dJ@a?J1d#v+(Nu7Za)}dzJbl`Hkb+fy-q zuiR*)wAyCXR{EMg2pqSk;?YQB>1(D3W8m*C6_4JC1nL{RJPoH)T}SNJI!j1k;l}MP z_I3Y*)ajk;cUE{Cs`nN(*-MUF?4_@OIgA|W&38TOvwX*|`O&4Di<*}{XJ2RYi#$-3 z-#uvk!_0E*%J)2YDJlP&!ILo%d7j`J#9y~05ySMZB)_qG`952Vb?w91Y4lpVr zZ$wsYn^=@9bILo)T!9OSG?5*twZn@PSl82DqFs8Pqv~3KHYR@mtElP-3b)B);bYE1C0_%Och zg?C02CT`bqr~jX?K<>26iuMI1`^g0Anu?NvN%`&*fAcSN`UZX+|I=OTa6PIgcRCw> zC8h_X=D+yOQA7MrZaP_AP+d@Qvh~CX@4S@MvRjuYw;YZwTQbk>KVXS}338_&_&Rc3 zzlnU;ZyP&P8}cl9AQ#u(3=c*+F`jg^q&2uo1ii@I>G!2Gik>@tfoq6agIgazGWh++ zW$tv(HN*>fFkb3a#Q7UKmcKgq_2mV5@L#+tEXTbu%wwPTK)mnp%6R*2CGqyV@5Z&m zmB^i5IK;ka(GZzAy>JNgrtM>9b=n_G>>RypyRmIqnK3ATYko_5U`SWh+0AVUIj580 zO4jO(niadLJvk(MTwZf!#hRf;T~lMTV^jNq=$x3`&iQSL`(LS|^Wu>svorJSSJ$W6 zgFd!&Wg&Cg@zKx<_^{QV@Rer9$;9cbxU(j&c_gu4en0!lMn9jgAi#Ia%YpV=4hQ=FFbHYW`~7@>{ddD>Zw>VAv;_LT_wRo8 zTNVcR{`cSgd~I`)Iz1%t)C%AKK8$W;pnY;cpzqzE8oraa8@`UYhJ7J&sXJB}6&)SO zo3}y8S%3tGsfTR{1MCx?l?C!kjWx+C?(m*!zgAVPzT~{=r><(Ke>heoPRBkX z^QNB~FdF-*XHHiHT`TjZ(bqGlE0AU^@}`$#yp}m#5p;{pn?_&HoURC(E%T-kxS?lG z54p;na|;qQFIxv5~& z!NVuvy;wFYCDrfNKi-P;c!R9s0L(|%U_QDL^U-u;r^}MxK$1H282p)}_hOeH__;I( zycaLucTvqpm+QMYe{d`Err%%YzAWFx?ps|(+Vp&+O~1O~u4O0l;JH{9Hc0p`_L|jx zV$N#!VOIOGIjh~*=d89qe`|U=D8;i?@LP=g%c(|Cikb6TQ>&ac^P&W$=vy;BzP_p9 zKznmcZu920ub-_gb48}rq@7AH%9`Ljom`h4Hm?L3)4K;gU?GK7xVx+2?B2-NX1w08 z&s{m;3ZzW8JvHL73wcTT#?KU9Q=>{oFRSw7mEO0O;p!|s7+3ZrPus7b*~xi)%rk8> zuDhVq;^l4c-~YHg(J#?&mfy_Ro>1y{KKMkX(Lsv&(mezOJPn0=p#%BSx*Jw+_rjiZ z?B4E$=RO+W_*r;$s`BHbTD!An7HL4*bkfSs2mNOEl{a050L%;JP1i_=$eP~C*wP2` z+`MV!p0yf}l6liTd#)U`4r0wg<3fA>$3Hk$Rjq22`P0{gZ1`ubCl5Z1Gb@5d7>j2X zIXjR)y(`|G0v|?)$e(ug8w)lTRF>xQ{hxg2=YIJeq>^$aApF;k0 zU7BZeVRc7y^9lRc-iU8p+nVCuG%)cZE{wbDQ|RXP1@Vdl0{h|>%Y&TVykbCL(hl)@ zd8z5s6%Sr4eY)bo%SfNL249?4T=lgtfBJNqz4*yE-`i)!`?cct7mfUR;Lol0jX@3e z${QL+3zx-Y{Iq^-ue`Hiv{7T&H?G3ZAV2$O?810#<1ufJH%FvTH>U4c<<85qz=g5A zA^xXv<$i&)dU(YN*!RBEr}4Ljx4>Jl>EwZ9!i6yej_<;SG0#0PY^3sg_Yc6|8UgrQ z1F!84q)#`@P8TkWpEiA3y|$lTU08go#Iw4(G_v&Us-i2vE2_UVPG-AT1c&20UlpNI ze@wN{`w9NmxDS78{1|_0Y?hqjn@FEtgf!~u51h6yMDlcBe{1Azh0l9nNC$o16HfiD zH6KX?&gl6_op#jTo-%Lg!yblXlVAN`qq9F?|$WmwRLIuJ9q8Cy7qMGH#kW6 z4Mrksc}|==?o5=J$>=vYi=3kL8~m1>$$o~J>>_@H1(le|Do$4S={NXNeJ#_LIYX7y zmO9&Z4m)$@UbFXgzs7!a0ZwtpgUb_a8{0+%gHwF1{^FeCPySoIN`X_9}Ply%=-yX9_RIocy)F z`y9zd`=XfXp2?FJxTmT^!^zbxEh&*!j` zTV!sVT%;G{<66zjHCtxZoFjC!ViJPVl}>xpNnygPcD*Mtj6cXs>WLp zV-2pkshZs43au_djgQ^TMRJQD^227aNH4}W_(8W>^WE%Tt$qY`Hm)_vMS3yDYW1(M zBAOpqi$&&8x8T~5s(%L&rLF%1YL8a$My=;k???Tfw*Gn4H}gYou}E%_*P>PZ3WUx@ zkz0IQTmL82>HJV%EPdxtuk8L@-D>ku+=_4W+t3ht@3GMeuZt+8{ zz6v$j1vQ@BVypK19g2E`wtvi_)^n@LErx32$t|{O`#T=>_1f(xq5e?YKYB6JM?>8| zxyAdm_2d@GJE-;K7Rg1ZI+f$K=i7HtAJf*8ThzH(a*Ky>JzL$L++w-*d?dFRtKFX5 z;%~I)Cw+t7)E*CWs4d$5l3UchMwg-XYWLSy4)sax_>o(T(#Dfpd|JDIa*JoQn%v?j z?e^PH@6;a8BUHo8?~NZjJ(FIYI-r2Yxhqt#(M2|(2KEJd;X=P*16|w)F-v=sV(zoUz{Sn z8o6A=OL204xzdxnp)=D8N-<%h(^eC{a0$ zjkAl9cFD#GGO`!BNd8Wsf%qx*P+*8Q0r1%b!6z&k`_7dXs3W&5c3&o83p+xazy+ss zx5cCH@l%w!(-+B=7Es~kdfCUQ~=CS#-rH-b-yVimlW`xHp*B zG4Cr5joL2T#&5Jfwdyx$eQMQj(fZV?|BlwDR{amPKDFxe`v_`(s8xTI)~8l|dYmaH zjav2Z)%w(`PXXTDai0se_W2I2Pp$g&>Q>{aRi9jt>Qk#e{SB3;;fEY!zW=6HVJOGfzHzuGEiHo9yB+%n6EJoSC z+3aV@+b-2~9kt0Wo}r#6#{^?;QF^4Nr)heQrahWwUVvg3i>UdBIhIapLStCy`LEbT zdL}A%aXq!kF4j@sA%+_b)C;6OMqMEFG|U@{T}*^l?4pzXMRJUneUH??puSV;29CK) z>L&J0{SLKx9P%Q1ZYz8e&FA?K*uPueR`?_?mRk5EeoyKv!7k!WOkX+DXkRQxTD%ka z7rSWwD)@B4%Rw)8@lt#ekAhvilpN{L!YABOq9ll0$=QA7j6Bqi<2i|6_z_f{$plplAoWtM;_mI#W5B;fd3wg z{#5Lu@;My$-K#+)UR|6K9|3xCNO2B)5_97t>xyI7`GZ@ek7C2R#ufe`7wMTOn8!W! z2OTda9qmOgj$Lr|=;$9_jrCWL9{K-Xefo7Wgqy*A(=W|STWq>77y50eJHp^`+zJ#E&3WC3#bSHs|b40cQ_!tc~8yDQL{P|ZM!7{ zdAXoo{$q~Up`;@FLnaD2`Vc9Gm-=3&pS6DiHPu9v&n#Y6UW zPm*1Hbm#iBySxo#7mtBm-0a`>YUIGubg+v7U>Da%ZZ2w!d^RK>SA{?=+6PK%(N{j% zukb+aiL$)Tl<4NIiJ6r}ulq{>Pp{{ z=y={&>W%j}cUIU3jEt|Sy2hxggimAKc5m~s))%UGH@;YSDDtJ4*GMpex``Zn9>KW7 zSv1eS>Mcu0%GT7nygK2T=qnu?-?6{F%3j_Cp0QQUd`Bj27XSxHqz4++25v ze}FBy1!>X^Gkv8OPLtk_H0hIWNd zH1AZ7D~)^C>dndVtqp|(JQ(Bjxhf^nvA?LQ6s+5vDwxyFwqqnYvcDM`i^7f6%7 zT#_+859zaEAQ`=%oMg1*uTOW(CCTW;)y2i9YZH^QT9X@{A+w5{Rk?K=Kr)sMHEJ5| zs{;HQn_8PAbE0$G=eH$odL<;UzR`VT|Ln%R328er?5oaNy3#AGplRolVsttGJ)-Kk zZ`GUdUd)Q?>Sh`1nwqm>l6^scb~GSGx;16H)BR9z;o{_D$<0Znd94|q{6diQWIzc;8*W#WUbvEaSge#?O~!j1f7~p6(p!%VZf_ zP9C=AbYfN_%ZOC?K3K-Bt|e(Uks*D|uO;oIYi9x(MpBL77zZvkE;mD3@eY>W8Pco$ zjpBWweP&3n5E;_lRO08xGPdL`$^W!0hY6=-puh23D=F z+t7ZZV^?QG(JPU!)$De!|M2Xm_g8GI9r4(pq?(zV@Lu<=W%$erS|li%$9j`xv~;^UMJ8C2*-bcyW%MRno$I@kn0puruhZ(n z_!^nSeD0&sS;mqp#xi;x)&$$BRCCw(B^ zz3Z8jc30FFMKT8WNiwe0NJh8?f1xB};QtYl(IH93Jn?Sr%StlFn0eCeJ$cfJJtSi_ z_8rcPKOyHk24^D(W0NxOCK;QLwUo}Yq!!MvBguI9WUjkB^gNPrl&izVSN4Y4w%Pn{ z0$$ZaWBq(9;P<}nZi9K!>RVH@jjwHU84uQ&xzb}$Kb{Kb#Wdq4R^Ln3~abU2D2EyBW#JgN&SnQ!bNaOgl47%w%+26v@err4G!XkDfDwM&tK|e_O|Z1lJuG z701|nj*@dz+u>&f$H@6&P+w=@K}`_}}9_ zOzQfi;xS={e@$rjE40^TP2;Pd3$K2?IY#xmxB_d6dvW{bYh&_(AyG@*NRlV8{$5#-j8~*RzHv0!VkQ~A~{CgKkXItnV}^YnJFEq z)qlc@_q6&is0(o2P%bi4nx1m1eix!r`+dHTda?HS$T4ovjt@CTLtD>GXeJf((SK3*?@Z@-TsKzxPmYn9bE>`_wF}pVRb7DkVwut|?e;&!_-C}| zC;b=S(;g2w#zETgUyk}W+WnQHuEDi+b^pwi*8Th*LVZR%e$12}tBq%-G;{pa?U^Yp z%q>L2YS4diqIP>`N;hctPmYl}r*g3xlxG* zJogH<^EC)Hb1~KZg`#$8`*$_!bZtF3#xAWMj=EIa9{m@8fq!ay^j|E~p3meM5hv5V zo*d(EwDsf|cWO2L7jv}z;d5hyR?~lRi+2Cy7!PR2gB;@y?fFNJF^!q#Gqy$U271pOz6#j&Q2@Pu%+_$cUCOXs=voVRQJ|w#!q;ct-0}tA2kxBN-yK9cnecKb|oZ$3Tsz zR^$8Q8Ob84@ziR(hkac4=R&ReOSL|=>U*_5wdy~i^{G{#-%nBO;YiF;>b|Jem>8{3 zt@?AcKDFvE*80?{&pA-Bjk~C?k&laWp<)}SQG;RN!Z}#6jhs&v+gOF?i((rSG4Cq2 zF_U_vxT&#=`WsS*;CZCjM$WT}ZM5JuM6rjt(CYY8t9`yl>r<=#3awAA`s=kmwd%hK zt@4_KBYKWAwHibJGj;r_RsUwKPp$gtTAy0=1?LFXf(u`p72BAIb5pU6Tc~f8V@^|# zlR6mZqw-%I46X8@53+xg95Wo}reYhJ+pgHgx2Y$}G4D`Ml6o@UdnmRskJ{W(54FiQ zZl^Zc##ZXDa31sy%s+~49FF&e;c@afq-%P$rgu@t%Q1VY9a4v4o>6S$MCwG@&!e6x zHQ)D#CrRA_t^61H{x{qy`wpDrifyEat703;O)G}6i8@)1Z-)*~m6{y1;ugt1t2}7I zGtQD@%F$Ph=X#ErE&GqN?~N!%6fL1xtcR}BjF8ihI&y`wd8*ACW zP4=TPC#an0n>FpE&XQw1)F#ikM$=8yCewG8+Vob8#N49v1WhMtI#1L0X?h0c9K|-S zrZ(9|;l+5n+@Cp^e-zuO`!b3==sV;Xkq5m%>O&k~AobhSZmG#OhA)(wT=q?iq|RX9 zBlTAH@09vC)OSgJkYnza`Y`*Z{(#y%4vR6LsN3ELt@5CM#{Ob?+m+PclX?yHJyL(+ zoFm?x{mY|K{x0~`!An3d&XIpNs0CBMSorkBlx@U`3g4T%7S9pPW0*!R=+Srz+cICS z#VvVX{I|yZDVq2%aPXyhG~SPKm*UZQKkoED)Xr=7g;S&#=NOFF!7b>ih5N<@9*r@R zCAdgr^bK)6Hs2t| z*#{i4_>$fXtli{WS?Ong;jO^BRBu+q%3+2*BOrY1%l4I<{C!yi!Yhs=_qnwpwPg8( zeIy}k_El_%G<+ooEYYu5Y`{HXbo6V!CvWJAsERhWJ|Df;UivH&q0fp$Xj|pZ^$kc^ zvk4|uDa9i7J-Tt3U3IPZzhE!)$#yF4%A2$knqe5)Q6*|hbk4sXN8 zt((SGGBLXFF#H`?Ziuh)G85V%GNGf7#O&#Mk(tn8$b_DNOz2`{LdPQAc4)lMdc;!g zh**~{IEZZHfwCe0?WKGr_^p#e|w`X*CeQQr!iohwp6%T*K6w-(- zCXHCKF7~Ap$+eGkJ#xA^c2nJfW@r1YZ5xA!cjkLDLXZY{ol)dE<%*u$3L5df__hP@ znW@l&tZiihp%tr}&*2g60a<=uJ|;1I9N@zL<&%9C_8>!uQqX6~+;my=qR0xGdJw#@2+=Lx995cruz!Ov_Q{LE$;4X&2- zLG&|Qi|d1H<{5fA^mqJtov@E&=*RodXj4}T&-GWlP%`x8Qi*V83l7UgGW5@p4Bg9# z>{9#{e+_@d2aT;6j;xbefgv>y*WpTG*XdR#@}OPqx#QBJ^6E0$E4!*IRtz;7o9(Nb z{5lVK560vq<(8$iIW`>~msQ{FZhb2iY_z3*#e}^2}C?XvOXH_K^kruu`ODJjYB;X#EVSzXDel4|lgGeXjk5uM#9l~`68 z*S5bY$C_UUD)B4kusCnxg3rle@c|1Gp*`n1EQV=`&{k{e7v``Se1Syhuav`LE2zZ5 z{?@s8b&UJzu9bczsXY#h6~bXLYbil_RLcQkVO| z^Boo)X@jy_vUX;#$m>WunUFpkoOI|ZdMz6Efn5g3#M4j1@wMFV!Lei)FcTr&PcREL zU>0f|U>96{vJ0b<=e)uQL44Nra}O;@0H(Ln4+l51L$}`2lF`5WI_Hh**DGUcy`?8(y5!N{JB42$kPt6jRkB2u6;3YY?2 z6G5Ub}01YVEvn`6WR}n=C&VU*Ft#u=7AtZpY@f;UCvlIcgGPlDo1> zEV~0v0n^&}M^?si>d=Uj4tv-?#~My9pJUN{F@-(ruCW8YgW zGj9K#a$EdoH>4&qj-BVRiZWmFT;i|R8STQ@8W4YD%6m}|D!&rM-#|jU`cE1wWgjKfk z?W-NdzB_df#JQMZvW5R4{SebDB(Iph3BHT)KBV`eH-qmC<$FT+(f3Z2IAl)rZ%=e) zcV-lU@fn7k=u^(-ml~a<~0!;qhH- z+f&??p~#8G>%2xQhGZ2b;XObWGFVq4CwkWxniKsmTG5CI8e_O`e=2bF@*sE?hX^O- z(Qs6b2%2KJzx!0+HuSflzYPw{+eCk+;lAxD|IsTj-h%P?GX7|oa19A`=ll+y#Tbq5 zHgvb4dwSz(@4eoot4h8Sv|?)peHW`OrFr)9y~20#(sH7^X~l!bT5INwN{zbp7-_|$ z$cZkuoJT7wg zuwJf<>Xnz!u71MrMl4Q-lR^&xXT9Ln- z&y!a4Oe|R7iE&SzZg)?eRABQ=oH#vZ0rb>~3uC4%fUQ!Wi~3BGE59thi}&MtpIjub zsOJf%VMVRBo|j|v{Aluu%vF?&JrrS=8%i@U1ScJs(%il`-+iQ9FOZra(WKS;QHS$`YOz?2=kb%CJ93e{;&H7euULm`Gip737f11f zd9hfHHvH`BeiF&N=!x3n`774vX~*MT)QwvGPt@hw@nc@J&YzN34A#~Mqoxm)Tx4GK zLT!HrVf}Dz{4mr_+VkaF)DLxkc5gMvE53p2o@#saT|A`iA9+O^t~03hcGNCy{WR3{ zX;JHMLA^n%9lX8v{G#vTliGUniuAQnw@*i1j%(1WCa*|O8&%VHagcWV1*q@R_TPiL zRy!W_U8G-(x;=Tt9Bq4jHLv}v$46dq zi}rkPK^>+&-;bis)Xq2Zid(exCsE(0)%0DwUprslL9P2HcA$1?+as@dvvz*ccX6?{ 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