imc_extension.cmake 5.4 KB

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