VER=$(VNAME)2024.2
BID=4293
CC=gcc
SED=sed

ASICLIBS = ihp25 sgb25vrh ut025crh virage rh_lib18t rh_lib18t_io2 rh_lib13t\
	atc18 artisan umc18 virage90 tsmc90 dare nextreme atc18rha_cell smic13 \
	tm65gplus st65lp st65gp cmos9sf nextreme2 gf65g saed32 gf22fdx
FPGALIBS = apa proasic3 axcelerator ec fusion unisim virtex virtex5 secureip unimacro altera altera_mf \
	 stratixii eclipsee cycloneiii stratixiii synplify simprim stratixiv \
	proasic3e proasic3l smartfusion2 rtg4 polarfire nx nexus

ifeq ("$(GRLIB_CONFIG)","")
GRLIB_CONFIG = dummy
endif
ifeq ("$(GRLIB_SIMULATOR)","")
GRLIB_SIMULATOR = ModelSim
endif


# Select LEON3 version
# The switch between gaisler/leon3 and gaisler/leon3pkgv1v2 is handled
# by a hack in the script generation (see if (test $$l = "leon3") ..)
ifeq ("$(GRLIB_LEON3_VERSION)","")
GRLIB_LEON3_VERSION = 3
else
ifeq ("$(GRLIB_LEON3_VERSION)","2")
DIRSKIP += leon3v3 grfpc grlfpc
DIRADD += leon3v1 leon3ftv2 grfpcv1 grlfpcv1 grfpcft grlfpcft
endif
ifeq ("$(GRLIB_LEON3_VERSION)","1")
DIRSKIP += leon3v3 grfpc grlfpc
DIRADD += leon3v1 leon3ftv1 grfpcv1 grlfpcv1 grfpcft grlfpcft
endif
endif

# Target technology libraries and techmap
ifeq ("$(TECHLIBS)","")
TECHLIBS=$(FPGALIBS) $(ASICLIBS)
endif
# The unisim techmap in GRLIB has been divided into several parts since
# new releases of the Xilinx libs lack support for the older technologies.
# The hack below expands techlibs for technologies that previously only
# required unisim but now also require the techmap/virtex directory
ifneq (,$(findstring unisim,$(TECHLIBS)))
# Virtex2, Virtex4, Spartan3, Spartan3e and Spartan6 currently depend
# on techmap/virtex
ifneq (,$(filter Virtex2 Virtex2p Virtex4 Spartan3 Spartan-3A-DSP Spartan3E Spartan6,$(TECHNOLOGY)))
ifeq (,$(findstring virtex,$(TECHLIBS)))
TECHLIBS+=virtex
endif
endif
endif

# Option to avoid scan of tech/, useful when tech libraries are compiled
# with separate tool:
ifeq ("$(SKIP_SIM_TECHLIBS)","")
XTECHLIBS = $(TECHLIBS:%=tech/% )
endif
SIMLIBS = hynix micron cypress
ACTELLIBS = apa apa3 axcelerator proasic3 proasic3e proasic3l fusion smartfusion2 rtg4 polarfire
XILINXLIBS = unisim simprim unimacro virtex virtex5
ALTERALIBS = altera_mf stratixii altera cycloneiii stratixiii
ALTERAFILES = $(ALTERALIBS:%=lib/techmap/%) $(RMCOMLIBS:%=lib/tech/%) netlists/altera
LATTICELIBS = ec nexus



BRMLIBS = core1553bbc core1553brm core1553brt gr1553
COREPCILIB = corePCIF
CONTRIBLIBS = openchip gleichmann contrib sun

RMFTLIBS=ihp25 sgb25vrh ut025crh rh_lib18t rh_lib18t_io2 rh_lib13t pere05 \
	rhumc tsmc90 atc18rha_cell
RMCOMLIBS=artisan cust1 virage90 nextreme nextreme2

RMFTLIBSX = $(RMFTLIBS:%=lib/techmap/%) $(RMFTLIBS:%=lib/tech/%)
RMCOMLIBSX = $(RMCOMLIBS:%=lib/techmap/%) $(RMCOMLIBS:%=lib/tech/%)
RMFPGALIBSX = $(ASICLIBS:%=lib/techmap/%) $(ASICLIBS:%=lib/tech/%)

ALIB = alib
ACOM = acom -quiet $(ACOMOPT)
ALOG = alog -quiet $(ALOGOPT)
AVHDL = avhdl

VLIB = vlib
ifeq ("$(GRLIB_SIMULATOR)", "ALDEC")
VCOM = vcom -incr -nowarn ELAB1_0026 -nowarn COMP96_0259 -quiet $(VCOMOPT)
VLOG = vlog -incr -v2k5 -quiet $(VLOGOPT)
SVLOG = vlog -incr -quiet $(VLOGOPT)
else
VCOM = vcom -quiet $(VCOMOPT)
VLOG = vlog -quiet $(VLOGOPT)
SVLOG = $(VLOG)
endif


OS = `uname`

ifeq ("$(SIMTOP)","")
SIMTOP=$(TOP)
endif

ifeq ("$(SIMINST)","")
SIMINST=$(TOP)
endif

ifeq ("$(LIBSKIP)","")
XLIBSKIP="x"
else
XLIBSKIP= $(LIBSKIP:%=%|) dummy
endif

XXDIRSKIP=$(DIRSKIP:%=%/core)
YDIRSKIP=$(DIRSKIP) $(XXDIRSKIP) $(LIBSKIP)

ifeq ("$(YDIRSKIP)","")
XDIRSKIP="dummy"
else
XDIRSKIP= $(YDIRSKIP:%=%|) $(LIBSKIP:%=%|) dummy
endif

XFILESKIP = $(FILESKIP:%=%|) $(LIBSKIP:%=*_%.vhd|) dummy
# Note that XFILESKIP is updated in Xilinx targets below


# GRLIB_NHCPU defines # of CPUs available on host for synthesis, value
# may be used in script generation
ifeq ("$(GRLIB_NHCPU)","")
GRLIB_NHCPU=4
endif

all: help

help:
	@echo
	@echo " installation targets: 	  : see doc/grlib.pdf for library installation targets"
	@echo
	@echo " interactive targets:"
	@echo "  simulation:"
	@echo "   make avhdl-launch         : start Active-HDL GUI mode"
	@echo "   make avhdl                : compile design using Active-HDL gui mode"
	@echo "   make ncsim-launch         : start NCSim GUI"
	@echo "   make riviera-launch       : start RivieraPRO"
	@echo "   make vsim-launch          : start ModelSim/QuestaSim"
	@echo "   make vcs-launch           : start VCS"
	@echo "  verification:"
	@echo "   make alint-launch         : start Alint elaboration time linting"
	@echo "   make fpro-launch          : start FormalPro GUI"
	@echo "  implementation:"
	@echo "   make actel-launch         : start Actel Designer for current project"
	@echo "   make ise-launch           : start ISE project navigator for XST project"
	@echo "   make ise-launch-synp      : start ISE project navigator for synplify project"
	@echo "   make libero-launch        : start Microsemi Libero"
	@echo "   make planahead-launch     : start PlanAhead project navigator"
	@echo "   make quartus-launch       : start Quartus for current project"
	@echo "   make quartus-launch-synp  : start Quartus for synplify project"
	@echo "   make radiant-launch       : start Lattice Radiant"
	@echo "   make synplify-launch      : start Synplify"
	@echo "   make vivado-launch        : start Vivado project navigator"
	@echo "   make nanoxmap-launch      : start NanoXmap GUI"
	@echo "  other GRLIB targets:"
	@echo "   make xgrlib               : start GRLIB GUI"
	@echo
	@echo " batch targets:"
	@echo "  simulation:"
	@echo "   make vsimsa          : compile design using Active-HDL batch mode"
	@echo "   make riviera         : compile design using riviera"
	@echo "   make vsim            : compile design using modelsim"
	@echo "   make ncsim           : compile design using ncsim"
	@echo "   make ghdl            : compile design using GHDL"
	@echo "   make vcs-elab        : compile and elaborate design using VCS"
	@echo "  verification:"
	@echo "   make alint-comp      : alint compilation time linting"
	@echo "   make fm              : Formal equivalence check using Synopsys Formality"
	@echo "  implementation:"
	@echo "   make actel           : synthesize with synplify, place&route Actel Designer"
	@echo "   make dc              : synthesize design usign Synopsys Design Compiler"
	@echo "   make ise             : synthesize and place&route with Xilinx ISE"
	@echo "   make ise-map         : synthesize design using Xilinx XST"
	@echo "   make ise-prec        : synthesize with precision, place&route with Xilinx ISE"
	@echo "   make ise-synp        : synthesize with synplify, place&route with Xilinx ISE"
	@echo "   make isp-synp        : synthesize with synplify, place&route with ISPLever"
	@echo "   make libero          : syntiesize, place&route and generate bit file with Microsemi Libero"
	@echo "   make planahead       : synthesize and place&route with Xilinx PlanAhead"
	@echo "   make precision       : synthesize design using precision"
	@echo "   make quartus         : synthesize and place&route using Quartus"
	@echo "   make quartus-map     : synthesize design using Quartus"
	@echo "   make quartus-synp    : synthesize with synplify, place&route with Quartus"
	@echo "   make radiant         : synthesize and place&route and generate bitstreams with Radiant"
	@echo "   make synplify        : synthesize design using synplify"
	@echo "   make vivado          : synthesize and place&route with Xilinx Vivado"
	@echo "   make nanoxpython     : synthesize and place&route with NanoXplore NanoXmap"
	@echo "  other GRLIB targets:"
	@echo "   make scripts         : generate compile scripts only"
	@echo "   make clean           : remove all temporary files"
	@echo "   make distclean       : remove all temporary files"
	@echo

make xgrlib:
	  @if test -r "/mingw/bin/wish84.exe"; then \
	    if !(test -r "/mingw/bin/echo.bat"); then \
	      cp $(GRLIB)/bin/echo.bat /mingw/bin/echo.bat; \
	    fi; \
	    if !(test -r "/mingw/bin/wish"); then \
	      cp $(GRLIB)/bin/wish /mingw/bin/wish; \
	    fi; \
	  fi; \
	unset LD_LIBRARY_PATH ; \
	$(GRLIB)/bin/xgrlib.tcl $(TOP) $(TECHNOLOGY) $(DEVICE) $(BOARD)

############  AHB ROM Generation     ########################

FILE=prom.exe

#leon5 designs should use BCC1. In leon5 design set OBJCOPY_CMD=sparc-gaisler-elf-objcopy
ifeq ("$(OBJCOPY_CMD)","")
OBJCOPY_CMD=sparc-elf-objcopy
endif

ahbrom: $(GRLIB)/bin/ahbrom.c
	@if test -r "/mingw/bin/gcc.exe"; then \
	  $(CC) $(GRLIB)/bin/ahbrom.c -o ahbrom -lwsock32; \
	else \
	  $(CC) $(GRLIB)/bin/ahbrom.c -o ahbrom; \
	fi;

ahbrom.bin:
	$(OBJCOPY_CMD) -O binary $(FILE) $@

ahbrom.vhd:
	make ahbrom
	make ahbrom.bin
	./ahbrom ahbrom.bin $@

ahbrom64.vhd:
	make ahbrom
	make ahbrom.bin
	./ahbrom ahbrom.bin $@ 64

ahbrom128.vhd:
	make ahbrom
	make ahbrom.bin
	./ahbrom ahbrom.bin $@ 128

#########    Active-HDL batch mode targets   ############

vsimsa: compile.vsim
	@cat libs.do | sed -e s/modelsim/activehdl/ | sed -e s/vlib/alib/ > alibs-batch.do
	@echo "do alibs-batch.do" > vsimsa-batch.do
	@vsimsa vsimsa-batch.do
	@vmap work activehdl/work
	@make -f make.vsim
	@-rm -f alibs-batch.do vsimsa-batch.do

vsimsa-run:
	@vsim $(SIMTOP) <  $(GRLIB)/bin/runvsim.do

vsimsa-launch: vsimsa-run

vsimsa-clean:
	-rm -rf activehdl vsimsa.cfg library.cfg wave.asdb alibs-batch.do vsimsa-batch.do

#vsimsa-modelsim:
#	echo "importmodelsim $(SIMTOP).mpf" . > activehdl.tcl
#	echo "quiet on" >> activehdl.tcl
#	echo "SET SIM_WORKING_FOLDER ..\\.." >> activehdl.tcl
#	AVHDL -do activehdl.tcl &

#########    Active-HDL gui mode targets   ############

avhdl avhdl.tcl: compile.asim
	@echo "createdesign work ." > avhdl.tcl
	@echo "opendesign -a work.adf" >> avhdl.tcl
	@cat alibs.do >> avhdl.tcl
	@echo "" >> avhdl.tcl
	@cat make.asim-addfile >> avhdl.tcl
	@cat make.asim >> avhdl.tcl
	@echo "" >> avhdl.tcl
	@echo SET SIM_WORKING_FOLDER $$\DSN/.. >> avhdl.tcl
	@echo "" >> avhdl.tcl
	@echo asim work.$(SIMTOP) >> avhdl.tcl

avhdl-run: avhdl-launch

avhdl-launch: avhdl.tcl
	@avhdl -do avhdl.tcl

avhdl-clean:
	-rm -rf work avhdl.tcl vsimsa.cfg wave.asdb

#########    Riviera targets    ############

ifeq ("$(GRLIB_SIMULATOR)", "ALDEC")
riviera: make.riviera
	@MTI_DEFAULT_LIB_TYPE=0 vsimsa -quiet -do "do libs.do; quit"
	make -f make.riviera

riviera-run:
ifeq ("$(VSIMOPT)","")
	@vsim -c $(SIMTOP) -do $(GRLIB)/bin/runvsim.do
else
	@vsim -c $(VSIMOPT)
endif

riviera-launch:
ifeq ("$(VSIMOPT)","")
	@vsim $(SIMTOP) -do $(GRLIB)/bin/runvsim.do
else
	@vsim $(VSIMOPT)
endif

else
### Riviera targets using WS

riviera_ws: riviera_ws_create.do
	vsimsa -quiet -do "do riviera_ws_create.do; quit"

riviera: riviera_ws
	vsimsa -quiet -do "workspace.open riviera_ws/riviera_ws.rwsp; workspace.compile; quit"

