## 
## -------------------------------------------------------------
##    Copyright 2010-2011 Mentor Graphics Corporation
##    All Rights Reserved Worldwide
## 
##    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.
## -------------------------------------------------------------
## 

USES_DPI = 1
ifdef UVM_NO_DPI
  USES_DPI=0
endif

#---------------------------------------------------------------
# Define Variables
#---------------------------------------------------------------

UVM_HOME ?= ..


LIBDIR  = $(UVM_HOME)/lib
#GCC     = $(MTI_HOME)/gcc-4.1.2-linux/bin/g++
GCC     = gcc
TEST    = /usr/bin/test
BITS    ?= 32
LIBNAME = uvm_dpi
DPI_SRC = $(UVM_HOME)/src/dpi/uvm_dpi.cc


GCCCMD =  $(GCC) \
        -m$(BITS) \
        -fPIC \
        -DQUESTA \
        -g \
        -W \
        -shared \
        -x c \
        -I$(MTI_HOME)/include \
        $(DPI_SRC) \
        -o $(LIBDIR)/$(LIBNAME).so

GCC_WINCMD = \
        $(WIN_GCC) \
        -g \
        -DQUESTA \
        -W \
        -shared \
        -Bsymbolic \
        -x c \
        -I$(MTI_HOME)/include \
        $(DPI_SRC) \
        -o $(LIBDIR)/$(LIBNAME).dll \
		$(MTI_HOME)/win32/mtipli.dll -lregex

WIN_GCC = $(MTI_HOME)/gcc-4.2.1-mingw32vc9/bin/g++.exe

VLIB =  vlib work

VLOG =  vlog \
        -timescale "1ns/1ns" \
        $(DPILIB_VLOG_OPT) \
        $(VLOG_OPT) \
        $(OPT_C) \
        -mfcu \
        -suppress 2181 \
        +acc=rmb \
        -writetoplevels questa.tops \
        +incdir+$(UVM_HOME)/src \
        $(UVM_HOME)/src/uvm.sv


VSIM =  vsim \
        $(DPILIB_VSIM_OPT) \
        $(VSIM_OPT) \
        $(OPT_R) \
        -c \
        -do "run -all; q" \
        -l questa.log \
        -f questa.tops

N_ERRS = 0
N_FATALS = 0

CHECK = \
	@$(TEST) \( `grep -c 'UVM_ERROR :    $(N_ERRS)' questa.log` -eq 1 \) -a \
		 \( `grep -c 'UVM_FATAL :    $(N_FATALS)' questa.log` -eq 1 \)

#---------------------------------------------------------------
# If USES_DPI is set, enables compilation and loading of DPI
# libraries. Enabling DPI adds +acc on command line, which
# may adversely affect simulator performance.
#---------------------------------------------------------------

ifeq ($(USES_DPI),1)
  DPILIB_VLOG_OPT = 
  DPILIB_VSIM_OPT = -sv_lib $(LIBDIR)/uvm_dpi 
  DPILIB_TARGET = dpi_lib$(BITS)
else
  DPILIB_VLOG_OPT = +define+UVM_NO_DPI 
  DPILIB_VSIM_OPT = 
  DPILIB_TARGET =
endif
  

#---------------------------------------------------------------
# Define Targets
#
# vlog and vsim targets defined in individual examples
#---------------------------------------------------------------


help: 
	@echo "Usage:  make -f Makefile.questa [target(s)]"
	@echo ""
	@echo "Typical: make -f Makefile.questa all"
	@echo ""
	@echo "where target is any of"
	@echo ""
	@echo "  dpi_lib     - compile DPI lib (use BITS=XX, def=32)"
	@echo "  dpi_lib32   - compile DPI lib for 32-bit Linux (BITS=32)"
	@echo "  dpi_lib64   - compile DPI lib for 64-bit Linux (BITS=64)"
	@echo "  dpi_libWin  - compile DPI lib for Windows"
	@echo ""
	@echo "  clean       - removes all derived files"
	@echo "  vlib        - creates work library"
	@echo "  prepare     - invokes clean, vlib, and dpi_lib targets"
	@echo ""
	@echo "When this makefile is included by a Makefile from an example"
	@echo "sub-directory, additional targets should be available:"
	@echo ""
	@echo "  all       - invokes targets prepare, vlog, and vsim"
	@echo "  vlog      - invokes the vlog compiler"
	@echo "  vsim      - invokes the vsim simulator"
	@echo ""
	@echo "Variables: specify any of the following on the make command line"
	@echo ""
	@echo "  UVM_HOME  - root directory of the UVM library (default:..)"
	@echo "  UVM_VERBOSITY - verbosity level for vsim (default:UVM_MEDIUM)"
	@echo "  BITS      - the bus architecture: 32 or 64 (default:32)"
	@echo "  LIBNAME   - the root name of the dpi library (default:uvm_dpi)"
	@echo "  LIBDIR    - the location to put the dpi lib (default:UVM_HOME/lib)"
	@echo ""

prepare: clean vlib $(DPILIB_TARGET)


dpi_lib:
	mkdir -p $(LIBDIR)
	$(GCCCMD)

dpi_libWin:
	mkdir -p $(LIBDIR)
	$(GCC_WINCMD)

dpi_lib32:
	make -f Makefile.questa BITS=32 dpi_lib

dpi_lib64:
	make -f Makefile.questa LIBNAME=uvm_dpi BITS=64 dpi_lib

vlib: $(DPILIB_TARGET)
	vlib work

clean:
	rm -rf *~ work vsim.wlf* *.log questa.tops transcript *.vstf


