aboutsummaryrefslogtreecommitdiffstats
path: root/fpga/usrp3/top/x400/Makefile
blob: 1bf0d3fcd4dd4dc85e9f23f8d7802769f944f92e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
#
# Copyright 2022 Ettus Research, a National Instruments Brand
#
# SPDX-License-Identifier: LGPL-3.0-or-later
#

# NOTE: All comments prefixed with a "##" will be displayed as a part of the "make help" target
##-------------------
##USRP X4xx FPGA Help
##-------------------
##Usage:
##  make <Targets> <Options>
##
##Output:
##  build/usrp_<product>_fpga_<image_type>.bit:  Configuration bitstream with header
##  build/usrp_<product>_fpga_<image_type>.dts:  Device tree source file
##  build/usrp_<product>_fpga_<image_type>.rpt:  Build report (includes utilization and timing summary)

# Base output directory for all builds
BUILD_BASE_DIR ?= .

# Definitions
# MGT Types from x4xx_mgt_type.vh
MGT_100GbE   = 5
MGT_Aurora   = 3
MGT_10GbE    = 2
MGT_Disabled = 0

# For a 4-lane MGT like 100GBE set QSFPx_0=MGT_100GbE and all others to
# MGT_Disabled. For a 1-lane MGT like 10GbE do not set anything for unused
# lanes. This ensures something is defined only for the lanes that are used, so
# that the TX/RX signals are connected. The presence of a define causes TX/RX
# to be declared, whereas declaring TX/RX on an unused lane will cause an error
# in bitgen for unconstrained pins after it is optimized out.

QSFP0_10GBE   = QSFP0_0=$(MGT_10GbE)
QSFP0_4X10GBE = QSFP0_0=$(MGT_10GbE)  QSFP0_1=$(MGT_10GbE)    QSFP0_2=$(MGT_10GbE)    QSFP0_3=$(MGT_10GbE)
QSFP0_100GBE  = QSFP0_0=$(MGT_100GbE) QSFP0_1=$(MGT_Disabled) QSFP0_2=$(MGT_Disabled) QSFP0_3=$(MGT_Disabled)

QSFP1_10GBE   = QSFP1_0=$(MGT_10GbE)
QSFP1_4X10GBE = QSFP1_0=$(MGT_10GbE)  QSFP1_1=$(MGT_10GbE)    QSFP1_2=$(MGT_10GbE)    QSFP1_3=$(MGT_10GbE)
QSFP1_100GBE  = QSFP1_0=$(MGT_100GbE) QSFP1_1=$(MGT_Disabled) QSFP1_2=$(MGT_Disabled) QSFP1_3=$(MGT_Disabled)

