aboutsummaryrefslogblamecommitdiff
path: root/build/Makefile.vivado
blob: 557eca25a9207cfd4588e9561e7642721b4ed299 (plain) (tree)
















































































































































































                                                                                                                                 
# Localize all the relative path awfulness in one variable.

CORE_TREE	:= $(abspath ../../..)

# Parameters

project		?= alpha_fmc
top_module	= alpha_fmc_top
board		= alpha
part		= xc7a200tfbg484-1

# Project configuration

CONFIG          = $(CORE_TREE)/platform/common/config
CONFIG_PROJECT	= hsm
CONFIG_GEN      = $(CONFIG)/core_config.py -c $(CONFIG)/core.cfg -b $(board)


# Intermediate TCL stuff

tcl_warning_message	= generated automatically, don't edit

tcl_create_project		= create_project.tcl
tcl_run_synthesis		= run_synthesis.tcl
tcl_run_implementation	= run_implementation.tcl
tcl_generate_bitstream	= generate_bitstream.tcl

# Project settings

proj_sources_set		= sources_1
proj_constraints_set	= constrs_1
proj_synthesis_run		= synth_1
proj_implementation_run	= impl_1

# Extra command line options

vivado_options = -nojournal -nolog

# Helper variables

synth_run					= $(project).runs/$(proj_synthesis_run)
impl_run					= $(project).runs/$(proj_implementation_run)

# Implementation constraints

xdcfiles = \
	$(CORE_TREE)/platform/$(board)/xdc/$(project)_clocks.xdc \
	$(CORE_TREE)/platform/$(board)/xdc/$(project)_pinout.xdc \
	$(CORE_TREE)/platform/$(board)/xdc/$(project)_timing.xdc

# Verilog include directories, if needed

vlogincdirs = \
	$(CORE_TREE)/lib/lowlevel \
	$(CORE_TREE)/math/ecdsalib/rtl/microcode \
	$(CORE_TREE)/lib/util

# Verilog files that always go with builds on this platform.

vfiles = \
	$(CORE_TREE)/platform/alpha/rtl/alpha_fmc_top.v \
	$(CORE_TREE)/platform/alpha/rtl/alpha_regs.v \
	$(CORE_TREE)/platform/alpha/rtl/alpha_clkmgr.v \
	$(CORE_TREE)/platform/alpha/rtl/clkmgr_mmcm.v \
	$(CORE_TREE)/platform/alpha/rtl/clkmgr_mmcm_ctrl.v \
	./core_selector.v \
	$(CORE_TREE)/platform/alpha/rtl/clkmgr_reset_gen.v \
	$(CORE_TREE)/platform/common/extra/reset_replicator.v \
	$(CORE_TREE)/comm/fmc/src/rtl/fmc_arbiter.v \
	$(CORE_TREE)/comm/fmc/src/rtl/fmc_d_phy.v \
	$(CORE_TREE)/comm/fmc/src/rtl/fmc_indicator.v \
	$(CORE_TREE)/comm/fmc/src/rtl/fmc_regs.v

# Verilog files selected by the core configuration script.

-include ./core_vfiles.mk

# List of Vivado's intermediate files and helper files

junk = \
	$(tcl_create_project) \
	$(tcl_run_synthesis) \
	$(tcl_run_implementation) \
	$(tcl_generate_bitstream) \
	$(project).*/ \
	usage_statistics_webtalk.xml\
	.Xil/



.PHONY: all clean distclean

# default target is to build a bitstream

all: $(top_module).bit

# recipe to generate "xilinx project" (.xpr) file

