From 86cfce6fb93c825f4f15bbe4b40e347733567ca9 Mon Sep 17 00:00:00 2001 From: Bumblebee00 Date: Mon, 2 Mar 2026 19:31:53 +0100 Subject: [PATCH 01/21] add placeholdeer code for spatz platform --- Deeploy/Targets/Spatz/Deployer.py | 48 +++++++++++++++++++++ Deeploy/Targets/Spatz/Platform.py | 71 +++++++++++++++++++++++++++++++ 2 files changed, 119 insertions(+) create mode 100644 Deeploy/Targets/Spatz/Deployer.py create mode 100644 Deeploy/Targets/Spatz/Platform.py diff --git a/Deeploy/Targets/Spatz/Deployer.py b/Deeploy/Targets/Spatz/Deployer.py new file mode 100644 index 0000000000..2442059606 --- /dev/null +++ b/Deeploy/Targets/Spatz/Deployer.py @@ -0,0 +1,48 @@ +# SPDX-FileCopyrightText: 2023 ETH Zurich and University of Bologna +# +# SPDX-License-Identifier: Apache-2.0 + +from typing import Callable, Dict, Type + +import onnx_graphsurgeon as gs + +from Deeploy.AbstractDataTypes import Pointer +from Deeploy.CommonExtensions.NetworkDeployers.SignPropDeployer import SignPropDeployer +from Deeploy.CommonExtensions.OptimizationPasses.TopologyOptimizationPasses.DebugPasses import DebugPrintMergePass +from Deeploy.CommonExtensions.OptimizationPasses.TopologyOptimizationPasses.LoweringOptimizationPasses import \ + NCHWtoNHWCPass, TransposeMatmulInputsPass +from Deeploy.DeeployTypes import DeploymentPlatform, TopologyOptimizer +from Deeploy.Targets.Generic.TopologyOptimizationPasses.Passes import TransposeConstOptPass, TransposeMergePass + + +class SpatzDeployer(SignPropDeployer): + + 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: Dict[str, int] = {}): + + super().__init__(graph, + deploymentPlatform, + inputTypes, + loweringOptimizer, + scheduler, + name, + default_channels_first = default_channels_first, + deeployStateDir = deeployStateDir) + +# self.inputOffsets = inputOffsets +# +# self.loweringOptimizer.passes += [ +# TransposeMatmulInputsPass(), +# NCHWtoNHWCPass(self.default_channels_first), +# TransposeMergePass(), +# TransposeConstOptPass(), +# DebugPrintMergePass() +# ] diff --git a/Deeploy/Targets/Spatz/Platform.py b/Deeploy/Targets/Spatz/Platform.py new file mode 100644 index 0000000000..89e8b9b411 --- /dev/null +++ b/Deeploy/Targets/Spatz/Platform.py @@ -0,0 +1,71 @@ +from typing import List + +from Deeploy.DeeployTypes import VariableBuffer, TransientBuffer, ConstantBuffer, StructBuffer, \ + NodeMapper, NodeTemplate, TopologyOptimizer, DeploymentEngine, DeploymentPlatform + +# from Deeploy.Targets.Spatz.Bindings import SpatzAddBindings # <- TODO create this +from Deeploy.Targets.Generic.Bindings import BasicAddBindings +from Deeploy.Targets.Generic.Layers import AddLayer +from Deeploy.Targets.Generic.Parsers import AddParser + +# TODO delete this and use from Deeploy.Targets.Spatz.Templates import AllocateTemplate as SpatzAllocateTemplate +from Deeploy.Targets.Generic.Templates import AllocateTemplate as GenericAllocateTemplate +from Deeploy.Targets.Generic.Templates import FreeTemplate as GenericFreeTemplate + +SpatzAddMapper = NodeMapper(AddParser(), BasicAddBindings) + +SpatzMapping = { + 'Add': AddLayer([SpatzAddMapper]), + # sparse attention : ... +} + + +class SpatzaVariableBuffer(VariableBuffer): + initTemplate = GenericAllocateTemplate.referenceInitTemplate + allocTemplate = GenericAllocateTemplate.referenceAllocateTemplate + deallocTemplate = GenericFreeTemplate.referenceLocalTemplate + + +class SpatzTransientBuffer(TransientBuffer): + initTemplate = GenericAllocateTemplate.referenceInitTemplate + allocTemplate = GenericAllocateTemplate.referenceAllocateTemplate + deallocTemplate = GenericFreeTemplate.referenceLocalTemplate + + +class SpatzConstantBuffer(ConstantBuffer): + initTemplate = GenericAllocateTemplate.referenceGlobalInitTemplate + allocTemplate = GenericAllocateTemplate.referenceGlobalAllocateTemplate + deallocTemplate = NodeTemplate("") # const not deallocated + + +class SpatzStructBuffer(StructBuffer): + initTemplate = GenericAllocateTemplate.referenceStructInitTemplate + allocTemplate = GenericAllocateTemplate.referenceStructAllocateTemplate + deallocTemplate = NodeTemplate("") # struct not deallocated ? + + +SpatzOptimizer = TopologyOptimizer([ + # TODO add something ? +], name = "SpatzOptimizer") + +includeList = [ + # TODO ??? +] + + +class SpatzEngine(DeploymentEngine): + def __init__(self, name: str, Mapping = SpatzMapping, initCode = "", includeList = includeList) -> None: + super().__init__(name, Mapping, initCode, includeList) + + +class SpatzPlatform(DeploymentPlatform): + + def __init__( self, + engines = [SpatzEngine("SpatzVectorProcessor")], + variableBuffer = SpatzaVariableBuffer, + transientBuffer = SpatzTransientBuffer, + constantBuffer = SpatzConstantBuffer, + structBuffer = SpatzStructBuffer, + includeList: List[str] = includeList + ): + super().__init__(engines, variableBuffer, constantBuffer, structBuffer, transientBuffer) From 077455632e0477415ada9ec2089ba752d0879f7d Mon Sep 17 00:00:00 2001 From: Bumblebee00 Date: Mon, 2 Mar 2026 19:33:03 +0100 Subject: [PATCH 02/21] code generation with generic c code --- DeeployTest/Platforms/Spatz/main.c | 65 ++++++++++++++++++++++++ DeeployTest/testUtils/platformMapping.py | 19 ++++++- 2 files changed, 83 insertions(+), 1 deletion(-) create mode 100644 DeeployTest/Platforms/Spatz/main.c diff --git a/DeeployTest/Platforms/Spatz/main.c b/DeeployTest/Platforms/Spatz/main.c new file mode 100644 index 0000000000..e2b0449fb5 --- /dev/null +++ b/DeeployTest/Platforms/Spatz/main.c @@ -0,0 +1,65 @@ +/* + * SPDX-FileCopyrightText: 2023 ETH Zurich and University of Bologna + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include + +#include "Network.h" +#include "testinputs.h" +#include "testoutputs.h" + +int main() { + + printf("Initializing network...\r\n"); + + InitNetwork(0, 1); + + for (uint32_t buf = 0; buf < DeeployNetwork_num_inputs; buf++) { + memcpy(DeeployNetwork_inputs[buf], testInputVector[buf], + DeeployNetwork_inputs_bytes[buf]); + } + + printf("Running network...\r\n"); + RunNetwork(0, 1); + + int32_t tot_err = 0; + uint32_t tot = 0; + OUTPUTTYPE diff; + OUTPUTTYPE expected, actual; + + for (uint32_t buf = 0; buf < DeeployNetwork_num_outputs; buf++) { + tot += DeeployNetwork_outputs_bytes[buf] / sizeof(OUTPUTTYPE); + for (uint32_t i = 0; + i < DeeployNetwork_outputs_bytes[buf] / sizeof(OUTPUTTYPE); i++) { + expected = ((OUTPUTTYPE *)testOutputVector[buf])[i]; + actual = ((OUTPUTTYPE *)DeeployNetwork_outputs[buf])[i]; + diff = expected - actual; + +#if ISOUTPUTFLOAT == 1 + // RUNWANG: Allow margin of error for float32_t + if ((diff < -1e-4) || (diff > 1e-4)) { + tot_err += 1; + printf("Expected: %10.6f ", (float)expected); + printf("Actual: %10.6f ", (float)actual); + printf("Diff: %10.6f at Index %12u in Output %u\r\n", (float)diff, i, + buf); + } +#else + // RUNWANG: No margin for integer comparison + if (diff != 0) { + 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); + } +#endif + } + } + + printf("Errors: %d out of %d \r\n", tot_err, tot); + + return tot_err; +} \ No newline at end of file diff --git a/DeeployTest/testUtils/platformMapping.py b/DeeployTest/testUtils/platformMapping.py index 9d526906f9..69a83f1e8d 100644 --- a/DeeployTest/testUtils/platformMapping.py +++ b/DeeployTest/testUtils/platformMapping.py @@ -10,6 +10,8 @@ from Deeploy.DeeployTypes import DeploymentPlatform, NetworkDeployer, TopologyOptimizer from Deeploy.MemoryLevelExtension.MemoryLevels import MemoryHierarchy, MemoryLevel from Deeploy.MemoryLevelExtension.NetworkDeployers.MemoryLevelDeployer import MemoryPlatform, MemoryPlatformWrapper +from Deeploy.Targets.Spatz.Deployer import SpatzDeployer +from Deeploy.Targets.Spatz.Platform import SpatzOptimizer, SpatzPlatform from Deeploy.Targets.Chimera.Deployer import ChimeraDeployer from Deeploy.Targets.Chimera.Platform import ChimeraOptimizer, ChimeraPlatform from Deeploy.Targets.CortexM.Deployer import CMSISDeployer @@ -31,7 +33,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", "GAP9"] +_NONSIGNPROP_PLATFORMS = ["Siracusa", "Siracusa_w_neureka", "PULPOpen", "Snitch", "Chimera", "GAP9", "Spatz"] _PLATFORMS = _SIGNPROP_PLATFORMS + _NONSIGNPROP_PLATFORMS @@ -76,6 +78,9 @@ def mapPlatform(platformName: str) -> Tuple[DeploymentPlatform, bool]: elif platformName == "Chimera": Platform = ChimeraPlatform() + elif platformName == "Spatz": + Platform = SpatzPlatform() + else: raise RuntimeError(f"Deployment platform {platformName} is not implemented") @@ -272,6 +277,18 @@ def mapDeployer(platform: DeploymentPlatform, name = name, default_channels_first = default_channels_first, deeployStateDir = deeployStateDir) + + elif isinstance(platform, (SpatzPlatform)): + deployer = SpatzDeployer( + graph, + platform, + inputTypes, + SpatzOptimizer, + scheduler, + name = name, + default_channels_first = default_channels_first, + deeployStateDir = deeployStateDir + ) else: raise RuntimeError(f"Deployer for platform {platform} is not implemented") From a8fd323b7cbb92c32b6833e8c6e4cfde231642b1 Mon Sep 17 00:00:00 2001 From: Bumblebee00 Date: Thu, 12 Mar 2026 22:18:52 +0100 Subject: [PATCH 03/21] modified spatz c code to use proper memory allocation and copying functions --- DeeployTest/Platforms/Spatz/main.c | 88 ++++++++++++++++-------------- TargetLibraries/Spatz/inc/utils.h | 2 + TargetLibraries/Spatz/src/Util.c | 3 + 3 files changed, 51 insertions(+), 42 deletions(-) create mode 100644 TargetLibraries/Spatz/inc/utils.h create mode 100644 TargetLibraries/Spatz/src/Util.c diff --git a/DeeployTest/Platforms/Spatz/main.c b/DeeployTest/Platforms/Spatz/main.c index e2b0449fb5..2ab98ce54d 100644 --- a/DeeployTest/Platforms/Spatz/main.c +++ b/DeeployTest/Platforms/Spatz/main.c @@ -1,65 +1,69 @@ -/* - * SPDX-FileCopyrightText: 2023 ETH Zurich and University of Bologna - * - * SPDX-License-Identifier: Apache-2.0 - */ #include #include +#include "printf.h" #include "Network.h" #include "testinputs.h" #include "testoutputs.h" int main() { + const unsigned int cid = snrt_cluster_core_idx(); - printf("Initializing network...\r\n"); + // do it only with one of the two spatz cores + if (cid==0){ + printf("Initializing network...\r\n"); - InitNetwork(0, 1); + InitNetwork(0, 1); - for (uint32_t buf = 0; buf < DeeployNetwork_num_inputs; buf++) { - memcpy(DeeployNetwork_inputs[buf], testInputVector[buf], - DeeployNetwork_inputs_bytes[buf]); - } + for (uint32_t buf = 0; buf < DeeployNetwork_num_inputs; buf++) { + snrt_dma_start_1d(DeeployNetwork_inputs[buf], testInputVector[buf], DeeployNetwork_inputs_bytes[buf]); + } - printf("Running network...\r\n"); - RunNetwork(0, 1); + printf("Running network...\r\n"); + RunNetwork(0, 1); - int32_t tot_err = 0; - uint32_t tot = 0; - OUTPUTTYPE diff; - OUTPUTTYPE expected, actual; + int32_t tot_err = 0; + uint32_t tot = 0; + OUTPUTTYPE diff; + OUTPUTTYPE expected, actual; - for (uint32_t buf = 0; buf < DeeployNetwork_num_outputs; buf++) { - tot += DeeployNetwork_outputs_bytes[buf] / sizeof(OUTPUTTYPE); - for (uint32_t i = 0; - i < DeeployNetwork_outputs_bytes[buf] / sizeof(OUTPUTTYPE); i++) { - expected = ((OUTPUTTYPE *)testOutputVector[buf])[i]; - actual = ((OUTPUTTYPE *)DeeployNetwork_outputs[buf])[i]; - diff = expected - actual; + for (uint32_t buf = 0; buf < DeeployNetwork_num_outputs; buf++) { + tot += DeeployNetwork_outputs_bytes[buf] / sizeof(OUTPUTTYPE); + for (uint32_t i = 0; + i < DeeployNetwork_outputs_bytes[buf] / sizeof(OUTPUTTYPE); i++) { + expected = ((OUTPUTTYPE *)testOutputVector[buf])[i]; + actual = ((OUTPUTTYPE *)DeeployNetwork_outputs[buf])[i]; + diff = expected - actual; #if ISOUTPUTFLOAT == 1 - // RUNWANG: Allow margin of error for float32_t - if ((diff < -1e-4) || (diff > 1e-4)) { - tot_err += 1; - printf("Expected: %10.6f ", (float)expected); - printf("Actual: %10.6f ", (float)actual); - printf("Diff: %10.6f at Index %12u in Output %u\r\n", (float)diff, i, - buf); - } + // RUNWANG: Allow margin of error for float32_t + if ((diff < -1e-4) || (diff > 1e-4)) { + tot_err += 1; + printf("Expected: %10.6f ", (float)expected); + printf("Actual: %10.6f ", (float)actual); + printf("Diff: %10.6f at Index %12u in Output %u\r\n", (float)diff, i, + buf); + } #else - // RUNWANG: No margin for integer comparison - if (diff != 0) { - 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); - } + // RUNWANG: No margin for integer comparison + if (diff != 0) { + 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); + } #endif + } } - } - printf("Errors: %d out of %d \r\n", tot_err, tot); + printf("Errors: %d out of %d \r\n", tot_err, tot); - return tot_err; + return tot_err; + } else { + // wait for core 0 to finish + snrt_cluster_hw_barrier(); + return 0; + } + } \ No newline at end of file diff --git a/TargetLibraries/Spatz/inc/utils.h b/TargetLibraries/Spatz/inc/utils.h new file mode 100644 index 0000000000..88c7dc8f78 --- /dev/null +++ b/TargetLibraries/Spatz/inc/utils.h @@ -0,0 +1,2 @@ +#include +void *deeploy_malloc(const size_t size) ; diff --git a/TargetLibraries/Spatz/src/Util.c b/TargetLibraries/Spatz/src/Util.c new file mode 100644 index 0000000000..daf546f649 --- /dev/null +++ b/TargetLibraries/Spatz/src/Util.c @@ -0,0 +1,3 @@ +#include "utils.h" + +void *deeploy_malloc(const size_t size) { return snrt_l1alloc(size); } From bbf27512b46264fa981d92d6488adfedc20f20c8 Mon Sep 17 00:00:00 2001 From: Bumblebee00 Date: Mon, 16 Mar 2026 17:11:42 +0100 Subject: [PATCH 04/21] tmp commit to send to badie103 --- CMakeLists.txt | 30 +++++- Deeploy/Targets/Spatz/Bindings.py | 12 +++ Deeploy/Targets/Spatz/Platform.py | 18 ++-- .../Targets/Spatz/Templates/AddTemplate.py | 5 + .../Spatz/Templates/AllocateTemplate.py | 5 + .../Targets/Spatz/Templates/FreeTemplate.py | 5 + DeeployTest/CMakeLists.txt | 2 + DeeployTest/Platforms/Spatz/CMakeLists.txt | 17 ++++ DeeployTest/deeployRunner_spatz.py | 11 +++ DeeployTest/testUtils/deeployRunner.py | 2 + DeeployTest/test_platforms.py | 8 ++ Makefile | 1 + TargetLibraries/Spatz/CMakeLists.txt | 14 +++ .../cmake/snitch-runtime-precompiled.cmake | 6 ++ TargetLibraries/Spatz/inc/DeeploySpatzMath.h | 20 ++++ TargetLibraries/Spatz/inc/Util.h | 9 ++ TargetLibraries/Spatz/inc/utils.h | 2 - TargetLibraries/Spatz/src/Util.c | 6 +- cmake/spatz/spatz.cmake | 77 +++++++++++++++ cmake/spatz/toolchain_llvm.cmake | 94 +++++++++++++++++++ 20 files changed, 329 insertions(+), 15 deletions(-) create mode 100644 Deeploy/Targets/Spatz/Bindings.py create mode 100644 Deeploy/Targets/Spatz/Templates/AddTemplate.py create mode 100644 Deeploy/Targets/Spatz/Templates/AllocateTemplate.py create mode 100644 Deeploy/Targets/Spatz/Templates/FreeTemplate.py create mode 100644 DeeployTest/Platforms/Spatz/CMakeLists.txt create mode 100644 DeeployTest/deeployRunner_spatz.py create mode 100644 TargetLibraries/Spatz/CMakeLists.txt create mode 100644 TargetLibraries/Spatz/cmake/snitch-runtime-precompiled.cmake create mode 100644 TargetLibraries/Spatz/inc/DeeploySpatzMath.h create mode 100644 TargetLibraries/Spatz/inc/Util.h delete mode 100644 TargetLibraries/Spatz/inc/utils.h create mode 100644 cmake/spatz/spatz.cmake create mode 100644 cmake/spatz/toolchain_llvm.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 4c8a024c15..049c2aa5d3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,8 +20,8 @@ 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, GAP9, Generic, Snitch)") -set_property(CACHE platform PROPERTY STRINGS MemPool SoftHier QEMU Siracusa Siracusa_w_neureka PULP-Open GAP9 Generic Snitch) +set(platform MemPool CACHE STRING "Platform (MemPool, SoftHier, QEMU, Siracusa, Siracusa_w_neureka, PULP-Open, GAP9, Generic, Snitch, Spatz)") +set_property(CACHE platform PROPERTY STRINGS MemPool SoftHier QEMU Siracusa Siracusa_w_neureka PULP-Open GAP9 Generic Snitch Spatz) if(platform STREQUAL MemPool) message(STATUS "Building for platform 'MemPool'") @@ -46,6 +46,8 @@ elseif(platform STREQUAL SoftHier) message(STATUS "Building for platform 'SoftHier'") elseif(platform STREQUAL Chimera) message(STATUS "Building for platform 'Chimera'") +elseif(platform STREQUAL Spatz) + message(STATUS "Building for platform 'Spatz'") else() message(FATAL_ERROR "Invalid platform '${platform}' specified!") endif() @@ -300,4 +302,28 @@ if(platform STREQUAL Chimera) endif() + +if(platform STREQUAL Spatz) + # Only LLVM supported for Spatz + set(CMAKE_TOOLCHAIN_FILE ${CMAKE_CURRENT_LIST_DIR}/cmake/spatz/toolchain_llvm.cmake) + + include(${CMAKE_CURRENT_LIST_DIR}/cmake/spatz/spatz.cmake OPTIONAL) + + project(deeploy LANGUAGES C ASM) + + message(STATUS "============================= ${platform} Configuration ============================") + message(STATUS "[cMake ] ISA = " ${ISA}) + message(STATUS "================================================================================") + message(STATUS "") + + add_subdirectory(TargetLibraries/Generic) + add_subdirectory(TargetLibraries/Spatz) + target_include_directories(deeployspatz PUBLIC TargetLibraries/Generic/inc) + + add_subdirectory(DeeployTest) + target_link_libraries(deeploylib INTERFACE deeploybasic deeployspatz) + +endif() + + print_simulation_config() diff --git a/Deeploy/Targets/Spatz/Bindings.py b/Deeploy/Targets/Spatz/Bindings.py new file mode 100644 index 0000000000..4f78c28f09 --- /dev/null +++ b/Deeploy/Targets/Spatz/Bindings.py @@ -0,0 +1,12 @@ +from Deeploy.DeeployTypes import NodeBinding + +from Deeploy.Targets.Generic.TypeCheckers import AddChecker +from Deeploy.Targets.Spatz.Templates import AddTemplate + + +SpatzAddBindings = [ + NodeBinding( + AddChecker(), + AddTemplate. + ) +] \ No newline at end of file diff --git a/Deeploy/Targets/Spatz/Platform.py b/Deeploy/Targets/Spatz/Platform.py index 89e8b9b411..af09dc227c 100644 --- a/Deeploy/Targets/Spatz/Platform.py +++ b/Deeploy/Targets/Spatz/Platform.py @@ -8,9 +8,9 @@ from Deeploy.Targets.Generic.Layers import AddLayer from Deeploy.Targets.Generic.Parsers import AddParser -# TODO delete this and use from Deeploy.Targets.Spatz.Templates import AllocateTemplate as SpatzAllocateTemplate from Deeploy.Targets.Generic.Templates import AllocateTemplate as GenericAllocateTemplate -from Deeploy.Targets.Generic.Templates import FreeTemplate as GenericFreeTemplate +from Deeploy.Targets.Spatz.Templates import AllocateTemplate as SpatzAllocateTemplate +from Deeploy.Targets.Spatz.Templates import FreeTemplate as SpatzFreeTemplate SpatzAddMapper = NodeMapper(AddParser(), BasicAddBindings) @@ -22,25 +22,25 @@ class SpatzaVariableBuffer(VariableBuffer): initTemplate = GenericAllocateTemplate.referenceInitTemplate - allocTemplate = GenericAllocateTemplate.referenceAllocateTemplate - deallocTemplate = GenericFreeTemplate.referenceLocalTemplate + allocTemplate = SpatzAllocateTemplate.referenceAllocateTemplate + deallocTemplate = SpatzFreeTemplate.spatzLocalTemplate class SpatzTransientBuffer(TransientBuffer): initTemplate = GenericAllocateTemplate.referenceInitTemplate - allocTemplate = GenericAllocateTemplate.referenceAllocateTemplate - deallocTemplate = GenericFreeTemplate.referenceLocalTemplate + allocTemplate = SpatzAllocateTemplate.referenceAllocateTemplate + deallocTemplate = SpatzFreeTemplate.spatzLocalTemplate class SpatzConstantBuffer(ConstantBuffer): initTemplate = GenericAllocateTemplate.referenceGlobalInitTemplate - allocTemplate = GenericAllocateTemplate.referenceGlobalAllocateTemplate + allocTemplate = GenericAllocateTemplate.referenceAllocateTemplate deallocTemplate = NodeTemplate("") # const not deallocated class SpatzStructBuffer(StructBuffer): initTemplate = GenericAllocateTemplate.referenceStructInitTemplate - allocTemplate = GenericAllocateTemplate.referenceStructAllocateTemplate + allocTemplate = GenericAllocateTemplate.referenceAllocateTemplate deallocTemplate = NodeTemplate("") # struct not deallocated ? @@ -49,7 +49,7 @@ class SpatzStructBuffer(StructBuffer): ], name = "SpatzOptimizer") includeList = [ - # TODO ??? + "DeeploySpatzMath.h", ] diff --git a/Deeploy/Targets/Spatz/Templates/AddTemplate.py b/Deeploy/Targets/Spatz/Templates/AddTemplate.py new file mode 100644 index 0000000000..a4572f625b --- /dev/null +++ b/Deeploy/Targets/Spatz/Templates/AddTemplate.py @@ -0,0 +1,5 @@ +from Deeploy.DeeployTypes import NodeTemplate + +... = NodeTemplate("\ + +") \ No newline at end of file diff --git a/Deeploy/Targets/Spatz/Templates/AllocateTemplate.py b/Deeploy/Targets/Spatz/Templates/AllocateTemplate.py new file mode 100644 index 0000000000..78d24b9f14 --- /dev/null +++ b/Deeploy/Targets/Spatz/Templates/AllocateTemplate.py @@ -0,0 +1,5 @@ +from Deeploy.DeeployTypes import NodeTemplate + +# allocate +referenceAllocateTemplate = NodeTemplate( + "${name} = (${type.typeName}) snrt_l1alloc(${type.referencedType.typeWidth//8} * ${size});\n") diff --git a/Deeploy/Targets/Spatz/Templates/FreeTemplate.py b/Deeploy/Targets/Spatz/Templates/FreeTemplate.py new file mode 100644 index 0000000000..f67cb3de38 --- /dev/null +++ b/Deeploy/Targets/Spatz/Templates/FreeTemplate.py @@ -0,0 +1,5 @@ +from Deeploy.DeeployTypes import NodeTemplate + +# snrt_l1alloc currently does not support free-ing of memory (spatz/sw/snRuntime/src/alloc.c) +spatzLocalTemplate = NodeTemplate("") +spatzGlobalTemplate = NodeTemplate("") \ No newline at end of file diff --git a/DeeployTest/CMakeLists.txt b/DeeployTest/CMakeLists.txt index b7f3535790..71f632cbd2 100644 --- a/DeeployTest/CMakeLists.txt +++ b/DeeployTest/CMakeLists.txt @@ -50,6 +50,8 @@ elseif(DEEPLOY_ARCH STREQUAL SNITCH) add_subdirectory(Platforms/Snitch) elseif(DEEPLOY_ARCH STREQUAL CHIMERA) add_subdirectory(Platforms/Chimera) +elseif(DEEPLOY_ARCH STREQUAL SPATZ) + add_subdirectory(Platforms/Spatz) elseif(platform STREQUAL GAP9) # Search for hex files generated by Python code generator diff --git a/DeeployTest/Platforms/Spatz/CMakeLists.txt b/DeeployTest/Platforms/Spatz/CMakeLists.txt new file mode 100644 index 0000000000..4804a63182 --- /dev/null +++ b/DeeployTest/Platforms/Spatz/CMakeLists.txt @@ -0,0 +1,17 @@ +# SPDX-FileCopyrightText: 2024 ETH Zurich and University of Bologna +# +# SPDX-License-Identifier: Apache-2.0 + +set(ProjectId ${TESTNAME}) + +file(GLOB_RECURSE SOURCES + main.c +) + +add_deeploy_executable(${ProjectId} EXCLUDE_FROM_ALL ${SOURCES}) + +target_link_libraries(${ProjectId} PRIVATE network deeploylib) +target_compile_options(${ProjectId} INTERFACE network) + +# Add QuestaSim RTL simulation for Spatz (mirroring Snitch's vsim) +add_spatz_vsim_simulation(${ProjectId}) diff --git a/DeeployTest/deeployRunner_spatz.py b/DeeployTest/deeployRunner_spatz.py new file mode 100644 index 0000000000..58168f3a44 --- /dev/null +++ b/DeeployTest/deeployRunner_spatz.py @@ -0,0 +1,11 @@ +import sys + +from testUtils.deeployRunner import main + +if __name__ == "__main__": + sys.exit( + main( + default_platform = "Spatz", + default_simulator = "vsim", + ) + ) diff --git a/DeeployTest/testUtils/deeployRunner.py b/DeeployTest/testUtils/deeployRunner.py index a5a8d70ef3..0c98e254aa 100644 --- a/DeeployTest/testUtils/deeployRunner.py +++ b/DeeployTest/testUtils/deeployRunner.py @@ -348,6 +348,7 @@ def main(default_platform: Optional[str] = None, "snitch": "Snitch", "chimera": "Chimera", "softhier": "SoftHier", + "spatz": "Spatz", } if args.platform: @@ -388,6 +389,7 @@ def main(default_platform: Optional[str] = None, "Snitch": "gvsoc", "Chimera": "gvsoc", "SoftHier": "gvsoc", + "Spatz": "vsim", } simulator = simulator_map.get(platform, "host") log.info(f"No simulator specified, using default for {platform}: {simulator}") diff --git a/DeeployTest/test_platforms.py b/DeeployTest/test_platforms.py index 6d9f3cfcd7..6be4bef197 100644 --- a/DeeployTest/test_platforms.py +++ b/DeeployTest/test_platforms.py @@ -110,6 +110,14 @@ def param_id(param): "model_tests": SNITCH_MODEL_TESTS, "default_num_cores": SNITCH_DEFAULT_NUM_CORES, }, + "spatz": { + "platform": "Spatz", + "simulator": "vsim", + # TODO: Define KERNEL_TESTS and MODEL_TESTS for Spatz + "kernel_tests": [], + "model_tests": [], + # "default_num_cores": , + }, "gap9": { "platform": "GAP9", "simulator": "gvsoc", diff --git a/Makefile b/Makefile index d40a49da11..24279ecfc3 100644 --- a/Makefile +++ b/Makefile @@ -124,6 +124,7 @@ ${LLVM_INSTALL_DIR}: ${TOOLCHAIN_DIR}/llvm-project llvm: ${LLVM_INSTALL_DIR} +# runtimes for different architectures ${LLVM_CLANG_RT_RISCV_RV32IM}: ${TOOLCHAIN_DIR}/llvm-project cd ${TOOLCHAIN_DIR}/llvm-project && mkdir -p build-compiler-rt-riscv-rv32im \ && cd build-compiler-rt-riscv-rv32im; \ diff --git a/TargetLibraries/Spatz/CMakeLists.txt b/TargetLibraries/Spatz/CMakeLists.txt new file mode 100644 index 0000000000..53b3c3b642 --- /dev/null +++ b/TargetLibraries/Spatz/CMakeLists.txt @@ -0,0 +1,14 @@ +file(GLOB_RECURSE SOURCES + "src/**" +) + +include(cmake/snitch-runtime-precompiled.cmake) + +add_deeploy_library(deeployspatz STATIC ${SOURCES}) +target_include_directories(deeployspatz + PUBLIC + ${CMAKE_CURRENT_LIST_DIR}/inc +) +target_include_directories(deeployspatz SYSTEM PUBLIC ${SNITCH_RUNTIME_INCLUDE}) +target_compile_options(deeployspatz PUBLIC ${SNITCH_RUNTIME_COMPILE_FLAGS}) +target_link_libraries(deeployspatz INTERFACE snitch-runtime) diff --git a/TargetLibraries/Spatz/cmake/snitch-runtime-precompiled.cmake b/TargetLibraries/Spatz/cmake/snitch-runtime-precompiled.cmake new file mode 100644 index 0000000000..84faa71fd4 --- /dev/null +++ b/TargetLibraries/Spatz/cmake/snitch-runtime-precompiled.cmake @@ -0,0 +1,6 @@ +# Copyright 2025 ETH Zurich and University of Bologna. +# Licensed under the Apache License, Version 2.0, see LICENSE for details. +# SPDX-License-Identifier: Apache-2.0 + +# This is a direct reference to the Snitch runtime setup for Spatz. +include(${CMAKE_CURRENT_LIST_DIR}/../../Snitch/cmake/snitch-runtime-precompiled.cmake) diff --git a/TargetLibraries/Spatz/inc/DeeploySpatzMath.h b/TargetLibraries/Spatz/inc/DeeploySpatzMath.h new file mode 100644 index 0000000000..0e856fbf1c --- /dev/null +++ b/TargetLibraries/Spatz/inc/DeeploySpatzMath.h @@ -0,0 +1,20 @@ +/* + * SPDX-FileCopyrightText: 2026 ETH Zurich and University of Bologna + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#ifndef __DEEPLOY_SPATZ_MATH_HEADER_ +#define __DEEPLOY_SPATZ_MATH_HEADER_ + +#include +#include + +#include "DeeployBasicMath.h" +#include "snrt.h" + +#define BEGIN_SINGLE_CORE if (core_id == 0) { +#define END_SINGLE_CORE } +#define SINGLE_CORE if (core_id == 0) + +#endif // __DEEPLOY_SPATZ_MATH_HEADER_ diff --git a/TargetLibraries/Spatz/inc/Util.h b/TargetLibraries/Spatz/inc/Util.h new file mode 100644 index 0000000000..893d687fa1 --- /dev/null +++ b/TargetLibraries/Spatz/inc/Util.h @@ -0,0 +1,9 @@ +// SPDX-FileCopyrightText: 2026 ETH Zurich and University of Bologna +// SPDX-License-Identifier: Apache-2.0 + +#ifndef SPATZ_UTIL_H +#define SPATZ_UTIL_H + +void spatz_util_dummy(void); + +#endif // SPATZ_UTIL_H diff --git a/TargetLibraries/Spatz/inc/utils.h b/TargetLibraries/Spatz/inc/utils.h deleted file mode 100644 index 88c7dc8f78..0000000000 --- a/TargetLibraries/Spatz/inc/utils.h +++ /dev/null @@ -1,2 +0,0 @@ -#include -void *deeploy_malloc(const size_t size) ; diff --git a/TargetLibraries/Spatz/src/Util.c b/TargetLibraries/Spatz/src/Util.c index daf546f649..9c30c11f49 100644 --- a/TargetLibraries/Spatz/src/Util.c +++ b/TargetLibraries/Spatz/src/Util.c @@ -1,3 +1,5 @@ -#include "utils.h" +// SPDX-FileCopyrightText: 2026 ETH Zurich and University of Bologna +// SPDX-License-Identifier: Apache-2.0 -void *deeploy_malloc(const size_t size) { return snrt_l1alloc(size); } +// Minimal stub for Spatz runtime linkage +void spatz_util_dummy(void) {} diff --git a/cmake/spatz/spatz.cmake b/cmake/spatz/spatz.cmake new file mode 100644 index 0000000000..ea888d4ac9 --- /dev/null +++ b/cmake/spatz/spatz.cmake @@ -0,0 +1,77 @@ +# SPDX-FileCopyrightText: 2024 ETH Zurich and University of Bologna +# +# SPDX-License-Identifier: Apache-2.0 + +# Spatz currently reuses the Snitch runtime layout. +if(DEFINED ENV{SPATZ_HOME}) + set(SPATZ_HOME $ENV{SPATZ_HOME}) +elseif(DEFINED ENV{SNITCH_HOME}) + set(SPATZ_HOME $ENV{SNITCH_HOME}) +else() + message(FATAL_ERROR "Environment variable SPATZ_HOME or SNITCH_HOME must be set.") +endif() + +# Keep compatibility with existing runtime cmake snippets expecting SNITCH_* vars. +set(SNITCH_HOME ${SPATZ_HOME}) +set(SNITCH_RUNTIME_HOME ${SNITCH_HOME}/sw/snRuntime) +set(SNITCH_CLUSTER_HOME ${SNITCH_HOME}/target/snitch_cluster) + +add_compile_definitions( + DEEPLOY_SPATZ_PLATFORM +) + +set(DEEPLOY_ARCH SPATZ) + +set(num_threads ${NUM_CORES}) + +macro(add_spatz_vsim_simulation name) + if(EXISTS ${SPATZ_HOME}/target/spatz_cluster/bin/spatz_cluster.vsim) + set(_SPATZ_VSIM_WORKDIR ${SPATZ_HOME}/target/spatz_cluster) + set(_SPATZ_VSIM_BIN bin/spatz_cluster.vsim) + else() + set(_SPATZ_VSIM_WORKDIR ${SPATZ_HOME}/target/snitch_cluster) + set(_SPATZ_VSIM_BIN bin/snitch_cluster.vsim) + endif() + + add_custom_target(vsim_${name} + WORKING_DIRECTORY ${_SPATZ_VSIM_WORKDIR} + DEPENDS ${name} + COMMAND ${QUESTA} ${_SPATZ_VSIM_BIN} + ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${name} || true + COMMENT "Simulating deeploytest with vsim (Spatz)" + POST_BUILD + USES_TERMINAL + VERBATIM + ) +endmacro() + +macro(add_spatz_vsim_gui_simulation name) + if(EXISTS ${SPATZ_HOME}/target/spatz_cluster/bin/spatz_cluster.vsim.gui) + set(_SPATZ_VSIM_GUI_WORKDIR ${SPATZ_HOME}/target/spatz_cluster) + set(_SPATZ_VSIM_GUI_BIN bin/spatz_cluster.vsim.gui) + else() + set(_SPATZ_VSIM_GUI_WORKDIR ${SPATZ_HOME}/target/snitch_cluster) + set(_SPATZ_VSIM_GUI_BIN bin/snitch_cluster.vsim.gui) + endif() + + add_custom_target(vsim.gui_${name} + WORKING_DIRECTORY ${_SPATZ_VSIM_GUI_WORKDIR} + DEPENDS ${name} + COMMAND ${QUESTA} ${_SPATZ_VSIM_GUI_BIN} + ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${name} || true + COMMENT "Simulating deeploytest with vsim.gui (Spatz)" + POST_BUILD + USES_TERMINAL + VERBATIM + ) +endmacro() + +add_compile_options( + -ffast-math +) + +add_link_options( + -ffast-math + -Wl,--gc-sections +) + diff --git a/cmake/spatz/toolchain_llvm.cmake b/cmake/spatz/toolchain_llvm.cmake new file mode 100644 index 0000000000..c3f13592e7 --- /dev/null +++ b/cmake/spatz/toolchain_llvm.cmake @@ -0,0 +1,94 @@ +# SPDX-FileCopyrightText: 2024 ETH Zurich and University of Bologna +# +# SPDX-License-Identifier: Apache-2.0 + +set(TOOLCHAIN_PREFIX ${TOOLCHAIN_INSTALL_DIR}/bin) + +set(CMAKE_SYSTEM_NAME Generic) + +set(LLVM_TAG llvm) + +# Crucial: Point CMake to the specialized Clang toolchain instead of system cc +set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}/clang) +set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}/clang++) +set(CMAKE_ASM_COMPILER ${TOOLCHAIN_PREFIX}/clang) +set(CMAKE_OBJCOPY ${TOOLCHAIN_PREFIX}/${LLVM_TAG}-objcopy) +set(CMAKE_OBJDUMP ${TOOLCHAIN_PREFIX}/${LLVM_TAG}-objdump) +set(CMAKE_LINKER ${TOOLCHAIN_PREFIX}/ld.lld) +set(CMAKE_EXECUTABLE_SUFFIX ".elf") + +# ISA definition from user command +set(ISA rv32imafdvzfh_xdma_xfquarter) + +# Compile options based on user's manual compilation commands +add_compile_options( + -target riscv32-unknown-elf + -MP + -mcpu=snitch + # -mcmodel=small # User used small, Snitch uses medany. Keeping user's choice can be risky if code is large. + # Safe compromise: use medany unless 'small' is strictly required, but user command had small. + # deeploy typically uses medany. Let's stick to user's flag if explicit, or Snitch defaults. + # User command: -mcmodel=small + -mcmodel=small + + -ffast-math + -fno-builtin-printf + -fno-common + -falign-loops=16 + -ffunction-sections + -Wextra + + # LLVM specific flags from user command + -mllvm -misched-topdown + -menable-experimental-extensions + -mno-relax + + -march=${ISA} + -mabi=ilp32d + -isystem ${TOOLCHAIN_INSTALL_DIR}/picolibc/riscv/rv32imafd/include + + # Optimization and debug + -O3 + -g + + # Include paths will be handled by CMake target_include_directories + # But we need riscv-opcodes if not standard + # -I.../riscv-opcodes is usually handled by Snitch/Spatz runtime includes +) + +# Link options matching user command +add_link_options( + -target riscv32-unknown-elf + -MP + -mcpu=snitch + -march=${ISA} + -mabi=ilp32d + -mcmodel=small + + -fuse-ld=lld + -nostartfiles + -nostdlib + -ffast-math + -fno-common + -fno-builtin-printf + + -Wl,-z,norelro + -Wl,--gc-sections + -Wl,--no-relax + -L${TOOLCHAIN_INSTALL_DIR}/picolibc/riscv/rv32imafd/lib + -L${TOOLCHAIN_INSTALL_DIR}/lib/clang/15.0.0/lib/baremetal/rv32imafd + + # User had explicit gcc toolchain path: --gcc-toolchain=/usr/pack/... + # In Docker/Deeploy we typically use packaged libs or environment variables. + # We will try to rely on the container's environment first. +) + +# User command linked: -lm -lgcc -lm -lgcc libsnRuntime-cluster.a +# libsnRuntime is handled by our target_link_libraries(deeployspatz ... snitch-runtime) +link_libraries( + -lc + -lclang_rt.builtins-riscv32 +) + +# Required by math library to avoid conflict with stdint definition +add_definitions(-D__DEFINED_intptr_t) From b1a5868c1a24270e0cc6337232a1f236a231972c Mon Sep 17 00:00:00 2001 From: Bumblebee00 Date: Mon, 23 Mar 2026 18:07:50 +0100 Subject: [PATCH 05/21] modified Makefile and cmakefiles to build and use spatz runtime. ugly version --- CMakeLists.txt | 14 ++- DeeployTest/Platforms/Spatz/CMakeLists.txt | 4 +- Makefile | 25 ++++- TargetLibraries/Spatz/CMakeLists.txt | 7 +- .../cmake/snitch-runtime-precompiled.cmake | 6 -- .../cmake/spatz-runtime-precompiled.cmake | 31 +++++++ cmake/spatz/spatz.cmake | 93 ++++++++----------- cmake/spatz/toolchain_llvm.cmake | 57 ++++-------- 8 files changed, 130 insertions(+), 107 deletions(-) delete mode 100644 TargetLibraries/Spatz/cmake/snitch-runtime-precompiled.cmake create mode 100644 TargetLibraries/Spatz/cmake/spatz-runtime-precompiled.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 049c2aa5d3..d7e294ce9f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,8 +10,8 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) set(CMAKE_C_STANDARD 99) -set(CMAKE_C_COMPILER_LAUNCHER "ccache") -set(CMAKE_CXX_COMPILER_LAUNCHER "ccache") +# 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) @@ -304,10 +304,16 @@ endif() if(platform STREQUAL Spatz) - # Only LLVM supported for Spatz + + if(NOT DEFINED ENV{SPATZ_HOME}) + message(FATAL_ERROR "Environment variable SNITCH_HOME not set.") + endif() + + set(SPATZ_HOME $ENV{SPATZ_HOME}) + set(CMAKE_TOOLCHAIN_FILE ${CMAKE_CURRENT_LIST_DIR}/cmake/spatz/toolchain_llvm.cmake) - include(${CMAKE_CURRENT_LIST_DIR}/cmake/spatz/spatz.cmake OPTIONAL) + include(${CMAKE_CURRENT_LIST_DIR}/cmake/spatz/spatz.cmake) project(deeploy LANGUAGES C ASM) diff --git a/DeeployTest/Platforms/Spatz/CMakeLists.txt b/DeeployTest/Platforms/Spatz/CMakeLists.txt index 4804a63182..f2f0c431a5 100644 --- a/DeeployTest/Platforms/Spatz/CMakeLists.txt +++ b/DeeployTest/Platforms/Spatz/CMakeLists.txt @@ -13,5 +13,5 @@ add_deeploy_executable(${ProjectId} EXCLUDE_FROM_ALL ${SOURCES}) target_link_libraries(${ProjectId} PRIVATE network deeploylib) target_compile_options(${ProjectId} INTERFACE network) -# Add QuestaSim RTL simulation for Spatz (mirroring Snitch's vsim) -add_spatz_vsim_simulation(${ProjectId}) +# # Add QuestaSim RTL simulation for Spatz (mirroring Snitch's vsim) +# add_spatz_vsim_simulation(${ProjectId}) diff --git a/Makefile b/Makefile index 24279ecfc3..015fbc4a2d 100644 --- a/Makefile +++ b/Makefile @@ -27,6 +27,7 @@ PICOLIBC_RV32IMF_INSTALL_DIR ?= ${LLVM_INSTALL_DIR}/picolibc/riscv/rv32imf 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 +SPATZ_INSTALL_DIR ?= ${DEEPLOY_INSTALL_DIR}/spatz QEMU_INSTALL_DIR ?= ${DEEPLOY_INSTALL_DIR}/qemu BANSHEE_INSTALL_DIR ?= ${DEEPLOY_INSTALL_DIR}/banshee MEMPOOL_INSTALL_DIR ?= ${DEEPLOY_INSTALL_DIR}/mempool @@ -44,6 +45,7 @@ PICOLIBC_COMMIT_HASH ?= 31ff1b3601b379e4cab63837f253f59729ce1fef PULP_SDK_COMMIT_HASH ?= 7f4f22516157a1b7c55bcbbc72ca81326180b3b4 MEMPOOL_COMMIT_HASH ?= affd45d94e05e375a6966af6a762deeb182a7bd6 SNITCH_COMMIT_HASH ?= e02cc9e3f24b92d4607455d5345caba3eb6273b2 +SPATZ_COMMIT_HASH ?= 9974c6aeabead537e232a0409742cb6fc534171e SOFTHIER_COMMIT_HASH ?= 0 # bowwang: to be updated GVSOC_COMMIT_HASH ?= edfcd8398840ceb1e151711befa06678b05f06a0 MINIMALLOC_COMMMIT_HASH ?= e9eaf54094025e1c246f9ec231b905f8ef42a29d @@ -69,7 +71,7 @@ else $(error unsupported platform $(OS)) endif -all: toolchain emulators docs echo-bash +all: toolchain emulators # docs echo-bash echo-bash: @@ -79,6 +81,7 @@ echo-bash: @echo "export PULP_SDK_HOME=${PULP_SDK_INSTALL_DIR}" @echo "export CHIMERA_SDK_HOME=${CHIMERA_SDK_INSTALL_DIR}" @echo "export SNITCH_HOME=${SNITCH_INSTALL_DIR}" + @echo "export SPATZ_HOME=${SPATZ_INSTALL_DIR}" @echo "export GVSOC_INSTALL_DIR=${GVSOC_INSTALL_DIR}" @echo "export SOFTHIER_INSTALL_DIR=${SOFTHIER_INSTALL_DIR}" @echo "export LLVM_INSTALL_DIR=${LLVM_INSTALL_DIR}" @@ -430,6 +433,26 @@ ${SNITCH_INSTALL_DIR}: ${TOOLCHAIN_DIR}/snitch_cluster snitch_runtime: ${SNITCH_INSTALL_DIR} +${TOOLCHAIN_DIR}/spatz: + cd ${TOOLCHAIN_DIR} && \ + git clone https://github.com/pulp-platform/spatz.git && \ + cd ${TOOLCHAIN_DIR}/spatz && git checkout ${SPATZ_COMMIT_HASH} && \ + git submodule update --init --recursive + +${SPATZ_INSTALL_DIR}: ${TOOLCHAIN_DIR}/spatz + mkdir -p ${SPATZ_INSTALL_DIR} + cp -r ${TOOLCHAIN_DIR}/spatz/ ${SPATZ_INSTALL_DIR}/../ + cd ${SPATZ_INSTALL_DIR} + make all -j8 && \ + conda activate /home/sem26f13/.conda/envs/mempool && \ + source util/iis-env.sh && \ + make init && \ + cd hw/system/spatz_cluster/ && \ + make sw && \ + conda deactivate \ + +spatz_runtime: ${SPATZ_INSTALL_DIR} + ${TOOLCHAIN_DIR}/gvsoc: cd ${TOOLCHAIN_DIR} && \ git clone https://github.com/gvsoc/gvsoc.git && \ diff --git a/TargetLibraries/Spatz/CMakeLists.txt b/TargetLibraries/Spatz/CMakeLists.txt index 53b3c3b642..7d192c2416 100644 --- a/TargetLibraries/Spatz/CMakeLists.txt +++ b/TargetLibraries/Spatz/CMakeLists.txt @@ -2,13 +2,12 @@ file(GLOB_RECURSE SOURCES "src/**" ) -include(cmake/snitch-runtime-precompiled.cmake) +include(cmake/spatz-runtime-precompiled.cmake) add_deeploy_library(deeployspatz STATIC ${SOURCES}) target_include_directories(deeployspatz PUBLIC ${CMAKE_CURRENT_LIST_DIR}/inc ) -target_include_directories(deeployspatz SYSTEM PUBLIC ${SNITCH_RUNTIME_INCLUDE}) -target_compile_options(deeployspatz PUBLIC ${SNITCH_RUNTIME_COMPILE_FLAGS}) -target_link_libraries(deeployspatz INTERFACE snitch-runtime) +target_include_directories(deeployspatz SYSTEM PUBLIC ${SPATZ_RUNTIME_INCLUDE}) +target_link_libraries(deeployspatz INTERFACE spatz-runtime) diff --git a/TargetLibraries/Spatz/cmake/snitch-runtime-precompiled.cmake b/TargetLibraries/Spatz/cmake/snitch-runtime-precompiled.cmake deleted file mode 100644 index 84faa71fd4..0000000000 --- a/TargetLibraries/Spatz/cmake/snitch-runtime-precompiled.cmake +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright 2025 ETH Zurich and University of Bologna. -# Licensed under the Apache License, Version 2.0, see LICENSE for details. -# SPDX-License-Identifier: Apache-2.0 - -# This is a direct reference to the Snitch runtime setup for Spatz. -include(${CMAKE_CURRENT_LIST_DIR}/../../Snitch/cmake/snitch-runtime-precompiled.cmake) diff --git a/TargetLibraries/Spatz/cmake/spatz-runtime-precompiled.cmake b/TargetLibraries/Spatz/cmake/spatz-runtime-precompiled.cmake new file mode 100644 index 0000000000..83e5a6c6d6 --- /dev/null +++ b/TargetLibraries/Spatz/cmake/spatz-runtime-precompiled.cmake @@ -0,0 +1,31 @@ +# Copyright 2025 ETH Zurich and University of Bologna. +# Licensed under the Apache License, Version 2.0, see LICENSE for details. +# SPDX-License-Identifier: Apache-2.0 + + +set(SPATZ_RUNTIME_BASE_INCLUDE + ${SPATZ_HOME}/sw/snRuntime/include + ${SPATZ_HOME}/sw/snRuntime/vendor + ${SPATZ_HOME}/sw/toolchain/riscv-opcodes +) + +set(SPATZ_CLUSTER_LINK_INCLUDE + ${SPATZ_HOME}/hw/system/spatz_cluster/sw/build/snRuntime +) + +set(SPATZ_LINKER_SCRIPT ${SPATZ_HOME}/hw/system/spatz_cluster/sw/build/snRuntime/common.ld) +# set(SPATZ_LINKER_SCRIPT ${SNITCH_RUNTIME_HOME}/base.ld) +if(NOT EXISTS ${SPATZ_LINKER_SCRIPT}) + message(FATAL_ERROR "Spatz linker script not found: ${SPATZ_LINKER_SCRIPT}") +endif() + +set(SPATZ_CLUSTER_LINK_OPTIONS + -Wl,--gc-sections + -T ${SPATZ_LINKER_SCRIPT} +) + +set(SPATZ_RUNTIME_INCLUDE ${SPATZ_RUNTIME_BASE_INCLUDE}) + +add_library(spatz-runtime INTERFACE) +target_link_directories(spatz-runtime INTERFACE ${SPATZ_CLUSTER_LINK_INCLUDE}) +target_link_libraries(spatz-runtime INTERFACE ${SPATZ_CLUSTER_LINK_OPTIONS} libsnRuntime-cluster.a) diff --git a/cmake/spatz/spatz.cmake b/cmake/spatz/spatz.cmake index ea888d4ac9..916966a323 100644 --- a/cmake/spatz/spatz.cmake +++ b/cmake/spatz/spatz.cmake @@ -2,19 +2,7 @@ # # SPDX-License-Identifier: Apache-2.0 -# Spatz currently reuses the Snitch runtime layout. -if(DEFINED ENV{SPATZ_HOME}) - set(SPATZ_HOME $ENV{SPATZ_HOME}) -elseif(DEFINED ENV{SNITCH_HOME}) - set(SPATZ_HOME $ENV{SNITCH_HOME}) -else() - message(FATAL_ERROR "Environment variable SPATZ_HOME or SNITCH_HOME must be set.") -endif() - # Keep compatibility with existing runtime cmake snippets expecting SNITCH_* vars. -set(SNITCH_HOME ${SPATZ_HOME}) -set(SNITCH_RUNTIME_HOME ${SNITCH_HOME}/sw/snRuntime) -set(SNITCH_CLUSTER_HOME ${SNITCH_HOME}/target/snitch_cluster) add_compile_definitions( DEEPLOY_SPATZ_PLATFORM @@ -24,47 +12,48 @@ set(DEEPLOY_ARCH SPATZ) set(num_threads ${NUM_CORES}) -macro(add_spatz_vsim_simulation name) - if(EXISTS ${SPATZ_HOME}/target/spatz_cluster/bin/spatz_cluster.vsim) - set(_SPATZ_VSIM_WORKDIR ${SPATZ_HOME}/target/spatz_cluster) - set(_SPATZ_VSIM_BIN bin/spatz_cluster.vsim) - else() - set(_SPATZ_VSIM_WORKDIR ${SPATZ_HOME}/target/snitch_cluster) - set(_SPATZ_VSIM_BIN bin/snitch_cluster.vsim) - endif() - - add_custom_target(vsim_${name} - WORKING_DIRECTORY ${_SPATZ_VSIM_WORKDIR} - DEPENDS ${name} - COMMAND ${QUESTA} ${_SPATZ_VSIM_BIN} - ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${name} || true - COMMENT "Simulating deeploytest with vsim (Spatz)" - POST_BUILD - USES_TERMINAL - VERBATIM - ) -endmacro() - -macro(add_spatz_vsim_gui_simulation name) - if(EXISTS ${SPATZ_HOME}/target/spatz_cluster/bin/spatz_cluster.vsim.gui) - set(_SPATZ_VSIM_GUI_WORKDIR ${SPATZ_HOME}/target/spatz_cluster) - set(_SPATZ_VSIM_GUI_BIN bin/spatz_cluster.vsim.gui) - else() - set(_SPATZ_VSIM_GUI_WORKDIR ${SPATZ_HOME}/target/snitch_cluster) - set(_SPATZ_VSIM_GUI_BIN bin/snitch_cluster.vsim.gui) - endif() +# TODO check this +# macro(add_spatz_vsim_simulation name) +# if(EXISTS ${SPATZ_HOME}/target/spatz_cluster/bin/spatz_cluster.vsim) +# set(_SPATZ_VSIM_WORKDIR ${SPATZ_HOME}/target/spatz_cluster) +# set(_SPATZ_VSIM_BIN bin/spatz_cluster.vsim) +# else() +# set(_SPATZ_VSIM_WORKDIR ${SPATZ_HOME}/target/snitch_cluster) +# set(_SPATZ_VSIM_BIN bin/snitch_cluster.vsim) +# endif() +# +# add_custom_target(vsim_${name} +# WORKING_DIRECTORY ${_SPATZ_VSIM_WORKDIR} +# DEPENDS ${name} +# COMMAND ${QUESTA} ${_SPATZ_VSIM_BIN} +# ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${name} || true +# COMMENT "Simulating deeploytest with vsim (Spatz)" +# POST_BUILD +# USES_TERMINAL +# VERBATIM +# ) +# endmacro() - add_custom_target(vsim.gui_${name} - WORKING_DIRECTORY ${_SPATZ_VSIM_GUI_WORKDIR} - DEPENDS ${name} - COMMAND ${QUESTA} ${_SPATZ_VSIM_GUI_BIN} - ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${name} || true - COMMENT "Simulating deeploytest with vsim.gui (Spatz)" - POST_BUILD - USES_TERMINAL - VERBATIM - ) -endmacro() +# macro(add_spatz_vsim_gui_simulation name) +# if(EXISTS ${SPATZ_HOME}/target/spatz_cluster/bin/spatz_cluster.vsim.gui) +# set(_SPATZ_VSIM_GUI_WORKDIR ${SPATZ_HOME}/target/spatz_cluster) +# set(_SPATZ_VSIM_GUI_BIN bin/spatz_cluster.vsim.gui) +# else() +# set(_SPATZ_VSIM_GUI_WORKDIR ${SPATZ_HOME}/target/snitch_cluster) +# set(_SPATZ_VSIM_GUI_BIN bin/snitch_cluster.vsim.gui) +# endif() +# +# add_custom_target(vsim.gui_${name} +# WORKING_DIRECTORY ${_SPATZ_VSIM_GUI_WORKDIR} +# DEPENDS ${name} +# COMMAND ${QUESTA} ${_SPATZ_VSIM_GUI_BIN} +# ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${name} || true +# COMMENT "Simulating deeploytest with vsim.gui (Spatz)" +# POST_BUILD +# USES_TERMINAL +# VERBATIM +# ) +# endmacro() add_compile_options( -ffast-math diff --git a/cmake/spatz/toolchain_llvm.cmake b/cmake/spatz/toolchain_llvm.cmake index c3f13592e7..03860e7e47 100644 --- a/cmake/spatz/toolchain_llvm.cmake +++ b/cmake/spatz/toolchain_llvm.cmake @@ -2,33 +2,26 @@ # # SPDX-License-Identifier: Apache-2.0 -set(TOOLCHAIN_PREFIX ${TOOLCHAIN_INSTALL_DIR}/bin) - set(CMAKE_SYSTEM_NAME Generic) -set(LLVM_TAG llvm) - # Crucial: Point CMake to the specialized Clang toolchain instead of system cc -set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}/clang) -set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}/clang++) -set(CMAKE_ASM_COMPILER ${TOOLCHAIN_PREFIX}/clang) -set(CMAKE_OBJCOPY ${TOOLCHAIN_PREFIX}/${LLVM_TAG}-objcopy) -set(CMAKE_OBJDUMP ${TOOLCHAIN_PREFIX}/${LLVM_TAG}-objdump) -set(CMAKE_LINKER ${TOOLCHAIN_PREFIX}/ld.lld) +set(SPATZ_TOOLCHAIN_DIR ${SPATZ_HOME}/sw/toolchain/llvm-project/build/bin) + +set(CMAKE_C_COMPILER ${SPATZ_TOOLCHAIN_DIR}/clang) +set(CMAKE_CXX_COMPILER ${SPATZ_TOOLCHAIN_DIR}/clang++) +set(CMAKE_ASM_COMPILER ${SPATZ_TOOLCHAIN_DIR}/clang) +set(CMAKE_OBJCOPY ${SPATZ_TOOLCHAIN_DIR}/llvm-objcopy) +set(CMAKE_OBJDUMP ${SPATZ_TOOLCHAIN_DIR}/llvm-objdump) +set(CMAKE_LINKER ${SPATZ_TOOLCHAIN_DIR}/ld.lld) set(CMAKE_EXECUTABLE_SUFFIX ".elf") -# ISA definition from user command -set(ISA rv32imafdvzfh_xdma_xfquarter) +set(ISA rv32imafdvzfh_xdma) # Compile options based on user's manual compilation commands add_compile_options( -target riscv32-unknown-elf - -MP + # -MP -mcpu=snitch - # -mcmodel=small # User used small, Snitch uses medany. Keeping user's choice can be risky if code is large. - # Safe compromise: use medany unless 'small' is strictly required, but user command had small. - # deeploy typically uses medany. Let's stick to user's flag if explicit, or Snitch defaults. - # User command: -mcmodel=small -mcmodel=small -ffast-math @@ -45,21 +38,16 @@ add_compile_options( -march=${ISA} -mabi=ilp32d - -isystem ${TOOLCHAIN_INSTALL_DIR}/picolibc/riscv/rv32imafd/include + -isystem ${SPATZ_HOME}/sw/toolchain/riscv-gnu-toolchain/riscv-newlib/newlib/libc/include # Optimization and debug -O3 -g - - # Include paths will be handled by CMake target_include_directories - # But we need riscv-opcodes if not standard - # -I.../riscv-opcodes is usually handled by Snitch/Spatz runtime includes ) # Link options matching user command add_link_options( - -target riscv32-unknown-elf - -MP + # -target riscv32-unknown-elf -mcpu=snitch -march=${ISA} -mabi=ilp32d @@ -67,28 +55,21 @@ add_link_options( -fuse-ld=lld -nostartfiles - -nostdlib + -ffast-math -fno-common -fno-builtin-printf - + + -static -Wl,-z,norelro -Wl,--gc-sections -Wl,--no-relax - -L${TOOLCHAIN_INSTALL_DIR}/picolibc/riscv/rv32imafd/lib - -L${TOOLCHAIN_INSTALL_DIR}/lib/clang/15.0.0/lib/baremetal/rv32imafd - - # User had explicit gcc toolchain path: --gcc-toolchain=/usr/pack/... - # In Docker/Deeploy we typically use packaged libs or environment variables. - # We will try to rely on the container's environment first. + + --gcc-toolchain=/usr/pack/riscv-1.0-kgf/spatz-gcc-7.1.1 ) # User command linked: -lm -lgcc -lm -lgcc libsnRuntime-cluster.a -# libsnRuntime is handled by our target_link_libraries(deeployspatz ... snitch-runtime) +# libsnRuntime-cluster.a is handled by our target_link_libraries(deeployspatz INTERFACE spatz-runtime) link_libraries( - -lc - -lclang_rt.builtins-riscv32 + -lm -lgcc -lm -lgcc ) - -# Required by math library to avoid conflict with stdint definition -add_definitions(-D__DEFINED_intptr_t) From 0acf6e7d890616bf8cf3d78c5a4f2965b4cc5264 Mon Sep 17 00:00:00 2001 From: Bumblebee00 Date: Mon, 23 Mar 2026 18:20:22 +0100 Subject: [PATCH 06/21] vsim simulator runnable by deeployRunner --- DeeployTest/Platforms/Spatz/CMakeLists.txt | 8 +-- .../cmake/spatz-runtime-precompiled.cmake | 4 -- cmake/spatz/spatz.cmake | 60 ++++--------------- cmake/spatz/toolchain_llvm.cmake | 3 - 4 files changed, 14 insertions(+), 61 deletions(-) diff --git a/DeeployTest/Platforms/Spatz/CMakeLists.txt b/DeeployTest/Platforms/Spatz/CMakeLists.txt index f2f0c431a5..54c56acc82 100644 --- a/DeeployTest/Platforms/Spatz/CMakeLists.txt +++ b/DeeployTest/Platforms/Spatz/CMakeLists.txt @@ -1,7 +1,3 @@ -# SPDX-FileCopyrightText: 2024 ETH Zurich and University of Bologna -# -# SPDX-License-Identifier: Apache-2.0 - set(ProjectId ${TESTNAME}) file(GLOB_RECURSE SOURCES @@ -13,5 +9,5 @@ add_deeploy_executable(${ProjectId} EXCLUDE_FROM_ALL ${SOURCES}) target_link_libraries(${ProjectId} PRIVATE network deeploylib) target_compile_options(${ProjectId} INTERFACE network) -# # Add QuestaSim RTL simulation for Spatz (mirroring Snitch's vsim) -# add_spatz_vsim_simulation(${ProjectId}) +# Add QuestaSim RTL simulation for Spatz (mirroring Snitch's vsim) +add_spatz_vsim_simulation(${ProjectId}) diff --git a/TargetLibraries/Spatz/cmake/spatz-runtime-precompiled.cmake b/TargetLibraries/Spatz/cmake/spatz-runtime-precompiled.cmake index 83e5a6c6d6..42e15e1b31 100644 --- a/TargetLibraries/Spatz/cmake/spatz-runtime-precompiled.cmake +++ b/TargetLibraries/Spatz/cmake/spatz-runtime-precompiled.cmake @@ -1,7 +1,3 @@ -# Copyright 2025 ETH Zurich and University of Bologna. -# Licensed under the Apache License, Version 2.0, see LICENSE for details. -# SPDX-License-Identifier: Apache-2.0 - set(SPATZ_RUNTIME_BASE_INCLUDE ${SPATZ_HOME}/sw/snRuntime/include diff --git a/cmake/spatz/spatz.cmake b/cmake/spatz/spatz.cmake index 916966a323..b715f625c9 100644 --- a/cmake/spatz/spatz.cmake +++ b/cmake/spatz/spatz.cmake @@ -1,9 +1,3 @@ -# SPDX-FileCopyrightText: 2024 ETH Zurich and University of Bologna -# -# SPDX-License-Identifier: Apache-2.0 - -# Keep compatibility with existing runtime cmake snippets expecting SNITCH_* vars. - add_compile_definitions( DEEPLOY_SPATZ_PLATFORM ) @@ -12,48 +6,18 @@ set(DEEPLOY_ARCH SPATZ) set(num_threads ${NUM_CORES}) -# TODO check this -# macro(add_spatz_vsim_simulation name) -# if(EXISTS ${SPATZ_HOME}/target/spatz_cluster/bin/spatz_cluster.vsim) -# set(_SPATZ_VSIM_WORKDIR ${SPATZ_HOME}/target/spatz_cluster) -# set(_SPATZ_VSIM_BIN bin/spatz_cluster.vsim) -# else() -# set(_SPATZ_VSIM_WORKDIR ${SPATZ_HOME}/target/snitch_cluster) -# set(_SPATZ_VSIM_BIN bin/snitch_cluster.vsim) -# endif() -# -# add_custom_target(vsim_${name} -# WORKING_DIRECTORY ${_SPATZ_VSIM_WORKDIR} -# DEPENDS ${name} -# COMMAND ${QUESTA} ${_SPATZ_VSIM_BIN} -# ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${name} || true -# COMMENT "Simulating deeploytest with vsim (Spatz)" -# POST_BUILD -# USES_TERMINAL -# VERBATIM -# ) -# endmacro() - -# macro(add_spatz_vsim_gui_simulation name) -# if(EXISTS ${SPATZ_HOME}/target/spatz_cluster/bin/spatz_cluster.vsim.gui) -# set(_SPATZ_VSIM_GUI_WORKDIR ${SPATZ_HOME}/target/spatz_cluster) -# set(_SPATZ_VSIM_GUI_BIN bin/spatz_cluster.vsim.gui) -# else() -# set(_SPATZ_VSIM_GUI_WORKDIR ${SPATZ_HOME}/target/snitch_cluster) -# set(_SPATZ_VSIM_GUI_BIN bin/snitch_cluster.vsim.gui) -# endif() -# -# add_custom_target(vsim.gui_${name} -# WORKING_DIRECTORY ${_SPATZ_VSIM_GUI_WORKDIR} -# DEPENDS ${name} -# COMMAND ${QUESTA} ${_SPATZ_VSIM_GUI_BIN} -# ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${name} || true -# COMMENT "Simulating deeploytest with vsim.gui (Spatz)" -# POST_BUILD -# USES_TERMINAL -# VERBATIM -# ) -# endmacro() +macro(add_spatz_vsim_simulation name) + add_custom_target(vsim_${name} + WORKING_DIRECTORY ${SPATZ_HOME}/hw/system/spatz_cluster + DEPENDS ${name} + COMMAND ${QUESTA} bin/spatz_cluster.vsim + ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${name} || true + COMMENT "Simulating deeploytest with vsim (Spatz cluster)" + POST_BUILD + USES_TERMINAL + VERBATIM + ) +endmacro() add_compile_options( -ffast-math diff --git a/cmake/spatz/toolchain_llvm.cmake b/cmake/spatz/toolchain_llvm.cmake index 03860e7e47..3a149c04f0 100644 --- a/cmake/spatz/toolchain_llvm.cmake +++ b/cmake/spatz/toolchain_llvm.cmake @@ -1,6 +1,3 @@ -# SPDX-FileCopyrightText: 2024 ETH Zurich and University of Bologna -# -# SPDX-License-Identifier: Apache-2.0 set(CMAKE_SYSTEM_NAME Generic) From 8e4e8c3ed6df0fc2ec6b7293074bf4d352aff7d6 Mon Sep 17 00:00:00 2001 From: Bumblebee00 Date: Mon, 23 Mar 2026 19:30:00 +0100 Subject: [PATCH 07/21] Removed reverence to conda environment and added commands to create venv in the makefile --- Makefile | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 015fbc4a2d..81e5fd32f0 100644 --- a/Makefile +++ b/Makefile @@ -444,12 +444,13 @@ ${SPATZ_INSTALL_DIR}: ${TOOLCHAIN_DIR}/spatz cp -r ${TOOLCHAIN_DIR}/spatz/ ${SPATZ_INSTALL_DIR}/../ cd ${SPATZ_INSTALL_DIR} make all -j8 && \ - conda activate /home/sem26f13/.conda/envs/mempool && \ + python3.6 -m venv .venv && \ + .venv/bin/pip install jsonref jsonschema jstyleson dataclasses hjson mako && \ + source .venv/bin/activate && \ source util/iis-env.sh && \ make init && \ cd hw/system/spatz_cluster/ && \ - make sw && \ - conda deactivate \ + make sw spatz_runtime: ${SPATZ_INSTALL_DIR} From 9cab7862e3ff568283a44d2e3691ba341451cab6 Mon Sep 17 00:00:00 2001 From: Bumblebee00 Date: Fri, 27 Mar 2026 10:45:00 +0100 Subject: [PATCH 08/21] typo --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d7e294ce9f..bc3fb15cb7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -306,7 +306,7 @@ endif() if(platform STREQUAL Spatz) if(NOT DEFINED ENV{SPATZ_HOME}) - message(FATAL_ERROR "Environment variable SNITCH_HOME not set.") + message(FATAL_ERROR "Environment variable SPATZ_HOME not set.") endif() set(SPATZ_HOME $ENV{SPATZ_HOME}) From e3c46c4e03c99ecd7d152d16c5e39f0416e92ce4 Mon Sep 17 00:00:00 2001 From: Bumblebee00 Date: Fri, 27 Mar 2026 12:12:43 +0100 Subject: [PATCH 09/21] double gvsoc temporaney configuration --- DeeployTest/Platforms/Spatz/CMakeLists.txt | 4 ++-- Makefile | 22 +++++++++++++++++++++- cmake/simulation.cmake | 16 ++++++++++++++++ toolchain/gvsoc.patch | 12 ++++++++++++ 4 files changed, 51 insertions(+), 3 deletions(-) create mode 100644 toolchain/gvsoc.patch diff --git a/DeeployTest/Platforms/Spatz/CMakeLists.txt b/DeeployTest/Platforms/Spatz/CMakeLists.txt index 54c56acc82..2eec84530b 100644 --- a/DeeployTest/Platforms/Spatz/CMakeLists.txt +++ b/DeeployTest/Platforms/Spatz/CMakeLists.txt @@ -9,5 +9,5 @@ add_deeploy_executable(${ProjectId} EXCLUDE_FROM_ALL ${SOURCES}) target_link_libraries(${ProjectId} PRIVATE network deeploylib) target_compile_options(${ProjectId} INTERFACE network) -# Add QuestaSim RTL simulation for Spatz (mirroring Snitch's vsim) -add_spatz_vsim_simulation(${ProjectId}) +add_spatz_gvsoc_emulation(${ProjectId} "spatz_v2") +add_spatz_vsim_simulation(${ProjectId}) \ No newline at end of file diff --git a/Makefile b/Makefile index 81e5fd32f0..2048d9d45d 100644 --- a/Makefile +++ b/Makefile @@ -32,6 +32,7 @@ QEMU_INSTALL_DIR ?= ${DEEPLOY_INSTALL_DIR}/qemu BANSHEE_INSTALL_DIR ?= ${DEEPLOY_INSTALL_DIR}/banshee MEMPOOL_INSTALL_DIR ?= ${DEEPLOY_INSTALL_DIR}/mempool GVSOC_INSTALL_DIR ?= ${DEEPLOY_INSTALL_DIR}/gvsoc +GVSOC_SPATZ_INSTALL_DIR ?= ${DEEPLOY_INSTALL_DIR}/gvsoc_spatz SOFTHIER_INSTALL_DIR ?= ${DEEPLOY_INSTALL_DIR}/softhier MINIMALLOC_INSTALL_DIR ?= ${DEEPLOY_INSTALL_DIR}/minimalloc XTL_INSTALL_DIR ?= ${DEEPLOY_INSTALL_DIR}/xtl @@ -47,7 +48,9 @@ MEMPOOL_COMMIT_HASH ?= affd45d94e05e375a6966af6a762deeb182a7bd6 SNITCH_COMMIT_HASH ?= e02cc9e3f24b92d4607455d5345caba3eb6273b2 SPATZ_COMMIT_HASH ?= 9974c6aeabead537e232a0409742cb6fc534171e SOFTHIER_COMMIT_HASH ?= 0 # bowwang: to be updated -GVSOC_COMMIT_HASH ?= edfcd8398840ceb1e151711befa06678b05f06a0 +GVSOC_COMMIT_HASH ?= edfcd8398840ceb1e151711befa06678b05f06a0 # old +# GVSOC_COMMIT_HASH ?= 209c147cbd293d5c1590694e68c489122c777acc # new +GVSOC_SPATZ_COMMIT_HASH ?= 209c147cbd293d5c1590694e68c489122c777acc MINIMALLOC_COMMMIT_HASH ?= e9eaf54094025e1c246f9ec231b905f8ef42a29d CHIMERA_SDK_COMMIT_HASH ?= b2392f6efcff75c03f4c65eaf3e12104442b22ea XTL_VERSION ?= 0.7.5 @@ -454,6 +457,23 @@ ${SPATZ_INSTALL_DIR}: ${TOOLCHAIN_DIR}/spatz spatz_runtime: ${SPATZ_INSTALL_DIR} +${TOOLCHAIN_DIR}/gvsoc_spatz: + cd ${TOOLCHAIN_DIR} && \ + git clone https://github.com/gvsoc/gvsoc.git gvsoc_spatz && \ + cd ${TOOLCHAIN_DIR}/gvsoc_spatz && git checkout ${GVSOC_SPATZ_COMMIT_HASH} && \ + git submodule update --init --recursive && \ + python3 -m venv venv && source venv/bin/activate &&\ + pip3 install -r core/requirements.txt && pip3 install -r gapy/requirements.txt && pip3 install psutil && \ + cd core && git apply ${TOOLCHAIN_DIR}/gvsoc.patch + + +${GVSOC_SPATZ_INSTALL_DIR}: ${TOOLCHAIN_DIR}/gvsoc_spatz + cd ${TOOLCHAIN_DIR}/gvsoc_spatz && \ + source venv/bin/activate &&\ + CXX=g++-11.2.0 CC=gcc-11.2.0 CMAKE=cmake-3.18.1 make all TARGETS=spatz_v2 INSTALLDIR=${GVSOC_SPATZ_INSTALL_DIR} + +gvsoc_spatz: ${GVSOC_SPATZ_INSTALL_DIR} + ${TOOLCHAIN_DIR}/gvsoc: cd ${TOOLCHAIN_DIR} && \ git clone https://github.com/gvsoc/gvsoc.git && \ diff --git a/cmake/simulation.cmake b/cmake/simulation.cmake index 55525feedd..50182548ba 100644 --- a/cmake/simulation.cmake +++ b/cmake/simulation.cmake @@ -102,3 +102,19 @@ macro(add_gvsoc_emulation name target) USES_TERMINAL ) endmacro() + +macro(add_spatz_gvsoc_emulation name target) + set(GVSOC_WORKDIR ${CMAKE_BINARY_DIR}/gvsoc_workdir) + make_directory(${GVSOC_WORKDIR}) + 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 bash -c "source /scratch/mmm/Deeploy/toolchain/gvsoc_spatz/venv/bin/activate && /scratch/mmm/Deeploy/install/gvsoc_spatz/bin/gvrun --target ${target} --param chip/soc/binary=${GVSOC_BINARY} run" + COMMENT "Simulating deeploytest ${name} with gvsoc for the target ${target}" + POST_BUILD + USES_TERMINAL + VERBATIM + ) +endmacro() diff --git a/toolchain/gvsoc.patch b/toolchain/gvsoc.patch new file mode 100644 index 0000000000..22e65922a9 --- /dev/null +++ b/toolchain/gvsoc.patch @@ -0,0 +1,12 @@ +diff --git a/engine/src/launcher.cpp b/engine/src/launcher.cpp +index f0b1b654..48c83592 100644 +--- a/engine/src/launcher.cpp ++++ b/engine/src/launcher.cpp +@@ -21,6 +21,7 @@ + + #include + #include ++#include + #include + + #include From 651d4cfa90bb22d201c7b5c5071d6741aed1b658 Mon Sep 17 00:00:00 2001 From: Bumblebee00 Date: Fri, 27 Mar 2026 13:30:39 +0100 Subject: [PATCH 10/21] reunited gvsoc build for spatz and other platforms --- Makefile | 41 +++++++++++++++++++++-------------------- cmake/simulation.cmake | 2 +- 2 files changed, 22 insertions(+), 21 deletions(-) diff --git a/Makefile b/Makefile index 2048d9d45d..80065cac9b 100644 --- a/Makefile +++ b/Makefile @@ -48,8 +48,8 @@ MEMPOOL_COMMIT_HASH ?= affd45d94e05e375a6966af6a762deeb182a7bd6 SNITCH_COMMIT_HASH ?= e02cc9e3f24b92d4607455d5345caba3eb6273b2 SPATZ_COMMIT_HASH ?= 9974c6aeabead537e232a0409742cb6fc534171e SOFTHIER_COMMIT_HASH ?= 0 # bowwang: to be updated -GVSOC_COMMIT_HASH ?= edfcd8398840ceb1e151711befa06678b05f06a0 # old -# GVSOC_COMMIT_HASH ?= 209c147cbd293d5c1590694e68c489122c777acc # new +# GVSOC_COMMIT_HASH ?= edfcd8398840ceb1e151711befa06678b05f06a0 # old +GVSOC_COMMIT_HASH ?= 209c147cbd293d5c1590694e68c489122c777acc # new GVSOC_SPATZ_COMMIT_HASH ?= 209c147cbd293d5c1590694e68c489122c777acc MINIMALLOC_COMMMIT_HASH ?= e9eaf54094025e1c246f9ec231b905f8ef42a29d CHIMERA_SDK_COMMIT_HASH ?= b2392f6efcff75c03f4c65eaf3e12104442b22ea @@ -457,33 +457,34 @@ ${SPATZ_INSTALL_DIR}: ${TOOLCHAIN_DIR}/spatz spatz_runtime: ${SPATZ_INSTALL_DIR} -${TOOLCHAIN_DIR}/gvsoc_spatz: - cd ${TOOLCHAIN_DIR} && \ - git clone https://github.com/gvsoc/gvsoc.git gvsoc_spatz && \ - cd ${TOOLCHAIN_DIR}/gvsoc_spatz && git checkout ${GVSOC_SPATZ_COMMIT_HASH} && \ - git submodule update --init --recursive && \ - python3 -m venv venv && source venv/bin/activate &&\ - pip3 install -r core/requirements.txt && pip3 install -r gapy/requirements.txt && pip3 install psutil && \ - cd core && git apply ${TOOLCHAIN_DIR}/gvsoc.patch - - -${GVSOC_SPATZ_INSTALL_DIR}: ${TOOLCHAIN_DIR}/gvsoc_spatz - cd ${TOOLCHAIN_DIR}/gvsoc_spatz && \ - source venv/bin/activate &&\ - CXX=g++-11.2.0 CC=gcc-11.2.0 CMAKE=cmake-3.18.1 make all TARGETS=spatz_v2 INSTALLDIR=${GVSOC_SPATZ_INSTALL_DIR} - -gvsoc_spatz: ${GVSOC_SPATZ_INSTALL_DIR} +# ${TOOLCHAIN_DIR}/gvsoc_spatz: +# cd ${TOOLCHAIN_DIR} && \ +# git clone https://github.com/gvsoc/gvsoc.git gvsoc_spatz && \ +# cd ${TOOLCHAIN_DIR}/gvsoc_spatz && git checkout ${GVSOC_SPATZ_COMMIT_HASH} && \ +# git submodule update --init --recursive && \ +# python3 -m venv venv && source venv/bin/activate &&\ +# pip3 install -r core/requirements.txt && pip3 install -r gapy/requirements.txt && pip3 install psutil && \ +# cd core && git apply ${TOOLCHAIN_DIR}/gvsoc.patch +# +# +# ${GVSOC_SPATZ_INSTALL_DIR}: ${TOOLCHAIN_DIR}/gvsoc_spatz +# cd ${TOOLCHAIN_DIR}/gvsoc_spatz && \ +# source venv/bin/activate &&\ +# CXX=g++-11.2.0 CC=gcc-11.2.0 CMAKE=cmake-3.18.1 make all TARGETS=spatz_v2 INSTALLDIR=${GVSOC_SPATZ_INSTALL_DIR} +# +# gvsoc_spatz: ${GVSOC_SPATZ_INSTALL_DIR} ${TOOLCHAIN_DIR}/gvsoc: cd ${TOOLCHAIN_DIR} && \ git clone https://github.com/gvsoc/gvsoc.git && \ cd ${TOOLCHAIN_DIR}/gvsoc && git checkout ${GVSOC_COMMIT_HASH} && \ git submodule update --init --recursive && \ - pip install -r core/requirements.txt && pip install -r gapy/requirements.txt + pip3 install -r core/requirements.txt && pip3 install -r gapy/requirements.txt && pip3 install psutil &&\ + cd core && git apply ${TOOLCHAIN_DIR}/gvsoc.patch ${GVSOC_INSTALL_DIR}: ${TOOLCHAIN_DIR}/gvsoc cd ${TOOLCHAIN_DIR}/gvsoc && \ - XTENSOR_INSTALL_DIR=${XTENSOR_INSTALL_DIR}/include XTL_INSTALL_DIR=${XTL_INSTALL_DIR}/include XSIMD_INSTALL_DIR=${XSIMD_INSTALL_DIR}/include make all TARGETS="pulp.snitch.snitch_cluster_single siracusa chimera" build INSTALLDIR=${GVSOC_INSTALL_DIR} + XTENSOR_INSTALL_DIR=${XTENSOR_INSTALL_DIR}/include XTL_INSTALL_DIR=${XTL_INSTALL_DIR}/include XSIMD_INSTALL_DIR=${XSIMD_INSTALL_DIR}/include make all TARGETS="pulp.snitch.snitch_cluster_single siracusa chimera spatz_v2" build INSTALLDIR=${GVSOC_INSTALL_DIR} gvsoc: ${GVSOC_INSTALL_DIR} diff --git a/cmake/simulation.cmake b/cmake/simulation.cmake index 50182548ba..983dc0e4ee 100644 --- a/cmake/simulation.cmake +++ b/cmake/simulation.cmake @@ -111,7 +111,7 @@ macro(add_spatz_gvsoc_emulation name target) DEPENDS ${name} WORKING_DIRECTORY ${GVSOC_WORKDIR} COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_BINARY_DIR}/*.bin ${GVSOC_WORKDIR}/ || true - COMMAND bash -c "source /scratch/mmm/Deeploy/toolchain/gvsoc_spatz/venv/bin/activate && /scratch/mmm/Deeploy/install/gvsoc_spatz/bin/gvrun --target ${target} --param chip/soc/binary=${GVSOC_BINARY} run" + COMMAND bash -c "${GVSOC_INSTALL_DIR}/bin/gvrun --target ${target} --param chip/soc/binary=${GVSOC_BINARY} run" COMMENT "Simulating deeploytest ${name} with gvsoc for the target ${target}" POST_BUILD USES_TERMINAL From 908261ddea2abc13e775e9ab26ed826ebea8b4d8 Mon Sep 17 00:00:00 2001 From: Bumblebee00 Date: Fri, 27 Mar 2026 13:32:25 +0100 Subject: [PATCH 11/21] forgot comment --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 80065cac9b..88385251fc 100644 --- a/Makefile +++ b/Makefile @@ -50,7 +50,7 @@ SPATZ_COMMIT_HASH ?= 9974c6aeabead537e232a0409742cb6fc534171e SOFTHIER_COMMIT_HASH ?= 0 # bowwang: to be updated # GVSOC_COMMIT_HASH ?= edfcd8398840ceb1e151711befa06678b05f06a0 # old GVSOC_COMMIT_HASH ?= 209c147cbd293d5c1590694e68c489122c777acc # new -GVSOC_SPATZ_COMMIT_HASH ?= 209c147cbd293d5c1590694e68c489122c777acc +# GVSOC_SPATZ_COMMIT_HASH ?= 209c147cbd293d5c1590694e68c489122c777acc MINIMALLOC_COMMMIT_HASH ?= e9eaf54094025e1c246f9ec231b905f8ef42a29d CHIMERA_SDK_COMMIT_HASH ?= b2392f6efcff75c03f4c65eaf3e12104442b22ea XTL_VERSION ?= 0.7.5 From edc461f24953300feca4a046d588e27c93148ac6 Mon Sep 17 00:00:00 2001 From: Bumblebee00 Date: Fri, 27 Mar 2026 13:39:57 +0100 Subject: [PATCH 12/21] forgot comment --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bc3fb15cb7..2e903eeb5e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,8 +10,8 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) set(CMAKE_C_STANDARD 99) -# set(CMAKE_C_COMPILER_LAUNCHER "ccache") -# set(CMAKE_CXX_COMPILER_LAUNCHER "ccache") +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) From cd13ce43e76559dd6ef7b9b06d4b1000ffb5801b Mon Sep 17 00:00:00 2001 From: Bumblebee00 Date: Sun, 29 Mar 2026 21:46:06 +0200 Subject: [PATCH 13/21] added topk generic binding (hardcoded k=10) --- Deeploy/Targets/Generic/Bindings.py | 15 ++++++- Deeploy/Targets/Generic/Layers.py | 12 ++++++ Deeploy/Targets/Generic/Parsers.py | 27 +++++++++++++ .../Targets/Generic/Templates/TopKTemplate.py | 40 +++++++++++++++++++ Deeploy/Targets/Generic/TypeCheckers.py | 14 +++++++ 5 files changed, 106 insertions(+), 2 deletions(-) create mode 100644 Deeploy/Targets/Generic/Templates/TopKTemplate.py diff --git a/Deeploy/Targets/Generic/Bindings.py b/Deeploy/Targets/Generic/Bindings.py index 308b179aef..4b0ecfc258 100644 --- a/Deeploy/Targets/Generic/Bindings.py +++ b/Deeploy/Targets/Generic/Bindings.py @@ -19,12 +19,12 @@ GatherTemplate, GemmTemplate, IntegerDivTemplate, ITAMaxTemplate, ITAPartialMaxTemplate, MatMulTemplate, \ MaxPoolTemplate, MulTemplate, PadTemplate, QuantTemplate, ReduceMeanTemplate, ReduceSumTemplate, \ RequantShiftTemplate, ReshapeTemplate, RQIntegerDivTemplate, RQSiGELUTemplate, SliceTemplate, TransposeTemplate, \ - iGELUTemplate, iLayernormTemplate, iRMSNormTemplate, iSoftmaxTemplate + iGELUTemplate, iLayernormTemplate, iRMSNormTemplate, iSoftmaxTemplate, TopKTemplate from Deeploy.Targets.Generic.TypeCheckers import AddChecker, BatchNormChecker, ConcatChecker, ConvChecker, \ DebugPrintChecker, DequantChecker, DivChecker, DummyChecker, GatherChecker, GELUChecker, GEMMChecker, \ LayerNormChecker, MatMulChecker, MaxPoolChecker, MulChecker, PadChecker, QuantChecker, ReduceMeanChecker, \ ReduceSumChecker, ReluChecker, RequantShiftChecker, ReshapeChecker, RQIntegerDivChecker, SliceChecker, \ - SoftmaxChecker, TransposeChecker + SoftmaxChecker, TransposeChecker, TopKChecker BasicTransformer = CodeTransformation([ArgumentStructGeneration(), MemoryManagementGeneration(), FutureGeneration()]) @@ -327,3 +327,14 @@ ConvTransposeTemplate.referenceTemplate, BasicTransformer) for type in FloatDataTypes ] + +BasicTopKBindings = [ + NodeBinding( + TopKChecker( + [PointerClass(float32_t), PointerClass(int8_t)], # inputs + [PointerClass(float32_t), PointerClass(int8_t)] # outputs + ), + TopKTemplate.referenceTemplate, + BasicTransformer, + ) +] diff --git a/Deeploy/Targets/Generic/Layers.py b/Deeploy/Targets/Generic/Layers.py index cc733937cc..51b7b45dd4 100644 --- a/Deeploy/Targets/Generic/Layers.py +++ b/Deeploy/Targets/Generic/Layers.py @@ -709,3 +709,15 @@ def computeOps(self): numPx = opRep['dim_im_out_x'] return numPx * opsPerPx + + +class TopKLayer(ONNXLayer): + + def __init__(self, maps: List[NodeMapper]): + super().__init__(maps) + +# def computeOps(self): +# ??? +# +# def computeShapes(self): +# ??? \ No newline at end of file diff --git a/Deeploy/Targets/Generic/Parsers.py b/Deeploy/Targets/Generic/Parsers.py index ad787d9e4b..dafde5a404 100644 --- a/Deeploy/Targets/Generic/Parsers.py +++ b/Deeploy/Targets/Generic/Parsers.py @@ -2886,3 +2886,30 @@ def parseNodeCtxt(self, self.operatorRepresentation['size'] = int(np.prod(data_in.shape)) return ctxt, True + +# TopKParser: selects the largest k elements from a vector +class TopKParser(NodeParser): + def __init__(self): + super().__init__() + + def parseNode(self, node: gs.Node) -> bool: + return len(node.inputs)==2 and len(node.outputs)==2 and node.op=='TopK' + + def parseNodeCtxt(self, + ctxt: NetworkContext, + node: gs.Node, + channels_first: bool = True) -> Tuple[NetworkContext, bool]: + data_in = ctxt.lookup(node.inputs[0].name) + k_in = ctxt.lookup(node.inputs[1].name) + values_out = ctxt.lookup(node.outputs[0].name) + indices_out = ctxt.lookup(node.outputs[1].name) + + self.operatorRepresentation['data_in'] = data_in.name + self.operatorRepresentation['data_in_size'] = int(np.prod(data_in.shape)) + self.operatorRepresentation['k_in'] = k_in.name + self.operatorRepresentation['values_out'] = values_out.name + self.operatorRepresentation['indices_out'] = indices_out.name + + print("parsenodectxt returning true") + + return ctxt, True diff --git a/Deeploy/Targets/Generic/Templates/TopKTemplate.py b/Deeploy/Targets/Generic/Templates/TopKTemplate.py new file mode 100644 index 0000000000..78e44ed7bc --- /dev/null +++ b/Deeploy/Targets/Generic/Templates/TopKTemplate.py @@ -0,0 +1,40 @@ +from typing import Dict, List, Tuple + +from Deeploy.DeeployTypes import NetworkContext, NodeTemplate, OperatorRepresentation + + +referenceTemplate = NodeTemplate(""" +// TopK (Name: ${nodeName}, Op: ${nodeOp}) +BEGIN_SINGLE_CORE +// Find the top 10 values and their indices +// Assumes 1D input for simplicity +typedef struct { + ${data_in_type.referencedType.typeName} value; + uint32_t index; +} topk_pair_t; + +topk_pair_t pairs[${data_in_size}]; +for (uint32_t i = 0; i < ${data_in_size}; ++i) { + pairs[i].value = ((${data_in_type.referencedType.typeName}*)${data_in})[i]; + pairs[i].index = i; +} +// Simple selection sort for top-k +for (uint32_t i = 0; i < 10; ++i) { + uint32_t max_idx = i; + for (uint32_t j = i + 1; j < ${data_in_size}; ++j) { + if (pairs[j].value > pairs[max_idx].value) { + max_idx = j; + } + } + // Swap + if (max_idx != i) { + topk_pair_t tmp = pairs[i]; + pairs[i] = pairs[max_idx]; + pairs[max_idx] = tmp; + } + // Write output + ((${values_out_type.referencedType.typeName}*)${values_out})[i] = pairs[i].value; + ((${indices_out_type.referencedType.typeName}*)${indices_out})[i] = pairs[i].index; +} +END_SINGLE_CORE +""") \ No newline at end of file diff --git a/Deeploy/Targets/Generic/TypeCheckers.py b/Deeploy/Targets/Generic/TypeCheckers.py index c2c8d436f8..5d363206f8 100644 --- a/Deeploy/Targets/Generic/TypeCheckers.py +++ b/Deeploy/Targets/Generic/TypeCheckers.py @@ -610,3 +610,17 @@ def _inferNumLevels(self, inputs: List[VariableBuffer], def _inferSignedness(self, inputs: List[VariableBuffer], operatorRepresentation: OperatorRepresentation) -> List[bool]: return [True] + +# TopKChecker: infers types for both values and indices outputs of TopK operation +class TopKChecker(SignPropTypeChecker): + def __init__(self, input_types: Sequence[Type[Pointer]], output_types: Sequence[Type[Pointer]]): + super().__init__(input_types, output_types) + + def _inferNumLevels(self, inputs: List[VariableBuffer], operatorRepresentation: OperatorRepresentation) -> List[int]: + # Output 0: values (same as input), Output 1: indices (integer, usually not quantized) + # We assume indices output is not quantized (set to 0 or 1) + return [inputs[0].nLevels, 1] + + def _inferSignedness(self, inputs: List[VariableBuffer], operatorRepresentation: OperatorRepresentation) -> List[bool]: + # Output 0: values (same signedness as input), Output 1: indices (unsigned) + return [inputs[0]._signed, False] \ No newline at end of file From f72e147d2dae7013eb728ce6e959bad93d0c4e08 Mon Sep 17 00:00:00 2001 From: Bumblebee00 Date: Sun, 29 Mar 2026 21:46:43 +0200 Subject: [PATCH 14/21] added matmul softmax and topk generic bindings to spatz --- Deeploy/Targets/Spatz/Platform.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/Deeploy/Targets/Spatz/Platform.py b/Deeploy/Targets/Spatz/Platform.py index af09dc227c..f494449c2c 100644 --- a/Deeploy/Targets/Spatz/Platform.py +++ b/Deeploy/Targets/Spatz/Platform.py @@ -4,18 +4,24 @@ NodeMapper, NodeTemplate, TopologyOptimizer, DeploymentEngine, DeploymentPlatform # from Deeploy.Targets.Spatz.Bindings import SpatzAddBindings # <- TODO create this -from Deeploy.Targets.Generic.Bindings import BasicAddBindings -from Deeploy.Targets.Generic.Layers import AddLayer -from Deeploy.Targets.Generic.Parsers import AddParser +from Deeploy.Targets.Generic.Bindings import BasicAddBindings, BasicMatMulBindings, BasicSoftmaxBindings, BasicTopKBindings +from Deeploy.Targets.Generic.Layers import AddLayer, GEMMLayer, SoftmaxLayer, TopKLayer +from Deeploy.Targets.Generic.Parsers import AddParser, MatMulParser, SoftmaxParser, TopKParser from Deeploy.Targets.Generic.Templates import AllocateTemplate as GenericAllocateTemplate from Deeploy.Targets.Spatz.Templates import AllocateTemplate as SpatzAllocateTemplate from Deeploy.Targets.Spatz.Templates import FreeTemplate as SpatzFreeTemplate SpatzAddMapper = NodeMapper(AddParser(), BasicAddBindings) +MatMulMapper = NodeMapper(MatMulParser(), BasicMatMulBindings) +SoftmaxMapper = NodeMapper(SoftmaxParser(), BasicSoftmaxBindings) +TopKMapper = NodeMapper(TopKParser(), BasicTopKBindings) SpatzMapping = { 'Add': AddLayer([SpatzAddMapper]), + 'MatMul': GEMMLayer([MatMulMapper]), + 'Softmax': SoftmaxLayer([SoftmaxMapper]), + 'TopK': TopKLayer([TopKMapper]), # sparse attention : ... } @@ -34,13 +40,13 @@ class SpatzTransientBuffer(TransientBuffer): class SpatzConstantBuffer(ConstantBuffer): initTemplate = GenericAllocateTemplate.referenceGlobalInitTemplate - allocTemplate = GenericAllocateTemplate.referenceAllocateTemplate + allocTemplate = GenericAllocateTemplate.referenceGlobalAllocateTemplate deallocTemplate = NodeTemplate("") # const not deallocated class SpatzStructBuffer(StructBuffer): initTemplate = GenericAllocateTemplate.referenceStructInitTemplate - allocTemplate = GenericAllocateTemplate.referenceAllocateTemplate + allocTemplate = GenericAllocateTemplate.referenceStructAllocateTemplate deallocTemplate = NodeTemplate("") # struct not deallocated ? From 93db81b1311ff97161419baaf4392cc5a124500c Mon Sep 17 00:00:00 2001 From: Bumblebee00 Date: Sun, 29 Mar 2026 21:47:18 +0200 Subject: [PATCH 15/21] switched default simulator to gvsoc bc is faster --- DeeployTest/deeployRunner_spatz.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DeeployTest/deeployRunner_spatz.py b/DeeployTest/deeployRunner_spatz.py index 58168f3a44..d17e3f510f 100644 --- a/DeeployTest/deeployRunner_spatz.py +++ b/DeeployTest/deeployRunner_spatz.py @@ -6,6 +6,6 @@ sys.exit( main( default_platform = "Spatz", - default_simulator = "vsim", + default_simulator = "gvsoc", ) ) From eee910c6e04c8cf77415d9ec9d875a48bca7d85a Mon Sep 17 00:00:00 2001 From: Bumblebee00 Date: Sun, 29 Mar 2026 21:47:59 +0200 Subject: [PATCH 16/21] added topk test network --- DeeployTest/Tests/Kernels/FP32/TopK/inputs.npz | Bin 0 -> 1012 bytes DeeployTest/Tests/Kernels/FP32/TopK/network.onnx | Bin 0 -> 341 bytes DeeployTest/Tests/Kernels/FP32/TopK/outputs.npz | Bin 0 -> 624 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 DeeployTest/Tests/Kernels/FP32/TopK/inputs.npz create mode 100644 DeeployTest/Tests/Kernels/FP32/TopK/network.onnx create mode 100644 DeeployTest/Tests/Kernels/FP32/TopK/outputs.npz diff --git a/DeeployTest/Tests/Kernels/FP32/TopK/inputs.npz b/DeeployTest/Tests/Kernels/FP32/TopK/inputs.npz new file mode 100644 index 0000000000000000000000000000000000000000..a02c827160fbfc0fe6ad6b01a5b3263d8df8f14d GIT binary patch literal 1012 zcmWIWW@Zs#fB;2?Or-}R4NMFSAk4}j!ceA{S5V2wAOIEsDFR7=z+}Hr-+)L)hBAg~ z^_0}&8)RpLC$b-k5v3{h#x`wsY_P-S_n#w>{gBS9WtJ z%(jbtEoRUB>D#^}nU?)Om^=3E>s_}`=HU{%ZfA4*ij|!Ew#<{-KVzP{eQNmx`(@=; z`>p=_HOyW^gS1ytn91&*Y8^wddL2Wrkq{ioT>X~rwSe@mT0k`Ig`PDhn4nz zqwSaWcQ%yREAxohbI$#2|Mcmiy$??C*?)Io-p6vB*S^-Sb)VJqpZoKo=Gd;ftG$2D z9fku8nQQh=dsDsdP)XaqZKkdEf}8KyOP*}m|7;zPs_OICd(QfC& zS@z}!XV@QhJZdjtZe=f%KHJ_~`M&+J;&pa4h70#59=p1K<#V0=im6BTuXrbC*MEAO z-8GSQc3Tg(?Ei56joljSnEl5;E#IG;@Wg)p`ET|DKbZGB@rvvhdU?SvW7DF2UTZq+ zA0FkhXW_kWyJO=|`6zn5SeZ%Nwc7&&cy|B4nu%9Ba;X-u8ap&1f&`mL2Pg~MAw4qX=E+ifteH% U1OeWxY#+nQwmcmpUAo53lWForKquo5}3(`leKM*dre%F%VLqcB%D5L^E3_`pAHeI_ri_7_a=5i zrZJ+8va8(rQLFptIBk8tY$fAO6=k-v%B)|8^?p7_p9FUyN#K+|#ry(?>tmeNm|83e a^Gh5a#0`%A@$1#`e?WCr&BY{GyVg#Ju?YqLfsSxLaaQaVk)}I3uwj70A~x)KM@r z(9}_=RUj8|-E7fu*s<}a{rvOa>^bLtw$Dv?V(+bd-(GO@9s8=ZJND~B@7T|=Id30; z;zJvwW2Y_vT@S*XARlJtr4+-w2oeMV7>(VFnHKc&VmQP(3}H~(4@#>+X4KeNrV|!bVC&ZsRl+68y5NKx=@1 Date: Sun, 29 Mar 2026 21:48:47 +0200 Subject: [PATCH 17/21] added sparse attention test network --- .../Tests/Kernels/FP32/Attention/inputs.npz | Bin 0 -> 23764 bytes .../Tests/Kernels/FP32/Attention/network.onnx | Bin 0 -> 797 bytes .../Tests/Kernels/FP32/Attention/outputs.npz | Bin 0 -> 768 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 DeeployTest/Tests/Kernels/FP32/Attention/inputs.npz create mode 100644 DeeployTest/Tests/Kernels/FP32/Attention/network.onnx create mode 100644 DeeployTest/Tests/Kernels/FP32/Attention/outputs.npz diff --git a/DeeployTest/Tests/Kernels/FP32/Attention/inputs.npz b/DeeployTest/Tests/Kernels/FP32/Attention/inputs.npz new file mode 100644 index 0000000000000000000000000000000000000000..1f27f7766e83e70ae346d0db9c61b24fc50a5292 GIT binary patch literal 23764 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 P5aO;RZdBg+pQrx;tJmQD literal 0 HcmV?d00001 diff --git a/DeeployTest/Tests/Kernels/FP32/Attention/network.onnx b/DeeployTest/Tests/Kernels/FP32/Attention/network.onnx new file mode 100644 index 0000000000000000000000000000000000000000..e35b7eb103a2176616a428033c1868f92655ab25 GIT binary patch literal 797 zcmZuvO;5r=6lAe+Azk9kAvmZ3Ah{ZX-~xo zqRBA>LpTu8rt#!_@DFR|sn02Lh$|Y>@=N2o8%wfi+c(XU837rE=eC9v9{G}!KNl&0o5UoO)AUGo5C`3mY8X|&fhv+0j1rTXpJAnH16q>@J z9yz2gwpQ>1C~z!cH!`;9RyHW zLGyt|HbpVRrTA3rk>Zj{7PV*FV4j!*gXXl1RK+25rjs3b`N zhhOwBxR23P6}q=%0`qD+acrG|nrD;nq46S4u+`#|EgYiV`x9!riV;_SAALUm2p!0` zS#nxZktui(yAv0mR{52VMTXXvM>mC^tSKH}ez}>{7#3 zMHc#lbFeji7&L}doGIXw(b;fhKa_w~yhICCY6Q(pBnrL~OZNG;V%|U=xmmaZb5&cA z&eCC1^c$I9iVumGxevkl?hV@o*vO z1b9DY%V)$U^HiA^F|zHj7!^v|{MbYzekf}<2}pF9KT-Nm!`a|C%o-XZr`bNT=Y|yg z;E4@Rt^7vA>m2;m(LiR~=0Tg80h2--@cM_$)`|rS-D*K48ZX=|n1$M3OR(R(2Ku|- zV5_WJ) Date: Sun, 29 Mar 2026 22:05:48 +0200 Subject: [PATCH 18/21] added topk binding to generic platform --- Deeploy/Targets/Generic/Platform.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Deeploy/Targets/Generic/Platform.py b/Deeploy/Targets/Generic/Platform.py index e05e897270..2e4601bdd4 100644 --- a/Deeploy/Targets/Generic/Platform.py +++ b/Deeploy/Targets/Generic/Platform.py @@ -14,19 +14,19 @@ BasicPad1DBindings, BasicPad2DBindings, BasicPowBindings, BasicQuantBindings, BasicReduceMeanBindings, \ BasicReduceSumBindings, BasicReluBinding, BasicReshapeBindings, BasicRQIntegerDivBinding, BasicRQSBindings, \ BasicRQSGELUBinding, BasicSliceBindings, BasicSoftmaxBindings, BasicSqrtBindings, BasicTransposeBindings, \ - DummyBinding + DummyBinding, BasicTopKBindings from Deeploy.Targets.Generic.Layers import AddLayer, BatchNormalizationLayer, ConcatLayer, ConvLayer, \ ConvTransposeLayer, DebugPrintLayer, DequantLayer, DivLayer, GatherLayer, GELULayer, GEMMLayer, ITAMaxLayer, \ LayerNormLayer, MatMulLayer, MaxPoolLayer, MulLayer, PadLayer, PowLayer, QuantLayer, ReduceMeanLayer, \ ReduceSumLayer, ReluLayer, RequantShiftLayer, ReshapeLayer, RQIntegerDivLayer, RQSiGELULayer, SliceLayer, \ - SoftmaxLayer, SqrtLayer, TransposeLayer + SoftmaxLayer, SqrtLayer, TransposeLayer, TopKLayer from Deeploy.Targets.Generic.Parsers import AddParser, BatchNormParser, ConcatParser, ConvTranspose1DParser, \ DebugParser, DequantParser, DivParser, DummyParser, FlattenParser, GatherParser, GELUParser, GenericConv1DParser, \ GenericConv2DParser, GenericDWConv1DParser, GenericDWConv2DParser, GenericGEMMParser, GenericMaxPool2DParser, \ IntegerDivParser, ITAMaxParser, ITAPartialMaxParser, LayerNormParser, MatMulParser, MaxPool1DParser, MulParser, \ Pad1DParser, Pad2DParser, PowParser, QuantParser, ReduceMeanParser, ReduceSumParser, ReluParser, \ RequantShiftParser, ReshapeParser, RQIntegerDivParser, RQSiGELUParser, SliceParser, SoftmaxParser, SqrtParser, \ - TransposeParser, UnsqueezeParser, iLayerNormParser, iSoftmaxParser + TransposeParser, TopKParser, UnsqueezeParser, iLayerNormParser, iSoftmaxParser from Deeploy.Targets.Generic.Templates import AllocateTemplate, FreeTemplate from Deeploy.Targets.Generic.TopologyOptimizationPasses.Passes import DequantPatternPass, ExtractPaddingFromConvPass, \ ExtractPaddingFromPoolPass, MatMulAddMergePass, MergeConstAddAndRequantPass, QuantPatternPass, \ @@ -67,6 +67,7 @@ SoftmaxMapper = NodeMapper(SoftmaxParser(), BasicSoftmaxBindings) iSoftmaxMapper = NodeMapper(iSoftmaxParser(), BasicSoftmaxBindings) TransposeMapper = NodeMapper(TransposeParser(), BasicTransposeBindings) +TopKMapper = NodeMapper(TopKParser(), BasicTopKBindings) UnsqueezeMapper = NodeMapper(UnsqueezeParser(), BasicReshapeBindings) QuantMapper = NodeMapper(QuantParser(), BasicQuantBindings) DequantMapper = NodeMapper(DequantParser(), BasicDequantBindings) @@ -113,6 +114,7 @@ 'RQIntegerDiv': RQIntegerDivLayer([RQIntegerDivMapper]), 'Squeeze': ReshapeLayer([UnsqueezeMapper]), 'Transpose': TransposeLayer([TransposeMapper]), + 'TopK': TopKLayer([TopKMapper]), 'Unsqueeze': ReshapeLayer([UnsqueezeMapper]), 'Slice': SliceLayer([SliceMapper]), 'Quant': QuantLayer([QuantMapper]), From b541e17f23340d3ddc14c5bcaecbf76860b030e1 Mon Sep 17 00:00:00 2001 From: Bumblebee00 Date: Sun, 29 Mar 2026 22:28:05 +0200 Subject: [PATCH 19/21] improved generic gather node to support more than one index --- Deeploy/Targets/Generic/Parsers.py | 17 ++++++++++++----- .../Targets/Generic/Templates/GatherTemplate.py | 10 ++++++++++ 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/Deeploy/Targets/Generic/Parsers.py b/Deeploy/Targets/Generic/Parsers.py index dafde5a404..5453c42b7b 100644 --- a/Deeploy/Targets/Generic/Parsers.py +++ b/Deeploy/Targets/Generic/Parsers.py @@ -982,7 +982,7 @@ def parseNode(self, node: gs.Node) -> (bool): return False indices_shape = node.inputs[1].shape - assert np.prod(indices_shape) == 1, f"Only indices of size 1 supported. Got indices of shape {indices_shape}" + self.operatorRepresentation['num_indices'] = int(np.prod(indices_shape)) self.operatorRepresentation['axis'] = node.attrs['axis'] if 'axis' in node.attrs else 0 return True @@ -1002,10 +1002,17 @@ def parseNodeCtxt(self, axis = self.operatorRepresentation['axis'] shape = ctxt.lookup(node.inputs[0].name).shape - self.operatorRepresentation['batch'] = np.prod(shape[:axis]) - self.operatorRepresentation['batch_length'] = np.prod(shape[axis:]) - self.operatorRepresentation['axis_length'] = np.prod(shape[axis + 1:]) - self.operatorRepresentation['index'] = int(node.inputs[1].values.item()) + self.operatorRepresentation['batch'] = int(np.prod(shape[:axis])) if axis > 0 else 1 + self.operatorRepresentation['batch_length'] = int(np.prod(shape[axis:])) + self.operatorRepresentation['axis_length'] = int(np.prod(shape[axis + 1:])) if axis + 1 < len(shape) else 1 + + if self.operatorRepresentation['num_indices'] == 1: + try: + self.operatorRepresentation['index'] = int(node.inputs[1].values.item()) + except Exception: + self.operatorRepresentation['index'] = f"{self.operatorRepresentation['indices']}[0]" + else: + self.operatorRepresentation['index'] = 0 # in this case is not used but is needed for mako template return ctxt, True diff --git a/Deeploy/Targets/Generic/Templates/GatherTemplate.py b/Deeploy/Targets/Generic/Templates/GatherTemplate.py index dd5e534fa4..4efce4d050 100644 --- a/Deeploy/Targets/Generic/Templates/GatherTemplate.py +++ b/Deeploy/Targets/Generic/Templates/GatherTemplate.py @@ -10,8 +10,18 @@ width = int(data_in_type.referencedType.typeWidth/8) %> BEGIN_SINGLE_CORE +% if num_indices == 1: for (uint32_t i=0; i<${batch}; ++i) { memcpy(${data_out} + i * ${axis_length}, ${data_in} + i * ${batch_length} + ${index} * ${axis_length}, ${axis_length} * ${width}); } +% else: +for (uint32_t i=0; i<${batch}; ++i) { + for (uint32_t j=0; j<${num_indices}; ++j) { + memcpy(${data_out} + i * (${num_indices} * ${axis_length}) + j * ${axis_length}, + ${data_in} + i * ${batch_length} + ${indices}[j] * ${axis_length}, + ${axis_length} * ${width}); + } +} +% endif END_SINGLE_CORE """) From e35433db0c6ee956d7a79085b4c683edb36c97fb Mon Sep 17 00:00:00 2001 From: Bumblebee00 Date: Sun, 29 Mar 2026 22:45:43 +0200 Subject: [PATCH 20/21] added gather binding for spatz --- Deeploy/Targets/Spatz/Bindings.py | 33 ++++++++++++++----- Deeploy/Targets/Spatz/Platform.py | 12 ++++--- .../Targets/Spatz/Templates/AddTemplate.py | 5 --- .../Targets/Spatz/Templates/GatherTemplate.py | 23 +++++++++++++ 4 files changed, 55 insertions(+), 18 deletions(-) delete mode 100644 Deeploy/Targets/Spatz/Templates/AddTemplate.py create mode 100644 Deeploy/Targets/Spatz/Templates/GatherTemplate.py diff --git a/Deeploy/Targets/Spatz/Bindings.py b/Deeploy/Targets/Spatz/Bindings.py index 4f78c28f09..0430bb80ce 100644 --- a/Deeploy/Targets/Spatz/Bindings.py +++ b/Deeploy/Targets/Spatz/Bindings.py @@ -1,12 +1,29 @@ -from Deeploy.DeeployTypes import NodeBinding +from Deeploy.DeeployTypes import CodeTransformation, NodeBinding +from Deeploy.CommonExtensions.CodeTransformationPasses.MemoryAllocation import ArgumentStructGeneration, \ + MemoryManagementGeneration +from Deeploy.FutureExtension.CodeTransformationPasses.FutureCodeTransformation import FutureGeneration +from Deeploy.AbstractDataTypes import PointerClass +from Deeploy.CommonExtensions.DataTypes import FloatDataTypes, IntegerDataTypes, SignedIntegerDataTypes, float32_t, int8_t, int32_t, uint8_t +from Deeploy.Targets.Generic.TypeCheckers import GatherChecker +from Deeploy.Targets.Spatz.Templates import GatherTemplate -from Deeploy.Targets.Generic.TypeCheckers import AddChecker -from Deeploy.Targets.Spatz.Templates import AddTemplate +BasicTransformer = CodeTransformation([ArgumentStructGeneration(), MemoryManagementGeneration(), FutureGeneration()]) - -SpatzAddBindings = [ +SpatzGatherBindings = [ + NodeBinding( + GatherChecker( + [PointerClass(type), PointerClass(int32_t)], + [PointerClass(type)] + ), + GatherTemplate.referenceTemplate, + BasicTransformer + ) for type in SignedIntegerDataTypes] + [ NodeBinding( - AddChecker(), - AddTemplate. - ) + GatherChecker( + [PointerClass(float32_t), PointerClass(type)], + [PointerClass(float32_t)] + ), + GatherTemplate.referenceTemplate, + BasicTransformer + ) for type in IntegerDataTypes ] \ No newline at end of file diff --git a/Deeploy/Targets/Spatz/Platform.py b/Deeploy/Targets/Spatz/Platform.py index f494449c2c..6cede5ca8a 100644 --- a/Deeploy/Targets/Spatz/Platform.py +++ b/Deeploy/Targets/Spatz/Platform.py @@ -3,25 +3,27 @@ from Deeploy.DeeployTypes import VariableBuffer, TransientBuffer, ConstantBuffer, StructBuffer, \ NodeMapper, NodeTemplate, TopologyOptimizer, DeploymentEngine, DeploymentPlatform -# from Deeploy.Targets.Spatz.Bindings import SpatzAddBindings # <- TODO create this -from Deeploy.Targets.Generic.Bindings import BasicAddBindings, BasicMatMulBindings, BasicSoftmaxBindings, BasicTopKBindings -from Deeploy.Targets.Generic.Layers import AddLayer, GEMMLayer, SoftmaxLayer, TopKLayer -from Deeploy.Targets.Generic.Parsers import AddParser, MatMulParser, SoftmaxParser, TopKParser - from Deeploy.Targets.Generic.Templates import AllocateTemplate as GenericAllocateTemplate from Deeploy.Targets.Spatz.Templates import AllocateTemplate as SpatzAllocateTemplate from Deeploy.Targets.Spatz.Templates import FreeTemplate as SpatzFreeTemplate +from Deeploy.Targets.Spatz.Bindings import SpatzGatherBindings +from Deeploy.Targets.Generic.Bindings import BasicAddBindings, BasicMatMulBindings, BasicSoftmaxBindings, BasicTopKBindings +from Deeploy.Targets.Generic.Layers import AddLayer, GEMMLayer, SoftmaxLayer, TopKLayer, GatherLayer +from Deeploy.Targets.Generic.Parsers import AddParser, MatMulParser, SoftmaxParser, TopKParser, GatherParser + SpatzAddMapper = NodeMapper(AddParser(), BasicAddBindings) MatMulMapper = NodeMapper(MatMulParser(), BasicMatMulBindings) SoftmaxMapper = NodeMapper(SoftmaxParser(), BasicSoftmaxBindings) TopKMapper = NodeMapper(TopKParser(), BasicTopKBindings) +GatherMapper = NodeMapper(GatherParser(), SpatzGatherBindings) SpatzMapping = { 'Add': AddLayer([SpatzAddMapper]), 'MatMul': GEMMLayer([MatMulMapper]), 'Softmax': SoftmaxLayer([SoftmaxMapper]), 'TopK': TopKLayer([TopKMapper]), + 'Gather': GatherLayer([GatherMapper]), # sparse attention : ... } diff --git a/Deeploy/Targets/Spatz/Templates/AddTemplate.py b/Deeploy/Targets/Spatz/Templates/AddTemplate.py deleted file mode 100644 index a4572f625b..0000000000 --- a/Deeploy/Targets/Spatz/Templates/AddTemplate.py +++ /dev/null @@ -1,5 +0,0 @@ -from Deeploy.DeeployTypes import NodeTemplate - -... = NodeTemplate("\ - -") \ No newline at end of file diff --git a/Deeploy/Targets/Spatz/Templates/GatherTemplate.py b/Deeploy/Targets/Spatz/Templates/GatherTemplate.py new file mode 100644 index 0000000000..d54a8f1374 --- /dev/null +++ b/Deeploy/Targets/Spatz/Templates/GatherTemplate.py @@ -0,0 +1,23 @@ +from Deeploy.DeeployTypes import NodeTemplate + +referenceTemplate = NodeTemplate(""" +// Gather (Name: ${nodeName}, Op: ${nodeOp}) +<% +width = int(data_in_type.referencedType.typeWidth/8) +%> +BEGIN_SINGLE_CORE +% if num_indices == 1: +for (uint32_t i=0; i<${batch}; ++i) { + snrt_dma_start_1d(${data_out} + i * ${axis_length}, ${data_in} + i * ${batch_length} + ${index} * ${axis_length}, ${axis_length} * ${width}); +} +% else: +for (uint32_t i=0; i<${batch}; ++i) { + for (uint32_t j=0; j<${num_indices}; ++j) { + snrt_dma_start_1d(${data_out} + i * (${num_indices} * ${axis_length}) + j * ${axis_length}, + ${data_in} + i * ${batch_length} + ${indices}[j] * ${axis_length}, + ${axis_length} * ${width}); + } +} +% endif +END_SINGLE_CORE +""") From 7eb2e35bbe1280d6ab98d50158afe155c6068da5 Mon Sep 17 00:00:00 2001 From: Bumblebee00 Date: Wed, 1 Apr 2026 17:37:56 +0200 Subject: [PATCH 21/21] now for any k inot the graph --- Deeploy/Targets/Generic/Parsers.py | 2 +- .../Targets/Generic/Templates/TopKTemplate.py | 4 ++-- .../Tests/Kernels/FP32/TopK/{ => 10}/inputs.npz | Bin .../Kernels/FP32/TopK/{ => 10}/network.onnx | Bin .../Tests/Kernels/FP32/TopK/{ => 10}/outputs.npz | Bin .../Tests/Kernels/FP32/TopK/20/inputs.npz | Bin 0 -> 1012 bytes .../Tests/Kernels/FP32/TopK/20/network.onnx | Bin 0 -> 341 bytes .../Tests/Kernels/FP32/TopK/20/outputs.npz | Bin 0 -> 744 bytes 8 files changed, 3 insertions(+), 3 deletions(-) rename DeeployTest/Tests/Kernels/FP32/TopK/{ => 10}/inputs.npz (100%) rename DeeployTest/Tests/Kernels/FP32/TopK/{ => 10}/network.onnx (100%) rename DeeployTest/Tests/Kernels/FP32/TopK/{ => 10}/outputs.npz (100%) create mode 100644 DeeployTest/Tests/Kernels/FP32/TopK/20/inputs.npz create mode 100644 DeeployTest/Tests/Kernels/FP32/TopK/20/network.onnx create mode 100644 DeeployTest/Tests/Kernels/FP32/TopK/20/outputs.npz diff --git a/Deeploy/Targets/Generic/Parsers.py b/Deeploy/Targets/Generic/Parsers.py index 5453c42b7b..206f901fc9 100644 --- a/Deeploy/Targets/Generic/Parsers.py +++ b/Deeploy/Targets/Generic/Parsers.py @@ -2913,7 +2913,7 @@ def parseNodeCtxt(self, self.operatorRepresentation['data_in'] = data_in.name self.operatorRepresentation['data_in_size'] = int(np.prod(data_in.shape)) - self.operatorRepresentation['k_in'] = k_in.name + self.operatorRepresentation['k_value'] = int(k_in.values[0]) self.operatorRepresentation['values_out'] = values_out.name self.operatorRepresentation['indices_out'] = indices_out.name diff --git a/Deeploy/Targets/Generic/Templates/TopKTemplate.py b/Deeploy/Targets/Generic/Templates/TopKTemplate.py index 78e44ed7bc..3f9b6474fa 100644 --- a/Deeploy/Targets/Generic/Templates/TopKTemplate.py +++ b/Deeploy/Targets/Generic/Templates/TopKTemplate.py @@ -6,7 +6,7 @@ referenceTemplate = NodeTemplate(""" // TopK (Name: ${nodeName}, Op: ${nodeOp}) BEGIN_SINGLE_CORE -// Find the top 10 values and their indices +// Find the top ${k_value} values and their indices // Assumes 1D input for simplicity typedef struct { ${data_in_type.referencedType.typeName} value; @@ -19,7 +19,7 @@ pairs[i].index = i; } // Simple selection sort for top-k -for (uint32_t i = 0; i < 10; ++i) { +for (uint32_t i = 0; i < ${k_value}; ++i) { uint32_t max_idx = i; for (uint32_t j = i + 1; j < ${data_in_size}; ++j) { if (pairs[j].value > pairs[max_idx].value) { diff --git a/DeeployTest/Tests/Kernels/FP32/TopK/inputs.npz b/DeeployTest/Tests/Kernels/FP32/TopK/10/inputs.npz similarity index 100% rename from DeeployTest/Tests/Kernels/FP32/TopK/inputs.npz rename to DeeployTest/Tests/Kernels/FP32/TopK/10/inputs.npz diff --git a/DeeployTest/Tests/Kernels/FP32/TopK/network.onnx b/DeeployTest/Tests/Kernels/FP32/TopK/10/network.onnx similarity index 100% rename from DeeployTest/Tests/Kernels/FP32/TopK/network.onnx rename to DeeployTest/Tests/Kernels/FP32/TopK/10/network.onnx diff --git a/DeeployTest/Tests/Kernels/FP32/TopK/outputs.npz b/DeeployTest/Tests/Kernels/FP32/TopK/10/outputs.npz similarity index 100% rename from DeeployTest/Tests/Kernels/FP32/TopK/outputs.npz rename to DeeployTest/Tests/Kernels/FP32/TopK/10/outputs.npz diff --git a/DeeployTest/Tests/Kernels/FP32/TopK/20/inputs.npz b/DeeployTest/Tests/Kernels/FP32/TopK/20/inputs.npz new file mode 100644 index 0000000000000000000000000000000000000000..0b66bfd41bf9b17c10e62fa6056b4559438044bc GIT binary patch literal 1012 zcmbtTe=O8t82_F_cKOwj*4oWkaYQzhF!#RHh;-bTA~VGKS%>o@rgY`zG&7b?Onzk* zCPPP!?tM-q`lVWCRxQbDt0fzb71n*3KUjaX`n-FdXV2$--tB$geLlhfrmi`)1}p0Q zQnjsAhob1vqs*ynM{!y%gECzu=plN8MtNYUKp4)TvZ*{?oG2q!!t>zrJmdHC9Jsvr zR7s{JMjVwYi4)PhZ_Mcok(SR$j7bw|ds`<5u9LHyodfqg_aDJ(!I;;4EDCZ3gc0&sA0B;A6`EIVYdcx-_AJ@n}*}kH($}X;T|ueRt;%6QB1Nr zX0U&r66A^nXwgu>Nxcn``E^Jszd{UrU7`7M3LZ&FAg|>N&{VTkO8Y~&*Q^Gnqr0)+ zP$h0}j^KX?+zL6955b~OhC9C=I&gzaQreI751hjJ)fqg}tIm@UUn_ z%e5Q`)SXfh<0xDbYNnnln&07tFG`$?>%U!_vMgtBQ$yFK8 zt{{oD2r=92@tpz$J5J?e!JrFT=)Va3#WwO_MF9nl(;(a++w_}3$wgXK(xI=FZDz{4 zZfS$?o4MXgU+iq+7xV5XWnikmD!;oid;ZB*d5jP?t&_saV>z6H8T~FnJ_^tghtzb>7h@;J zBOkq;(Cft5ZlzmTH&WYVRY}5ck!JB)3$>XC#eQmI3m7$!1H&5putg8=*ZcTfV5l&M aVA03>gQ&#b4Q~gJ|3N6KoN~yNcbb2xj#+O2 literal 0 HcmV?d00001 diff --git a/DeeployTest/Tests/Kernels/FP32/TopK/20/outputs.npz b/DeeployTest/Tests/Kernels/FP32/TopK/20/outputs.npz new file mode 100644 index 0000000000000000000000000000000000000000..abccfba29520aeae6ec9a3d8466d5a05e4223477 GIT binary patch literal 744 zcmWIWW@Zs#fB;2?qp@#~T>x@Gn1extA-^m!M=!6Sl953GECx~sk^_Osexberk&Fyw z4Atr>sl~}f>Q)NsHfbj6ItuD(`9&o~iFxt)MJcHuaks>r;#8n`aYkZ6Dv+;XsH0$H zpsAx!t3WQ`y2+#Bz&Kyj;jtQv!|ba}4y7AE*hefoX0Nv6u>HG)ZT1m)E9{xMR@fUY zT4?WaVupRD%5?jN!pZion>2SDi}DD4HMO`)_3l#YkeRZv