ifeq ("$(ASIMOPT)","")
ASIMOPT = $(VSIMOPT)
endif

# Allow to override
ifeq ("$(RIVIERA_DO)","")
RIVIERA_DO = workspace.open riviera_ws/riviera_ws.rwsp; simulation.initialize $(SIMTOP)
endif

riviera-run: riviera_ws
	cp *.srec riviera_ws/
ifeq ("$(VSIMOPT)","")
	vsimsa -c -do "$(RIVIERA_DO); do $(realpath $(GRLIB))/bin/runvsim.do"
else
	vsimsa -c $(ASIMOPT) -do "$(RIVIERA_DO); $(ASIMDO)"
endif

riviera-launch: riviera_ws
	cp *.srec riviera_ws/
ifeq ("$(VSIMOPT)","")
	riviera -do "$(RIVIERA_DO); do $(realpath $(GRLIB))/bin/runvsim.do"
else
	riviera $(ASIMOPT) -do "$(RIVIERA_DO); $(ASIMDO)"
endif

endif ### end of Riviera targets using WS

riviera-clean:
	-rm -rf riviera_ws riviera_ws_*.do vsimsa.cfg wave.asdb library.cfg .riviera_project rlibs.do compile.riviera make.riviera dataset.asdb

#########    Alint targets   ############

# Alint compilation time linting
alint-comp: compile.vsim
	@vsim -c -do "do libs.do; quit"
	@sed -r -e 's/\b(vcom|vlog)\b/\1 -alint -alint_elabchecks -alint_avdb alint\.avdb/' make.vsim > make.alint
	@make -f make.alint
	@vmap work modelsim/work

# Alint elaboration time linting
alint-elab: alint-comp
	vlint -c -alint_maxwarn none -alint_maxrulewarn none -alint_avdb alint.avdb -asim $(TOP)

#########    Modelsim targets   ############

UNISIMSRC = $(XILINX)/vhdl/src/unisims/unisim_VPKG.vhd  \
	$(XILINX)/vhdl/src/unisims/unisim_VCOMP.vhd \
	$(XILINX)/vhdl/src/unisims/unisim_VITAL.vhd

SIMPRIMSRC = $(XILINX)/vhdl/src/simprims/simprim_Vpackage.vhd  \
	$(XILINX)/vhdl/src/simprims/simprim_Vcomponents.vhd \
	$(XILINX)/vhdl/src/simprims/simprim_VITAL.vhd

vsim: make.work
ifeq ("$(VMAKESKIP)","")
	@make -f make.work
endif

make.work: compile.vsim modelsim
	@make -f make.vsim
ifeq ("$(VMAKESKIP)","")
	@echo "" > make.work
	@for i in `cat libs.txt`; do vmake $$i >> make.work ; done
	@cat make.work | sed 's/\([a-zA-Z]\)\(:[\\\/]\)/\/cygdrive\/\L\1\//' > make.work2
	@mv make.work2 make.work
else
	@echo "Note: Skipping vmake"
endif

# If we have paths with ':' we assume that we are running on Cygwin:
vsim-fix:
#	@cat make.work | sed 's/\([a-zA-Z]\)\(:\\\)/\/\1\//'  > make.work2
	@cat make.work | sed 's/\([a-zA-Z]\)\(:[\\\/]\)/\/cygdrive\/\L\1\//' > make.work2
	@mv make.work2 make.work

ifeq ("$(VCSELAB)","")
VCSELAB = -debug_access+all
endif

vcs-comp: make.simv
	@sh vcs_libs
	@make -f make.simv

vcs-elab: vcs-comp
	vcs work.$(SIMTOP) $(VCSELAB)

vcs-run: vcs-elab
	./simv

vcs-launch: vcs-elab
	./simv -gui

vcs-clean:
	rm -rf vcs/ simv.daidir/ csrc DVEfiles/
	rm -f simv vcs_libs synopsys_sim.setup .vdbg_combination_lock .vlogansetup.args .vlogansetup.env ucli.key inter.vpd


modelsim: compile.vsim
	@MTI_DEFAULT_LIB_TYPE=0 vsim -c -quiet -do "do libs.do; quit"

vsim-grlib: modelsim
	make vsim
#	@for i in `cat libs.txt`; do \
#	  make -f modelsim/make.$$i ; \
#	done ;

vsim-run: vsim
ifeq ("$(VSIMOPT)","")
	@vsim -c -voptargs="+acc -nowarn 1" $(SIMTOP) <  $(GRLIB)/bin/runvsim.do
else
	@vsim -c $(VSIMOPT)
endif

vsim-launch: scripts modelsim
ifeq ("$(VSIMOPT)","")
	@vsim -i -quiet -voptargs="+acc -nowarn 1" $(SIMTOP)
else
	vsim -i -quiet $(VSIMOPT)
endif

vsim-mcb: scripts
	-vlib modelsim
	-vlib modelsim/unisim
	vcom -quiet -explicit -work unisim $(XILINX)/vhdl/src/unisims/secureip/MCB.vhd

vsim-unisim: modelsim
	vcom -quiet -explicit -work unisim $(UNISIMSRC)

vsim-simprim: modelsim
	vcom -quiet -explicit -work simprim -ignorevitalerrors $(SIMPRIMSRC)

# Ugly hardcode of testbench.vhd..
vsim-netgen-syn:
	vcom -quiet -explicit -work work netgen/translate/$(TOP)_translate.vhd
	vcom -quiet -explicit -work work testbench.vhd

vsim-netgen-par:
	vcom -quiet -explicit -work work netgen/par/$(TOP)_timesim.vhd
	vcom -quiet -explicit -work work testbench.vhd

vsim-clean:
	-rm -rf modelsim transcript *.mti stdout.log vsim.wlf vsim_stacktrace.vstf \
	$(SIMTOP).mpf.bak $(SIMTOP).mti *.mpf wlft*

#########   FormalPro targets ############

fpro-launch: $(TOP)_rtl_fpro.fl
	formalpro -gui -a -fl $(TOP)_rtl_fpro.fl -mod $(TOP)

# Target rtl2rtl for sanity check
fpro-launch-rtl2rtl: $(TOP)_rtl_fpro.fl
	formalpro -gui -a -fl $(TOP)_rtl_fpro.fl -mod $(TOP) -b -fl $(TOP)_rtl_fpro.fl -mod $(TOP)

fpro-run-rtl2rtl: $(TOP)_rtl_fpro.fl
	formalpro -a -fl $(TOP)_rtl_fpro.fl -mod $(TOP) -b -fl $(TOP)_rtl_fpro.fl -mod $(TOP)

fpro-clean:
	-rm -rf $(TOP)_rtl_fpro.fl formalpro.log formalpro.cache


#########   GHDL targets   ############
# Outdated files are resolved by "GHDLM".

GHDL ?= ghdl
GHDLI = $(GHDL) -i
GHDLM = $(GHDL) -m
GHDLIOPT ?= --mb-comments
GHDLMOPT ?= -fexplicit --ieee=synopsys --mb-comments --warn-no-binding --warn-no-hide -O2
GHDLRUNOPT ?= --assert-level=error --ieee-asserts=disable

# Compile design

.PHONY: ghdl-import
ghdl-import gnu: make.ghdl
	make -f make.ghdl ghdl-import

.PHONY: ghdl
ghdl: $(SIMTOP)

# Analyse outdated files and elaborate design.
.PHONY: $(SIMTOP)
$(SIMTOP): gnu
	$(GHDLM) $(GHDLMOPT) --workdir=gnu/work --work=work `cat ghdl.path` $@

# Run testbench SIMTOP
.PHONY: ghdl-run
ghdl-run: $(SIMTOP)
	./$(SIMTOP) $(GHDLRUNOPT)

ghdl-clean:
	-rm -rf gnu $(SIMTOP) make.ghdl

#########   NcSim targets   ############

ncsim: xncsim/done
	ncupdate $(SIMTOP)

ncsim-run: ncsim
	ncsim $(SIMTOP)

ncsim-launch: ncsim
	ncsim -gui $(SIMTOP)&

xncsim xncsim/done : compile.ncsim
	-rm -rf xncsim
	make -f make.ncsim
	touch xncsim/done

ncsim-clean:
	-rm -rf xncsim nc*.log ncsim.key

### Lattice targets ###

GRLIB_LATTICE_RADIANT_PERFORMANCE?="9_High-Performance_1.0"
GRLIB_LATTICE_RADIANT_SYNTHESIS?="synplify"
GRLIB_LATTICE_RADIANT_SIM_DEVICE?=all
export FOUNDRY=$(GRLIB_LATTICE_RADIANT)/ispfpga
#Setting Modelsim path by checking where vsim is, unless already set
GRLIB_LATTICE_RADIANT_SIM_PATH?=$(dir $(shell which vsim))

$(TOP)_radiant.rdf: $(TOP)_radiant.tcl $(TOP)_radiant_build.tcl radiant-ips
	@mkdir -p $(TOP)_radiant
	@echo "Calling radiant in CLI mode to create project"
	@if test -r "$(GRLIB_LATTICE_RADIANT)/bin/lin64/radiantc"; then \
		radiantc $(TOP)_radiant.tcl; \
	elif test -r "$(GRLIB_LATTICE_RADIANT)/bin/nt64/pnmainc.exe"; then \
		pnmainc.exe $(TOP)_radiant.tcl; \
	else \
		echo "radiant executable not found"; \
	fi;
	@echo "radiant finished"

#radiant-ips just takes care of generating the Lattice IPs from the cfg files
#set in LATTICE_IP in the design Makefile
radiant-ips: $(TOP)_radiant_gen_ips.tcl
	@for ip_cfg in ${LATTICE_IP}; do \
		if [ ! -d "./lattice_ips/$${ip_cfg}" ]; then \
			echo "Copying IP cfg $${ip_cfg} from boards/$(BOARD)/lattice_ips to lattice_ips/ in project folder"; \
			mkdir -p lattice_ips/$${ip_cfg}; \
			cp "$(GRLIB)/boards/$(BOARD)/lattice_ips/$${ip_cfg}.cfg" lattice_ips/$${ip_cfg}/. ; \
		else \
			echo "IP cfg $${ip_cfg} already in lattice_ips folder. We use that one."; \
		fi; \
	done;
	@if test -r "$(GRLIB_LATTICE_RADIANT)/bin/lin64/radiantc"; then \
		radiantc $(TOP)_radiant_gen_ips.tcl; \
	elif test -r "$(GRLIB_LATTICE_RADIANT)/bin/nt64/pnmainc.exe"; then \
		pnmainc.exe $(TOP)_radiant_gen_ips.tcl; \
	else \
		echo "radiant executable not found"; \
	fi;
	@echo "radiant IP generation finished"

radiant: $(TOP)_radiant.rdf
	@if test -r "$(GRLIB_LATTICE_RADIANT)/bin/lin64/radiant"; then \
		radiantc $(TOP)_radiant_build.tcl; \
	elif test -r "$(GRLIB_LATTICE_RADIANT)/bin/nt64/pnmain.exe"; then \
		pnmainc.exe $(TOP)_radiant_build.tcl; \
	else \
		echo "radiant executable not found"; \
	fi;

radiant-launch: $(TOP)_radiant.rdf
	@if test -r "$(GRLIB_LATTICE_RADIANT)/bin/lin64/radiant"; then \
		radiant $(TOP)_radiant.rdf; \
	elif test -r "$(GRLIB_LATTICE_RADIANT)/bin/nt64/pnmain.exe"; then \
		pnmain.exe $(TOP)_radiant.rdf; \
	else \
		echo "radiant executable not found"; \
	fi;

install-radiant-simlibs:
ifeq ("$(GRLIB_LATTICE_RADIANT)","")
	@echo "GRLIB_LATTICE_RADIANT env variable needs to be set to radiant installation directory"
else
	@if [ ! -d $(GRLIB)/lib/tech/lattice/$(GRLIB_LATTICE_RADIANT_SIM_DEVICE) ]; then \
		echo "Using simulator at $(GRLIB_LATTICE_RADIANT_SIM_PATH)"; \
		echo "The simulator can be set via"; \
		echo "Building simulation libraries for $(GRLIB_LATTICE_RADIANT_SIM_DEVICE)" ; \
		echo "Calling cmpl_libs.tcl to build libraries in $(GRLIB)/lib/tech/lattice/" ; \
		tclsh $(GRLIB_LATTICE_RADIANT)/cae_library/simulation/scripts/cmpl_libs.tcl \
		-sim_path $(GRLIB_LATTICE_RADIANT_SIM_PATH) \
		-target_path $(GRLIB)/lib/tech/lattice \
		-device $(GRLIB_LATTICE_RADIANT_SIM_DEVICE) ; \
	else \
		echo "Library $(GRLIB_LATTICE_RADIANT_SIM_DEVICE) already compiled. If you want to re-compile it, " ; \
		echo "you need first to manually delete it from: $(GRLIB)/lib/tech/lattice/  Skipping compilation." ; \
	fi;
endif

map-radiant-simlibs: modelsim.ini install-radiant-simlibs radiant-ips
	@echo "Mapping radiant libs"
	@if [ -d $(GRLIB)/lib/tech/lattice/$(GRLIB_LATTICE_RADIANT_SIM_DEVICE) ]; then \
		vmap nexus_sim $(GRLIB)/lib/tech/lattice/$(GRLIB_LATTICE_RADIANT_SIM_DEVICE) ; \
	fi;

remove-radiant-simlibs:
	@echo "Removing simulation libraries under $(GRLIB)/lib/tech/lattice/"
	@-rm -rf $(GRLIB)/lib/tech/lattice/{ice40up*,lfd2nx*,lfcpnx*,lfmxo5*,lifcl*,modelsim.ini,tplus.f,uaplatform.f,vmap.log}

remove-radiant-ips:
	-rm -rf lattice_ips

radiant-clean:
	-rm -rf $(TOP)_radiant* reportview.xml .recovery .setting.ini .ng_run_manager.ini

#########   Lattice ISPLEVER targets   ############

isp-synp: $(TOP)_synplify.prj synplify/$(TOP).edf
	$(GRLIB)/bin/route_lattice $(TOP) $(UCF) $(PART) synplify $(ISPLIB) $(ISPPACKAGE) $(BITGEN)

isp-prec: $(TOP)_precision.prj precision/$(TOP).edf
	$(GRLIB)/bin/route_lattice $(TOP) $(UCF) $(PART) precision $(ISPLIB) $(ISPPACKAGE) $(BITGEN)

