cmake_minimum_required (VERSION 3.14) cmake_policy(SET CMP0077 NEW) include(CMakePrintHelpers) list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}") if (NOT (DEFINED CMSISDSP)) set(CMSISDSP "${CMAKE_CURRENT_SOURCE_DIR}/..") endif() function(writeConfig path) set(output "") list(APPEND output "OPTIMIZED,HARDFP,FASTMATH,NEON,HELIUM,UNROLL,ROUNDING,PLATFORM,CORE,COMPILER,VERSION\n") if (OPTIMIZED) list(APPEND output "1") else() list(APPEND output "0") endif() if (HARDFP) list(APPEND output ",1") else() list(APPEND output ",0") endif() if (FASTMATHCOMPUTATIONS) list(APPEND output ",1") else() list(APPEND output ",0") endif() if (NEON OR NEONEXPERIMENTAL) list(APPEND output ",1") else() list(APPEND output ",0") endif() if (HELIUM OR MVEI OR MVEF) list(APPEND output ",1") else() list(APPEND output ",0") endif() if (LOOPUNROLL) list(APPEND output ",1") else() list(APPEND output ",0") endif() if (ROUNDING) list(APPEND output ",1") else() list(APPEND output ",0") endif() list(APPEND output ",${PLATFORMID}") if (CONFIGID) # Specific config ID (like M55 with autovectorizer) list(APPEND output ",${CONFIGID},") else() # Core ID is used as config ID when not specified list(APPEND output ",${COREID},") endif() if (ARMAC6) list(APPEND output "AC6") elseif(GCC) list(APPEND output "GCC") endif() compilerVersion() list(APPEND output ",${COMPILERVERSION}") file(WRITE ${path} ${output}) endfunction() option(BENCHMARK "Benchmarking compiled" OFF) option(EXTBENCH "Benchmarking with external traces" OFF) option(NN "NN Tests included" OFF) option(REFLIB "Use already built reference lib" OFF) option(EMBEDDED "Embedded Mode" ON) option(FLOAT16TESTS "Float16 tests" OFF) option(ALLTESTS "All tests including Float16 tests" OFF) option(MICROBENCH "Micro benchmarks" OFF) option(EXTERNAL "External benchmarks or tests" OFF) option(CACHEANALYSIS "Build with cache analysis mode enabled" OFF) option(DISTINCT "Different generated folder for benchmarking and tests" OFF) project(Testing) # Needed to find the config modules # Change behavior of configBoot for scatter file # We use the linker files from older test framework because bigger sections are needed. # We should migrate the linker files to this new framework. set(TESTFRAMEWORK ON) include(config) if ((NOT REFLIB) AND (NOT NOCMSIS)) add_subdirectory(../Source bin_dsp) configLib(CMSISDSP) endif() add_library(TestingLib STATIC) add_library(FrameworkLib STATIC) if (DISABLEFLOAT16) target_compile_definitions(TestingLib PRIVATE DISABLEFLOAT16) target_compile_definitions(FrameworkLib PRIVATE DISABLEFLOAT16) endif() if (AUTOVECTORIZE) target_compile_definitions(TestingLib PRIVATE ARM_MATH_AUTOVECTORIZE) endif() if (CACHEANALYSIS) target_compile_definitions(FrameworkLib PRIVATE CACHEANALYSIS) endif() if (BENCHMARK) set(STANDARDBENCH ON) if (MICROBENCH) set (MICROSRC Source/Benchmarks/MicroBenchmarksF32.cpp Source/Benchmarks/MicroBenchmarksQ31.cpp Source/Benchmarks/MicroBenchmarksQ15.cpp Source/Benchmarks/MicroBenchmarksQ7.cpp ) set(STANDARDBENCH OFF) endif() if (EXTERNAL) add_subdirectory(${EXTERNALDIR} bin_external) set(STANDARDBENCH OFF) endif() set (NNSRC Source/Benchmarks/FullyConnectedBench.cpp Source/Benchmarks/PoolingBench.cpp ) if (STANDARDBENCH) set(TESTSRC Source/Benchmarks/BasicMathsBenchmarksF32.cpp Source/Benchmarks/BasicMathsBenchmarksQ31.cpp Source/Benchmarks/BasicMathsBenchmarksQ15.cpp Source/Benchmarks/BasicMathsBenchmarksQ7.cpp Source/Benchmarks/ComplexMathsBenchmarksF32.cpp Source/Benchmarks/ComplexMathsBenchmarksQ31.cpp Source/Benchmarks/ComplexMathsBenchmarksQ15.cpp Source/Benchmarks/QuaternionMathsBenchmarksF32.cpp Source/Benchmarks/BayesF32.cpp Source/Benchmarks/SVMF32.cpp Source/Benchmarks/DistanceF32.cpp Source/Benchmarks/DistanceU32.cpp Source/Benchmarks/StatsF64.cpp Source/Benchmarks/StatsF32.cpp Source/Benchmarks/StatsQ31.cpp Source/Benchmarks/StatsQ15.cpp Source/Benchmarks/StatsQ7.cpp Source/Benchmarks/FIRF32.cpp Source/Benchmarks/FIRQ31.cpp Source/Benchmarks/FIRQ15.cpp Source/Benchmarks/FIRQ7.cpp Source/Benchmarks/MISCF32.cpp Source/Benchmarks/MISCQ31.cpp Source/Benchmarks/MISCQ15.cpp Source/Benchmarks/MISCQ7.cpp Source/Benchmarks/DECIMF32.cpp Source/Benchmarks/DECIMQ31.cpp Source/Benchmarks/DECIMQ15.cpp Source/Benchmarks/BIQUADF32.cpp Source/Benchmarks/BIQUADF64.cpp Source/Benchmarks/ControllerF32.cpp Source/Benchmarks/ControllerQ31.cpp Source/Benchmarks/ControllerQ15.cpp Source/Benchmarks/FastMathF32.cpp Source/Benchmarks/FastMathQ31.cpp Source/Benchmarks/FastMathQ15.cpp Source/Benchmarks/SupportF32.cpp Source/Benchmarks/SupportBarF32.cpp Source/Benchmarks/SupportQ31.cpp Source/Benchmarks/SupportQ15.cpp Source/Benchmarks/SupportQ7.cpp Source/Benchmarks/UnaryF32.cpp Source/Benchmarks/UnaryF64.cpp Source/Benchmarks/UnaryQ31.cpp Source/Benchmarks/UnaryQ15.cpp Source/Benchmarks/UnaryQ7.cpp Source/Benchmarks/BinaryF32.cpp Source/Benchmarks/BinaryQ31.cpp Source/Benchmarks/BinaryQ15.cpp Source/Benchmarks/BinaryQ7.cpp Source/Benchmarks/TransformF32.cpp Source/Benchmarks/TransformQ31.cpp Source/Benchmarks/TransformQ15.cpp ) target_include_directories(TestingLib PRIVATE Include/Benchmarks) endif() if ((NOT ARMAC5) AND (FLOAT16TESTS OR ALLTESTS) AND ((FLOAT16) OR (MVEF) OR (HELIUM) OR (NEON) OR (NEONEXPERIMENTAL))) set(TESTSRC16 Source/Benchmarks/BasicMathsBenchmarksF16.cpp Source/Benchmarks/ComplexMathsBenchmarksF16.cpp Source/Benchmarks/BayesF16.cpp Source/Benchmarks/SVMF16.cpp Source/Benchmarks/DistanceF16.cpp Source/Benchmarks/StatsF16.cpp Source/Benchmarks/FIRF16.cpp Source/Benchmarks/MISCF16.cpp Source/Benchmarks/BIQUADF16.cpp Source/Benchmarks/FastMathF16.cpp Source/Benchmarks/SupportF16.cpp Source/Benchmarks/SupportBarF16.cpp Source/Benchmarks/UnaryF16.cpp Source/Benchmarks/BinaryF16.cpp Source/Benchmarks/TransformF16.cpp ) endif() else() set(STANDARDTEST ON) set(NNSRC Source/Tests/NNSupport.cpp Source/Tests/Pooling.cpp Source/Tests/Softmax.cpp Source/Tests/FullyConnected.cpp ) if (EXTERNAL) add_subdirectory(${EXTERNALDIR} bin_external) set(STANDARDTEST OFF) endif() if (STANDARDTEST) if (BASICMATH) set(BASICMATHSRC Source/Tests/BasicTestsF64.cpp Source/Tests/BasicTestsF32.cpp Source/Tests/BasicTestsQ31.cpp Source/Tests/BasicTestsQ15.cpp Source/Tests/BasicTestsQ7.cpp) endif() if (QUATERNIONMATH) set(QUATERNIONMATHSRC Source/Tests/QuaternionTestsF32.cpp ) endif() if (COMPLEXMATH) set(COMPLEXMATHSRC Source/Tests/ComplexTestsF64.cpp Source/Tests/ComplexTestsF32.cpp Source/Tests/ComplexTestsQ31.cpp Source/Tests/ComplexTestsQ15.cpp) endif() if (CONTROLLER) set(CONTROLLERSRC ) endif() if (FASTMATH) set(FASTMATHSRC Source/Tests/FastMathF64.cpp Source/Tests/FastMathF32.cpp Source/Tests/FastMathQ63.cpp Source/Tests/FastMathQ31.cpp Source/Tests/FastMathQ15.cpp) endif() if (FILTERING) set(FILTERINGSRC Source/Tests/DECIMF32.cpp Source/Tests/DECIMQ31.cpp Source/Tests/DECIMQ15.cpp Source/Tests/MISCF64.cpp Source/Tests/MISCF32.cpp Source/Tests/MISCQ31.cpp Source/Tests/MISCQ15.cpp Source/Tests/MISCQ7.cpp Source/Tests/FIRF64.cpp Source/Tests/FIRF32.cpp Source/Tests/FIRQ31.cpp Source/Tests/FIRQ15.cpp Source/Tests/FIRQ7.cpp Source/Tests/BIQUADF64.cpp Source/Tests/BIQUADF32.cpp Source/Tests/BIQUADQ31.cpp Source/Tests/BIQUADQ15.cpp) endif() if (MATRIX) set(MATRIXSRC Source/Tests/UnaryTestsQ31.cpp Source/Tests/UnaryTestsQ15.cpp Source/Tests/UnaryTestsQ7.cpp Source/Tests/UnaryTestsF32.cpp Source/Tests/UnaryTestsF64.cpp Source/Tests/BinaryTestsF32.cpp Source/Tests/BinaryTestsF64.cpp Source/Tests/BinaryTestsQ31.cpp Source/Tests/BinaryTestsQ15.cpp Source/Tests/BinaryTestsQ7.cpp) endif() if (STATISTICS) set(STATISTICSSRC Source/Tests/StatsTestsF32.cpp Source/Tests/StatsTestsF64.cpp Source/Tests/StatsTestsQ31.cpp Source/Tests/StatsTestsQ15.cpp Source/Tests/StatsTestsQ7.cpp) endif() if (SUPPORT) set(SUPPORTSRC Source/Tests/SupportTestsF64.cpp Source/Tests/SupportTestsF32.cpp Source/Tests/SupportTestsQ31.cpp Source/Tests/SupportTestsQ15.cpp Source/Tests/SupportTestsQ7.cpp Source/Tests/SupportBarTestsF32.cpp) endif() if (TRANSFORM) set(TRANSFORMSRC Source/Tests/TransformCF64.cpp Source/Tests/TransformCF32.cpp Source/Tests/TransformRF64.cpp Source/Tests/TransformRF32.cpp Source/Tests/TransformCQ31.cpp Source/Tests/TransformRQ31.cpp Source/Tests/TransformCQ15.cpp Source/Tests/TransformRQ15.cpp Source/Tests/MFCCF32.cpp Source/Tests/MFCCQ31.cpp Source/Tests/MFCCQ15.cpp Source/Tests/mfccdata.c ) endif() if (SVM) set(SVMSRC Source/Tests/SVMF32.cpp) endif() if (BAYES) set(BAYESSRC Source/Tests/BayesF32.cpp) endif() if (DISTANCE) set(DISTANCESRC Source/Tests/DistanceTestsF64.cpp Source/Tests/DistanceTestsF32.cpp Source/Tests/DistanceTestsU32.cpp) endif() if (INTERPOLATION) set(INTERPOLATIONSRC Source/Tests/InterpolationTestsF32.cpp Source/Tests/InterpolationTestsQ31.cpp Source/Tests/InterpolationTestsQ15.cpp Source/Tests/InterpolationTestsQ7.cpp) endif() set(TESTSRC ${BASICMATHSRC} ${COMPLEXMATHSRC} ${CONTROLLERSRC} ${FASTMATHSRC} ${FILTERINGSRC} ${MATRIXSRC} ${STATISTICSSRC} ${SUPPORTSRC} ${TRANSFORMSRC} ${SVMSRC} ${BAYESSRC} ${DISTANCESRC} ${QUATERNIONMATHSRC} ${INTERPOLATIONSRC} #Source/Tests/ExampleCategoryF32.cpp #Source/Tests/ExampleCategoryQ31.cpp #Source/Tests/ExampleCategoryQ15.cpp #Source/Tests/ExampleCategoryQ7.cpp ) if ((NOT ARMAC5) AND (FLOAT16TESTS OR ALLTESTS) AND ((FLOAT16) OR (MVEF) OR (HELIUM) OR (NEON) OR (NEONEXPERIMENTAL))) set(TESTSRC16 Source/Tests/BasicTestsF16.cpp Source/Tests/ComplexTestsF16.cpp Source/Tests/InterpolationTestsF16.cpp Source/Tests/StatsTestsF16.cpp Source/Tests/FIRF16.cpp Source/Tests/BIQUADF16.cpp Source/Tests/MISCF16.cpp Source/Tests/BinaryTestsF16.cpp Source/Tests/UnaryTestsF16.cpp Source/Tests/TransformCF16.cpp Source/Tests/TransformRF16.cpp Source/Tests/SupportTestsF16.cpp Source/Tests/SupportBarTestsF16.cpp Source/Tests/FastMathF16.cpp Source/Tests/DistanceTestsF16.cpp Source/Tests/SVMF16.cpp Source/Tests/BayesF16.cpp Source/Tests/MFCCF16.cpp Source/Tests/mfccdata_f16.c ) endif() endif() target_include_directories(TestingLib PUBLIC Include/Tests) endif() set(FRAMEWORKSRC FrameworkSource/Test.cpp FrameworkSource/IORunner.cpp FrameworkSource/ArrayMemory.cpp FrameworkSource/Pattern.cpp FrameworkSource/PatternMgr.cpp FrameworkSource/Error.cpp FrameworkSource/Timing.cpp FrameworkSource/Generators.cpp FrameworkSource/Calibrate.cpp ) if (EMBEDDED) set(FRAMEWORKMODESRC FrameworkSource/FPGA.cpp) else() set(FRAMEWORKMODESRC FrameworkSource/Semihosting.cpp) endif() ## Only build f16 version when running float16tests or all tests ## and float16 are supported if (ARMAC5) target_sources(TestingLib PRIVATE ${TESTSRC}) elseif ((FLOAT16) OR (MVEF) OR (HELIUM) OR (NEON) OR (NEONEXPERIMENTAL)) if (ALLTESTS) target_sources(TestingLib PRIVATE ${TESTSRC16}) target_sources(TestingLib PRIVATE ${TESTSRC}) elseif (FLOAT16TESTS) target_sources(TestingLib PRIVATE ${TESTSRC16}) else() target_sources(TestingLib PRIVATE ${TESTSRC}) endif() else() target_sources(TestingLib PRIVATE ${TESTSRC}) endif() if(NN) target_sources(TestingLib PRIVATE ${NNSRC}) endif() target_sources(TestingLib PRIVATE testmain.cpp) if ((DISTINCT) AND (BENCHMARK)) target_sources(TestingLib PRIVATE GeneratedSourceBench/TestDesc.cpp) else() target_sources(TestingLib PRIVATE GeneratedSource/TestDesc.cpp) endif() if (EMBEDDED) target_compile_definitions(TestingLib PUBLIC EMBEDDED) endif() if (BENCHMARK) target_compile_definitions(TestingLib PUBLIC BENCHMARK) if (MICROBENCH) target_sources(TestingLib PRIVATE ${MICROSRC}) endif() endif() target_sources(FrameworkLib PRIVATE ${FRAMEWORKSRC}) target_sources(FrameworkLib PRIVATE ${FRAMEWORKMODESRC}) target_compile_definitions(FrameworkLib PRIVATE ${PLATFORMOPT}) if (DISABLEFLOAT16) target_compile_definitions(FrameworkLib PRIVATE DISABLEFLOAT16) endif() if (BENCHMARK) target_compile_definitions(FrameworkLib PUBLIC BENCHMARK) endif() if (EXTBENCH) target_compile_definitions(FrameworkLib PUBLIC EXTBENCH) endif() ### Includes if (REFLIB) target_include_directories(TestingLib PUBLIC "../Include") target_link_libraries(TestingLib PRIVATE "${REFLIBNAME}") else() if (NOT NOCMSIS) target_link_libraries(TestingLib PRIVATE CMSISDSP) endif() endif() target_include_directories(TestingLib PRIVATE FrameworkInclude) if ((DISTINCT) AND (BENCHMARK)) target_include_directories(TestingLib PRIVATE GeneratedIncludeBench) else() target_include_directories(TestingLib PRIVATE GeneratedInclude) endif() target_include_directories(FrameworkLib PRIVATE FrameworkInclude) # arm_math.h is needed for q7,q15,q31 types # which are used for access to pattern files. target_include_directories(FrameworkLib PRIVATE ../Include) # Because we need access to core include for # timing features in the test framework. # So we need to identify the core # then reference the right include folder set_platform_core() core_includes(FrameworkLib) # To have access to CMSIS Core includes configLib(FrameworkLib) add_executable(Testing main.cpp) # To see the file in the scatter load, it must not because # linked in a .a archive if ((DISTINCT) AND (BENCHMARK)) target_include_directories(Testing PRIVATE GeneratedIncludeBench) else() target_include_directories(Testing PRIVATE GeneratedInclude) endif() target_sources(Testing PRIVATE patterndata.c) # With -O2, generated code is crashing on some cycle accurate models. # (cpp part) configApp(Testing) target_link_libraries(Testing PRIVATE TestingLib) target_link_libraries(Testing PRIVATE FrameworkLib) if (EXTERNAL) target_include_directories(${EXTERNALPROJECT} PRIVATE FrameworkInclude) if ((DISTINCT) AND (BENCHMARK)) target_include_directories(${EXTERNALPROJECT} PRIVATE GeneratedIncludeBench) else() target_include_directories(${EXTERNALPROJECT} PRIVATE GeneratedInclude) endif() target_link_libraries(TestingLib PRIVATE ${EXTERNALPROJECT}) endif() writeConfig(${CMAKE_CURRENT_BINARY_DIR}/currentConfig.csv)