#--enable-light-cdo --Xpreproc=-D__DEBUG__
	#--large-program-memory=1

PART=xc10AIE2P_ML-die-0x-e-S-es1
TARGET=hw
CFLAGS=--adf-api-log-level=8 --stacksize=4480 --heapsize=2496 \
	--enable-core-processor-bus=true \
	--disable-dma-autostart=true \
	--enable-partition=0:8 \
	--aie2ipu-base-addr=0 \
	--Xchess="main:backend.mist2.pnll=off" \
	--Xchess="main:backend.amnesia.rls=on" \
	--Xelfgen="-j `grep "^processor" /proc/cpuinfo | wc -l`" \
	--xlopt=0 \
	--enable-light-cdo
	#--large-program-memory=1 
	
	 
SFLAGS=--profile --dump-vcd=dump

BACKEND=Adf
OVERLAY=overlay_sdxl.py

TESTBENCH=tests/main.cpp
ifdef TXN

CFLAGS+=--Xpreproc="-DTXN_MODE=1"
BACKEND=Txn
endif

#--Xpreproc="-D{ident}={val}"'
#            directive('SQ_IN', M),
#            directive('DH_IN', K),
#            directive('SK_IN', N),
#            directive('DV_IN', L),

ifdef MHA_1
OVERLAY=src/generate_dataflow_4x8.py $(BACKEND) 1
CFLAGS+=--Xpreproc="-DMHA_1=1" 
CFLAGS+=--Xpreproc="-DSQ_IN=256"
CFLAGS+=--Xpreproc="-DDH_IN=64"
CFLAGS+=--Xpreproc="-DSK_IN=256"
CFLAGS+=--Xpreproc="-DDV_IN=64"
CFLAGS+=--Xpreproc="-DH_IN=1"
CFLAGS+=--Xpreproc="-DTEST_BENCH_DIR=model_data_256x64x256_256x256x64"
else ifdef MHA_2
OVERLAY=src/generate_dataflow_4x8.py $(BACKEND) 2
CFLAGS+=--Xpreproc="-DMHA_2=1"
CFLAGS+=--Xpreproc="-DSQ_IN=1024"
CFLAGS+=--Xpreproc="-DDH_IN=64"
CFLAGS+=--Xpreproc="-DSK_IN=1024"
CFLAGS+=--Xpreproc="-DDV_IN=64 
CFLAGS+=--Xpreproc="-DH_IN=1"
CFLAGS+=--Xpreproc="-DH_IN=1"
CFLAGS+=--Xpreproc="-DTEST_BENCH_DIR=model_data_1024x64x1024_1024x1024x64"
else ifdef MHA_3
OVERLAY=src/generate_dataflow_4x8.py $(BACKEND) 3
CFLAGS+=--Xpreproc="-DMHA_3=1"
CFLAGS+=--Xpreproc="-DSQ_IN=256"
CFLAGS+=--Xpreproc="-DDH_IN=64"
CFLAGS+=--Xpreproc="-DSK_IN=256"
CFLAGS+=--Xpreproc="-DDV_IN=64"
CFLAGS+=--Xpreproc="-DH_IN=1"
CFLAGS+=--Xpreproc="-DTEST_BENCH_DIR=model_data_256x64x256_256x256x64"
else ifdef MHA_4
OVERLAY=src/generate_dataflow_4x8.py $(BACKEND) 4
CFLAGS+=--Xpreproc="-DMHA_4=1"
CFLAGS+=--Xpreproc="-DSQ_IN=1024"
CFLAGS+=--Xpreproc="-DDH_IN=64"
CFLAGS+=--Xpreproc="-DSK_IN=1024"
CFLAGS+=--Xpreproc="-DH_IN=1"
CFLAGS+=--Xpreproc="-DDV_IN=64 -DH_IN=1"
CFLAGS+=--Xpreproc="-DTEST_BENCH_DIR=model_data_1024x64x1024_1024x1024x64"
endif



ifdef TXN
#TESTBENCH=txn.cpp
#CFLAGS+=--adf-api-log-level=8 --stacksize=4480 --heapsize=2048 \
	--enable-core-processor-bus=true \
	--disable-dma-autostart=true \
	--enable-partition=0:8 \
	--aie2ipu-base-addr=0 \
	--Xelfgen="-j `grep "^processor" /proc/cpuinfo | wc -l`" \
    --enable-light-cdo

CFLAGS+=--Xpreproc="-DTXN_MODE=1"
endif