isp-launch-synp: $(TOP)_synplify.prj synplify/$(TOP).edf
	projnav ./$(TOP).syn

isp-launch-prec: $(TOP)_precision.prj precision/$(TOP).edf
	projnav ./$(TOP)_precision.syn

diamond-launch: $(TOP).ldf
	diamond $(TOP).ldf

isp-prom:
	synsvf $(PROMGENPAR)
isp-clean:
	-rm -rf $(TOP).dir *.jid *.alt *.lci *.mt *.nc1 *.nc2 *.p?t \
	*.err compxlib.cfg *.jhd *.lct $(TOP).log *.ngy *.prf  *.pt *.rev \
	*.syn *.t2b *.tcm *.tcp *.tw1 $(TOP).tcl *.sty *.svl *.env fonts.dir \
	$(TOP)_tcl.ini lattice $(TOP).ldf $(TOP).lpf


#########   Xilinx targets    ############
ifeq ("$(NETLISTTECH)","")
# Some netlists are reused for other FPGA families
ifeq ("$(TECHNOLOGY)","zynq7000")
NETLISTTECH = Zynq
else
ifeq ("$(TECHNOLOGY)","Virtex7")
NETLISTTECH = Virtex7
else
ifeq ("$(TECHNOLOGY)","Kintex7")
NETLISTTECH = Kintex7
else
ifeq ("$(TECHNOLOGY)","Artix7")
NETLISTTECH = Artix7
else
ifeq ("$(TECHNOLOGY)","Spartan6")
NETLISTTECH = Spartan3
else
ifeq ("$(TECHNOLOGY)","Virtex6")
NETLISTTECH = Virtex6
else
ifeq ("$(TECHNOLOGY)","Virtex2p")
NETLISTTECH = Virtex2
else
ifeq ("$(TECHNOLOGY)","Spartan3A")
NETLISTTECH = Spartan3
else
ifeq ("$(TECHNOLOGY)","Spartan3E")
NETLISTTECH = Spartan3
else
ifeq ("$(TECHNOLOGY)","Spartan-3A-DSP")
NETLISTTECH = Spartan3
else
ifeq ("$(TECHNOLOGY)","KintexU")
NETLISTTECH = kintexu
else
NETLISTTECH = $(TECHNOLOGY)
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
endif
#########   Xilinx ISE targets   ############

XSTVHDL = elaborate -ifmt vhdl -work_lib
XSTVLOG = elaborate -ifmt verilog -work_lib
XSTLIBSKIPX = $(ASICLIBS) $(BRMLIBS) $(ACTELLIBS) $(ALTERALIBS) \
	$(LATTICELIBS) $(COREPCILIB) $(SIMLIBS)
XSTLIBSKIP = $(XSTLIBSKIPX:%=%|) dware
XSTDIRSKIPX = $(ASICLIBS) $(ACTELLIBS) $(ALTERALIBS) $(LATTICELIBS)
XSTDIRSKIP = $(XSTDIRSKIPX:%=%|) dware
#XSTSKIPX = $(XSTLIBSKIPX:%=*_%.vhd |)
XSTSKIP = $(XSTSKIPX) b1553* | pci_components* | pcicore* | snpsmul.vhd

ifeq ("$(ISETECH)","")
ISETECH=$(TECHNOLOGY)
endif

ifeq ("$(ISE11TECH)","")
ISE11TECH=$(ISETECH)
endif

# Xilinx FT-FPGA addon package targets, note: may modify COMPXLIBTECH
ifneq ("$(GRLIB)","")
-include $(GRLIB)/bin/xtmr/Makefile
endif

## Xilinx ISE project properties that can be overrideen
# Pack I/O Registers/Latches into IOBs
ifeq ("$(GRLIB_XIL_PN_Pack_Reg_Latches_into_IOBs)","")
GRLIB_XIL_PN_Pack_Reg_Latches_into_IOBs=For Inputs and Outputs
endif
# Simulator
ifeq ("$(GRLIB_XIL_PN_Simulator)","")
ifeq ("$(GRLIB_SIMULATOR)","ModelSim")
GRLIB_XIL_PN_Simulator=Modelsim-SE VHDL
else
ifeq ("$(GRLIB_SIMULATOR)","ModelSim-SE")
GRLIB_XIL_PN_Simulator=Modelsim-SE VHDL
else
ifeq ("$(GRLIB_SIMULATOR)","ModelSim-PE")
GRLIB_XIL_PN_Simulator=ModelSim-PE VHDL
else
GRLIB_XIL_PN_Simulator=ISim \(VHDL/Verilog\)
endif
endif
endif
endif

## End of Xilinx ISE project properties

NUCF = $(UCF:%=-uc % )

ise: $(TOP).ngc
	ngdbuild  $(TOP).ngc -aul $(NUCF) -p $(DEVICE) -sd $(GRLIB)/netlists/xilinx/$(NETLISTTECH)
	map -pr b -w -ol $(EFFORT) -p $(DEVICE) $(TOP) $(ISEMAPOPT)
	par -ol $(EFFORT) -w $(TOP) $(TOP).ncd
	trce -v 5 $(TOP).ncd $(TOP).pcf
	bitgen $(TOP) -d -m -w -f $(BITGEN)

ise-synp: $(TOP)_synplify.prj synplify/$(TOP).edf
	ngdbuild  synplify/$(TOP).edf -aul $(NUCF) -p $(DEVICE) -sd $(GRLIB)/netlists/xilinx/$(NETLISTTECH)
	map -pr b -w -ol $(EFFORT) -p $(DEVICE) $(TOP) $(ISEMAPOPT)
	par -ol $(EFFORT) -w $(TOP) $(TOP).ncd
	trce -v 5 $(TOP).ncd $(TOP).pcf
	bitgen $(TOP) -d -m -w -f $(BITGEN)

ise-prec: $(TOP).psp precision/$(TOP).edf
	ngdbuild   precision/$(TOP).edf -aul $(NUCF) -p $(DEVICE) -sd $(GRLIB)/netlists/xilinx/$(NETLISTTECH)
	map -pr b -w -ol $(EFFORT) -p $(DEVICE) $(TOP) $(ISEMAPOPT)
	par -ol $(EFFORT) -w $(TOP) $(TOP).ncd
	trce -v 5 $(TOP).ncd $(TOP).pcf
	bitgen $(TOP) -d -m -w -f $(BITGEN)

ise-launch8 xst-launch: $(TOP).npl $(TOP)_ise.tcl
	ise $(TOP).npl>& ise.err&

ise-launch10 ise-launch9: $(TOP).ise
	ise $(TOP).ise

ise-launch11 : $(TOP).xise
	ise $(TOP).xise

ise-launch :
	@isever=`promgen | grep Rele | awk '{print $$2}'`; \
	case $$isever in \
	8*) \
		make ise-launch8 ;;\
	9*) \
		make ise-launch9 ;;\
	10*) \
		make ise-launch10 ;;\
	*) \
		make ise-launch11 ;;\
	esac



ise-launch-synp: $(TOP).npl $(TOP)_synplify.prj synplify/$(TOP).edf $(TOP)_synplify.prj
	ise $(TOP)_synplify.npl>& ise.err&

$(TOP).xst: compile.xst $(TOP)_files.prj
	@rm -f $(TOP).xst
	@$(GRLIB)/bin/xstrun $(TOP) $(TOP).vhd  $(DEVICE) >> $(TOP).xst
	@echo -ofn $(TOP) $(XSTOPT) -define {XSTDUMMY $(SYNPVLOGDEFS)} -sd $(GRLIB)/netlists/xilinx/$(NETLISTTECH) >> $(TOP).xst

ise-xstmod :
	$(GRLIB)/bin/xstmod $(CORE) $(CORE).vhd $(DEVICE) vhdl  > tmp.xst
	xst -ifn tmp.xst

ise-map xst-map ise-xst xst: $(TOP).ngc

$(TOP).ngc: $(TOP).xst $(VHDLSYNFILES) $(VERILOGSYNFILES) compile.xst
	-rm -rf xst
	@-mkdir xst xst/projnav.tmp
	xst -ifn $(TOP).xst

$(TOP).ngd:
	@if test -r "$(TOP).ngc"; then \
	  ngdbuild $(TOP).ngc -aul $(NUCF) -p $(DEVICE) -sd $(GRLIB)/netlists/xilinx/$(NETLISTTECH) ; \
	fi; \
	if test -r "synplify/$(TOP).edf"; then \
	  ngdbuild  synplify/$(TOP).edf -aul $(NUCF) -p $(DEVICE) -sd $(GRLIB)/netlists/xilinx/$(NETLISTTECH) ; \
	fi; \
	if test -r "precision/$(TOP).edf"; then \
	  ngdbuild   precision/$(TOP).edf -aul $(NUCF) -p $(DEVICE) -sd $(GRLIB)/netlists/xilinx/$(NETLISTTECH) ; \
	fi;

$(TOP).ise: $(TOP)_ise.tcl
	@echo "Creating $(TOP).ise using xtclsh - this can take up to 20 minutes."
	xtclsh $(TOP)_ise.tcl

ise-prom:
ifeq ("$(PROMGENPAR)","")
	@echo "no prom programming support for this board"
	@exit 1
else
	promgen $(PROMGENPAR)
	cp $(TOP).bit $(BOARD).bit
	cp $(TOP).msk $(BOARD).msk
endif