# Target specific variables
X410_IP:          DEFS += $(QSFP0_10GBE)                   RF_BW=100
X410_X1_100:      DEFS += $(QSFP0_10GBE)                   RF_BW=100  RF_CORE_100M=1 DRAM_BANKS=1 DRAM_CH=4*$(DRAM) DRAM_W=64
X410_XG_100:      DEFS += $(QSFP0_10GBE)   $(QSFP1_10GBE)  RF_BW=100  RF_CORE_100M=1 DRAM_BANKS=1 DRAM_CH=4*$(DRAM) DRAM_W=64
X410_X4_100:      DEFS += $(QSFP0_4X10GBE)                 RF_BW=100  RF_CORE_100M=1 DRAM_BANKS=1 DRAM_CH=4*$(DRAM) DRAM_W=64
X410_X4C_100:     DEFS += $(QSFP0_4X10GBE) $(QSFP1_100GBE) RF_BW=100  RF_CORE_100M=1 DRAM_BANKS=0 DRAM_CH=0
X410_C1_100:      DEFS += $(QSFP0_100GBE)                  RF_BW=100  RF_CORE_100M=1 DRAM_BANKS=1 DRAM_CH=4*$(DRAM) DRAM_W=64
X410_UC_100:      DEFS +=                  $(QSFP1_100GBE) RF_BW=100  RF_CORE_100M=1 DRAM_BANKS=1 DRAM_CH=4*$(DRAM) DRAM_W=64
X410_C1_200:      DEFS += $(QSFP0_100GBE)                  RF_BW=200  RF_CORE_200M=1 DRAM_BANKS=1 DRAM_CH=4*$(DRAM) DRAM_W=64
X410_UC_200:      DEFS +=                  $(QSFP1_100GBE) RF_BW=200  RF_CORE_200M=1 DRAM_BANKS=1 DRAM_CH=4*$(DRAM) DRAM_W=64
X410_CG_200:      DEFS += $(QSFP0_100GBE)  $(QSFP1_100GBE) RF_BW=200  RF_CORE_200M=1 DRAM_BANKS=1 DRAM_CH=4*$(DRAM) DRAM_W=64
X410_X1_200:      DEFS += $(QSFP0_10GBE)                   RF_BW=200  RF_CORE_200M=1 DRAM_BANKS=1 DRAM_CH=4*$(DRAM) DRAM_W=64
X410_XG_200:      DEFS += $(QSFP0_10GBE)   $(QSFP1_10GBE)  RF_BW=200  RF_CORE_200M=1 DRAM_BANKS=1 DRAM_CH=4*$(DRAM) DRAM_W=64
X410_X4_200:      DEFS += $(QSFP0_4X10GBE)                 RF_BW=200  RF_CORE_200M=1 DRAM_BANKS=1 DRAM_CH=4*$(DRAM) DRAM_W=64
X410_X4C_200:     DEFS += $(QSFP0_4X10GBE) $(QSFP1_100GBE) RF_BW=200  RF_CORE_200M=1 DRAM_BANKS=0 DRAM_CH=0
X410_X1_400:      DEFS += $(QSFP0_10GBE)                   RF_BW=400  RF_CORE_400M=1 DRAM_BANKS=2 DRAM_CH=4*$(DRAM) DRAM_W=128
X410_XG_400:      DEFS += $(QSFP0_10GBE)   $(QSFP1_10GBE)  RF_BW=400  RF_CORE_400M=1 DRAM_BANKS=2 DRAM_CH=4*$(DRAM) DRAM_W=128
X410_X4_400:      DEFS += $(QSFP0_4X10GBE)                 RF_BW=400  RF_CORE_400M=1 DRAM_BANKS=2 DRAM_CH=4*$(DRAM) DRAM_W=128
X410_C1_400:      DEFS += $(QSFP0_100GBE)                  RF_BW=400  RF_CORE_400M=1 DRAM_BANKS=0 DRAM_CH=0
X410_UC_400:      DEFS +=                  $(QSFP1_100GBE) RF_BW=400  RF_CORE_400M=1 DRAM_BANKS=0 DRAM_CH=0
X410_CG_400:      DEFS += $(QSFP0_100GBE)  $(QSFP1_100GBE) RF_BW=400  RF_CORE_400M=1 DRAM_BANKS=0 DRAM_CH=0
X440_X4_200:      DEFS += $(QSFP0_4X10GBE)                 RF_BW=200  RF_CORE_FULL=1 DRAM_BANKS=0 DRAM_CH=0
X440_X1_400:      DEFS += $(QSFP0_10GBE)                   RF_BW=400  RF_CORE_FULL=1 DRAM_BANKS=2 DRAM_CH=8*$(DRAM) DRAM_W=128
X440_X4_400:      DEFS += $(QSFP0_4X10GBE)                 RF_BW=400  RF_CORE_FULL=1 DRAM_BANKS=2 DRAM_CH=8*$(DRAM) DRAM_W=128
X440_C1_400:      DEFS += $(QSFP0_100GBE)                  RF_BW=400  RF_CORE_FULL=1 DRAM_BANKS=0 DRAM_CH=0
X440_CG_400:      DEFS += $(QSFP0_100GBE)  $(QSFP1_100GBE) RF_BW=400  RF_CORE_FULL=1 DRAM_BANKS=0 DRAM_CH=0
X440_X1_1600:     DEFS += $(QSFP0_10GBE)                   RF_BW=1600 RF_CORE_FULL=1 DRAM_BANKS=2 DRAM_CH=2*$(DRAM) DRAM_W=512
X440_X4_1600:     DEFS += $(QSFP0_4X10GBE)                 RF_BW=1600 RF_CORE_FULL=1 DRAM_BANKS=2 DRAM_CH=2*$(DRAM) DRAM_W=512
X440_C1_1600:     DEFS += $(QSFP0_100GBE)                  RF_BW=1600 RF_CORE_FULL=1 DRAM_BANKS=0 DRAM_CH=0
X440_CG_1600:     DEFS += $(QSFP0_100GBE)  $(QSFP1_100GBE) RF_BW=1600 RF_CORE_FULL=1 DRAM_BANKS=0 DRAM_CH=0

