imc_extension.cmake 6.0 KB

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