CFLAGS_      = -O3
LDFLAGS      =
MCC_FLAGS_   = -k --ompss --variable=disable_final_clause_transformation:1
MCC_FLAGS_I_ = --instrument --fpga-instrumentation-buffer-size
MCC_FLAGS_D_ = --debug -g
LDFLAGS_     = $(LDFLAGS)

PROGRAM_ = matrix_vector_block_mult

MCC               ?= fpgacc
CROSS_COMPILE_ZED ?= arm-linux-gnueabihf-
MCC_               = $(CROSS_COMPILE_ZED)$(MCC)

BOARD = zedboard
# BOARD = zcu102
FPGA_CLOCK_I = 100
FPGA_CLOCK_P = 100
.PHONY: HLS_i HLS_p bitstream_fpga_i bitstream_fpga_p bitstream_smp_fpga_i bitstream_smp_fpga_p smp clean

HLS_i: $(PROGRAM_).c Makefile
	mkdir -p ${PWD}/$(BOARD)_HLS_i
	$(MCC_) $(CFLAGS_) $(MCC_FLAGS_) $(MCC_FLAGS_I_) --bitstream-generation \
	--Wf,"--verbose,--name=$(PROGRAM_)_HLS_i,--dir=${PWD}/$(BOARD)_HLS_i,--board=$(BOARD),--hwruntime=som,--clock=$(FPGA_CLOCK_I),--to_step=HLS" \
        $< -o $(PROGRAM_)_HLS_i $(LDFLAGS_)
	rm -rf arm* *.cpp

HLS_p: $(PROGRAM_).c Makefile
	mkdir -p ${PWD}/$(BOARD)_HLS_p
	$(MCC_) $(CFLAGS_) $(MCC_FLAGS_) --bitstream-generation \
	--Wf,"--verbose,--name=$(PROGRAM_)_HLS_p,--dir=${PWD}/$(BOARD)_HLS_p,--board=$(BOARD),--hwruntime=som,--clock=$(FPGA_CLOCK_P),--to_step=HLS" \
         $< -o $(PROGRAM_)_HLS_p $(LDFLAGS_)
	rm -rf arm* *.cpp

bitstream_fpga_i: $(PROGRAM_).c Makefile
	mkdir -p ${PWD}/$(BOARD)_fpga_i
	$(MCC_) $(CFLAGS_) $(MCC_FLAGS_) $(MCC_FLAGS_I_) --bitstream-generation \
	--Wf,"--verbose,--name=$(PROGRAM_)_fpga_i,--dir=${PWD}/$(BOARD)_fpga_i,--board=$(BOARD),--hwruntime=som,--clock=$(FPGA_CLOCK_I)" \
	$< -o $(PROGRAM_)_fpga_i $(LDFLAGS_)
	rm -rf arm* *.cpp

bitstream_fpga_p: $(PROGRAM_).c Makefile
	mkdir -p ${PWD}/$(BOARD)_fpga_p
	$(MCC_) $(CFLAGS_) $(MCC_FLAGS_) --bitstream-generation \
	--Wf,"--verbose,--name=$(PROGRAM_)_fpga_p,--dir=${PWD}/$(BOARD)_fpga_p,--board=$(BOARD),--hwruntime=som,--clock=$(FPGA_CLOCK_P)" \
	$< -o $(PROGRAM_)_fpga_p $(LDFLAGS_)
	rm -rf arm* *.cpp

smp: $(PROGRAM_).c Makefile
	$(MCC_) $(CFLAGS_) $(MCC_FLAGS_) -D_SMP_ \
        $< -o $(PROGRAM_)_smp $(LDFLAGS_)
	rm -rf arm* *.cpp

clean:
	rm -f *.o *~
	rm -f $(PROGRAM_)_HLS_i $(PROGRAM_)_fpga_i $(PROGRAM_)_smp_fpga_i $(PROGRAM_)_smp
	rm -f $(PROGRAM_)_HLS_p $(PROGRAM_)_fpga_p $(PROGRAM_)_smp_fpga_p
	rm -rf $(BOARD)_HLS_i $(BOARD)_fpga_i $(BOARD)_smp_fpga_i
	rm -rf $(BOARD)_HLS_p $(BOARD)_fpga_p $(BOARD)_smp_fpga_p
