# Copyright 2025 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
#
#     http://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.

# Makefile for Kelvin UVM Testbench (Integrates with MPACT-Sim)

# Check if ROOTDIR is set. If not, exit with an error.
ifndef ROOTDIR
    $(error ROOTDIR is not set. Please define it, e.g., export ROOTDIR=$(abspath ../../../..))
endif

# User Configuration
VCS = vcs
CXX = clang++

# UVM DV Directories
RTL_DIR = ./rtl
COMMON_DIR = ./common
TB_DIR = ./tb
ENV_DIR = ./env
TESTS_DIR = ./tests
BIN_DIR = ./bin
UTILS_DIR = $(ROOTDIR)/hw/kelvin/utils

# Simulation Work Directory
SIM_DIR = ./sim_work
LOG_DIR = $(SIM_DIR)/logs
WAVE_DIR = $(SIM_DIR)/waves
MEM_FILE_DIR = $(SIM_DIR)/mem_files
RUN_OPTS_FILE = $(MEM_FILE_DIR)/elf_run_opts.f

# MPACT-Sim Integration Paths
MPACT_DIR = $(ROOTDIR)/sim/kelvin
MPACT_BAZEL_BIN_DIR = $(MPACT_DIR)/bazel-bin/sim/cosim
MPACT_COSIM_LIB_NAME = kelvin_cosim_lib_static

# File List for VCS -f option
FILE_LIST = ./kelvin_dv.f

# Simulation Settings
SIM_EXEC = $(SIM_DIR)/simv
UVM_TESTNAME ?= kelvin_base_test
TEST_ELF ?= $(BIN_DIR)/program.elf
UVM_VERBOSITY ?= UVM_MEDIUM
TEST_TIMEOUT_NS ?= 20000
PLUSARGS = +UVM_TESTNAME=$(UVM_TESTNAME) \
           +UVM_VERBOSITY=$(UVM_VERBOSITY) +TEST_TIMEOUT=$(TEST_TIMEOUT_NS) \
           +TEST_ELF=$(TEST_ELF)

# Waveform Dumping
DUMP_WAVES = 1
WAVE_FILE = $(WAVE_DIR)/$(UVM_TESTNAME).fsdb

# VCS Options
VCS_COMPILE_OPTS = \
	-full64 \
	-sverilog \
	+define+UVM_NO_DEPRECATED \
	-ntb_opts uvm-1.2 \
	-debug_access+all \
	-kdb \
	-timescale=1ns/1ps \
	-o $(SIM_EXEC)

# Add C++ compiler/linker options for MPACT-Sim
VCS_COMPILE_OPTS += \
    -cpp $(CXX) \
    -cppflags "-std=c++17" \
    -CFLAGS "-I$(MPACT_DIR)" \
    -L$(MPACT_BAZEL_BIN_DIR) \
    -l$(MPACT_COSIM_LIB_NAME)

VCS_RUN_OPTS = \
	$(PLUSARGS) \
	-f $(RUN_OPTS_FILE)

# Add define to COMPILE options for waveform dumping
ifeq ($(DUMP_WAVES),1)
VCS_COMPILE_OPTS += +define+DUMP_WAVES
VCS_RUN_OPTS += +fsdb+all \
                +fsdbfile+$(WAVE_FILE)
endif

# Targets

.PHONY: all compile run clean dirs help build_mpact_lib gen_mem_files

# Default target
all: run

# Create necessary directories
dirs:
	@mkdir -p $(SIM_DIR) $(LOG_DIR) $(WAVE_DIR) $(BIN_DIR) $(MEM_FILE_DIR)

# Build the MPACT-Sim library using Bazel with CC=clang
build_mpact_lib:
	@echo "--- Building MPACT-Sim Co-sim Library via Bazel ---"
	cd $(MPACT_DIR) && CC=clang bazel build //sim/cosim:$(MPACT_COSIM_LIB_NAME)

# Generate memory and run option files from the ELF file
gen_mem_files: dirs
	@echo "--- Generating Memory and Run Option Files from ELF ---"
	@rm -f $(MEM_FILE_DIR)/*
	python3 $(UTILS_DIR)/elf_to_mem.py --elf_file $(TEST_ELF) --out_dir $(MEM_FILE_DIR)

# Compile the design
compile: dirs build_mpact_lib
	@echo "--- Compiling with VCS ---"
	$(VCS) $(VCS_COMPILE_OPTS) -l $(LOG_DIR)/compile.log -f $(FILE_LIST)
	@echo "--- Compilation Finished ---"

# Run the simulation
run: compile gen_mem_files
	@echo "--- Running Simulation ---"
	@echo "Test:      $(UVM_TESTNAME)"
	@echo "ELF File:  $(TEST_ELF)"
	@echo "Verbosity: $(UVM_VERBOSITY)"
	@echo "Timeout:   $(TEST_TIMEOUT_NS) ns"
	@echo "Plusargs:  $(PLUSARGS)"
	@echo "Log File:  $(LOG_DIR)/$(UVM_TESTNAME).log"
ifeq ($(DUMP_WAVES),1)
	@echo "Wave File: $(WAVE_FILE)"
endif
	./$(SIM_EXEC) $(VCS_RUN_OPTS) -l $(LOG_DIR)/$(UVM_TESTNAME).log
	@echo "--- Simulation Finished ---"

# Clean up simulation files
clean:
	@echo "--- Cleaning Simulation Files ---"
	rm -rf $(SIM_DIR) simv* csrc* *.log* *.key *.vpd *.fsdb ucli.key DVEfiles/ verdiLog/ novas.*
	@echo "--- Cleaning MPACT-Sim Bazel cache ---"
	cd $(MPACT_DIR) && bazel clean

# Help
help:
	@echo "Makefile Targets:"
	@echo "  make compile          : Builds MPACT lib and compiles DUT/testbench"
	@echo "  make run              : Generates mem files, builds, and runs the simulation"
	@echo "                        :   Override defaults: make run UVM_TESTNAME=<test> TEST_ELF=<path> UVM_VERBOSITY=<level>"
	@echo "  make build_mpact_lib  : Only builds the MPACT-Sim C++ library"
	@echo "  make gen_mem_files    : Only generates ITCM/DTCM and run opt files"
	@echo "  make clean            : Removes generated simulation and MPACT-Sim files"
	@echo "  make dirs             : Creates simulation directories"
	@echo "  make help             : Shows this help message"
