imc_extension.cmake 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. set(IMC_BENCH_NAME "vAes" CACHE STRING "")
  2. set(IMC_BENCH_INFINITE_LOOP 0 CACHE BOOL "")
  3. set(IMC_PRINT_RECOVERY_MESSAGE 0 CACHE BOOL "")
  4. set(AVAILABLE_BENCHES "vBasicMath" "vStringSearch" "vFFT" "vSha" "vCrc" "vMatMul" "vConv2d" "adc_demo" "vAes")
  5. if(NOT IMC_BENCH_NAME IN_LIST AVAILABLE_BENCHES)
  6. message( FATAL_ERROR "incorrect benchmark name: ${IMC_BENCH_NAME}")
  7. endif()
  8. add_compile_definitions(imcBENCH_NAME=${IMC_BENCH_NAME})
  9. if(IMC_BENCH_INFINITE_LOOP)
  10. add_compile_definitions(imcBENCH_INFINITE_LOOP=1)
  11. endif()
  12. if(IMC_PRINT_RECOVERY_MESSAGE)
  13. add_compile_definitions(imcPRINT_RECOVERY_MESSAGE=1)
  14. endif()
  15. if(IMC_BENCH_NAME MATCHES "vConv2d")
  16. set(BENCHMARK_SRC_FILES
  17. )
  18. set(IMC_APP_FILES
  19. Core/Src/benchmarks/conv2d/conv2d.c
  20. )
  21. set(IMC_LINK_OBJS
  22. )
  23. endif()
  24. if(IMC_BENCH_NAME MATCHES "adc_demo")
  25. set(BENCHMARK_SRC_FILES
  26. Core/Src/benchmarks/adc_demo/adc_demo.c
  27. )
  28. set(IMC_APP_FILES
  29. )
  30. set(IMC_LINK_OBJS
  31. )
  32. endif()
  33. if(IMC_BENCH_NAME MATCHES "vBasicMath")
  34. set(BENCHMARK_SRC_FILES
  35. Core/Src/benchmarks/basicmath/cubic.c
  36. Core/Src/benchmarks/basicmath/isqrt.c
  37. Core/Src/benchmarks/basicmath/rad2deg.c
  38. )
  39. set(IMC_APP_FILES
  40. Core/Src/benchmarks/basicmath/basicmath.c
  41. )
  42. set(IMC_LINK_OBJS
  43. )
  44. include_directories(
  45. Core/Inc/benchmarks/basicmath
  46. )
  47. endif()
  48. if(IMC_BENCH_NAME MATCHES "vCrc")
  49. set(BENCHMARK_SRC_FILES
  50. )
  51. set(IMC_APP_FILES
  52. Core/Src/benchmarks/crc/crc_32.c
  53. )
  54. set(IMC_LINK_OBJS
  55. ${CMAKE_SOURCE_DIR}/Core/Src/benchmarks/crc/crc_input.o
  56. )
  57. include_directories(
  58. Core/Inc/benchmarks/crc
  59. )
  60. endif()
  61. if(IMC_BENCH_NAME MATCHES "vFFT")
  62. set(BENCHMARK_SRC_FILES
  63. Core/Src/benchmarks/fft/fftmisc.c
  64. Core/Src/benchmarks/fft/fourierf.c
  65. )
  66. set(IMC_APP_FILES
  67. Core/Src/benchmarks/fft/fft.c
  68. )
  69. set(IMC_LINK_OBJS
  70. )
  71. include_directories(
  72. Core/Inc/benchmarks/fft
  73. )
  74. endif()
  75. if(IMC_BENCH_NAME MATCHES "vSha")
  76. set(BENCHMARK_SRC_FILES
  77. )
  78. set(IMC_APP_FILES
  79. Core/Src/benchmarks/sha/sha.c
  80. )
  81. set(IMC_LINK_OBJS
  82. ${CMAKE_SOURCE_DIR}/Core/Src/benchmarks/sha/sha_input.o
  83. )
  84. include_directories(
  85. Core/Inc/benchmarks/sha
  86. )
  87. endif()
  88. if(IMC_BENCH_NAME MATCHES "vMatMul")
  89. set(BENCHMARK_SRC_FILES
  90. )
  91. set(IMC_APP_FILES
  92. Core/Src/benchmarks/matmul/matmul.c
  93. )
  94. set(IMC_LINK_OBJS
  95. )
  96. endif()
  97. if(IMC_BENCH_NAME MATCHES "vStringSearch")
  98. set(BENCHMARK_SRC_FILES
  99. )
  100. set(IMC_APP_FILES
  101. Core/Src/benchmarks/stringsearch/stringsearch_local.c
  102. )
  103. set(IMC_LINK_OBJS
  104. )
  105. endif()
  106. if(IMC_BENCH_NAME MATCHES "vAes")
  107. set(BENCHMARK_SRC_FILES
  108. )
  109. set(IMC_APP_FILES
  110. Core/Src/benchmarks/aes/aes.c
  111. )
  112. set(IMC_LINK_OBJS
  113. )
  114. include_directories(
  115. Core/Inc/benchmarks/aes
  116. )
  117. endif()
  118. foreach(BENCH_SRC ${BENCHMARK_SRC_FILES})
  119. list(APPEND SRC_FILES ${BENCH_SRC})
  120. endforeach()
  121. function(split_loop imc_files)
  122. list(APPEND IMC_APP_FILES
  123. Core/Src/ImC/imc_extension.c
  124. )
  125. get_target_property(SRC_INCLUDES imc_freeRTOS INCLUDE_DIRECTORIES)
  126. foreach(dir ${SRC_INCLUDES})
  127. list(APPEND INCLUDE_DIRS "-I${dir}")
  128. endforeach()
  129. string(REPLACE " " ";" C_FLAGS ${CMAKE_C_FLAGS})
  130. set(BASIC_OPT_PASSES "mem2reg,indvars,instnamer,unify-loop-exits,lcssa,simplifycfg,loop-simplify")
  131. set(IMC_OPT_PASSES "imc-loop-opt")
  132. set(IMC_FLAGS ${IMC_BASE})
  133. set(LOOP_SPLIT_PLUGIN /home/ybkim/workspace/imc/loop_duplication/build/lib/libImcLoopOpt.so)
  134. # set(TARGET_TRIPPLE "--target=armv7em-none-eabi --sysroot=${CMAKE_SYSROOT}")
  135. foreach(APP_SRC ${IMC_APP_FILES})
  136. add_custom_command(
  137. OUTPUT ${PROJECT_BINARY_DIR}/${APP_SRC}.s
  138. DEPENDS ${APP_SRC}
  139. # COMMAND ${CLANG_BIN} --target=armv8m-none-eabi --sysroot=${CMAKE_SYSROOT} -g ${C_FLAGS} -O0 -Xclang -disable-O0-optnone ${INCLUDE_DIRS} -D USE_HAL_DRIVER -D STM32L552xx -c -emit-llvm ${PROJECT_SOURCE_DIR}/${APP_SRC} -o ${PROJECT_BINARY_DIR}/${APP_SRC}.bc
  140. COMMAND ${CMAKE_C_COMPILER} -g ${C_FLAGS} -O0 -Xclang -disable-O0-optnone ${INCLUDE_DIRS} -D USE_HAL_DRIVER -D STM32L552xx -c -emit-llvm ${PROJECT_SOURCE_DIR}/${APP_SRC} -o ${PROJECT_BINARY_DIR}/${APP_SRC}.bc
  141. COMMAND ${OPT_BIN} -o ${PROJECT_BINARY_DIR}/${APP_SRC}_imc.bc -load-pass-plugin=${LOOP_SPLIT_PLUGIN} -passes=${BASIC_OPT_PASSES},${IMC_OPT_PASSES} ${PROJECT_BINARY_DIR}/${APP_SRC}.bc
  142. COMMAND ${OPT_BIN} ${OPT} -o ${PROJECT_BINARY_DIR}/${APP_SRC}.opt.bc ${PROJECT_BINARY_DIR}/${APP_SRC}_imc.bc
  143. COMMAND ${LLC_BIN} ${IMC_FLAGS} ${CPU} ${OPT} -o ${PROJECT_BINARY_DIR}/${APP_SRC}.s ${PROJECT_BINARY_DIR}/${APP_SRC}.opt.bc
  144. )
  145. list(APPEND APP_OPTS ${PROJECT_BINARY_DIR}/${APP_SRC}.s)
  146. endforeach()
  147. add_library(imc_apps "${APP_OPTS}")
  148. endfunction()