CMakeLists.txt 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. cmake_minimum_required(VERSION 3.16...3.24)
  2. # include(static_kernel.cmake)
  3. set(CMAKE_EXPORT_COMPILE_COMMANDS TRUE)
  4. if(true)
  5. set(CMAKE_BUILD_TYPE Debug)
  6. set(CMAKE_VERBOSE_MAKEFILE 0)
  7. set(CMAKE_TRY_COMPILE_TARGET_TYPE "STATIC_LIBRARY")
  8. # user configurations: use -D option to change these on command line
  9. set(IMC_INSERT_COMPILER_CHECKPOINTS 1 CACHE BOOL "")
  10. set(IMC_ENABLE_EXTENSION 1 CACHE BOOL "")
  11. set(IMC_USE_CHECKPOINT_PASS_COUNTER 1 CACHE BOOL "")
  12. set(IMC_USE_CHECKPOINT_VOLTAGE_CHECK 0 CACHE BOOL "")
  13. set(IMC_CHECKPOINT_PASS_COUNT 100 CACHE STRING "")
  14. set(IMC_SPLIT_LOOP 0 CACHE BOOL "")
  15. # set(CMAKE_C_COMPILER arm-none-eabi-gcc) #tested with: clang, arm-none-eabi-gcc
  16. # set(CMAKE_C_COMPILER /home/ybkim/workspace/imc/llvm/llvm-17/build/bin/clang)
  17. set(CMAKE_C_COMPILER /home/ybkim/workspace/imc/llvm/llvm-17/build_release/bin/clang)
  18. set(CMAKE_SYSROOT "/opt/gcc-arm-none-eabi/arm-none-eabi")
  19. set(ARM_CORTEXM_MULTI_DIR "/opt/gcc-arm-none-eabi/arm-none-eabi/lib/thumb/v8-m.main+fp/hard")
  20. set(ARM_CORTEXM_BUILTINS_DIR "/opt/gcc-arm-none-eabi/lib/gcc/arm-none-eabi/11.2.1/thumb/v8-m.main+fp/hard")
  21. set(OPT_BIN /home/ybkim/workspace/imc/llvm/llvm-17/build/bin/opt)
  22. set(LLC_BIN /home/ybkim/workspace/imc/llvm/llvm-17/build/bin/llc)
  23. set(LLVM_OPT_PLUGIN /home/ybkim/workspace/imc/loop_duplication/build/lib/libImcInsertCheckpoints.so)
  24. set(SRC_FILES
  25. USB_Device/Target/usbd_conf.c
  26. USB_Device/App/usb_device.c
  27. USB_Device/App/usbd_cdc_if.c
  28. USB_Device/App/usbd_desc.c
  29. Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c
  30. Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM33_NTZ/non_secure/port.c
  31. Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.c
  32. Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2/cmsis_os2.c
  33. Middlewares/Third_Party/FreeRTOS/Source/croutine.c
  34. Middlewares/Third_Party/FreeRTOS/Source/event_groups.c
  35. Middlewares/Third_Party/FreeRTOS/Source/list.c
  36. Middlewares/Third_Party/FreeRTOS/Source/queue.c
  37. Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.c
  38. Middlewares/Third_Party/FreeRTOS/Source/tasks.c
  39. Middlewares/Third_Party/FreeRTOS/Source/timers.c
  40. Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_core.c
  41. Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c
  42. Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ioreq.c
  43. Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Src/usbd_cdc.c
  44. Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal.c
  45. Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_adc.c
  46. Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_adc_ex.c
  47. Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_cortex.c
  48. Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_dma.c
  49. Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_dma_ex.c
  50. Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_exti.c
  51. Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_fdcan.c
  52. Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_flash.c
  53. Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_flash_ex.c
  54. Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_flash_ramfunc.c
  55. Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_gpio.c
  56. Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_gtzc.c
  57. Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_i2c.c
  58. Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_i2c_ex.c
  59. Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_icache.c
  60. Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_pcd.c
  61. Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_pcd_ex.c
  62. Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_pwr.c
  63. Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_pwr_ex.c
  64. Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_rcc.c
  65. Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_rcc_ex.c
  66. Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_spi.c
  67. Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_spi_ex.c
  68. Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_sram.c
  69. Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_tim.c
  70. Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_tim_ex.c
  71. Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_uart.c
  72. Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_uart_ex.c
  73. Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_ll_fmc.c
  74. Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_ll_usb.c
  75. Drivers/STM32L5xx_HAL_Driver/Src/stm32l5xx_hal_comp.c
  76. Core/Startup/startup_stm32l552zetx.s
  77. Core/Src/sc03mpd/sc03mpd.c
  78. Core/Src/ImC/decoder.c
  79. Core/Src/ImC/imc_api.c
  80. Core/Src/ImC/imc_kernel.c
  81. Core/Src/app_freertos.c
  82. Core/Src/main.c
  83. Core/Src/stm32l5xx_hal_msp.c
  84. Core/Src/stm32l5xx_hal_timebase_tim.c
  85. Core/Src/stm32l5xx_it.c
  86. Core/Src/syscalls.c
  87. Core/Src/sysmem.c
  88. Core/Src/system_stm32l5xx.c
  89. Core/Src/benchmarks/benchmark_driver.c
  90. )
  91. include_directories(
  92. Core/Inc
  93. Drivers/STM32L5xx_HAL_Driver/Inc
  94. Drivers/STM32L5xx_HAL_Driver/Inc/Legacy
  95. Drivers/CMSIS/Device/ST/STM32L5xx/Include
  96. Drivers/CMSIS/Include
  97. USB_Device/App
  98. USB_Device/Target
  99. Middlewares/ST/STM32_USB_Device_Library/Core/Inc
  100. Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc
  101. Middlewares/Third_Party/FreeRTOS/Source/include
  102. Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2
  103. Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM33_NTZ/non_secure
  104. )
  105. link_directories(
  106. ${ARM_CORTEXM_BUILTINS_DIR}
  107. ${ARM_CORTEXM_MULTI_DIR}
  108. )
  109. if(IMC_ENABLE_EXTENSION)
  110. include(imc_extension.cmake)
  111. add_compile_definitions(imcUSE_IMC_EXTENSION=1)
  112. else()
  113. add_compile_definitions(imcUSE_IMC_EXTENSION=0)
  114. set(IMC_APP_FILES
  115. Core/Src/benchmarks/conv2d/conv2d.c
  116. Core/Src/benchmarks/adc_demo/adc_demo.c
  117. )
  118. endif()
  119. if(IMC_USE_CHECKPOINT_PASS_COUNTER)
  120. if(IMC_USE_CHECKPOINT_VOLTAGE_CHECK)
  121. message(FATAL_ERROR "IMC_USE_CHECKPOINT_PASS_COUNTER and IMC_USE_CHECKPOINT_VOLTAGE_CHECK cannot be turned on simultaneously")
  122. endif()
  123. add_compile_definitions(imcUSE_CHECKPOINT_PASS_COUNTER=1)
  124. add_compile_definitions(imcUSE_CHECKPOINT_VOLTAGE_CHECK=0)
  125. add_compile_definitions(imcCHECKPOINT_PASS_COUNT=${IMC_CHECKPOINT_PASS_COUNT})
  126. endif()
  127. if(IMC_USE_CHECKPOINT_VOLTAGE_CHECK)
  128. if(IMC_USE_CHECKPOINT_PASS_COUNTER)
  129. message(FATAL_ERROR "IMC_USE_CHECKPOINT_PASS_COUNTER and IMC_USE_CHECKPOINT_VOLTAGE_CHECK cannot be turned on simultaneously")
  130. endif()
  131. add_compile_definitions(imcUSE_CHECKPOINT_PASS_COUNTER=0)
  132. add_compile_definitions(imcUSE_CHECKPOINT_VOLTAGE_CHECK=1)
  133. endif()
  134. # compile flags
  135. add_compile_definitions(USE_HAL_DRIVER STM32L552xx)
  136. set(CMAKE_SYSTEM_NAME Generic)
  137. set(CPU "-mcpu=cortex-m33")
  138. set(FPU "-mfpu=fpv5-sp-d16")
  139. set(FLOAT-ABI "-mfloat-abi=hard")
  140. # set(FLOAT-ABI "-mfloat-abi=soft")
  141. set(MCU "${CPU} -mthumb ${FPU} ${FLOAT-ABI}")
  142. set(OPT "-O3")
  143. set(C_FLAGS_NO_ASM )
  144. set(C_FLAGS_EXTRA "-Wall -Wno-char-subscripts -Wno-unused-function -Wno-unused-variable -Wno-unused-but-set-variable -Wno-format -nostdlib -fdata-sections -ffunction-sections")
  145. set(COMPILER_SPECIFIC_CFLAGS )
  146. if (CMAKE_C_COMPILER MATCHES "clang")
  147. set(TARGET-TRIPPLE "--target=armv8m-none-eabi --sysroot=${CMAKE_SYSROOT}")
  148. set(COMPILER_SPECIFIC_CFLAGS "${TARGET-TRIPPLE}")
  149. endif()
  150. set(COMMON_CC_FLAGS "${MCU} ${TARGET-TRIPPLE} ${OPT} ${C_FLAGS_EXTRA} ${COMPILER_SPECIFIC_CFLAGS}")
  151. set(CMAKE_C_FLAGS "${COMMON_CC_FLAGS} ${C_FLAGS_NO_ASM}")
  152. # asm options
  153. set(ASM_OPTIONS "-x assembler-with-cpp -Wno-null-character")
  154. set(CMAKE_ASM_FLAGS "${COMMON_CC_FLAGS} ${ASM_OPTIONS}")
  155. # linker options
  156. set(ARM_CORTEXM_BUILTINS "-L${ARM_CORTEXM_BUILTINS_DIR}")
  157. set(LD_ADDITIONAL_FILES "${ARM_CORTEXM_BUILTINS_DIR}/crti.o ${ARM_CORTEXM_BUILTINS_DIR}/crtn.o ${IMC_LINK_OBJS}")
  158. set(LINKER_SCRIPT "${CMAKE_SOURCE_DIR}/STM32L552ZETX_FLASH.ld")
  159. set(CMAKE_EXE_LINKER_FLAGS "${LD_ADDITIONAL_FILES} -T ${LINKER_SCRIPT}")
  160. project(imc_freeRTOS C ASM)
  161. add_executable(imc_freeRTOS ${SRC_FILES})
  162. if(IMC_ENABLE_EXTENSION)
  163. if(IMC_APP_FILES)
  164. compile_imc_files()
  165. endif()
  166. else()
  167. if(IMC_APP_FILES)
  168. if(IMC_INSERT_COMPILER_CHECKPOINTS)
  169. if(NOT CMAKE_C_COMPILER MATCHES "clang")
  170. message(FATAL_ERROR "compiler must be clang 17 to enable compiler checkpoint insertion")
  171. endif()
  172. add_compile_definitions(imcUSE_IMC_KERNEL=1)
  173. get_target_property(SRC_INCLUDES imc_freeRTOS INCLUDE_DIRECTORIES)
  174. foreach(dir ${SRC_INCLUDES})
  175. list(APPEND INCLUDE_DIRS "-I${dir}")
  176. endforeach()
  177. string(REPLACE " " ";" C_FLAGS ${CMAKE_C_FLAGS})
  178. set(BASIC_OPT_PASSES "loop-simplify,loop-rotate,mem2reg,instcombine,instsimplify,dce,simplifycfg")
  179. set(IMC_OPT_PASSES "imc-insert-checkpoints")
  180. set(IMC_FLAGS ${IMC_BASE})
  181. # set(TARGET_TRIPPLE "--target=armv7em-none-eabi --sysroot=${CMAKE_SYSROOT}")
  182. # set(IMC_OPT_FLAGS "-disable-loop-unrolling")
  183. set(IMC_OPT_FLAGS "")
  184. foreach(APP_SRC ${IMC_APP_FILES})
  185. add_custom_command(
  186. OUTPUT ${PROJECT_BINARY_DIR}/${APP_SRC}.s
  187. DEPENDS ${APP_SRC}
  188. # 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
  189. 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
  190. COMMAND ${OPT_BIN} -o ${PROJECT_BINARY_DIR}/${APP_SRC}_imc.bc -load-pass-plugin=${LLVM_OPT_PLUGIN} -passes=${BASIC_OPT_PASSES},${IMC_OPT_PASSES} ${PROJECT_BINARY_DIR}/${APP_SRC}.bc
  191. COMMAND ${OPT_BIN} ${OPT} ${IMC_OPT_FLAGS} -o ${PROJECT_BINARY_DIR}/${APP_SRC}.opt.bc ${PROJECT_BINARY_DIR}/${APP_SRC}_imc.bc
  192. COMMAND ${LLC_BIN} ${IMC_FLAGS} ${CPU} ${OPT} -o ${PROJECT_BINARY_DIR}/${APP_SRC}.s ${PROJECT_BINARY_DIR}/${APP_SRC}.opt.bc
  193. )
  194. list(APPEND APP_OPTS ${PROJECT_BINARY_DIR}/${APP_SRC}.s)
  195. endforeach()
  196. add_library(imc_apps "${APP_OPTS}")
  197. else()
  198. if(NOT IMC_SPLIT_LOOP)
  199. add_library(imc_apps "${IMC_APP_FILES}")
  200. endif()
  201. endif()
  202. endif()
  203. endif()
  204. target_link_options(imc_freeRTOS PRIVATE "LINKER:-gc-sections")
  205. if(IMC_APP_FILES)
  206. target_link_libraries(imc_freeRTOS PRIVATE imc_apps c m nosys gcc)
  207. else()
  208. target_link_libraries(imc_freeRTOS PRIVATE c m nosys gcc)
  209. endif()
  210. target_compile_options(imc_freeRTOS PRIVATE "-g")
  211. set_target_properties(imc_freeRTOS PROPERTIES LINK_DEPENDS ${LINKER_SCRIPT})
  212. endif()