CUR_DIR=$(shell pwd)
WORK_DIR=Work
TXN_HW_BUILD_DIR=$(CUR_DIR)/../../dataflow/xclbin/HW_build_txn
TXN_BASE_XCLBIN=$(TXN_HW_BUILD_DIR)/simnow_base.xclbin
FP_TYPE_ISA="0800"
FP_VERSION="020500"
FP_CFG="1"
FP_GIT_HASH=$(shell git rev-parse --short=5 HEAD)
FP_UPDATE=$(shell printf "%d\n" 0x$(FP_TYPE_ISA)$(FP_VERSION)$(FP_CFG)$(FP_GIT_HASH))
PLATFORM_REPO_PATH=/proj/xbuilds/9999.0_plus_daily_latest/internal_platforms/
PLATFORM_NAME=xilinx_vck190_base_202420_1
TEST_INC=$(CUR_DIR)/../includes/
KERNEL_DIR=$(CUR_DIR)/../../kernels/
COMMON_DIR = $(CUR_DIR)/../../kernels/common
COMMON_INC_DIR = $(CUR_DIR)/../../kernels/include
default: all

all: clean build txn_hw_clean txn_update_fingerprint txn_full_pdi txn_xclbin sim

build:
	python3 $(OVERLAY)
	aiecompiler --target=$(TARGET) --part=$(PART) $(CFLAGS) $(TESTBENCH) --include=$(TEST_INC) --include=$(KERNEL_DIR) --include=$(COMMON_INC_DIR) --include=$(COMMON_DIR)
	sed -i 's/-ladf_api/-ladf_rt_ctrl_api -ladf_api/g' Work/ps/c_rts/systemC/Makefile
	make -C Work/ps/c_rts/systemC/ all

sim:
	aiesimulator $(SFLAGS)

clean:
	rm -rf aiesimulator_output Work .Xil *.log *.vpd *.vcd .AIE* pl_* temp hw_package \
		x86simulator_output libadf.a Map_Report.csv sol.db DVEfiles ISS_RPC_SERVER_PORT \
		dma.hpp \
		param.bin txn.bin ifm.bin wgt.bin ofm.bin

	rm -rf HW_build_txn/BOOT.BIN HW_build_txn/_x/ HW_build_txn/boot_image.bif HW_build_txn/full.pdi HW_build_txn/v++_temp.log HW_build_txn/xcd.log

txn_update_fingerprint:
	@echo 'update fingerprint to $(FP_UPDATE) in $(TXN_HW_BUILD_DIR)/aie_partition_8x4.json'
	@sed -i 's/\"inference_fingerprint\": \".*\",/\"inference_fingerprint\": \"$(FP_UPDATE)\",/g' $(TXN_HW_BUILD_DIR)/aie_partition_8x4.json

txn_full_pdi:
	${XILINX_VITIS}/bin/bootgen -arch versal -image $(TXN_HW_BUILD_DIR)/full_pdi.bif -o $(TXN_HW_BUILD_DIR)/full.pdi -w

txn_xclbin:
	cd $(TXN_HW_BUILD_DIR);\
	${XILINX_VITIS}/bin/v++ -p -f $(PLATFORM_REPO_PATH)/$(PLATFORM_NAME)/$(PLATFORM_NAME).xpfm -t $(TARGET) $(TXN_BASE_XCLBIN) $(CUR_DIR)/libadf.a -o $(TXN_HW_BUILD_DIR)/_x/temp.xclbin --advanced.param package.generateAieIpu=true
	xclbinutil --replace-section PDI:raw:$(TXN_HW_BUILD_DIR)/full.pdi -i $(TXN_HW_BUILD_DIR)/_x/temp.xclbin -o $(TXN_HW_BUILD_DIR)/_x/temp1.xclbin --force
	xclbinutil --input $(TXN_HW_BUILD_DIR)/_x/temp1.xclbin --add-kernel $(TXN_HW_BUILD_DIR)/add_kernel.json --output $(TXN_HW_BUILD_DIR)/_x/temp2.xclbin --force
	xclbinutil --input $(TXN_HW_BUILD_DIR)/_x/temp2.xclbin --add-section AIE_METADATA:JSON:$(CUR_DIR)/$(WORK_DIR)/ps/c_rts/aie_control_config.json -o $(TXN_HW_BUILD_DIR)/_x/temp3.xclbin --force
	xclbinutil --add-section "AIE_PARTITION[]:JSON:$(TXN_HW_BUILD_DIR)/aie_partition_8x4.json" -i $(TXN_HW_BUILD_DIR)/_x/temp3.xclbin -o $(TXN_HW_BUILD_DIR)/_x/8x4.xclbin --force
	mkdir ./hw_package
	cp -rf $(TXN_HW_BUILD_DIR)/_x/8x4.xclbin ./hw_package/.

txn_hw_clean:
	rm -rf $(TXN_HW_BUILD_DIR)/*.pdi $(TXN_HW_BUILD_DIR)/_x $(TXN_HW_BUILD_DIR)/*.log $(TXN_HW_BUILD_DIR)/*.bin $(TXN_HW_BUILD_DIR)/*.BIN $(TXN_HW_BUILD_DIR)/boot_image.bif