# DRAM IP inclusion. Set to 1 to include DRAM memory controller in design, 0 to
# exclude it. Note that some targets exclude it regardless of this setting.
DRAM ?= 1

DEFS += $(OPTIONS)

# Initialize a build seed. This can be changed to randomly affect build results.
BUILD_SEED ?= 0
DEFS += BUILD_SEED=$(BUILD_SEED)

# Default value for incremental Vivado build is disabled. 
INCR_BUILD ?= 0

# Defaults specific to the various targets:
X410_200_DEFAULTS     := DEFAULT_RFNOC_IMAGE_CORE_FILE=x410_200_rfnoc_image_core.v     DEFAULT_EDGE_FILE=$(abspath x410_200_static_router.hex)
X410_X4C_200_DEFAULTS := DEFAULT_RFNOC_IMAGE_CORE_FILE=x410_x4c_200_rfnoc_image_core.v DEFAULT_EDGE_FILE=$(abspath x410_x4c_200_static_router.hex)
X410_CG_200_DEFAULTS  := DEFAULT_RFNOC_IMAGE_CORE_FILE=x410_cg_200_rfnoc_image_core.v  DEFAULT_EDGE_FILE=$(abspath x410_cg_200_static_router.hex)
X410_400_DEFAULTS     := DEFAULT_RFNOC_IMAGE_CORE_FILE=x410_400_rfnoc_image_core.v     DEFAULT_EDGE_FILE=$(abspath x410_400_static_router.hex)
X410_400_D_DEFAULTS   := DEFAULT_RFNOC_IMAGE_CORE_FILE=x410_400_d_rfnoc_image_core.v   DEFAULT_EDGE_FILE=$(abspath x410_400_d_static_router.hex)
X440_200_DEFAULTS     := DEFAULT_RFNOC_IMAGE_CORE_FILE=x440_200_rfnoc_image_core.v     DEFAULT_EDGE_FILE=$(abspath x440_200_static_router.hex)
X440_400_DEFAULTS     := DEFAULT_RFNOC_IMAGE_CORE_FILE=x440_400_rfnoc_image_core.v     DEFAULT_EDGE_FILE=$(abspath x440_400_static_router.hex)
X440_400_D_DEFAULTS   := DEFAULT_RFNOC_IMAGE_CORE_FILE=x440_400_d_rfnoc_image_core.v   DEFAULT_EDGE_FILE=$(abspath x440_400_d_static_router.hex)
X440_1600_DEFAULTS    := DEFAULT_RFNOC_IMAGE_CORE_FILE=x440_1600_rfnoc_image_core.v    DEFAULT_EDGE_FILE=$(abspath x440_1600_static_router.hex)
X440_1600_D_DEFAULTS  := DEFAULT_RFNOC_IMAGE_CORE_FILE=x440_1600_d_rfnoc_image_core.v  DEFAULT_EDGE_FILE=$(abspath x440_1600_d_static_router.hex)

# Option to stop after RTL elaboration. Use this flag as a synthesis check.
ifndef TARGET
	ifdef CHECK
		TARGET = rtl
	else ifdef SYNTH
		TARGET = synth
	else
		TARGET = bin
	endif
endif
TOP ?= x4xx

# vivado_build($1=Device, $2=Definitions, $3=Defaults)
vivado_build = make -f Makefile.x4xx.inc $(TARGET) NAME=$@ ARCH=$(XIL_ARCH_$1) PART_ID=$(XIL_PART_ID_$1) $2 TOP_MODULE=$(TOP) EXTRA_DEFS="$2" $3 INCR_BUILD=$(INCR_BUILD)
vivado_ip    = make -f Makefile.x4xx.inc viv_ip    NAME=$@ ARCH=$(XIL_ARCH_$1) PART_ID=$(XIL_PART_ID_$1) $2 TOP_MODULE=$(TOP) EXTRA_DEFS="$2" $3

# vivado_build($1=Device, $2=Option)
ifeq ($(TARGET),bin)
	post_build = @\
		mkdir -p build; \
		echo "Exporting bitstream file..."; \
		cp $(BUILD_BASE_DIR)/build-$(1)_$(2)/x4xx.bit build/usrp_`echo $(1) | tr A-Z a-z`_fpga_$(2).bit; \
		echo "Exporting build report..."; \
		cp $(BUILD_BASE_DIR)/build-$(1)_$(2)/build.rpt build/usrp_`echo $(1) | tr A-Z a-z`_fpga_$(2).rpt; \
		echo "Build DONE ... $(1)_$(2)";
