@@ -20,48 +20,43 @@ if(WIN32)
20
20
set (WIN_FLAG "/EHsc" )
21
21
endif ()
22
22
23
- set (EMULATOR_COMPILE_FLAGS -Wall ${WIN_FLAG} -fintelfpga -DFPGA_EMULATOR -c )
24
- set (EMULATOR_LINK_FLAGS -fintelfpga )
25
- set (HARDWARE_COMPILE_FLAGS -Wall ${WIN_FLAG} -fintelfpga -c )
26
- set (HARDWARE_LINK_FLAGS -fintelfpga -Xshardware -Xsboard=${FPGA_BOARD} ${USER_HARDWARE_FLAGS} )
23
+ # A DPC++ ahead-of-time (AoT) compile processes the device code in two stages.
24
+ # 1. The "compile" stage compiles the device code to an intermediate representation (SPIR-V).
25
+ # 2. The "link" stage invokes the compiler's FPGA backend before linking.
26
+ # For this reason, FPGA backend flags must be passed as link flags in CMake.
27
+ set (EMULATOR_COMPILE_FLAGS "-Wall ${WIN_FLAG} -fintelfpga -DFPGA_EMULATOR" )
28
+ set (EMULATOR_LINK_FLAGS "-fintelfpga" )
29
+ set (HARDWARE_COMPILE_FLAGS "-Wall ${WIN_FLAG} -fintelfpga" )
30
+ set (HARDWARE_LINK_FLAGS "-fintelfpga -Xshardware -Xsboard=${FPGA_BOARD} ${USER_HARDWARE_FLAGS} " )
27
31
# use cmake -D USER_HARDWARE_FLAGS=<flags> to set extra flags for FPGA backend compilation
28
32
29
33
###############################################################################
30
34
### FPGA Emulator
31
35
###############################################################################
32
- # To compile manually :
33
- # dpcpp -fintelfpga -DFPGA_EMULATOR -c host.cpp -o host_emu.o
34
- # dpcpp -fintelfpga -DFPGA_EMULATOR -c kernel.cpp -o dev_emu.o
35
- # dpcpp -fintelfpga -fsycl-link=image dev_emu. o -o dev_image_emu.a
36
- # dpcpp -fintelfpga host_emu.o dev_image_emu.a -o fast_recompile.fpga
37
-
38
- if ( WIN32 )
39
- set ( EMULATOR_TARGET ${EMULATOR_TARGET} .exe )
40
- endif ( )
36
+ # To compile in a single command :
37
+ # dpcpp -fintelfpga -DFPGA_EMULATOR host.cpp kernel.cpp -o fast_recompile.fpga_emu
38
+ # CMake executes:
39
+ # [compile] dpcpp -fintelfpga -DFPGA_EMULATOR -o host.cpp. o -c host.cpp
40
+ # [compile] dpcpp -fintelfpga -DFPGA_EMULATOR -o kernel.cpp.o -c kernel.cpp
41
+ # [link] dpcpp -fintelfpga host.cpp.o kernel.cpp.o -o fast_recompile.fpga_emu
42
+ add_executable ( ${EMULATOR_TARGET} ${HOST_SOURCE_FILE} ${DEVICE_SOURCE_FILE} )
43
+ set_target_properties ( ${ EMULATOR_TARGET} PROPERTIES COMPILE_FLAGS " ${EMULATOR_COMPILE_FLAGS} " )
44
+ set_target_properties ( ${EMULATOR_TARGET} PROPERTIES LINK_FLAGS " ${EMULATOR_LINK_FLAGS} " )
41
45
add_custom_target (fpga_emu DEPENDS ${EMULATOR_TARGET} )
42
- set (HOST_EMU_OBJ "host_emu.o" )
43
- set (DEVICE_EMU_OBJ "dev_emu.o" )
44
- set (DEVICE_IMAGE_EMU_OBJ "dev_image_emu.a" )
45
46
46
- set (CMAKE_CXX_FLAGS_LIST ${CMAKE_CXX_FLAGS_LIST} )
47
- separate_arguments (CMAKE_CXX_FLAGS_LIST )
48
-
49
- add_custom_command (OUTPUT ${HOST_EMU_OBJ}
50
- COMMAND ${CMAKE_CXX_COMPILER} ${CMAKE_CXX_FLAGS_LIST} ${EMULATOR_COMPILE_FLAGS}
51
- ${CMAKE_CURRENT_SOURCE_DIR} /${HOST_SOURCE_FILE} -o ${HOST_EMU_OBJ}
52
- DEPENDS ${HOST_SOURCE_FILE} ${KERNEL_HEADER_FILE} )
53
-
54
- add_custom_command (OUTPUT ${DEVICE_EMU_OBJ}
55
- COMMAND ${CMAKE_CXX_COMPILER} ${CMAKE_CXX_FLAGS_LIST} ${EMULATOR_COMPILE_FLAGS} ${CMAKE_CURRENT_SOURCE_DIR} /${DEVICE_SOURCE_FILE} -o ${DEVICE_EMU_OBJ}
56
- DEPENDS ${DEVICE_SOURCE_FILE} ${KERNEL_HEADER_FILE} )
57
-
58
- add_custom_command (OUTPUT ${DEVICE_IMAGE_EMU_OBJ}
59
- COMMAND ${CMAKE_CXX_COMPILER} ${CMAKE_CXX_FLAGS_LIST} ${EMULATOR_LINK_FLAGS} -fsycl-link=image ${DEVICE_EMU_OBJ} -o ${DEVICE_IMAGE_EMU_OBJ}
60
- DEPENDS ${DEVICE_EMU_OBJ} )
47
+ ###############################################################################
48
+ ### Generate Report
49
+ ###############################################################################
50
+ # To compile manually:
51
+ # dpcpp -fintelfpga -Xshardware -Xsboard=<FPGA_BOARD> -fsycl-link=early host.cpp kernel.cpp -o fast_compile_report.a
52
+ set (FPGA_EARLY_IMAGE ${TARGET_NAME} _report.a )
53
+ # The compile output is not an executable, but an intermediate compilation result unique to DPC++.
54
+ add_executable (${FPGA_EARLY_IMAGE} ${HOST_SOURCE_FILE} ${DEVICE_SOURCE_FILE} )
55
+ add_custom_target (report DEPENDS ${FPGA_EARLY_IMAGE} )
56
+ set_target_properties (${FPGA_EARLY_IMAGE} PROPERTIES COMPILE_FLAGS ${HARDWARE_COMPILE_FLAGS} )
57
+ set_target_properties (${FPGA_EARLY_IMAGE} PROPERTIES LINK_FLAGS "${HARDWARE_LINK_FLAGS} -fsycl-link=early" )
58
+ # fsycl-link=early stops the compiler after RTL generation, before invoking Quartus®
61
59
62
- add_custom_command (OUTPUT ${EMULATOR_TARGET}
63
- COMMAND ${CMAKE_CXX_COMPILER} ${CMAKE_CXX_FLAGS_LIST} -fintelfpga ${HOST_EMU_OBJ} ${DEVICE_IMAGE_EMU_OBJ} -o ${CMAKE_BINARY_DIR} /${EMULATOR_TARGET}
64
- DEPENDS ${HOST_EMU_OBJ} ${DEVICE_IMAGE_EMU_OBJ} )
65
60
66
61
###############################################################################
67
62
### FPGA Hardware
@@ -83,9 +78,10 @@ set(CMAKE_CXX_FLAGS_LIST "${CMAKE_CXX_FLAGS}")
83
78
separate_arguments (CMAKE_CXX_FLAGS_LIST )
84
79
set (HARDWARE_LINK_FLAGS_LIST "${HARDWARE_LINK_FLAGS} " )
85
80
separate_arguments (HARDWARE_LINK_FLAGS_LIST )
81
+
86
82
87
83
add_custom_command (OUTPUT ${HOST_OBJ}
88
- COMMAND ${CMAKE_CXX_COMPILER} ${CMAKE_CXX_FLAGS_LIST} ${HARDWARE_COMPILE_FLAGS} ${CMAKE_CURRENT_SOURCE_DIR} /${HOST_SOURCE_FILE} -o ${HOST_OBJ}
84
+ COMMAND ${CMAKE_CXX_COMPILER} ${CMAKE_CXX_FLAGS_LIST} ${HARDWARE_COMPILE_FLAGS} -c ${CMAKE_CURRENT_SOURCE_DIR} /${HOST_SOURCE_FILE} -o ${HOST_OBJ}
89
85
DEPENDS ${HOST_SOURCE_FILE} ${KERNEL_HEADER_FILE} )
90
86
91
87
add_custom_command (OUTPUT ${DEVICE_IMAGE_OBJ}
0 commit comments