ise-cp-ref:
	cp bitfiles/*.* .

ise-prog-prom: ise-prom
	impact -batch $(GRLIB)/boards/$(BOARD)/prom.cmd

ise-prog-prom-usb: ise-prom
	impact -batch $(GRLIB)/boards/$(BOARD)/prom-usb.cmd

ise-prog-prom-ref: ise-cp-ref ise-prom
	impact -batch $(GRLIB)/boards/$(BOARD)/prom.cmd

ise-prog-prom-ref-usb: ise-cp-ref ise-prom
	impact -batch $(GRLIB)/boards/$(BOARD)/prom-usb.cmd

ise-prog-fpga:
	cp $(TOP).bit $(BOARD).bit
	cp $(TOP).msk $(BOARD).msk
	impact -batch $(GRLIB)/boards/$(BOARD)/fpga.cmd

ise-prog-fpga-usb:
	cp $(TOP).bit $(BOARD).bit
	cp $(TOP).msk $(BOARD).msk
	impact -batch $(GRLIB)/boards/$(BOARD)/fpga-usb.cmd


ise-prog-fpga-ref: ise-cp-ref
	cp $(TOP).bit $(BOARD).bit
	cp $(TOP).msk $(BOARD).msk
	impact -batch $(GRLIB)/boards/$(BOARD)/fpga.cmd

ise-prog-fpga-ref-usb: ise-cp-ref
	cp $(TOP).bit $(BOARD).bit
	cp $(TOP).msk $(BOARD).msk
	impact -batch $(GRLIB)/boards/$(BOARD)/fpga-usb.cmd

ise-netgen-syn: $(TOP).ngd
	netgen -rpw 100 -tpw 100 -ar Structure -tm $(TOP) \
	-w -dir netgen/translate -ofmt vhdl -sim $(TOP).ngd $(TOP)_translate.vhd

ise-netgen-par:
	netgen -s 1 -pcf $(TOP).pcf -rpw 100 -tpw 0 -ar Structure -tm $(TOP) \
	-insert_pp_buffers true -w -dir netgen/par -ofmt vhdl -sim $(TOP).ncd $(TOP)_timesim.vhd

ise-clean xst-clean:
	-rm -rf xst *.srp xstmods *.twr *.pad _impact* coregen.log \
	tmp.xst *.ngc __projnav* *.stx *.lso *.dhp automake.log \
	$(TOP)*_vhdl.prj  *.bit *.bgn *.bld \
	*.cmd_log *.ll *.mrp *.msk *.ncd *.ngd *.syr *.xpi *.csv \
	*pad.txt *.ngm *.lst *.drc *.par *.pcf *.ngo *.mcs *.prm \
	*.sig *.rba *.rbb *.rbd *.rbt *.msd _ngo _impact* stdout.log \
	ngd2vhdl.log _xmsgs tmp.txt $(TOP)*.unroutes $(TOP)*_usage.xml *.cfi \
	$(TOP)*.ise* $(TOP)*.npl* xlnx_auto_0* *.xrpt *.ptwx $(TOP)*_xdb \
	$(TOP)*_summary.html $(TOP)*.restore $(TOP).ntrc_log $(TOP)*.twx \
	$(TOP)*_map.map $(TOP)*.ngr $(TOP)*.xise $(TOP)*.gise $(TOP)*.psr \
	device_usage_statistics.html* __*.lock \
	*.xwbt *webtalk* par_usage_statistics.html fuse.log fuse.xmsgs \
	fuseRelaunch.cmd iseconfig isim isim.cmd isim.log testbench_beh.prj \
	version_isim_beh.wdb xilinxsim.ini .ngc2edfcache netgen

UNISIM = $(XILINX)/vhdl/src/unisims
UNISIMFILES = unisim_VPKG.vhd unisim_VCOMP.vhd unisim_VITAL.vhd \
	unisim_virtex5_SMODEL.vhd
UNISIMSECIPFILES = MCB.vhd GTXE1.vhd \
	GTP_DUAL.vhd GTPA1_DUAL.vhd GT11.vhd \
	GT11CLK.vhd GT11CLK_MGT.vhd GT11_CUSTOM.vhd \
	GT11_DUAL.vhd GTX_DUAL.vhd GTHE1_QUAD.vhd \
	PCIE_2_0.vhd PCIE_A1.vhd
UNISIMSECIPFILESSKIP = $(UNISIMSECIPFILES:%=|%)

# Workaround for secureip files being part of unisim and secureip techlib
# being unavailable
ifneq (,$(findstring unisim,$(TECHLIBS)))
ifeq (,$(filter secureip secureip_ver,$(TECHLIBS)))
# Skip unisim secureip files if secureip is missing from techlibs.
# Bad things will happen if there are file name collisions with
# other libraries..
XFILESKIP+= $(UNISIMSECIPFILESSKIP)
endif
endif

GRUNISIM = $(GRLIB)/lib/tech/unisim/ise
SIMPRIM = $(XILINX)/vhdl/src/simprims
UNIMACRO = $(XILINX)/vhdl/src/unimacro
UNISIMS_VER = $(XILINX)/verilog/src/unisims
GRUNISIMS_VER = $(GRLIB)/lib/tech/unisims_ver/ise
XILINXCORELIB_VER =  $(XILINX)/verilog/src/
GRXILINXCORELIB_VER = $(GRLIB)/lib/tech/xilinxcorelib_ver/ise


install-unimacro:
	@echo UNIMACRO source path: $(UNIMACRO); \
	if test -r $(UNIMACRO); then \
	  cp $(UNIMACRO)/*.vhd $(GRLIB)/lib/tech/unimacro/ise; \
	  for i in $(UNIMACRO)/*.vhd ; do basename $$i >> $(GRLIB)/lib/tech/unimacro/ise/vhdlsyn.txt; done; \
        fi

remove-unimacro:
	@-rm $(GRLIB)/lib/tech/unimacro/ise/*.vhd; echo "" > $(GRLIB)/lib/tech/unimacro/ise/vhdlsyn.xt

install-unisim:
ifeq ("$(GRLIB_SIMULATOR)","Xilinx")
	@echo "GRLIB_SIMULATOR is Xilinx. Unisim installation not required, aborted."
else
	@echo UNISIM source path: $(UNISIM); \
	for i in $(UNISIMFILES); do \
	  if test -r $(UNISIM)/$$i; then \
	    cp  $(UNISIM)/$$i  $(GRUNISIM);\
	    echo  installing $$i ;\
	  else \
	    if [ "unisim_VITAL.vhd" = $$i ]; then \
	      if test -r $(UNISIM)/primitive/vhdl_analyze_order; then \
		echo "creating unisim_VITAL.vhd from primitives" ; \
		echo "" >  $(GRUNISIM)/unisim_VITAL.vhd; \
		for j in `cat $(UNISIM)/primitive/vhdl_analyze_order`; do \
		  cat $(UNISIM)/primitive/$$j >> $(GRUNISIM)/unisim_VITAL.vhd; \
		done ; \
	      fi ; \
	    fi ; \
	  fi ; \
	done
endif

install-xilinxcorelib_ver:
ifeq ("$(GRLIB_SIMULATOR)","Xilinx")
	@echo "GRLIB_SIMULATOR is Xilinx. Library installation not required, aborted."
else
	@if [ -d $(GRXILINXCORELIB_VER) ]; then \
	echo "xilinxcorelib_ver library already installed"; else \
	echo installing xilinxcorelib_ver in $(GRXILINXCORELIB_VER) ; \
	mkdir -p $(GRXILINXCORELIB_VER) ; \
	for i in $(XILINXCORELIB_VER)/*.v; do \
	  cp $$i $(GRXILINXCORELIB_VER) ; \
	  echo `basename $$i`  >>  $(GRXILINXCORELIB_VER)/vlogsim.txt ; \
	done; fi
endif

install-unisim_ver: install-xilinxcorelib_ver
ifeq ("$(GRLIB_SIMULATOR)","Xilinx")
	@echo "GRLIB_SIMULATOR is Xilinx. Unisim installation not required, aborted."
else
	@if [ -f $(GRUNISIMS_VER)/noexist ]; then \
	  echo "unisims_ver library already installed"; else \
	  echo installing unisims_ver in $(GRUNISIMS_VER) ; \
	  mkdir -p $(GRUNISIMS_VER) ; \
	  for i in $(UNISIMS_VER)/*.v; do \
	    cat $$i  >> $(GRUNISIMS_VER)/unisims_ver.v ; \
#	    cp $$i $(GRUNISIMS_VER) ; \
#	    echo `basename $$i`  >>  $(GRUNISIMS_VER)/vlogsim.txt ; \
	  done ; \
	  echo unisims_ver.v > $(GRUNISIMS_VER)/vlogsim.txt ; \
	fi
endif

# Undocumented target, functionality was previously part of install-unisim target.
patch-unisim:
	if (test -r $(GRUNISIM)/unisim_VITAL.vhd); then \
	  cat $(GRUNISIM)/unisim_VITAL.vhd | sed -e s/'SIM_COLLISION_CHECK : string := "ALL"'/'SIM_COLLISION_CHECK : string := "GENERATE_X_ONLY"'/ \
	   > $(GRUNISIM)/unisim_vitalx.vhd;\
	   cp $(GRUNISIM)/unisim_vitalx.vhd $(GRUNISIM)/unisim_VITAL.vhd;\
	   rm $(GRUNISIM)/unisim_vitalx.vhd;\
	  echo  patching unisim_VITAL.vhd ;\
	fi

ifeq ("$(GRLIB_SIMULATOR)","ALDEC")
XILINX_SECUREIP_PATH = aldec
else
ifeq ("$(GRLIB_SIMULATOR)","ALDEC_RWS")
XILINX_SECUREIP_PATH = aldec
else
XILINX_SECUREIP_PATH = mti
endif
endif

install-secureip: install-unisim
ifeq ("$(GRLIB_SIMULATOR)","Xilinx")
	@echo "GRLIB_SIMULATOR is Xilinx. SecureIP installation not required, aborted."
else
	@echo UNISIM source path: $(UNISIM); \
	for i in $(UNISIMSECIPFILES); do \
	  cp  $(UNISIM)/secureip/$$i  $(GRUNISIM);\
	  echo  installing $$i ;\
	done
	@if (test -r $(XILINX)/secureip/$(XILINX_SECUREIP_PATH)/mcb_$(XILINX_SECUREIP_PATH)); then \
	  echo  installing $(XILINX)/secureip ;\
	  cp  $(XILINX)/secureip/$(XILINX_SECUREIP_PATH)/mcb_$(XILINX_SECUREIP_PATH)/*.vp  $(GRLIB)/lib/tech/secureip/ise;\
	fi ; \
	if (test -r $(XILINX)/secureip/$(XILINX_SECUREIP_PATH)/pcie_2_0_$(XILINX_SECUREIP_PATH)); then \
	  cp  $(XILINX)/secureip/$(XILINX_SECUREIP_PATH)/pcie_2_0_$(XILINX_SECUREIP_PATH)/*.vp  $(GRLIB)/lib/tech/secureip/ise; \
	fi ; \
	if (test -r $(XILINX)/secureip/$(XILINX_SECUREIP_PATH)/gtxe1_$(XILINX_SECUREIP_PATH)); then \
	  cp  $(XILINX)/secureip/$(XILINX_SECUREIP_PATH)/gtxe1_$(XILINX_SECUREIP_PATH)/*.vp  $(GRLIB)/lib/tech/secureip/ise; \
	fi ; \
	if (test -r $(XILINX)/secureip/$(XILINX_SECUREIP_PATH)/gtpa1_dual_$(XILINX_SECUREIP_PATH)); then \
	  cp  $(XILINX)/secureip/$(XILINX_SECUREIP_PATH)/gtpa1_dual_$(XILINX_SECUREIP_PATH)/*.vp  $(GRLIB)/lib/tech/secureip/ise; \
	fi ; \
	if (test -r $(XILINX)/secureip/$(XILINX_SECUREIP_PATH)/gtp_dual_fast_$(XILINX_SECUREIP_PATH)); then \
	  cp  $(XILINX)/secureip/$(XILINX_SECUREIP_PATH)/gtp_dual_fast_$(XILINX_SECUREIP_PATH)/*.vp  $(GRLIB)/lib/tech/secureip/ise; \
	fi ; \
	if (test -r $(XILINX)/secureip/$(XILINX_SECUREIP_PATH)/gtx_dual_fast_$(XILINX_SECUREIP_PATH)); then \
	  cp  $(XILINX)/secureip/$(XILINX_SECUREIP_PATH)/gtx_dual_fast_$(XILINX_SECUREIP_PATH)/*.vp  $(GRLIB)/lib/tech/secureip/ise; \
	fi ; \
	if (test -r $(XILINX)/secureip/$(XILINX_SECUREIP_PATH)/pcie_a1_$(XILINX_SECUREIP_PATH)); then \
	  cp  $(XILINX)/secureip/$(XILINX_SECUREIP_PATH)/pcie_a1_$(XILINX_SECUREIP_PATH)/*.vp  $(GRLIB)/lib/tech/secureip/ise; \
	fi
endif

install-secureip_ver: install-unisim_ver
ifeq ("$(GRLIB_SIMULATOR)","Xilinx")
	@echo "GRLIB_SIMULATOR is Xilinx. SecureIP installation not required, aborted."
else
	@echo UNISIM source path: $(UNISIM); \
	for i in $(UNISIMSECIPFILES); do \
	  cp  $(UNISIM)/secureip/$$i  $(GRUNISIM);\
	  echo  installing $$i ;\
	done
	@if (test -r $(XILINX)/secureip/$(XILINX_SECUREIP_PATH)/mcb_$(XILINX_SECUREIP_PATH)); then \
	  echo  installing $(XILINX)/secureip ;\
	  cp  $(XILINX)/secureip/$(XILINX_SECUREIP_PATH)/mcb_$(XILINX_SECUREIP_PATH)/*.vp  $(GRLIB)/lib/tech/secureip_ver/ise;\
	fi ; \
	if (test -r $(XILINX)/secureip/$(XILINX_SECUREIP_PATH)/pcie_2_0_$(XILINX_SECUREIP_PATH)); then \
	  cp  $(XILINX)/secureip/$(XILINX_SECUREIP_PATH)/pcie_2_0_$(XILINX_SECUREIP_PATH)/*.vp  $(GRLIB)/lib/tech/secureip_ver/ise; \
	fi ; \
	if (test -r $(XILINX)/secureip/$(XILINX_SECUREIP_PATH)/gtxe1_$(XILINX_SECUREIP_PATH)); then \
	  cp  $(XILINX)/secureip/$(XILINX_SECUREIP_PATH)/gtxe1_$(XILINX_SECUREIP_PATH)/*.vp  $(GRLIB)/lib/tech/secureip_ver/ise; \
	fi ; \
	if (test -r $(XILINX)/secureip/$(XILINX_SECUREIP_PATH)/gtpa1_dual_$(XILINX_SECUREIP_PATH)); then \
	  cp  $(XILINX)/secureip/$(XILINX_SECUREIP_PATH)/gtpa1_dual_$(XILINX_SECUREIP_PATH)/*.vp  $(GRLIB)/lib/tech/secureip_ver/ise; \
	fi ; \
	if (test -r $(XILINX)/secureip/$(XILINX_SECUREIP_PATH)/gtp_dual_fast_$(XILINX_SECUREIP_PATH)); then \
	  cp  $(XILINX)/secureip/$(XILINX_SECUREIP_PATH)/gtp_dual_fast_$(XILINX_SECUREIP_PATH)/*.vp  $(GRLIB)/lib/tech/secureip_ver/ise; \
	fi ; \
	if (test -r $(XILINX)/secureip/$(XILINX_SECUREIP_PATH)/gtx_dual_fast_$(XILINX_SECUREIP_PATH)); then \
	  cp  $(XILINX)/secureip/$(XILINX_SECUREIP_PATH)/gtx_dual_fast_$(XILINX_SECUREIP_PATH)/*.vp  $(GRLIB)/lib/tech/secureip_ver/ise; \
	fi ; \
	if (test -r $(XILINX)/secureip/$(XILINX_SECUREIP_PATH)/pcie_a1_$(XILINX_SECUREIP_PATH)); then \
	  cp  $(XILINX)/secureip/$(XILINX_SECUREIP_PATH)/pcie_a1_$(XILINX_SECUREIP_PATH)/*.vp  $(GRLIB)/lib/tech/secureip_ver/ise; \
	fi
endif

remove-secureip uninstall-secureip remove-unisim uninstall-unisim:
	@-rm $(GRLIB)/lib/tech/secureip/ise/*.vp $(GRLIB)/lib/tech/secureip_ver/ise/*.vp
	@-rm -r $(GRLIB)/lib/tech/unisims_ver/ise $(GRLIB)/lib/tech/xilinxcorelib_ver/ise
	@-rm $(GRLIB)/lib/tech/unisim/ise/*.vhd

# Simulator compxlib
ifeq ("$(GRLIB_XIL_compxlib_Simulator)","")
# Set default to ModelSim for GRLIB_XIL_compxlib_Simulator
GRLIB_XIL_compxlib_Simulator=mti_se
ifeq ("$(GRLIB_SIMULATOR)","ModelSim")
GRLIB_XIL_compxlib_Simulator=mti_se
endif
ifeq ("$(GRLIB_SIMULATOR)","ModelSim-PE")
GRLIB_XIL_compxlib_Simulator=mti_pe
endif
ifeq ("$(GRLIB_SIMULATOR)","ModelSim-SE")
GRLIB_XIL_compxlib_Simulator=mti_se
endif
ifeq ("$(GRLIB_SIMULATOR)","ALDEC")
GRLIB_XIL_compxlib_Simulator=riviera
endif
ifeq ("$(GRLIB_SIMULATOR)","ALDEC_RWS")
GRLIB_XIL_compxlib_Simulator=riviera
endif
ifeq ("$(GRLIB_SIMULATOR)","Questa")
GRLIB_XIL_compxlib_Simulator=questasim
endif
endif

# Simulator vivado
ifeq ("$(GRLIB_XIL_simlib_Simulator)","")
# Set default to ModelSim for GRLIB_XIL_simlib_Simulator
export GRLIB_XIL_simlib_Simulator=modelsim
ifeq ("$(GRLIB_SIMULATOR)","ModelSim")
export GRLIB_XIL_simlib_Simulator=modelsim
endif
ifeq ("$(GRLIB_SIMULATOR)","ModelSim-PE")
export GRLIB_XIL_simlib_Simulator=modelsim
endif
ifeq ("$(GRLIB_SIMULATOR)","ModelSim-SE")
export GRLIB_XIL_simlib_Simulator=modelsim
endif
ifeq ("$(GRLIB_SIMULATOR)","ALDEC")
export GRLIB_XIL_simlib_Simulator=riviera
endif
ifeq ("$(GRLIB_SIMULATOR)","ALDEC_RWS")
export GRLIB_XIL_simlib_Simulator=riviera
endif
ifeq ("$(GRLIB_SIMULATOR)","Questa")
export GRLIB_XIL_simlib_Simulator=questa
endif
endif

ifeq ("$(COMPXLIBTECH)","")
COMPXLIBTECH=$(ISETECH)
endif

ifeq ("$(GRLIB_COMPILE_VIVADO_IP)","")
VIVADOCOMPILEIP=-no_ip_compile
endif

ifeq ("$(GRLIB_VIVADO_COMPILE_VERBOSE)","")
VERBOSE7SERIESCOMPILE=-quiet
endif


# install-simprim, compile-simprim/xilinxcorelib/unisim/xilinx-simlibs are tailored for ModelSim/Questa
# (target dir is ./modelsim)
install-simprim:
	@echo "install-simprim is not supported. compile-simprim can be used to compile simprim for ModelSim"

compile-simprim:
	compxlib -s $(GRLIB_XIL_compxlib_Simulator) -l vhdl -arch $(COMPXLIBTECH) -lib simprim -w -dir ./modelsim

compile-xilinxcorelib:
	compxlib -s $(GRLIB_XIL_compxlib_Simulator) -l vhdl -arch $(COMPXLIBTECH) -lib xilinxcorelib -w -dir ./modelsim

compile-unisim:
	compxlib -s $(GRLIB_XIL_compxlib_Simulator) -l vhdl -arch $(COMPXLIBTECH) -lib unisim -w -dir ./modelsim

compile-xilinx-simlibs:
	compxlib -s $(GRLIB_XIL_compxlib_Simulator) -l vhdl -arch $(COMPXLIBTECH) -lib unisim -lib simprim -lib xilinxcorelib -w -dir ./modelsim

# Needs to depend on modelsim.ini so that the file is not overwritten by subsequent commands
# Selects family all since GRLIB techmap layer has Virtex-5-specific primitives (for example)
# Compilation of IPs can be turned on by setting GRLIB_COMPILE_VIVADO_IP to a non-empty value
# This is turned off by default, since the IPs aren't used in the template designs
compile_xilinx_7series_lib: modelsim.ini
ifneq ("$(GRLIB_SIMULATOR)","Xilinx")
	-@mkdir -p ./xilinx_lib
	@if [ -d ./xilinx_lib/unisims_ver ]; then \
	echo "Xilinx library already compiled"; else \
	echo "compile_simlib $(VERBOSE7SERIESCOMPILE) -directory ./xilinx_lib/ -family all -language all -simulator $(GRLIB_XIL_simlib_Simulator) $(VIVADOCOMPILEIP) -library unisim -library simprim " > ./xilinx_lib/$(TOP)_simlib.tcl ; \
	vivado -mode batch -source ./xilinx_lib/$(TOP)_simlib.tcl ; \
	fi;
endif

map_xilinx_7series_lib: compile_xilinx_7series_lib
ifneq ("$(GRLIB_SIMULATOR)","Xilinx")
ifneq ("$(GRLIB_SIMULATOR)","ALDEC_RWS")
	@if [ -d ./xilinx_lib/unisims_ver ]; then \
	vmap secureip_ver ./xilinx_lib/secureip ; \
	vmap secureip ./xilinx_lib/secureip ; \
	vmap axi_bfm ./xilinx_lib/secureip ; \
	vmap unisims_ver ./xilinx_lib/unisims_ver ; \
	vmap unisim ./xilinx_lib/unisim ; \
	vmap unimacro_ver ./xilinx_lib/unimacro_ver ; \
	vmap unimacro ./xilinx_lib/unimacro ; \
	vmap simprim_ver ./xilinx_lib/simprims_ver ; \
	vmap unifast_ver ./xilinx_lib/unifast_ver ; \
	vmap unifast ./xilinx_lib/unifast_ver ; else \
	echo "Xilinx Library not found. Please make sure you have installed the correct version of the Xilinx Library. This can also be caused by a simulator error. Please make sure a simulator supported by the Xilinx Vivado version is installed." ; exit 1 ; \
	fi;
else
	vsimsa -c -do $(GRLIB)/bin/aldec/riviera_ws_map_xilinx_libs.do
endif
else
	echo "GRLIB_SIMULATOR is Xilinx, skipping map of libraries"; exit 1
endif

clean-xilinx-lib:
	-rm -rf xilinx_lib compxlib.* .cxl.*.version

ip_7series_generate: vivado/$(TOP)_vivado.tcl $(VHDLSYNFILES) $(VERILOGSYNFILES)
ifeq ($(CONFIG_MIG_7SERIES),y)
	@if [ -d ./vivado/$(DESIGN)/$(DESIGN).srcs/sources_1/ip ]; then \
	echo "Xilinx IPs already generated!"; else \
	vivado -mode batch -source ./vivado/$(TOP)_vivado.tcl ; \
	fi;
endif

mig_7series: ip_7series_generate compile_xilinx_7series_lib map_xilinx_7series_lib
ifneq ("$(GRLIB_SIMULATOR)","Xilinx")
ifeq ($(CONFIG_MIG_7SERIES),y)
ifneq ("$(GRLIB_SIMULATOR)","ALDEC_RWS")
	if [ -f ./vivado/$(DESIGN)/$(DESIGN).srcs/sources_1/ip/mig/mig/user_design/rtl/mig.v ]; then \
	vlog -work gaisler \
	./vivado/$(DESIGN)/$(DESIGN).srcs/sources_1/ip/mig/mig/user_design/rtl/mig.v \
	./vivado/$(DESIGN)/$(DESIGN).srcs/sources_1/ip/mig/mig/user_design/rtl/mig_mig_sim.v \
	./vivado/$(DESIGN)/$(DESIGN).srcs/sources_1/ip/mig/mig/user_design/rtl/clocking/*.v \
	./vivado/$(DESIGN)/$(DESIGN).srcs/sources_1/ip/mig/mig/user_design/rtl/controller/*.v \
	./vivado/$(DESIGN)/$(DESIGN).srcs/sources_1/ip/mig/mig/user_design/rtl/ecc/*.v \
	./vivado/$(DESIGN)/$(DESIGN).srcs/sources_1/ip/mig/mig/user_design/rtl/ip_top/*.v \
	./vivado/$(DESIGN)/$(DESIGN).srcs/sources_1/ip/mig/mig/user_design/rtl/phy/*.v \
	./vivado/$(DESIGN)/$(DESIGN).srcs/sources_1/ip/mig/mig/user_design/rtl/ui/*.v ;\
	vlog -work work $(XILINX_VIVADO)/data/verilog/src/glbl.v ;\
	fi;
	if [ -f ./vivado/$(DESIGN)/$(DESIGN).srcs/sources_1/ip/mig/mig/user_design/rtl/axi/*axi_mc.v ]; then \
	vlog -work gaisler ./vivado/$(DESIGN)/$(DESIGN).srcs/sources_1/ip/mig/mig/user_design/rtl/axi/*.v ;\
	fi;
else
# The design.file.property command below is a hack so that the Verilog MIG IP, in (VHDL)
# library gaisler, will find components from unisim. Otherwise errors will be given during
# riviera elaboration. No documentation has been found about this. The command is intended
# to have the same effects as adding libs using:
# <right click> -> properties -> Enries -> Libraries
	@echo "workspace.open riviera_ws/riviera_ws.rwsp; workspace.design.setactive gaisler"  > riviera_ws_add_mig_7series.do
	@for f in ./vivado/$(DESIGN)/$(DESIGN).srcs/sources_1/ip/mig/mig/user_design/rtl/mig.v \
		./vivado/$(DESIGN)/$(DESIGN).srcs/sources_1/ip/mig/mig/user_design/rtl/mig_mig_sim.v \
		./vivado/$(DESIGN)/$(DESIGN).srcs/sources_1/ip/mig/mig/user_design/rtl/clocking/*.v \
		./vivado/$(DESIGN)/$(DESIGN).srcs/sources_1/ip/mig/mig/user_design/rtl/controller/*.v \
		./vivado/$(DESIGN)/$(DESIGN).srcs/sources_1/ip/mig/mig/user_design/rtl/ecc/*.v \
		./vivado/$(DESIGN)/$(DESIGN).srcs/sources_1/ip/mig/mig/user_design/rtl/ip_top/*.v \
		./vivado/$(DESIGN)/$(DESIGN).srcs/sources_1/ip/mig/mig/user_design/rtl/phy/*.v \
		./vivado/$(DESIGN)/$(DESIGN).srcs/sources_1/ip/mig/mig/user_design/rtl/ui/*.v ; do \
		echo "design.file.add .$$f" >> riviera_ws_add_mig_7series.do ; \
		echo "design.file.property " `basename $$f` "compilation/verilog/verilog-libraries \"secureip_ver;secureip;axi_bfm;unisims_ver;unisim;unimacro_ver;unimacro;simprim_ver;simprim;unifast_ver;unifast\"" >> riviera_ws_add_mig_7series.do; \
	done;
	@echo "workspace.design.setactive work; design.file.add $(XILINX_VIVADO)/data/verilog/src/glbl.v ; quit"  >> riviera_ws_add_mig_7series.do
	@vsimsa -quiet -do riviera_ws_add_mig_7series.do
endif
endif
endif

sgmii_7series: ip_7series_generate compile_xilinx_7series_lib map_xilinx_7series_lib
ifneq ("$(GRLIB_SIMULATOR)","Xilinx")
ifeq ($(CONFIG_GRETH_ENABLE),y)
ifneq ("$(GRLIB_SIMULATOR)","ALDEC_RWS")
	if [ -f./vivado/$(DESIGN)/$(DESIGN).srcs/sources_1/ip/sgmii/synth/sgmii.v ]; then \
	vlib modelsim/gig_ethernet_pcs_pma ;\
	vmap -modelsimini ./modelsim.ini gig_ethernet_pcs_pma ./modelsim/gig_ethernet_pcs_pma ;\
	vcom -work gig_ethernet_pcs_pma ./vivado/$(DESIGN)/$(DESIGN).srcs/sources_1/ip/sgmii/hdl/gig_ethernet_pcs_pma*.vhd  ;\
	vlog -work work \
	./vivado/$(DESIGN)/$(DESIGN).srcs/sources_1/ip/sgmii/synth/*.v \
	./vivado/$(DESIGN)/$(DESIGN).srcs/sources_1/ip/sgmii/synth/*/*.v ;\
	fi;