else
	post_build = @echo "Skipping bitfile export."
endif

##
##Available Targets
##-------------|-----------|----|-----------------|-----------------|------------
##Target       | Bandwidth | Ch | QSFP0           | QSFP1           | DRAM
##-------------|-----------|----|-----------------|-----------------|------------
##X410_X1_100  | 100 MHz   | 4  | 10 GbE (Lane 0) | Unused          | 64b x 4 Ch
##X410_XG_100  | 100 MHz   | 4  | 10 GbE (Lane 0) | 10 GbE (Lane 0) | 64b x 4 Ch
##X410_X4_100  | 100 MHz   | 4  | 4 x 10 GbE      | Unused          | 64b x 4 Ch
##X410_X4C_100 | 100 MHz   | 4  | 4 x 10 GbE      | 100 GbE         | Unused
##X410_C1_100  | 100 MHz   | 4  | 100 GbE         | Unused          | 64b x 4 Ch
##X410_UC_100  | 100 MHz   | 4  | Unused          | 100 GbE         | 64b x 4 Ch
##X410_X1_200  | 200 MHz   | 4  | 10 GbE (Lane 0) | Unused          | 64b x 4 Ch
##X410_XG_200  | 200 MHz   | 4  | 10 GbE (Lane 0) | 10 GbE (Lane 0) | 64b x 4 Ch
##X410_X4_200  | 200 MHz   | 4  | 4 x 10 GbE      | Unused          | 64b x 4 Ch
##X410_X4C_200 | 200 MHz   | 4  | 4 x 10 GbE      | 100 GbE         | Unused
##X410_C1_200  | 200 MHz   | 4  | 100 GbE         | Unused          | 64b x 4 Ch
##X410_UC_200  | 200 MHz   | 4  | Unused          | 100 GbE         | 64b x 4 Ch
##X410_X1_400  | 400 MHz   | 4  | 10 GbE (Lane 0) | Unused          | 128b x 4 Ch
##X410_XG_400  | 400 MHz   | 4  | 10 GbE (Lane 0) | 10 GbE (Lane 0) | 128b x 4 ch
##X410_X4_400  | 400 MHz   | 4  | 4 x 10 GbE      | Unused          | 128b x 4 Ch
##X410_C1_400  | 400 MHz   | 4  | 100 GbE         | Unused          | Unused
##X410_UC_400  | 400 MHz   | 4  | Unused          | 100 GbE         | Unused
##X410_CG_400  | 400 MHz   | 4  | 100 GbE         | 100 GbE         | Unused
##X440_X1_400  | 400 MHz   | 8  | 10 GbE (Lane 0) | Unused          | 128b x 8 Ch
##X440_X4_400  | 400 MHz   | 8  | 4 x 10 GbE      | Unused          | 128b x 8 Ch
##X440_C1_400  | 400 MHz   | 8  | 100 GbE         | Unused          | Unused
##X440_CG_400  | 400 MHz   | 8  | 100 GbE         | 100 GbE         | Unused
##X440_X1_1600 | 1.6 GHz   | 2  | 10 GbE (Lane 0) | Unused          | 512b x 2 Ch
##X440_X4_1600 | 1.6 GHz   | 2  | 4 x 10 GbE      | Unused          | 512b x 2 Ch
##X440_C1_1600 | 1.6 GHz   | 2  | 100 GbE         | Unused          | Unused
##X440_CG_1600 | 1.6 GHz   | 2  | 100 GbE         | 100 GbE         | Unused
##* Note: Not all targets are shipped with UHD
##* Note: Some YAML configurations might not use all available DRAM channels.

X410_X1_100: X410_IP build/usrp_x410_fpga_X1_100.dts
	$(call vivado_build,X410,$(DEFS) X410=1,$(X410_200_DEFAULTS))
	$(call post_build,X410,X1_100)

X410_XG_100: X410_IP build/usrp_x410_fpga_XG_100.dts
	$(call vivado_build,X410,$(DEFS) X410=1,$(X410_200_DEFAULTS))
	$(call post_build,X410,XG_100)

X410_X4_100: X410_IP build/usrp_x410_fpga_X4_100.dts
	$(call vivado_build,X410,$(DEFS) X410=1,$(X410_200_DEFAULTS))
	$(call post_build,X410,X4_100)

