FILENAME=out.xclbin
CUR_DIR=$(shell pwd)
PART=xc10AIE2P_ML-die-0x-e-S-es1
TARGET=hw
CFLAGS=\
	--adf-api-log-level=3 \
	--stacksize=$(STACKSIZE) \
	--heapsize=$(HEAPSIZE) \
	--enable-core-processor-bus=true \
	--disable-dma-autostart=true \
	--include=$(CUR_DIR)/../../kernels \
	--include=$(CUR_DIR)/../../kernels/include \
	--include=$(CUR_DIR)/../../kernels/common \
	--include=$(CUR_DIR)/../../kernels/qdq \
	--enable-partition=0:8 \
	--Xchess="main:backend.mist2.pnll=off" \
	--Xpreproc=-D__AIE_API_WORKAROUND_CR_1223259__=1 \
    --enable-light-cdo \
	--aie2ipu-base-addr=0 \
	--Xpreproc="-D_main_init=_waic_main_init" \
	--Xelfgen="-j `grep "^processor" /proc/cpuinfo | wc -l`" \
	--xlopt=0
TESTBENCH=../xclbin/main.cpp
WORK_DIR=Work
TXN_HW_BUILD_DIR=$(CUR_DIR)/../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

SHELL := bash  # required for "export -f make" used in rule

default: all

all: build txn_hw_clean txn_update_fingerprint txn_full_pdi txn_xclbin

build:
	make() { patch_aiecompiler_make.py "$$@"; /usr/bin/make "$$@"; }; \
	export -f make; \
	aiecompiler --target=$(TARGET) --part=$(PART) $(CFLAGS) $(TESTBENCH)
	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

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 $(TXN_HW_BUILD_DIR)/BOOT.BIN $(TXN_HW_BUILD_DIR)/_x/ $(TXN_HW_BUILD_DIR)/boot_image.bif $(TXN_HW_BUILD_DIR)/full.pdi $(TXN_HW_BUILD_DIR)/v++_temp.log $(TXN_HW_BUILD_DIR)/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/$(FILENAME) --force
	cp $(TXN_HW_BUILD_DIR)/_x/$(FILENAME) .

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
