1
+ # Direct CMake to use icpx rather than the default C++ compiler/linker on Linux
2
+ # and icx-cl on Windows
3
+ if (UNIX )
4
+ set (CMAKE_CXX_COMPILER icpx )
5
+ else () # Windows
6
+ include (CMakeForceCompiler )
7
+ CMAKE_FORCE_CXX_COMPILER (icx-cl IntelDPCPP )
8
+ include (Platform/Windows-Clang )
9
+ endif ()
10
+
11
+ cmake_minimum_required (VERSION 3.7.2 )
12
+
13
+ project (SVD CXX )
14
+
15
+ set (CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} )
16
+ set (CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} )
17
+ set (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} )
18
+
19
+ ###############################################################################
20
+ ### Customize these build variables
21
+ ###############################################################################
22
+ set (SOURCE_FILES src/svd_demo.cpp )
23
+ set (TARGET_NAME svd )
24
+
25
+ # Use cmake -DFPGA_DEVICE=<board-support-package>:<board-variant> to choose a
26
+ # different device.
27
+ # Note that depending on your installation, you may need to specify the full
28
+ # path to the board support package (BSP), this usually is in your install
29
+ # folder.
30
+ #
31
+ # You can also specify a device family (E.g. "Arria10" or "Stratix10") or a
32
+ # specific part number (E.g. "10AS066N3F40E2SG") to generate a standalone IP.
33
+ if (NOT DEFINED FPGA_DEVICE )
34
+ set (FPGA_DEVICE "Agilex7" )
35
+ message (STATUS "FPGA_DEVICE was not specified.\
36
+ \n Configuring the design to the default FPGA family target: ${FPGA_DEVICE} \
37
+ \n Please refer to the README for information on target selection." )
38
+ else ()
39
+ # Check if the target is a BSP
40
+ if (IS_BSP MATCHES "1" )
41
+ set (BSP_FLAG "-DIS_BSP" )
42
+ else ()
43
+ set (BSP_FLAG "" )
44
+ message (STATUS "The selected target ${FPGA_DEVICE} is assumed to be an FPGA part number, so the IS_BSP macro will not be passed to your C++ code." )
45
+ message (STATUS "If the target is actually a BSP, run cmake with -DIS_BSP=1 to pass the IS_BSP macro to your C++ code." )
46
+ endif ()
47
+ endif ()
48
+
49
+ if (NOT DEFINED FIXED_ITERATIONS )
50
+ set (FIXED_ITERATIONS 55 )
51
+ endif ()
52
+ message (STATUS "FIXED_ITERATIONS=${FIXED_ITERATIONS} " )
53
+
54
+ # Print the device being used for the compiles
55
+ message (STATUS "Configuring the design to run on FPGA board ${FPGA_DEVICE} " )
56
+
57
+ # Use cmake -DUSER_FPGA_FLAGS=<flags> to set extra flags for FPGA backend
58
+ # compilation.
59
+ set (USER_FPGA_FLAGS ${USER_FPGA_FLAGS} )
60
+
61
+ # Use cmake -DUSER_FLAGS=<flags> to set extra flags for general compilation.
62
+ set (USER_FLAGS ${USER_FLAGS} ;-DFIXED_ITERATIONS=${FIXED_ITERATIONS};${BSP_FLAG} )
63
+
64
+ # Use cmake -DUSER_INCLUDE_PATHS=<paths> to set extra paths for general
65
+ # compilation.
66
+ set (USER_INCLUDE_PATHS ../../include;${USER_INCLUDE_PATHS} )
67
+
68
+ ###############################################################################
69
+ ### no changes after here
70
+ ###############################################################################
71
+
72
+ # Set the names of the makefile targets to be generated by cmake
73
+ set (EMULATOR_TARGET fpga_emu )
74
+ set (SIMULATOR_TARGET fpga_sim )
75
+ set (REPORT_TARGET report )
76
+ set (FPGA_TARGET fpga )
77
+
78
+ # Set the names of the generated files per makefile target
79
+ set (EMULATOR_OUTPUT_NAME ${TARGET_NAME} .${EMULATOR_TARGET} )
80
+ set (SIMULATOR_OUTPUT_NAME ${TARGET_NAME} .${SIMULATOR_TARGET} )
81
+ set (REPORT_OUTPUT_NAME ${TARGET_NAME} .${REPORT_TARGET} )
82
+ set (FPGA_OUTPUT_NAME ${TARGET_NAME} .${FPGA_TARGET} )
83
+
84
+ message (STATUS "Additional USER_FPGA_FLAGS=${USER_FPGA_FLAGS} " )
85
+ message (STATUS "Additional USER_FLAGS=${USER_FLAGS} " )
86
+
87
+ include_directories (${USER_INCLUDE_PATHS} )
88
+ message (STATUS "Additional USER_INCLUDE_PATHS=${USER_INCLUDE_PATHS} " )
89
+
90
+ link_directories (${USER_LIB_PATHS} )
91
+ message (STATUS "Additional USER_LIB_PATHS=${USER_LIB_PATHS} " )
92
+
93
+ link_libraries (${USER_LIBS} )
94
+ message (STATUS "Additional USER_LIBS=${USER_LIBS} " )
95
+
96
+ if (WIN32 )
97
+ # add qactypes for Windows
98
+ set (QACTYPES "-Qactypes" )
99
+ # This is a Windows-specific flag that enables exception handling in host code
100
+ set (WIN_FLAG "/EHsc" )
101
+ else ()
102
+ # add qactypes for Linux
103
+ set (QACTYPES "-qactypes" )
104
+ endif ()
105
+
106
+ string (TOLOWER "${CMAKE_BUILD_TYPE} " LOWER_BUILD_TYPE )
107
+ if (LOWER_BUILD_TYPE MATCHES debug )
108
+ # Set debug flags
109
+ if (WIN32 )
110
+ set (DEBUG_FLAGS /DEBUG /Od )
111
+ else ()
112
+ set (DEBUG_FLAGS -g -O0 )
113
+ endif ()
114
+ else ()
115
+ set (DEBUG_FLAGS "" )
116
+ endif ()
117
+
118
+ if (WIN32 )
119
+ set (EXT ".exe" )
120
+ endif ()
121
+
122
+ set (COMMON_COMPILE_FLAGS -fintelfpga -Wall ${WIN_FLAG} ${QACTYPES} ${USER_FLAGS} )
123
+ set (COMMON_LINK_FLAGS -fintelfpga ${QACTYPES} ${USER_FLAGS} )
124
+
125
+ # A SYCL ahead-of-time (AoT) compile processes the device code in two stages.
126
+ # 1. The "compile" stage compiles the device code to an intermediate
127
+ # representation (SPIR-V).
128
+ # 2. The "link" stage invokes the compiler's FPGA backend before linking. For
129
+ # this reason, FPGA backend flags must be passed as link flags in CMake.
130
+ set (EMULATOR_COMPILE_FLAGS -DFPGA_EMULATOR ${DEBUG_FLAGS} )
131
+ set (EMULATOR_LINK_FLAGS )
132
+ set (REPORT_COMPILE_FLAGS -DFPGA_HARDWARE )
133
+ set (REPORT_LINK_FLAGS -Xshardware -Xstarget=${FPGA_DEVICE} ${USER_FPGA_FLAGS} -fsycl-link=early )
134
+ set (SIMULATOR_COMPILE_FLAGS -Xssimulation -DFPGA_SIMULATOR )
135
+ set (SIMULATOR_LINK_FLAGS -Xssimulation -Xsghdl -Xstarget=${FPGA_DEVICE} ${USER_FPGA_FLAGS} -reuse-exe=${CMAKE_BINARY_DIR}/${SIMULATOR_OUTPUT_NAME}${EXT} )
136
+ set (FPGA_COMPILE_FLAGS -DFPGA_HARDWARE )
137
+ set (FPGA_LINK_FLAGS -Xshardware -Xstarget=${FPGA_DEVICE} ${USER_FPGA_FLAGS} -reuse-exe=${CMAKE_BINARY_DIR}/${FPGA_OUTPUT_NAME}${EXT} )
138
+
139
+ ###############################################################################
140
+ ### FPGA Emulator
141
+ ###############################################################################
142
+ add_executable (${EMULATOR_TARGET} ${SOURCE_FILES} )
143
+ target_compile_options (${EMULATOR_TARGET} PRIVATE ${COMMON_COMPILE_FLAGS} )
144
+ target_compile_options (${EMULATOR_TARGET} PRIVATE ${EMULATOR_COMPILE_FLAGS} )
145
+ target_link_libraries (${EMULATOR_TARGET} ${COMMON_LINK_FLAGS} )
146
+ target_link_libraries (${EMULATOR_TARGET} ${EMULATOR_LINK_FLAGS} )
147
+ set_target_properties (${EMULATOR_TARGET} PROPERTIES OUTPUT_NAME ${EMULATOR_OUTPUT_NAME} )
148
+
149
+ ###############################################################################
150
+ ### FPGA Simulator
151
+ ###############################################################################
152
+ add_executable (${SIMULATOR_TARGET} EXCLUDE_FROM_ALL ${SOURCE_FILES} )
153
+ target_compile_options (${SIMULATOR_TARGET} PRIVATE ${COMMON_COMPILE_FLAGS} )
154
+ target_compile_options (${SIMULATOR_TARGET} PRIVATE ${SIMULATOR_COMPILE_FLAGS} )
155
+ target_link_libraries (${SIMULATOR_TARGET} ${COMMON_LINK_FLAGS} )
156
+ target_link_libraries (${SIMULATOR_TARGET} ${SIMULATOR_LINK_FLAGS} )
157
+ set_target_properties (${SIMULATOR_TARGET} PROPERTIES OUTPUT_NAME ${SIMULATOR_OUTPUT_NAME} )
158
+
159
+ ###############################################################################
160
+ ### Generate Report
161
+ ###############################################################################
162
+ add_executable (${REPORT_TARGET} EXCLUDE_FROM_ALL ${SOURCE_FILES} )
163
+ target_compile_options (${REPORT_TARGET} PRIVATE ${COMMON_COMPILE_FLAGS} )
164
+ target_compile_options (${REPORT_TARGET} PRIVATE ${REPORT_COMPILE_FLAGS} )
165
+
166
+ # The report target does not need the QACTYPES flag at link stage
167
+ set (MODIFIED_COMMON_LINK_FLAGS_REPORT ${COMMON_LINK_FLAGS} )
168
+ list (REMOVE_ITEM MODIFIED_COMMON_LINK_FLAGS_REPORT ${QACTYPES} )
169
+
170
+ target_link_libraries (${REPORT_TARGET} ${MODIFIED_COMMON_LINK_FLAGS_REPORT} )
171
+ target_link_libraries (${REPORT_TARGET} ${REPORT_LINK_FLAGS} )
172
+ set_target_properties (${REPORT_TARGET} PROPERTIES OUTPUT_NAME ${REPORT_OUTPUT_NAME} )
173
+
174
+ ###############################################################################
175
+ ### FPGA Hardware
176
+ ###############################################################################
177
+ add_executable (${FPGA_TARGET} EXCLUDE_FROM_ALL ${SOURCE_FILES} )
178
+ target_compile_options (${FPGA_TARGET} PRIVATE ${COMMON_COMPILE_FLAGS} )
179
+ target_compile_options (${FPGA_TARGET} PRIVATE ${FPGA_COMPILE_FLAGS} )
180
+ target_link_libraries (${FPGA_TARGET} ${COMMON_LINK_FLAGS} )
181
+ target_link_libraries (${FPGA_TARGET} ${FPGA_LINK_FLAGS} )
182
+ set_target_properties (${FPGA_TARGET} PROPERTIES OUTPUT_NAME ${FPGA_OUTPUT_NAME} )
183
+
184
+ ###############################################################################
185
+ ### This part only manipulates cmake variables to print the commands cmake is expected to run to the user
186
+ ###############################################################################
187
+
188
+ # set the correct object file extension depending on the target platform
189
+ if (WIN32 )
190
+ set (OBJ_EXTENSION "obj" )
191
+ else ()
192
+ set (OBJ_EXTENSION "o" )
193
+ endif ()
194
+
195
+ # Set the source file names in a string
196
+ set (SOURCE_FILE_NAME "${SOURCE_FILES} " )
197
+
198
+ function (getCompileCommands common_compile_flags special_compile_flags common_link_flags special_link_flags target output_name )
199
+
200
+ set (file_names ${SOURCE_FILE_NAME} )
201
+ set (COMPILE_COMMAND )
202
+ set (LINK_COMMAND )
203
+
204
+ foreach (source ${file_names} )
205
+ # Get the relative path to the source and object files
206
+ file (RELATIVE_PATH CURRENT_SOURCE_FILE ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_LIST_DIR} /${source} )
207
+ file (RELATIVE_PATH OBJ_FILE ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR} /CMakeFiles/${target}.dir/${source}.${OBJ_EXTENSION} )
208
+
209
+ # Creating a string that contains the compile command
210
+ # Start by the compiler invocation
211
+ set (COMPILE_COMMAND "${COMPILE_COMMAND}${CMAKE_CXX_COMPILER} " )
212
+
213
+ # Add all the potential includes
214
+ foreach (INCLUDE ${USER_INCLUDE_PATHS} )
215
+ if (NOT IS_ABSOLUTE ${INCLUDE} )
216
+ file (RELATIVE_PATH INCLUDE ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_LIST_DIR} /${INCLUDE} )
217
+ endif ()
218
+ set (COMPILE_COMMAND "${COMPILE_COMMAND} -I${INCLUDE} " )
219
+ endforeach ()
220
+
221
+ # Add all the common compile flags
222
+ foreach (FLAG ${common_compile_flags} )
223
+ set (COMPILE_COMMAND "${COMPILE_COMMAND} ${FLAG} " )
224
+ endforeach ()
225
+
226
+ # Add all the specific compile flags
227
+ foreach (FLAG ${special_compile_flags} )
228
+ set (COMPILE_COMMAND "${COMPILE_COMMAND} ${FLAG} " )
229
+ endforeach ()
230
+
231
+ # Get the location of the object file
232
+ file (RELATIVE_PATH OBJ_FILE ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR} /CMakeFiles/${target}.dir/${source}.${OBJ_EXTENSION} )
233
+
234
+ # Add the source file and the output file
235
+ set (COMPILE_COMMAND "${COMPILE_COMMAND} -c ${CURRENT_SOURCE_FILE} -o ${OBJ_FILE} \n " )
236
+ endforeach ()
237
+
238
+ set (COMPILE_COMMAND "${COMPILE_COMMAND} " PARENT_SCOPE )
239
+
240
+ # Creating a string that contains the link command
241
+ # Start by the compiler invocation
242
+ set (LINK_COMMAND "${LINK_COMMAND}${CMAKE_CXX_COMPILER} " )
243
+
244
+ # Add all the common link flags
245
+ foreach (FLAG ${common_link_flags} )
246
+ set (LINK_COMMAND "${LINK_COMMAND} ${FLAG} " )
247
+ endforeach ()
248
+
249
+ # Add all the specific link flags
250
+ foreach (FLAG ${special_link_flags} )
251
+ set (LINK_COMMAND "${LINK_COMMAND} ${FLAG} " )
252
+ endforeach ()
253
+
254
+ # Add the output file
255
+ set (LINK_COMMAND "${LINK_COMMAND} -o ${output_name} " )
256
+
257
+ foreach (source ${file_names} )
258
+ # Get the relative path to the source and object files
259
+ file (RELATIVE_PATH OBJ_FILE ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR} /CMakeFiles/${target}.dir/${source}.${OBJ_EXTENSION} )
260
+
261
+ # Add the source file and the output file
262
+ set (LINK_COMMAND "${LINK_COMMAND} ${OBJ_FILE} " )
263
+ endforeach ()
264
+
265
+ # Add all the potential library paths
266
+ foreach (LIB_PATH ${USER_LIB_PATHS} )
267
+ if (NOT IS_ABSOLUTE ${LIB_PATH} )
268
+ file (RELATIVE_PATH LIB_PATH ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_LIST_DIR} /${LIB_PATH} )
269
+ endif ()
270
+ if (NOT WIN32 )
271
+ set (LINK_COMMAND "${LINK_COMMAND} -L${LIB_PATH} " )
272
+ else ()
273
+ set (LINK_COMMAND "${LINK_COMMAND} -L${LIB_PATH} -Wl,-rpath,${LIB_PATH} " )
274
+ endif ()
275
+ endforeach ()
276
+
277
+ # Add all the potential includes
278
+ foreach (LIB ${USER_LIBS} )
279
+ set (LINK_COMMAND "${LINK_COMMAND} -l${LIB} " )
280
+ endforeach ()
281
+
282
+ set (LINK_COMMAND "${LINK_COMMAND} " PARENT_SCOPE )
283
+
284
+ endfunction ()
285
+
286
+ # Windows executable is going to have the .exe extension
287
+ if (WIN32 )
288
+ set (EXECUTABLE_EXTENSION ".exe" )
289
+ endif ()
290
+
291
+ # Display the compile instructions in the emulation flow
292
+ getCompileCommands ("${COMMON_COMPILE_FLAGS} " "${EMULATOR_COMPILE_FLAGS} " "${COMMON_LINK_FLAGS} " "${EMULATOR_LINK_FLAGS} " "${EMULATOR_TARGET} " "${EMULATOR_OUTPUT_NAME}${EXECUTABLE_EXTENSION} " )
293
+
294
+ add_custom_target ( displayEmulationCompileCommands
295
+ ${CMAKE_COMMAND} -E cmake_echo_color --cyan ""
296
+ COMMENT "\n To compile manually:\n ${COMPILE_COMMAND} \n To link manually:\n ${LINK_COMMAND} " )
297
+ add_dependencies (${EMULATOR_TARGET} displayEmulationCompileCommands )
298
+
299
+ # Display the compile instructions in the simulation flow
300
+ getCompileCommands ("${COMMON_COMPILE_FLAGS} " "${SIMULATOR_COMPILE_FLAGS} " "${COMMON_LINK_FLAGS} " "${SIMULATOR_LINK_FLAGS} " "${SIMULATOR_TARGET} " "${SIMULATOR_OUTPUT_NAME}${EXECUTABLE_EXTENSION} " )
301
+
302
+ add_custom_target ( displaySimulationCompileCommands
303
+ ${CMAKE_COMMAND} -E cmake_echo_color --cyan ""
304
+ COMMENT "\n To compile manually:\n ${COMPILE_COMMAND} \n To link manually:\n ${LINK_COMMAND} " )
305
+ add_dependencies (${SIMULATOR_TARGET} displaySimulationCompileCommands )
306
+
307
+ # Display the compile instructions in the report flow
308
+ getCompileCommands ("${COMMON_COMPILE_FLAGS} " "${REPORT_COMPILE_FLAGS} " "${MODIFIED_COMMON_LINK_FLAGS_REPORT} " "${REPORT_LINK_FLAGS} " "${REPORT_TARGET} " "${REPORT_OUTPUT_NAME}${EXECUTABLE_EXTENSION} " )
309
+
310
+ add_custom_target ( displayReportCompileCommands
311
+ ${CMAKE_COMMAND} -E cmake_echo_color --cyan ""
312
+ COMMENT "\n To compile manually:\n ${COMPILE_COMMAND} \n To link manually:\n ${LINK_COMMAND} " )
313
+ add_dependencies (${REPORT_TARGET} displayReportCompileCommands )
314
+
315
+ # Display the compile instructions in the fpga flow
316
+ getCompileCommands ("${COMMON_COMPILE_FLAGS} " "${FPGA_COMPILE_FLAGS} " "${COMMON_LINK_FLAGS} " "${FPGA_LINK_FLAGS} " "${FPGA_TARGET} " "${FPGA_OUTPUT_NAME}${EXECUTABLE_EXTENSION} " )
317
+
318
+ add_custom_target ( displayFPGACompileCommands
319
+ ${CMAKE_COMMAND} -E cmake_echo_color --cyan ""
320
+ COMMENT "\n To compile manually:\n ${COMPILE_COMMAND} \n To link manually:\n ${LINK_COMMAND} " )
321
+ add_dependencies (${FPGA_TARGET} displayFPGACompileCommands )
0 commit comments