X410_X4C_100: X410_IP build/usrp_x410_fpga_X4C_100.dts
	$(call vivado_build,X410,$(DEFS) X410=1,$(X410_X4C_200_DEFAULTS))
	$(call post_build,X410,X4C_100)

X410_C1_100: X410_IP build/usrp_x410_fpga_C1_100.dts
	$(call vivado_build,X410,$(DEFS) X410=1,$(X410_CG_200_DEFAULTS))
	$(call post_build,X410,C1_100)

X410_UC_100: X410_IP build/usrp_x410_fpga_UC_100.dts
	$(call vivado_build,X410,$(DEFS) X410=1,$(X410_CG_200_DEFAULTS))
	$(call post_build,X410,UC_100)

X410_X1_200: X410_IP build/usrp_x410_fpga_X1_200.dts
	$(call vivado_build,X410,$(DEFS) X410=1,$(X410_200_DEFAULTS))
	$(call post_build,X410,X1_200)

X410_XG_200: X410_IP build/usrp_x410_fpga_XG_200.dts
	$(call vivado_build,X410,$(DEFS) X410=1,$(X410_200_DEFAULTS))
	$(call post_build,X410,XG_200)

X410_X4_200: X410_IP build/usrp_x410_fpga_X4_200.dts
	$(call vivado_build,X410,$(DEFS) X410=1,$(X410_200_DEFAULTS))
	$(call post_build,X410,X4_200)

X410_X4C_200: X410_IP build/usrp_x410_fpga_X4C_200.dts
	$(call vivado_build,X410,$(DEFS) X410=1,$(X410_X4C_200_DEFAULTS))
	$(call post_build,X410,X4C_200)

X410_C1_200: X410_IP build/usrp_x410_fpga_C1_200.dts
	$(call vivado_build,X410,$(DEFS) X410=1,$(X410_CG_200_DEFAULTS))
	$(call post_build,X410,C1_200)

X410_UC_200: X410_IP build/usrp_x410_fpga_UC_200.dts
	$(call vivado_build,X410,$(DEFS) X410=1,$(X410_CG_200_DEFAULTS))
	$(call post_build,X410,UC_200)

X410_X1_400: X410_IP build/usrp_x410_fpga_X1_400.dts
	$(call vivado_build,X410,$(DEFS) X410=1,$(X410_400_D_DEFAULTS))
	$(call post_build,X410,X1_400)

X410_XG_400: X410_IP build/usrp_x410_fpga_XG_400.dts
	$(call vivado_build,X410,$(DEFS) X410=1,$(X410_400_D_DEFAULTS))
	$(call post_build,X410,XG_400)

X410_X4_400: X410_IP build/usrp_x410_fpga_X4_400.dts
	$(call vivado_build,X410,$(DEFS) X410=1,$(X410_400_D_DEFAULTS))
	$(call post_build,X410,X4_400)

X410_C1_400: X410_IP build/usrp_x410_fpga_C1_400.dts
	$(call vivado_build,X410,$(DEFS) X410=1,$(X410_400_DEFAULTS))
	$(call post_build,X410,C1_400)

X410_UC_400: X410_IP build/usrp_x410_fpga_UC_400.dts
	$(call vivado_build,X410,$(DEFS) X410=1,$(X410_400_DEFAULTS))
	$(call post_build,X410,UC_400)

X410_CG_400: X410_IP build/usrp_x410_fpga_CG_400.dts
	$(call vivado_build,X410,$(DEFS) X410=1,$(X410_400_DEFAULTS))
	$(call post_build,X410,CG_400)

X440_X4_200: X440_IP build/usrp_x440_fpga_X4_200.dts
	$(call vivado_build,X440,$(DEFS) X440=1,$(X440_200_DEFAULTS))
	$(call post_build,X440,X4_200)

X440_X1_400: X440_IP build/usrp_x440_fpga_X1_400.dts
	$(call vivado_build,X440,$(DEFS) X440=1,$(X440_400_D_DEFAULTS))
	$(call post_build,X440,X1_400)

X440_X4_400: X440_IP build/usrp_x440_fpga_X4_400.dts
	$(call vivado_build,X440,$(DEFS) X440=1,$(X440_400_D_DEFAULTS))
	$(call post_build,X440,X4_400)

X440_C1_400: X440_IP build/usrp_x440_fpga_C1_400.dts
	$(call vivado_build,X440,$(DEFS) X440=1,$(X440_400_DEFAULTS))
	$(call post_build,X440,C1_400)

