# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you 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.

VERILATOR_BIN := $(shell which verilator)
VERILATOR_INC_DIR := $(abspath $(dir $(VERILATOR_BIN))/../share/verilator/include)
TOP_NAME = "Top"
VERILOG_DIR = $(abspath .)/verilog
SRC_DIR = $(abspath .)/src
ROOT_DIR = $(abspath ..)
TVM_DIR = $(abspath ../../../../..)
OUT_DIR = $(abspath .)/out

default: $(ROOT_DIR)/libverilator.so

$(ROOT_DIR)/libverilator.so: $(OUT_DIR)/$(TOP_NAME).cpp
	g++ \
	-std=c++14 \
	-O2 \
	-shared \
	-fPIC \
	-I$(TVM_DIR)/src/runtime/contrib/verilator \
	-I$(TVM_DIR)/include \
	-I$(TVM_DIR)/3rdparty/dlpack/include \
	-I$(VERILATOR_INC_DIR) \
	-I$(OUT_DIR) \
	$(VERILATOR_INC_DIR)/verilated.cpp \
	$(SRC_DIR)/*.cc \
	$(OUT_DIR)/*.cpp \
	-o $@

$(OUT_DIR)/$(TOP_NAME).cpp: $(VERILOG_DIR)/*.v
	$(VERILATOR_BIN) \
	-Wno-BLKANDNBLK \
	-Wno-PINMISSING \
	-Wno-STMTDLY \
	-Wno-WIDTH \
	-Wno-UNOPTFLAT \
	--cc \
	--prefix $(TOP_NAME) \
	--top-module "driver" \
	--Mdir $(OUT_DIR) \
	$^

clean:
	-rm -rf $(OUT_DIR)