else
	@echo "workspace.open riviera_ws/riviera_ws.rwsp"  > riviera_ws_add_sgmii_7series.do
	@echo "workspace.design.create gig_ethernet_pcs_pma_v14_3 ."  >> riviera_ws_add_sgmii_7series.do
	@echo "workspace.design.setactive gig_ethernet_pcs_pma_v14_3"  >> riviera_ws_add_sgmii_7series.do
	@echo "amap secureip_ver ../xilinx_lib/secureip"  >> riviera_ws_add_sgmii_7series.do
	@echo "amap secureip ../xilinx_lib/secureip"  >> riviera_ws_add_sgmii_7series.do
	@echo "amap axi_bfm ../xilinx_lib/secureip"  >> riviera_ws_add_sgmii_7series.do
	@echo "amap unisims_ver ../xilinx_lib/unisims_ver"  >> riviera_ws_add_sgmii_7series.do
	@echo "amap unisim ../xilinx_lib/unisim"  >> riviera_ws_add_sgmii_7series.do
	@echo "amap unimacro_ver ../xilinx_lib/unimacro_ver"  >> riviera_ws_add_sgmii_7series.do
	@echo "amap unimacro ../xilinx_lib/unimacro"  >> riviera_ws_add_sgmii_7series.do
	@echo "amap simprim_ver ../xilinx_lib/simprims_ver"  >> riviera_ws_add_sgmii_7series.do
	@echo "amap unifast_ver ../xilinx_lib/unifast_ver"  >> riviera_ws_add_sgmii_7series.do
	@echo "amap unifast ../xilinx_lib/unifast_ver"  >> riviera_ws_add_sgmii_7series.do
	@echo "design.file.add ../vivado/$(DESIGN)/$(DESIGN).srcs/sources_1/ip/sgmii/gig_ethernet_pcs_pma_v14_3/hdl/gig_ethernet_pcs_pma_v14_3_rfs.vhd"  >> riviera_ws_add_sgmii_7series.do
	@echo "workspace.design.setactive work"  >> riviera_ws_add_sgmii_7series.do

	@for f in ./vivado/$(DESIGN)/$(DESIGN).srcs/sources_1/ip/sgmii/synth/*.v \
		./vivado/$(DESIGN)/$(DESIGN).srcs/sources_1/ip/sgmii/synth/*/*.v ; do \
		echo "design.file.add .$$f" >> riviera_ws_add_mig_7series.do ; \
		echo "design.file.property " `basename $$f` "compilation/verilog/verilog-libraries \"secureip_ver;secureip;axi_bfm;unisims_ver;unisim;unimacro_ver;unimacro;simprim_ver;simprim;unifast_ver;unifast\"" >> riviera_ws_add_mig_7series.do; \
	done;
	@echo "quit"  >> riviera_ws_add_sgmii_7series.do
	@vsimsa -quiet -do riviera_ws_add_sgmii_7series.do
endif
endif
endif

.PHONY: compile_xilinx_7series_lib map_xilinx_7series_lib mig_7series_generate mig_7series install-simprim compile-simprim compile-xilinxcorelib compile-unisim compile-xilinx-simlibs

#########    Xilinx PlanAhead targets   ############
ifeq ("$(AREA_OPT)","")
AREA_OPT =no
endif
ifeq ("$(PLANAHEAD_SYNTH_FLOW)","")
PLANAHEAD_SYNTH_FLOW="XST 14"
endif
ifeq ("$(PLANAHEAD_SYNTH_STRATEGY)","")
PLANAHEAD_SYNTH_STRATEGY="TimingWithIOBPacking"
#PLANAHEAD_SYNTH_STRATEGY="XST Defaults"
endif
ifeq ("$(PLANAHEAD_IMPL_STRATEGY)","")
PLANAHEAD_IMPL_STRATEGY="ParHighEffort"
endif
AREA_OPT_LW=$(shell echo $(AREA_OPT) | tr '[:upper:]' '[:lower:]')
ifeq ("$(AREA_OPT_LW)","yes")
PLANAHEAD_SYNTH_STRATEGY="AreaReduction"
PLANAHEAD_IMPL_STRATEGY="MapCoverArea"
endif

## Xilinx planAhead project properties that can be overrideen
ifeq ("$(GRLIB_XIL_PlanAhead_Simulator)","")
ifeq ("$(GRLIB_SIMULATOR)","ModelSim")
GRLIB_XIL_PlanAhead_Simulator=ModelSim
else
GRLIB_XIL_PlanAhead_Simulator=ISim
endif
endif