X440_CG_400: X440_IP build/usrp_x440_fpga_CG_400.dts
	$(call vivado_build,X440,$(DEFS) X440=1,$(X440_400_DEFAULTS))
	$(call post_build,X440,CG_400)

X440_X1_1600: X440_IP build/usrp_x440_fpga_X1_1600.dts
	$(call vivado_build,X440,$(DEFS) X440=1,$(X440_1600_D_DEFAULTS))
	$(call post_build,X440,X1_1600)

X440_X4_1600: X440_IP build/usrp_x440_fpga_X4_1600.dts
	$(call vivado_build,X440,$(DEFS) X440=1,$(X440_1600_D_DEFAULTS))
	$(call post_build,X440,X4_1600)

X440_C1_1600: X440_IP build/usrp_x440_fpga_C1_1600.dts
	$(call vivado_build,X440,$(DEFS) X440=1,$(X440_1600_DEFAULTS))
	$(call post_build,X440,C1_1600)

X440_CG_1600: X440_IP build/usrp_x440_fpga_CG_1600.dts
	$(call vivado_build,X440,$(DEFS) X440=1,$(X440_1600_DEFAULTS))
	$(call post_build,X440,CG_1600)

##
##Experimental Targets
##-------------|-----------|----|-----------------|-----------------|------------
##Target       | Bandwidth | Ch | QSFP0           | QSFP1           | DRAM
##-------------|-----------|----|-----------------|-----------------|------------
##X410_CG_200  | 200       | 4  | 100 GbE         | 100 GbE         | 64b x 4 Ch

X410_CG_200: X410_IP build/usrp_x410_fpga_CG_200.dts
	$(call vivado_build,X410,$(DEFS) X410=1,$(X410_CG_200_DEFAULTS))
	$(call post_build,X410,CG_200)

##
##Other Make Targets
##------------------

.DEFAULT_GOAL := all

all:          X410_X4_200 X410_CG_400 X410_UC_200 X440_X4_200 X440_X4_400 X440_CG_400 X440_X4_1600 X440_CG_1600 ##(Default targets)

X410_IP:      ##Build IP only.
	+$(call vivado_ip,X410,$(DEFS) X410=1)

X440_IP:      ##Build IP only.
	+$(call vivado_ip,X440,$(DEFS) X440=1)

build/usrp_x410%.dts: dts/*.dts dts/*.dtsi
	-mkdir -p build
	tools/parse_versions_for_dts.py \
		--input regmap/x410/versioning_regs_regmap_utils.vh \
		--output dts/x410-version-info.dtsi \
		--components fpga,cpld_ifc,db_gpio_ifc,rf_core_100m,rf_core_400m
	${CC} -o $@ -C -E -I dts -nostdinc -undef -x assembler-with-cpp -D__DTS__ \
		$$(python3 tools/get_dts_input.py --target $@)

build/usrp_x440%.dts: dts/*.dts dts/*.dtsi
	-mkdir -p build
	tools/parse_versions_for_dts.py \
		--input regmap/x440/versioning_regs_regmap_utils.vh \
		--output dts/x440-version-info.dtsi \
		--components fpga,cpld_ifc,db_gpio_ifc,rf_core_full
	${CC} -o $@ -C -E -I dts -nostdinc -undef -x assembler-with-cpp -D__DTS__ \
		$$(python3 tools/get_dts_input.py --target $@)

clean:        ##Clean up all target build outputs.
	@echo "Cleaning targets..."
	@rm -rf build-X4*
	@rm -rf build

cleanall:     ##Clean up all target and IP build outputs.
	@echo "Cleaning targets and IP..."
	@rm -rf build-ip
	@rm -rf build-X4*
	@rm -rf build

help:         ##Show this help message.
	@grep -h "##" Makefile | grep -v "\"##\"" | sed -e 's/\\$$//' | sed -e 's/##//'

##
##Supported Options
##-----------------
##INCR_BUILD=0   Use incremental Vivado build to speed up consecutive runs
##DRAM=0         Exclude DDR4 memory controller IP from the FPGA build.
##GUI=1          Launch the build in the Vivado GUI.
##PROJECT=1      Save Vivado project file, otherwise it's created in memory.
##CHECK=1        Launch the syntax checker instead of building a bitfile.
##SYNTH=1        Launch the build but stop after synthesis.
##BUILD_SEED=<N> Build seed to used to affect build results. (Default is 0)
##TOP=<module>   Specify a top module for syntax checking. (Default is the bitfile top)

.PHONY: all clean cleanall help