$(project).xpr:
	# create helper tcl file
	echo "# $(tcl_warning_message)" > $(tcl_create_project)
	# add create_project command
	echo "create_project -force -part $(part) $(project)" >> $(tcl_create_project)
	# add sources and constraints
	for z in $(vfiles); do echo "add_files -fileset $(proj_sources_set) $$z" >> $(tcl_create_project); done
	for z in $(xdcfiles); do echo "add_files -fileset $(proj_constraints_set) $$z" >> $(tcl_create_project); done
	# add include directories
	echo "set_property include_dirs {$(vlogincdirs)} [get_filesets $(proj_sources_set)]" >> $(tcl_create_project)
	# invoke vivado
	vivado -mode batch $(vivado_options) -source $(tcl_create_project)

# recipe to run synthesis, this should produce "design check point" (.dcp) file

$(synth_run)/$(top_module).dcp: $(project).xpr $(vfiles) $(xdcfiles)
	# create helper tcl file
	echo "# $(tcl_warning_message)" > $(tcl_run_synthesis)
	# add open_project command
	echo "open_project $(project).xpr" >> $(tcl_run_synthesis)
	# reset synthesis run
	echo "reset_run $(proj_synthesis_run)" >> $(tcl_run_synthesis)
	# launch synthesis run and wait for it to finish
	echo "launch_runs $(proj_synthesis_run)" >> $(tcl_run_synthesis)
	echo "wait_on_run $(proj_synthesis_run)" >> $(tcl_run_synthesis)
	# invoke vivado
	vivado -mode batch $(vivado_options) -source $(tcl_run_synthesis)
	# for some reason vivado seems to overwrite the project file when exiting,
	# which causes .xpr to appear newer, than the corresponding .dcp and gets
	# make to always re-run synthesis, even if the .dcp is already available
	# the quick and dirty workaround is to clone the .dcp's date to .xpr
	touch -r $(synth_run)/$(top_module).dcp $(project).xpr

# recipe to run implementation, this should produce another routed "design check point" (.dcp) file

$(impl_run)/$(top_module)_routed.dcp: $(synth_run)/$(top_module).dcp
	# create helper tcl file
	echo "# $(tcl_warning_message)" > $(tcl_run_implementation)
	# add open_project command
	echo "open_project $(project).xpr" >> $(tcl_run_implementation)
	# reset synthesis run
	echo "reset_run $(proj_implementation_run)" >> $(tcl_run_implementation)
	# launch synthesis run and wait for it to finish
	echo "launch_runs $(proj_implementation_run)" >> $(tcl_run_implementation)
	echo "wait_on_run $(proj_implementation_run)" >> $(tcl_run_implementation)
	# invoke vivado
	vivado -mode batch $(vivado_options) -source $(tcl_run_implementation)
	# same thing as for synthesis, counteract vivado's stupid project file overwriting
	touch -r $(synth_run)/$(top_module).dcp $(project).xpr

# recipe to build the bitstream (.bit) from routed checkpoint

$(top_module).bit: $(impl_run)/$(top_module)_routed.dcp
	# create helper tcl file
	echo "# $(tcl_warning_message)" > $(tcl_generate_bitstream)
	# add open_project command
	echo "open_project $(project).xpr" >> $(tcl_generate_bitstream)
	# add open_run command
	echo "open_run $(proj_implementation_run)" >> $(tcl_generate_bitstream)
	# enable compression
	echo "set_property BITSTREAM.GENERAL.COMPRESS TRUE [get_designs $(proj_implementation_run)]" >> $(tcl_generate_bitstream)
	# add write_bitstream command
	echo "write_bitstream -force $(top_module).bit" >> $(tcl_generate_bitstream)
	# invoke vivado
	vivado -mode batch $(vivado_options) -source $(tcl_generate_bitstream)
	# same thing as for synthesis and implementation, counteract vivado's stupid project file overwriting
	touch -r $(synth_run)/$(top_module).dcp $(project).xpr

# Build the default core_selector if it doesn't already exist.

core_selector.v core_vfiles.mk:
	$(CONFIG_GEN) -p $(CONFIG_PROJECT)

# clean
clean: 
	rm -rf $(junk)

distclean: clean
	rm core_selector.v core_vfiles.mk