#PLANAHEAD_SIMSET=sim_$(DESIGN)
PLANAHEAD_SIMSET=sim_1

planahead-launch: planahead/$(TOP)_planAhead.tcl $(VHDLSYNFILES) $(VERILOGSYNFILES)
	planAhead -mode gui -source ./planahead/$(TOP)_planAhead.tcl
	@if test -r ./planahead/$(DESIGN)/$(DESIGN).runs/impl_1/$(TOP).bit; then \
	  cp ./planahead/$(DESIGN)/$(DESIGN).runs/impl_1/$(TOP).bit . ; \
	  cp ./planahead/$(DESIGN)/$(DESIGN).runs/impl_1/$(TOP).msk . ; \
	fi;

planahead: planahead/$(TOP)_planAhead.tcl $(VHDLSYNFILES) $(VERILOGSYNFILES)
	planAhead -mode batch -source ./planahead/$(TOP)_planAhead.tcl ./planahead/$(TOP)_planAhead_run.tcl ./planahead/$(TOP)_planAhead_end.tcl
	@if test -r ./planahead/$(DESIGN)/$(DESIGN).runs/impl_1/$(TOP).bit; then \
	  cp ./planahead/$(DESIGN)/$(DESIGN).runs/impl_1/$(TOP).bit . ; \
	  cp ./planahead/$(DESIGN)/$(DESIGN).runs/impl_1/$(TOP).msk . ; \
	fi;

planahead-clean:
	-rm -rf ./planahead planAhead.log planAhead*.jou planAhead*.*.log

#########    Xilinx Vivado targets   ############

VIVADOVHDL = read_vhdl -library
VIVADOVLOG = read_verilog -library

VIVADOLIBSKIPX = $(ASICLIBS) $(BRMLIBS) $(ACTELLIBS) $(ALTERALIBS) \
	$(LATTICELIBS) $(COREPCILIB) $(SIMLIBS)
VIVADOLIBSKIP = $(VIVADOLIBSKIPX:%=%|) dware | grdware
VIVADODIRSKIPX = $(ASICLIBS) $(ACTELLIBS) $(ALTERALIBS) $(LATTICELIBS)
VIVADODIRSKIP = $(VIVADODIRSKIPX:%=%|) dware | grdware
VIVADOSKIP = $(VIVADOSKIPX) b1553* | pci_components* | pcicore* | snpsmul.vhd | clkgen_virtex.vhd | \
	memory_virtex.vhd | simple_simprim.vhd | unisim_VCOMP.vhd | unisim_VITAL.vhd | unisim_VPKG.vhd


ifeq ("$(VIVADO_SYNTH_FLOW)","")
VIVADO_SYNTH_FLOW=Vivado Synthesis 2012
endif
ifeq ("$(VIVADO_SYNTH_STRATEGY)","")
VIVADO_SYNTH_STRATEGY=Vivado Synthesis Defaults
endif
ifeq ("$(VIVADO_IMPL_STRATEGY)","")
VIVADO_IMPL_STRATEGY=Vivado Implementation Defaults
endif

## Xilinx Vivado project properties that can be overrideen
ifeq ("$(GRLIB_XIL_Vivado_Simulator)","")
GRLIB_XIL_Vivado_Simulator=XSim
ifeq ("$(GRLIB_SIMULATOR)","ModelSim")
GRLIB_XIL_Vivado_Simulator=ModelSim
endif
ifeq ("$(GRLIB_SIMULATOR)","ModelSim-PE")
GRLIB_XIL_Vivado_Simulator=ModelSim
endif
ifeq ("$(GRLIB_SIMULATOR)","ModelSim-SE")
GRLIB_XIL_Vivado_Simulator=ModelSim
endif
ifeq ("$(GRLIB_SIMULATOR)","Questa")
GRLIB_XIL_Vivado_Simulator=Questa
endif
ifeq ("$(GRLIB_SIMULATOR)","ALDEC")
GRLIB_XIL_Vivado_Simulator=Riviera
endif
ifeq ("$(GRLIB_SIMULATOR)","ALDEC_RWS")
GRLIB_XIL_Vivado_Simulator=Riviera
endif
endif

#VIVADO_SIMSET=sim_$(DESIGN)
VIVADO_SIMSET=sim_1

vivado-launch: vivado/$(TOP)_vivado.tcl $(VHDLSYNFILES) $(VERILOGSYNFILES)
	vivado -mode gui -source ./vivado/$(TOP)_vivado.tcl
	@if test -r ./vivado/$(DESIGN)/$(DESIGN).runs/impl_1/$(TOP).bit; then \
	  cp ./vivado/$(DESIGN)/$(DESIGN).runs/impl_1/$(TOP).bit . ; \
	  cp ./vivado/$(DESIGN)/$(DESIGN).runs/impl_1/$(TOP).msk . ; \
	fi;

vivado: vivado/$(TOP)_vivado.tcl $(VHDLSYNFILES) $(VERILOGSYNFILES)
	vivado -mode batch -source ./vivado/$(TOP)_vivado.tcl ./vivado/$(TOP)_vivado_run.tcl | tee $(TOP)_vivado.log
	@if test -r ./vivado/$(DESIGN)/$(DESIGN).runs/impl_1/$(TOP).bit; then \
	  cp ./vivado/$(DESIGN)/$(DESIGN).runs/impl_1/$(TOP).bit . ; \
	  cp ./vivado/$(DESIGN)/$(DESIGN).runs/impl_1/$(TOP).msk . ; \
	fi;

vivado-clean:
	-rm -rf ./vivado *vivado.log vivado*.jou vivado*.backup.log vivado*.str .Xil .cxl.*.version compile_simlib.log compile_simlib.log.bak xmd.ini xsct.ini

vivado-detected-prog := $(shell { command -v xsct || command -v xmd; } 2>/dev/null)

vivado-prog-fpga:
	@echo "connect" > ./xsct.ini
	@echo "fpga -f ./vivado/$(DESIGN)/$(DESIGN).runs/impl_1/$(TOP).bit" > ./xmd.ini
	@echo "exit" >> ./xmd.ini
	cat  ./xmd.ini >>./xsct.ini
	$(vivado-detected-prog)

vivado-prog-fpga-ref:
	@echo "connect" > ./xsct.ini
	@echo "fpga -f ./bitfiles/$(TOP).bit" > ./xmd.ini
	@echo "exit" >> ./xmd.ini
	cat  ./xmd.ini >>./xsct.ini
	$(vivado-detected-prog)

#########   Altera targets   ############

install-altera:
ifeq ("$(QUARTUS_ROOTDIR)","")
	@echo "QUARTUS_ROOTDIR is not set. Altera library installation failed"
else
	@if test -r $(QUARTUS_ROOTDIR)/eda/sim_lib/altera_primitives.vhd; then \
	  echo installing tech/altera ;\
	  cp $(QUARTUS_ROOTDIR)/eda/sim_lib/altera_primitives*.vhd  $(GRLIB)/lib/tech/altera/simprims ;\
	else echo skipping tech/altera; fi ; \
	if test -r $(QUARTUS_ROOTDIR)/eda/sim_lib/altera_mf_components.vhd; then \
	  echo installing tech/altera_mf ;\
	  cp $(QUARTUS_ROOTDIR)/eda/sim_lib/altera_mf*.vhd  $(GRLIB)/lib/tech/altera_mf/simprims ;\
	  cat $(GRLIB)/bin/altera/altera_mf.vhd >> $(GRLIB)/lib/tech/altera_mf/simprims/altera_mf.vhd ;\
	else echo skipping tech/altera_mf; fi ; \
	if test -r $(QUARTUS_ROOTDIR)/eda/sim_lib/cycloneiii_atoms.vhd; then \
	  echo installing tech/cycloneiii ;\
	  cp $(QUARTUS_ROOTDIR)/eda/sim_lib/cycloneiii_*.vhd  $(GRLIB)/lib/tech/cycloneiii/simprims ;\
	else echo skipping tech/cycloneiii - not supported by Quartus II version; fi ; \
	if test -r $(QUARTUS_ROOTDIR)/eda/sim_lib/stratixii_atoms.vhd; then \
	  echo installing tech/stratixii ;\
	  cp $(QUARTUS_ROOTDIR)/eda/sim_lib/stratixii_*.vhd  $(GRLIB)/lib/tech/stratixii/simprims ;\
	else echo skipping tech/stratixii - not supported by Quartus II version; fi ; \
	if test -r $(QUARTUS_ROOTDIR)/eda/sim_lib/stratixiii_atoms.vhd; then \
	  echo installing tech/stratixii ;\
	  cp $(QUARTUS_ROOTDIR)/eda/sim_lib/stratixiii_*.vhd  $(GRLIB)/lib/tech/stratixiii/simprims ;\
	else echo skipping tech/stratixiii - not supported by Quartus II version; fi ; \
	echo Altera library installation completed.
endif

remove-altera:
	-@rm $(GRLIB)/lib/tech/altera/simprims/altera_primitives*.vhd \
	$(GRLIB)/lib/tech/altera_mf/simprims/altera_mf*.vhd \
	$(GRLIB)/lib/tech/cycloneiii/simprims/cycloneiii_*.vhd \
	$(GRLIB)/lib/tech/stratixii/simprims/stratixii_*.vhd \
	$(GRLIB)/lib/tech/stratixiii/simprims/stratixiii_*.vhd
	@echo Altera libraries removed from GRLIB

#########   Altera Quartus targets   ############

#ifeq ("$(QUARTUS_ROOTDIR)","")
QUARTUS_CDB = quartus_cdb $(QUARTUSOPT)
QUARTUS_MAP = quartus_map $(QUARTUSOPT)
QUARTUS_FIT = quartus_fit $(QUARTUSOPT)
QUARTUS_ASM = quartus_asm $(QUARTUSOPT)
QUARTUS_STA = quartus_sta $(QUARTUSOPT)
QUARTUS_PGM = quartus_pgm $(QUARTUSOPT)
QUARTUS_SH = quartus_sh $(QUARTUSOPT)
#else
#QUARTUS_MAP = $(QUARTUS_ROOTDIR)/bin/quartus_map
#QUARTUS_FIT = $(QUARTUS_ROOTDIR)/bin/quartus_fit
#QUARTUS_ASM = $(QUARTUS_ROOTDIR)/bin/quartus_asm
#QUARTUS_STA = $(QUARTUS_ROOTDIR)/bin/quartus_tan
#endif
ALTCABLE ?= USB-Blaster
QLIBSKIPX = $(SIMLIBS) $(ASICLIBS) $(BRMLIBS) $(ACTELLIBS) $(XILINXLIBS) \
	$(LATTICELIBS) $(COREPCILIB)
QUARTUSLIBSKIP = $(QLIBSKIPX:%=%|) dware
QDIRSKIPX = $(ASICLIBS) $(ACTELLIBS) $(XILINXLIBS) $(LATTICELIBS)
QDIRSKIP = $(QDIRSKIPX:%=%|) dware | satcan | leon2ft
QUARTUSSKIP = b1553* | pci_components* | pcicore* | snpsmul.vhd

