# Copyright 2022 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

IREE_SRC:=$(ROOTDIR)/toolchain/iree
TOOLCHAINRV32_PATH:=$(CACHE)/toolchain_iree_rv32imf
IREE_COMPILER_DIR:=${CACHE}/iree_compiler

IREE_RUNTIME_ROOT:=$(ROOTDIR)/sw/vec_iree
MODEL_SRC_DIR:=$(ROOTDIR)/ml/ml-models-public
IREE_RUNTIME_OUT=$(OUT)/springbok_iree
IREE_RUNTIME_NO_WMMU_OUT=$(OUT)/springbok_iree_no_wmmu

MODEL_INTERNAL_SRC_DIR:=$(ROOTDIR)/ml/ml-models
IREE_RUNTIME_INTERNAL_OUT=$(OUT)/springbok_iree_internal
IREE_RUNTIME_INTERNAL_NO_WMMU_OUT=$(OUT)/springbok_iree_internal_no_wmmu

RV32_EXE_LINKER_FLAGS=-Wl,--print-memory-usage

RV32_COMPILER_FLAGS=-g3 \
    -ggdb

# The following targets are always rebuilt when the iree target is made

iree_check:
	@if echo "$${PIN_TOOLCHAINS}" |grep -qw 'iree'; then \
        echo "****************************************************"; \
        echo "*                                                  *"; \
        echo "*  PIN_TOOLCHAINS includes iree! Skipping the      *"; \
        echo "*  download of the latest IREE compiler binaries.  *"; \
        echo "*  Please DO NOT file bugs for IREE mis-behavior!  *"; \
        echo "*                                                  *"; \
        echo "****************************************************"; \
	else \
		echo Updating $(IREE_SRC) submodules...; \
		git -C $(IREE_SRC) submodule sync && \
	  		git -C $(IREE_SRC) submodule update --init --jobs=8 --depth=10; \
	fi

$(IREE_COMPILER_DIR)/build.ninja: | iree_check
	cmake -G Ninja -B $(IREE_COMPILER_DIR) \
	    -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ \
	    -DCMAKE_BUILD_TYPE=RelWithDebInfo \
	    -DCMAKE_INSTALL_PREFIX=$(IREE_COMPILER_DIR)/install \
	    -DIREE_BUILD_TESTS=OFF \
	    $(IREE_SRC)

## Builds the IREE compiler from source and records the HEAD commit ID
iree_compiler_src: $(IREE_COMPILER_DIR)/build.ninja | iree_check
	cmake --build $(IREE_COMPILER_DIR) --target install
	git -C "$(IREE_SRC)" rev-parse HEAD > $(IREE_COMPILER_DIR)/tag

$(IREE_COMPILER_DIR):
	mkdir -p $(IREE_COMPILER_DIR)

## Downloads the latest release of the IREE compiler and tflite tools.
#
# The release tag and commit are recorded for consistency checks in
# the `iree_runtime` target. The outputs of this target are placed in
# out/host/iree_compiler.
#
iree_compiler: | $(IREE_COMPILER_DIR)
	$(ROOTDIR)/scripts/download_iree_compiler.py --iree_compiler_dir "$(IREE_COMPILER_DIR)" --tag_name candidate-20240909.1011
iree_commit_check:
	$(ROOTDIR)/scripts/check-iree-commit.sh "$(IREE_SRC)" "$(IREE_COMPILER_DIR)"

IREE_RUNTIME_DEFAULT_CONFIG :=\
	-DCMAKE_TOOLCHAIN_FILE="$(IREE_RUNTIME_ROOT)/cmake/riscv_iree.cmake" \
	-DCMAKE_BUILD_TYPE=MinSizeRel \
	-DIREE_HOST_BIN_DIR="$(IREE_COMPILER_DIR)/install/bin" \
	-DRISCV_TOOLCHAIN_ROOT=$(TOOLCHAINRV32_PATH) \
	-DRISCV_COMPILER_FLAGS="$(RV32_COMPILER_FLAGS)" \
	-DCMAKE_EXE_LINKER_FLAGS="$(RV32_EXE_LINKER_FLAGS)" \
	-DBUILD_WITH_KELVIN=OFF

IREE_RUNTIME_CONFIG :=\
	$(IREE_RUNTIME_DEFAULT_CONFIG) \
	-DBUILD_NO_WMMU=OFF \
	-DPRINT_IREE_STATS=OFF

IREE_RUNTIME_NO_WMMU_CONFIG :=\
	$(IREE_RUNTIME_DEFAULT_CONFIG) \
	-DBUILD_NO_WMMU=ON \
	-DPRINT_IREE_STATS=ON \
	-DSPRINGBOK_LINKER_SCRIPT=$(realpath $(ROOTDIR)/sw/vec/springbok/springbok_no_wmmu.ld)

