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

ifeq ($(DISABLE_FAST_PM), 0)
	CFLAGS := $(CFLAGS) --gen-elf-ctrl-pkts
endif

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

default: all

ifeq ($(DISABLE_FAST_PM), 0)
all: build 
else
all: build txn_hw_clean txn_update_fingerprint txn_full_pdi txn_xclbin
endif

build:
	cd $(OUT_DIR);\
	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' $(OUT_DIR)/Work/ps/c_rts/systemC/Makefile
	make -C $(OUT_DIR)/Work/ps/c_rts/systemC/ all


sim:
	aiesimulator

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:
ifeq ($(DISABLE_FAST_PM), 1)
	cd $(OUT_DIR);\
	${XILINX_VITIS}/bin/bootgen -arch versal -image $(TXN_HW_BUILD_DIR)/full_pdi.bif -o $(TXN_HW_BUILD_DIR)/full.pdi -w
else
	cd $(OUT_DIR);\
	${XILINX_VITIS}/bin/bootgen -arch versal -image $(TXN_HW_BUILD_DIR)/full_pdi_fast_pm.bif -o $(TXN_HW_BUILD_DIR)/full.pdi -w
endif

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) $(OUT_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:$(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