quartus-vqm:
	-@case $(TECHNOLOGY) in \
	CYCLONEII) \
		cp  $(GRLIB)/netlists/altera/cyclone2/*.vqm . ;;\
	CYCLONEIII) \
		cp  $(GRLIB)/netlists/altera/cyclone3/*.vqm . ;;\
	CYCLONEIV) \
		cp  $(GRLIB)/netlists/altera/cyclone3/*.vqm . ;;\
	CYCLONEIV-E) \
		cp  $(GRLIB)/netlists/altera/cyclone3/*.vqm . ;;\
	CYCLONEV) \
		cp  $(GRLIB)/netlists/altera/cyclone5/*.vqm . ;;\
	STRATIXV) \
		cp  $(GRLIB)/netlists/altera/stratix5/*.vqm . ;;\
	STRATIXIV) \
		cp  $(GRLIB)/netlists/altera/stratix4/*.vqm . ;;\
	STRATIXIII) \
		cp  $(GRLIB)/netlists/altera/stratix3/*.vqm . ;;\
	STRATIXII) \
		cp  $(GRLIB)/netlists/altera/stratix2/*.vqm . ;;\
	esac

quartus: quartus-vqm
	make quartus-map quartus-route

quartus-synp:  $(TOP)_synplify.prj synplify/$(TOP).edf quartus-vqm
	@-cp synplify/*.hex .
	$(QUARTUS_MAP) --import_settings_files=on  --export_settings_files=off $(TOP)_synplify -c $(TOP)_synplify
	    $(if $(strip $(QSF_NEXT)),$(QUARTUS_SH) -t $(QSF_NEXT) quartus_map $(TOP)_synplify $(TOP)_synplify,)
	$(QUARTUS_CDB) --merge $(TOP)_synplify
	$(QUARTUS_FIT) --import_settings_files=off --export_settings_files=off $(TOP)_synplify -c $(TOP)_synplify
	    $(if $(strip $(QSF_NEXT)),$(QUARTUS_SH) -t $(QSF_NEXT) quartus_fit $(TOP)_synplify $(TOP)_synplify,)
	$(QUARTUS_ASM) --import_settings_files=off --export_settings_files=off $(TOP)_synplify -c $(TOP)_synplify
	    $(if $(strip $(QSF_NEXT)),$(QUARTUS_SH) -t $(QSF_NEXT) quartus_asm $(TOP)_synplify $(TOP)_synplify,)
	$(QUARTUS_STA) $(TOP)_synplify

quartus-launch: $(TOP)_quartus.qsf quartus-vqm
	quartus  $(TOP)_quartus.qpf

quartus-launch-synp:  $(TOP)_synplify.prj synplify/$(TOP).edf quartus-vqm
	quartus $(TOP)_synplify.qpf

quartus-map: $(TOP)_quartus.qsf quartus-vqm
	$(QUARTUS_MAP) --import_settings_files=on  --export_settings_files=off $(TOP)_quartus -c $(TOP)_quartus
	    $(if $(strip $(QSF_NEXT)),$(QUARTUS_SH) -t $(QSF_NEXT) quartus_map     $(TOP)_quartus $(TOP)_quartus,)

quartus-route: $(TOP)_quartus.qsf
	$(QUARTUS_CDB) --merge $(TOP)_quartus
	$(QUARTUS_FIT) --import_settings_files=off --export_settings_files=off $(TOP)_quartus -c $(TOP)_quartus
	    $(if $(strip $(QSF_NEXT)),$(QUARTUS_SH) -t $(QSF_NEXT) quartus_fit $(TOP)_quartus $(TOP)_quartus,)
	$(QUARTUS_ASM) --import_settings_files=off --export_settings_files=off $(TOP)_quartus -c $(TOP)_quartus
	    $(if $(strip $(QSF_NEXT)),$(QUARTUS_SH) -t $(QSF_NEXT) quartus_asm $(TOP)_quartus $(TOP)_quartus,)
	$(QUARTUS_STA) $(TOP)_quartus

quartus-prog-fpga:
	$(QUARTUS_PGM) -c $(ALTCABLE) -m JTAG -o p\;$(TOP)_quartus.sof

quartus-prog-fpga-ref:
	cp bitfiles/$(TOP)_quartus.sof $(TOP)_ref.sof
	$(QUARTUS_PGM) -c $(ALTCABLE) -m JTAG -o p\;$(TOP)_ref.sof

quartus-srec:
	$(QUARTUS_PGM)

quartus-clean:
	-rm -rf db *.syr *.qws automake.log dumpdata.txt \
	*.rpt *.done *.eqn *.pof *.summary *.ttf *.pin *.sof \
	*.jam *.jbc cmp_state.ini simulation undo_redo.txt *.vqm *.qdf \
	*.csf *.psf *.quartus *.smsg .undefinedlib .jaguarc .unorderedFilePath \
	incremental_db PLLJ_PLLSPE_INFO.txt *.jdi $(TOP)_quartus.sld

########   Synplify targets   ########################

SYNPVHDL = add_file -vhdl -lib
SYNPVLOG = add_file -verilog
SYNPLIBSKIP = $(ASICLIBS)
XSYNPLIBSKIP = $(SYNPLIBSKIP:%=%|) dummy
XSYNPDIRSKIP = $(SYNPLIBSKIP:%=%|) dummy

SYNPSKIP = snpsmul.vhd

SYNPLIFY = synplify_pro


synplify synplify-map: $(TOP)_synplify.prj synplify/$(TOP).edf

synplify-launch: $(TOP)_synplify.prj
	$(SYNPLIFY) $(TOP)_synplify.prj && \
	if test -r synplify//$(TOP).edn; then \
	  echo "GRLIB: Detected synplify/$(TOP).edn, copying to synplify/$(TOP).edf"; \
	  cp synplify/$(TOP).edn synplify/$(TOP).edf; \
	fi &
	-@mkdir synplify>& tmp.err; touch synplify/dummy.mif
	-@mv synplify/*.mif .

synplify/$(TOP).edf: $(VHDLSYNFILES) $(VERILOGSYNFILES)
	$(SYNPLIFY) -batch $(TOP)_synplify.prj
	@touch synplify/dummy.mif
	-@mv synplify/*.mif .
	@if test -r synplify/$(TOP).edn; then \
	  echo "GRLIB: Detected synplify/$(TOP).edn, copying to synplify/$(TOP).edf"; \
	  cp synplify/$(TOP).edn synplify/$(TOP).edf; \
	fi;

$(TOP)_synplify.prj: compile.synp
	@echo source compile.synp > $(TOP)_synplify.prj
	@for i in $(VERILOGOPTSYNFILES) $(VERILOGSYNFILES); do \
	    if test -r $$i; then \
		echo add_file "-verilog -lib work" $$i >> $(TOP)_synplify.prj; \
	    fi; \
	done
	@for i in $(VHDLOPTSYNFILES) $(VHDLSYNFILES); do \
	    if test -r $$i; then \
		echo add_file "-vhdl -lib work" $$i >> $(TOP)_synplify.prj; \
	    fi; \
	done
	@if test -r $(GRLIB)/netlists/xilinx/$(NETLISTTECH)/edifsyn.txt; then \
	  for q in `cat $(GRLIB)/netlists/xilinx/$(NETLISTTECH)/edifsyn.txt`; do \
	    if test -r $(GRLIB)/netlists/xilinx/$(NETLISTTECH)/$$q; then \
	      echo add_file -edif $(GRLIB)/netlists/xilinx/$(NETLISTTECH)/$$q >> $(TOP)_synplify.prj ; \
	    fi; \
	  done; \
	fi
	@for i in $(SDCFILE); do echo add_file "-constraint " $$i >> $(TOP)_synplify.prj; done
	@for i in $(FDCFILE); do echo add_file "-fpga_constraint " $$i >> $(TOP)_synplify.prj; done
	@cat $(GRLIB)/bin/synplify.prj | sed -e s/TOP/$(TOP)/ \
	-e s/TECHNOLOGY/$(TECHNOLOGY)/ \
	-e s/PART/$(PART)/ -e s/SPEED/$(SPEED)/ -e s/SYNFREQ/$(SYNFREQ)/ >> $(TOP)_synplify.prj
ifneq ("$(PACKAGE)","")
	@echo set_option -package $(PACKAGE) >> $(TOP)_synplify.prj
endif
ifneq ("$(SYNPVLOGDEFS)","")
	@echo set_option -hdl_define -set \"$(SYNPVLOGDEFS)\" >> $(TOP)_synplify.prj
endif
ifneq ("$(SYNPVLOGINC)","")
	@echo set_option -include_path \"$(SYNPVLOGINC)\" >> $(TOP)_synplify.prj
endif
ifneq ("$(SYNPVLOGSTD)","")
	@echo set_option -vlog_std \"$(SYNPVLOGSTD)\" >> $(TOP)_synplify.prj
endif
	@echo $(SYNPOPT) >> $(TOP)_synplify.prj
	@echo impl -active \"synplify\" >> $(TOP)_synplify.prj

synplify-clean:
	-rm -rf synplify *.prd stdout.log *.mif syntmp.* synplify_* \
	$(TOP).map $(TOP)_summary.xml synlog.tcl

########   Precision targets   ########################

PRECLIBSKIPX = $(SIMLIBS) $(ASICLIBS)
PRECLIBSKIP =  $(PRECLIBSKIPX:%=%|) dware
PRECDIRSKIP =  $(PRECLIBSKIPX:%=%|) dware
PRECSKIP = dummy


PRECISION=precision

precision precision-map: $(TOP)_precision.tcl $(TOP).psp precision/$(TOP).edf

$(TOP).psp: $(TOP)_precision.tcl
	$(PRECISION) -shell $(PRECISIONOPT) -file $(TOP)_precision.tcl

precision-launch: $(TOP).psp
	$(PRECISION) $(PRECISIONOPT) -project $(TOP).psp

precision/$(TOP).edf: $(TOP)_precision.tcl  $(VHDLSYNFILES) $(VERILOGSYNFILES)
	$(PRECISION) -shell $(PRECISIONOPT) -file $(TOP)_precrun.tcl

precision-clean:
	-rm -rf *.psp stdout.log prec.log  $(TOP)_prec* precision* $(TOP)_temp*

######### DARE targets ###############

ifneq ("$(GRLIB)","")
-include $(GRLIB)/bin/Makefile.dare
endif

remove-dare:
	-@rm -r $(GRLIB)/lib/tech/dare/components/*.v
	@echo "" > $(GRLIB)/lib/tech/dare/components/vlogsim.txt

######### Microsemi targets ###############
PROASIC3LIBS = proasic3 proasic3e proasic3l
XLIBEROLIBSKIP = $(ASICLIBS) $(LATTICELIBS) $(GLS_LIBS) \
	$(ALTERALIBS) $(XILINXLIBS) $(PROASIC3LIBS) fusion smartfusion2 axcelerator rtg4 polarfire
LIBEROLIBSKIP = $(XLIBEROLIBSKIP:%=%|) dummy
LIBERODIRSKIPX = $(ASICLIBS) $(XILINXLIBS) $(ALTERALIBS) $(LATTICELIBS)
LIBERODIRSKIP = $(LIBERODIRSKIPX:%=%|) dummy
LIBEROSKIP = dummy

ifeq ("$(TECHNOLOGY)","RTG4")
LIBEROPRECOMPLIBDIR=rtg4
else ifeq ("$(TECHNOLOGY)","ProASIC3L")
LIBEROPRECOMPLIBDIR=proasic3l
else ifeq ("$(TECHNOLOGY)","ProASIC3")
LIBEROPRECOMPLIBDIR=proasic3
else ifeq ("$(TECHNOLOGY)","ProASIC3E")
LIBEROPRECOMPLIBDIR=proasic3e
else ifeq ("$(TECHNOLOGY)","IGLOO2")
LIBEROPRECOMPLIBDIR=smartfusion2
else ifeq ("$(TECHNOLOGY)","PolarFire")
LIBEROPRECOMPLIBDIR=polarfire
else
LIBEROPRECOMPLIBDIR=smartfusion2
endif

LIBERO = libero

# DESIGNER_LAYOUT_OPT can be overridden i template design Makefile
ifeq ("$(DESIGNER_LAYOUT_OPT)","")
ifeq ("$(TECHNOLOGY)","Axcelerator")
DESIGNER_LAYOUT_OPT=-effort_level 5 -timing_driven -incremental \"OFF\"
else
DESIGNER_LAYOUT_OPT=-timing_driven -incremental \"OFF\"
endif
endif

ifeq ("$(DESIGNER_TECHNOLOGY)","")
DESIGNER_TECHNOLOGY=$(TECHNOLOGY)
endif

ifeq ("$(DESIGNER_PART)","")
DESIGNER_PART=$(PART)
endif

ifeq ("$(DESIGNER_RESTRICTPROBEPINS)","")
DESIGNER_RESTRICTPROBEPINS=1
endif

ifeq ("$(DESIGNER_RTG4_SET_MITIGATION)","")
DESIGNER_RTG4_SET_MITIGATION=unassigned
endif


ifneq ("$(GRLIB)","")
-include $(GRLIB)/bin/Makefile.microsemi
endif

actel-clean:
	-rm -rf *.adb report*.log ./actel hdl constraint \
	actgen constraint designer package phy_synthesis simulation \
	smartgen stimulus synthesis viewdraw libero x $(TOP)_libero.prj \
	libero_sim_files libero_syn_files coreconsole \
	libero.do component *.pdb *.pdb.depends *.stp \
	*.sdb *_layout.log *.dtf from.ufc from.mem  \
	 $(TOP)_libero.prjx tooldata $(TOP)_libero.tcl $(TOP)_libero/ \
	$(TOP)_libero_genbit.tcl $(TOP)_libero_progfpga.tcl

remove-microsemi: remove-microsemi-precomp
	-@for i in fusion proasic3 proasic3e proasic3l axcelerator smartfusion2 rtg4 polarfire; do \
	  rm $(GRLIB)/lib/tech/$$i/components/$$i.v* ;  \
	done

remove-microsemi-precomp:
	-@rm -r $(GRLIB)/lib/tech/smartfusion2/precomp_libraries/smartfusion2
	-@rm -r $(GRLIB)/lib/tech/rtg4/precomp_libraries/rtg4
	-@rm -r $(GRLIB)/lib/tech/polarfire/precomp_libraries/polarfire

############  Synopsys              ########################

install-gtech:
	@echo GTECH source path: $(SNPS_HOME)/packages/gtech/src; \
	if test -r $(SNPS_HOME)/packages/gtech/src; then \
	  cp $(SNPS_HOME)/packages/gtech/src/*.vhd $(GRLIB)/lib/tech/gtech/simprims; \
        fi

remove-gtech:
	@-rm $(GRLIB)/lib/tech/gtech/simprims/*.vhd


############  Synopsys DC targets   ########################

DCVHDL = analyze -f VHDL -library
DCVLOG = analyze -f VERILOG -library
FMVHDL = read_vhdl -r -libname
FMVLOG = read_verilog -r -libname
ifeq ("$(DCSCRIPT)","")
DCSCRIPT=$(TOP)_dc.tcl
endif
ifeq ("$(FMSCRIPT)","")
FMSCRIPT=$(TOP)_fm.tcl
endif
DCLIBSKIP = $(FPGALIBS) corePCIF
DCDIRSKIP =  $(FPGALIBS) corePCIF pci/pcif
#DCDIRSKIP =  corePCIF pcif
XDCLIBSKIP = $(DCLIBSKIP:%=% | ) dummy
XDCDIRSKIP = $(DCDIRSKIP:%=% | ) dummy
DCSKIP = $(DCLIBSKIP:%=*_%.vhd | ) dummy

dc-launch: $(TOP)_dc.tcl
	@-mkdir -p synopsys
	design_compiler&

dc: $(TOP)_dc.tcl
	@-mkdir -p synopsys
	dc_shell-xg-t $(DCOPT) -f $(DCSCRIPT) | tee $(DCSCRIPT).log

fm: $(TOP)_dc.tcl
	@-mkdir -p synopsys
	fm_shell $(FMOPT) -f $(FMSCRIPT) | tee $(FMSCRIPT).log

$(TOP)_dc.tcl: compile.dc
	@cp $(GRLIB)/bin/top.dc $(TOP)_dc.tcl
	@for i in $(VERILOGOPTSYNFILES) $(VERILOGSYNFILES); do \
	 if test -r $$i; then \
	    echo $(DCVLOG) work $$i >> $(TOP)_dc.tcl; \
	    echo $(FMVLOG) work $$i >> fmref.tcl; \
	 fi; \
	done
	@for i in $(VHDLOPTSYNFILES) $(VHDLSYNFILES); do \
	 if test -r $$i; then \
	    echo $(DCVHDL) work $$i >> $(TOP)_dc.tcl; \
	    echo $(FMVHDL) work $$i >> fmref.tcl; \
	 fi; \
	done
	@echo elaborate $(TOP) >> $(TOP)_dc.tcl

dc-clean:
	-rm -rf synopsys view_command.log command.log dumpdata.txt filenames.log \
	dc.log dwsvf* alib* $(TOP)_dc.tcl fmref.tcl fm_shell_command.log \
	formality*.log *.svf $(DCSCRIPT).log $(DCSCRIPT).log.swp FM_WORK $(FMSCRIPT).log formality_svf *.mr *.pvl \
	ARCH ENTI PACK *.log.swp

############  Cadence RTL Compiler   ########################

RTLCVHDL = read_hdl -vhdl -lib
RTLCVLOG = read_hdl
RCSCRIPT=$(TOP).rc

NCVHDL = ncvhdl -nowarn DLCPTH -NOVITALCHECK -linedebug -v93 -nocopyright -work
NCVLOG = ncvlog -nowarn DLCPTH -nocopyright -linedebug $(NCVLOGOPT) -work

rc: $(TOP).rc
	-mkdir rtlc
	rc -files $(RCSCRIPT)

$(TOP).rc: compile.rc
	@cp $(GRLIB)/bin/top.rc $(TOP).rc
	@for i in $(VHDLOPTSYNFILES) $(VHDLSYNFILES); do \
	 if test -r $$i; then \
	    echo "read_hdl -vhdl -lib work" $$i >> $(TOP).rc; \
	 fi; \
	done
#	@for i in $(VERILOGOPTSYNFILES) $(VERILOGSYNFILES); do echo "read_hdl " $$i >> $(TOP).rc; done
	@echo elaborate $(TOP) >> $(TOP).rc

rc-clean:
	-rm -rf rtlc rc.log rc.cmd


#########    NanoXplore  targets   ############

# There are some issues with supporting installing simulation libraries for
# multiple tool versions:
# 1. In NanoXmap 2 only a single nxLibrary.vhdp is provided while in later
#  versions there are separate nxLibrary-Medium.vhdl, nxLibrary-Large.vdhp
#  and nxLibrary-Ultra.vhdp files. (nxLibrary.vhdp remains, but is a symbolic
#  link to nxLibrary-Medium.vhdp).
# 2. Some tool versions seem to lack share/modelsim in favour of share/backannoted
#  [sic?]. The spelling of "backannoted" varies with version.
# 3. The GRLIB techmap layer assumes the existence of NG-ULTRA primitives and
#  will not compile when these are not present.
# 4. The .vhdp files from later tool versions require VHDL 2008.
# The following has been successfully tested with nxdesignsuite-22.3.0.2 and
# NXmap-22.1.0.1 (though ModelSim does report some unresolved warnings).
install-nxlibrary:
ifeq ("$(NANOXLIBPATH)","")
	@echo "NANOXLIBPATH is not set. NanoXplore library installation failed"
else
ifeq ("$(wildcard $(NANOXLIBPATH)/nxLibrary-Ultra.vhdp)","")
	@echo "ERROR: Could not find nxLibrary-Ultra.vhdp in $(NANOXLIBPATH)"
	@echo " This suggests an old tool version without NG-ULTRA support. The GRLIB"
	@echo " techmap layer for NanoXplore will fail to compile. "
	@echo "NanoXplore library installation failed"
else
	@cp $(NANOXLIBPATH)/nxLibrary.vhdp $(GRLIB)/lib/tech/nx/components/nxLibrary.vhdp
	@echo "Copied nxLibrary.vhdp"
	@cp $(NANOXLIBPATH)/nxLibrary-Medium.vhdp $(GRLIB)/lib/tech/nx/components/nxLibrary-Medium.vhdp
	@echo "Copied nxLibrary-Medium.vhdp"
	@cp $(NANOXLIBPATH)/nxLibrary-Large.vhdp $(GRLIB)/lib/tech/nx/components/nxLibrary-Large.vhdp
	@echo "Copied nxLibrary-Large.vhdp"
	@cp $(NANOXLIBPATH)/nxLibrary-Ultra.vhdp $(GRLIB)/lib/tech/nx/components/nxLibrary-Ultra.vhdp
	@echo "Copied nxLibrary-Ultra.vhdp"
	@echo "NanoXplore library installed in GRLIB"
endif
endif

remove-nxlibrary:
	rm -f $(GRLIB)/lib/tech/nx/components/nxLibrary.vhdp
	rm -f $(GRLIB)/lib/tech/nx/components/nxLibrary-Medium.vhdp
	rm -f $(GRLIB)/lib/tech/nx/components/nxLibrary-Large.vhdp
	rm -f $(GRLIB)/lib/tech/nx/components/nxLibrary-Ultra.vhdp
	@echo "NanoXplore libraries removed from GRLIB"


ifeq ("$(TIMING_DRIVEN)","")
TIMING_DRIVEN=No
endif
ifeq ("$(MAPPING_EFFORT)","")
MAPPING_EFFORT=High
endif

#Generate project file
nanoxmap-gen: $(TOP)_nanoxmap.py
	nxpython $(TOP)_nanoxmap.py
#Launch NanoXmap GUI on the project file
nanoxmap-launch: nanoxmap-gen
	nxmap $(TOP)_native.nym
#Synthetize, place, route and generate bitstream in batch mode using NanoXpython
nanoxpython: nanoxmap-gen
	nxpython $(TOP)_nanoxpython.py

#Load the generated bitstream into the chip of the current board, using the JTAG interface.
nx-prog-fpga:
	nxbase2_cli -i -c "chip bitstream load  $(TOP)_bitfile.nxb"

#Write the generate bitstream into the SPI flash daughter board and validate the memory content
nx-prog-prom:
	nxbase2_cli -i -c "board spi flash program  $(TOP)_bitfile.nxb" -c "board spi flash validate $(TOP)_bitfile.nxb"

nanoxmap-clean:
	rm -rf logs *.nxm *.nym __pycache__ _preMap.vhd *.pyc *.nxb $(TOP)_nanoxmap.py $(TOP)_nanoxpython.py $(TOP)_generated_pads.py

#########    Generic simulation target ###############

ifeq ("$(GRLIB_SIMULATOR)", "ALDEC")
SIM=riviera
else
SIM=vsim
endif

sim:
	make $(SIM)

sim-run:
	make $(SIM)-run

sim-launch:
	make $(SIM)-launch


########## Gate lavel simulation targets ###############
GLS_LIBS = $(GLS_NETLIST) $(GLS_POSTSIM)

gls-setup-lib:
	vlib modelsim/$(GLS_NETLIST); vmap $(GLS_NETLIST) modelsim/$(GLS_NETLIST)
	vlib modelsim/$(GLS_POSTSIM); vmap $(GLS_POSTSIM) modelsim/$(GLS_POSTSIM)

gls-setup-dir:
	@mkdir -p $(EXTRALIBS)/$(GLS_NETLIST); touch $(EXTRALIBS)/$(GLS_NETLIST)/dirs.txt;
	@mkdir -p $(EXTRALIBS)/$(GLS_POSTSIM); touch $(EXTRALIBS)/$(GLS_POSTSIM)/dirs.txt;

########## Generation of compile scripts ###############
prereqtools:= $(shell (export GRLIB=$(GRLIB) TOP=$(TOP) && tclsh $(GRLIB)/bin/scriptgen/dependencies.tcl))

targettools:= $(shell (export GRLIB=$(GRLIB) TOP=$(TOP) && tclsh $(GRLIB)/bin/scriptgen/targets.tcl))

empty:=
s:= $(empty) $(empty)
u:= |

scripts: $(prereqtools)

$(targettools): scriptgendone

VARIABLE_LIST := $(shell cat $(GRLIB)/bin/scriptgen/scriptgen_variables.txt)

scriptgen_variable_values.tcl:
	@rm -f scriptgen_variable_values.tcl
	@touch scriptgen_variable_values.tcl
	@$(foreach v,$(VARIABLE_LIST), echo set $(v) {$(subst $(u),$(s),$($(v)))} >> scriptgen_variable_values.tcl ;)

scriptgendone: scriptgen_variable_values.tcl
	@printf "$(shell export GRLIB=$(GRLIB) OS=$(OS) && tclsh $(GRLIB)/bin/scriptgen/main.tcl)"



######## Common cleaning   ####################

work-clean: $(CLEAN) vsim-clean ise-clean ncsim-clean ghdl-clean synplify-clean quartus-clean \
	actel-clean dc-clean rc-clean isp-clean precision-clean vsimsa-clean avhdl-clean \
	vivado-clean planahead-clean riviera-clean fpro-clean vcs-clean nanoxmap-clean \
	radiant-clean
	-rm -rf verilog.txt tkparse.exe main.tk ahbrom outdata ahbrom.bin

scripts-clean:
	-rm -rf compile\.* libs.txt $(TOP)_quartus.qsf $(TOP)_synplify.qsf *.qpf ghdl.path \
	compile\.* libs.do make\.* *.xst $(TOP)*_files.prj cds.lib *.npl $(TOP)_ise.tcl \
	.config.old hdl.var $(TOP)_dc.tcl  $(TOP).rc  \
	$(TOP)_synplify.prj $(SIMTOP).mpf \
	$(TOP)_designer.tcl $(TOP)_designer_act.tcl \
	modelsim.ini modelsim.ini.bak \
	alibs.do avhdl.tcl riviera_ws_create.do $(EXTRACLEAN) \
	make.ghdl simulation vivado scriptgendone scriptgen_variable_values.tcl

scriptgen-clean:
	-rm -rf scriptgenwork

clean distclean: $(CLEAN) work-clean scripts-clean clean-xilinx-lib scriptgen-clean

libclean: remove-altera remove-unisim remove-microsemi remove-dare remove-nxlibrary

none-clean:

######## xconfig targets   ####################

ifneq ("$(GRLIB)", "")
  include $(GRLIB)/bin/Makefile.config
endif

TKCONFIG= $(GRLIB)/bin/tkconfig

tkparse.o: $(TKCONFIG)/tkparse.c
	$(CC) -g -c $<

tkcond.o: $(TKCONFIG)/tkcond.c
	$(CC) -g -c $<

tkgen.o: $(TKCONFIG)/tkgen.c
	$(CC) -g -c $<


tkparse.exe: tkparse.o tkcond.o tkgen.o
	$(CC) -g tkparse.o tkcond.o tkgen.o -o tkparse.exe

lconfig.tk: config.in $(CONFDEP) $(HELPDEP)
	make main.tk
	cat $(TKCONFIG)/header.tk main.tk $(TKCONFIG)/tail.tk > lconfig.tk
	chmod a+x lconfig.tk

main.tk : config.in tkparse.exe $(CONFDEP) $(HELPDEP)
	./tkparse.exe config.in $(GRLIB) $(EXTRALIBS) > main.tk

$(GRLIB)/bin/Makefile.config:
	@printf "CONFDEP = "  > $(GRLIB)/bin/Makefile.config
	@for i in `find $(GRLIB)/lib -name '*.in' -print | grep -v vhd | xargs`; do \
	  echo -n $$i >> $(GRLIB)/bin/Makefile.config ; \
	  printf " \\"  >> $(GRLIB)/bin/Makefile.config ; \
	  printf "\n"  >> $(GRLIB)/bin/Makefile.config ; \
	done;
	@printf "  \n" >> $(GRLIB)/bin/Makefile.config
	@printf "HELPDEP = "  >> $(GRLIB)/bin/Makefile.config
	@for i in `find $(GRLIB)/lib -name '*.in.help' -print | xargs`; do \
	  echo -n $$i >> $(GRLIB)/bin/Makefile.config ; \
	  printf " \\"  >> $(GRLIB)/bin/Makefile.config ; \
	  printf "\n"  >> $(GRLIB)/bin/Makefile.config ; \
	done;
	@printf "  \n" >> $(GRLIB)/bin/Makefile.config

xconfig: lconfig.tk $(GRLIB)/bin/Makefile.config
	@if test -r "/usr/bin/wish84.exe"; then /usr/bin/wish84.exe -f lconfig.tk; \
	else \
	  if test -r "/mingw/bin/wish84.exe"; then \
	    if !(test -r "/mingw/bin/echo.bat"); then \
	      cp $(GRLIB)/bin/echo.bat /mingw/bin/echo.bat; \
	    fi; \
	    if !(test -r "/mingw/bin/wish"); then \
	      cp $(GRLIB)/bin/wish /mingw/bin/wish; \
	    fi; \
	  fi; \
	  unset LD_LIBRARY_PATH ; \
	  wish -f lconfig.tk; \
	fi; \
	if test $$? = "2" ; then                   \
	   cpp -P -DGRLIB_PATH=$(GRLIB) config.vhd.in > config.vhd; \
	   echo config.vhd created; \
	fi

xdep:
	cpp -P -DGRLIB_PATH=$(GRLIB) config.vhd.in > config.vhd

boardconfig:
	cp $(GRLIB)/boards/$(BOARD)/config .config
	cp $(GRLIB)/boards/$(BOARD)/config.h config.h
	make xdep

oldconfig: lconfig.tk $(GRLIB)/bin/Makefile.config
	@if test -r "/usr/bin/wish84.exe"; then /usr/bin/wish84.exe -f lconfig.tk -regen; \
	else \
	  if test -r "/mingw/bin/wish84.exe"; then \
	    if !(test -r "/mingw/bin/echo.bat"); then \
	      cp $(GRLIB)/bin/echo.bat /mingw/bin/echo.bat; \
	    fi; \
	    if !(test -r "/mingw/bin/wish"); then \
	      cp $(GRLIB)/bin/wish /mingw/bin/wish; \
	    fi; \
	  fi; \
	  unset LD_LIBRARY_PATH ; \
	  wish -f lconfig.tk -regen; \
	fi; \
	if test $$? = "2" ; then                   \
	   cpp -P -DGRLIB_PATH=$(GRLIB) config.vhd.in > config.vhd; \
	   echo config.vhd recreated from .config; \
	fi

.PHONY: xst precision synplify scripts bitfiles planahead planahead-launch vivado vivado-launch



############ Maintenance - do not remove!   ##################

cfgdep:
	@printf "CONFDEP = "  > bin/Makefile.config
	@for i in `find lib -name '*.in' -print | grep -v vhd | xargs`; do \
	  echo -n '$$(GRLIB)'/$$i >> bin/Makefile.config ; \
	  printf " \\"  >> bin/Makefile.config ; \
	  printf "\n"  >> bin/Makefile.config ; \
	done;
	@printf "  \n" >> bin/Makefile.config
	@printf "HELPDEP = "  >> bin/Makefile.config
	@for i in `find lib -name '*.in.help' -print | xargs`; do \
	  echo -n '$$(GRLIB)'/$$i >> bin/Makefile.config ; \
	  printf " \\"  >> bin/Makefile.config ; \
	  printf "\n"  >> bin/Makefile.config ; \
	done;
	@printf "  \n" >> bin/Makefile.config


ifneq ("$(GRLIB)","")
-include $(GRLIB)/bin/Makefile.dist
-include $(GRLIB)/bin/Makefile.test
endif