$(IREE_RUNTIME_OUT)/build.ninja: | iree_compiler iree_check iree_commit_check
	cmake -G Ninja -B $(IREE_RUNTIME_OUT) \
	    $(IREE_RUNTIME_CONFIG) \
	    $(MODEL_SRC_DIR)

## Model artifact used in cantrip-builtins-*
#
# IREE executables used in cantrip-builtins-*
iree_model_builtins: $(IREE_RUNTIME_OUT)/build.ninja | iree_check iree_commit_check
	PYTHONPATH=$(IREE_COMPILER_DIR) cmake --build $(IREE_RUNTIME_OUT) --target \
		quant_models/mobilenet_v1_emitc_static

$(IREE_RUNTIME_INTERNAL_OUT)/build.ninja: | iree_check iree_commit_check
	cmake -G Ninja -B $(IREE_RUNTIME_INTERNAL_OUT) \
	    $(IREE_RUNTIME_CONFIG) \
	    $(MODEL_INTERNAL_SRC_DIR)

$(IREE_RUNTIME_NO_WMMU_OUT)/build.ninja: | iree_check iree_commit_check
	cmake -G Ninja -B $(IREE_RUNTIME_NO_WMMU_OUT) \
	    $(IREE_RUNTIME_NO_WMMU_CONFIG) \
	    $(MODEL_SRC_DIR)

$(IREE_RUNTIME_INTERNAL_NO_WMMU_OUT)/build.ninja: | iree_check iree_commit_check
	cmake -G Ninja -B $(IREE_RUNTIME_INTERNAL_NO_WMMU_OUT) \
	    $(IREE_RUNTIME_NO_WMMU_CONFIG) \
	    $(MODEL_INTERNAL_SRC_DIR)

## Installs the IREE runtime applications.
#
# Unlike the `iree_compiler` target, this target actually builds the runtime
# from source in toolchain/iree. The results of the build are placed in
# out/springbok_iree.
#
# In general, you probably want the `iree` target instead, which combines
# `iree_compiler` and `iree_runtime`.
iree_runtime: $(IREE_RUNTIME_OUT)/build.ninja | iree_check iree_commit_check
	PYTHONPATH=$(IREE_COMPILER_DIR) cmake --build $(IREE_RUNTIME_OUT)

## Installs the IREE compiler and its runtime applications.
iree: iree_compiler iree_runtime

## Installs the IREE runtime internal applications.
#
# Unlike the `iree_runtime` target, this target builds the runtime application
# for internal models. The results of the build are placed in
# out/springbok_iree_internal.
#
# In general, you probably want the `iree_runtime` target instead.
iree_runtime_internal: $(IREE_RUNTIME_INTERNAL_OUT)/build.ninja | \
		iree_check iree_commit_check
	PYTHONPATH=$(IREE_COMPILER_DIR) cmake --build $(IREE_RUNTIME_INTERNAL_OUT)

## Installs the IREE compiler and internal runtime applications.
#
# In general, you probably want to run `iree` target to build the public
# applications.
iree_internal: iree_compiler iree_runtime_internal

## Installs the IREE runtime applications, built without WMMU support.
iree_runtime_no_wmmu: $(IREE_RUNTIME_NO_WMMU_OUT)/build.ninja | iree_check iree_commit_check
	PYTHONPATH=$(IREE_COMPILER_DIR) cmake --build $(IREE_RUNTIME_NO_WMMU_OUT)

## Installs the IREE compiler and its runtime applications without WMMU, for single core testing.
iree_no_wmmu: iree_compiler iree_runtime_no_wmmu

## Installs the IREE runtime internal applications, built without WMMU support.
iree_internal_runtime_no_wmmu: $(IREE_RUNTIME_INTERNAL_NO_WMMU_OUT)/build.ninja | iree_check iree_commit_check
	PYTHONPATH=$(IREE_COMPILER_DIR) cmake --build $(IREE_RUNTIME_INTERNAL_NO_WMMU_OUT)

## Installs the IREE compiler and its runtime applications without WMMU, for single core testing.
iree_internal_no_wmmu: iree_compiler iree_internal_runtime_no_wmmu

## Clean IREE compiler and runtime applications.
iree_clean:
	rm -rf $(IREE_COMPILER_DIR) $(IREE_RUNTIME_OUT) $(IREE_RUNTIME_NO_WMMU_OUT)

## Clean IREE compiler and runtime application of internal models
iree_internal_clean:
	rm -rf $(IREE_COMPILER_DIR) $(IREE_RUNTIME_INTERNAL_OUT) $(IREE_RUNTIME_INTERNAL_NO_WMMU_OUT)

.PHONY:: iree iree_check iree_compiler iree_runtime iree_clean
.PHONY:: iree_commit_check iree_compiler_src
.PHONY:: iree_runtime_internal iree_internal iree_internal_clean
.PHONY:: iree_runtime_no_wmmu iree_no_wmmu iree_internal_runtime_no_wmmu iree_internal_no_wmmu
.PHONY:: iree_model_builtins
