SYSTEM = system

MHSFILE = system.mhs

MSSFILE = system.mss

MVSFILE = system.mvs

FPGA_ARCH = spartan2e

DEVICE = xc2s300epq208-6

LANGUAGE = verilog

PLATGEN_OPTIONS = -p $(FPGA_ARCH) -lang $(LANGUAGE) 

LIBGEN_OPTIONS = -p $(FPGA_ARCH) $(MYMICROBLAZE_LIBG_OPT)

# Paths

XILINX = /usr/cad/xilinx/ise6.1i
ISEBINDIR = $(XILINX)/bin/lin
ISEENVCMDS = LD_LIBRARY_PATH=$(ISEBINDIR) XILINX=$(XILINX) PATH=$(ISEBINDIR)

XILINX_EDK = /usr/cad/xilinx/edk3.2

MICROBLAZE = /usr/cad/xilinx/gnu
MBBINDIR = $(MICROBLAZE)/bin
XESSBINDIR = /usr/cad/xess/bin

# Executables

XST = $(ISEENVCMDS) $(ISEBINDIR)/xst
XFLOW = $(ISEENVCMDS) $(ISEBINDIR)/xflow
BITGEN = $(ISEENVCMDS) $(ISEBINDIR)/bitgen
XSLOAD = $(XESSBINDIR)/xsload
XESS_BOARD = XSB-300E

MYMICROBLAZE_CC = $(MBBINDIR)/microblaze-gcc
MYMICROBLAZE_CC_SIZE = $(MBBINDIR)/microblaze-size

SIM_COMP_SCRIPT = simulation/$(SYSTEM)_comp.do

SIM_INIT_SCRIPT = simulation/$(SYSTEM)_init.do

SIMGEN_OPTIONS = -p $(FPGA_ARCH) -lang $(LANGUAGE)

MYMICROBLAZE_OUTPUT = hello_world.elf

LIBRARIES = mymicroblaze/lib/libxil.a 

# External Targets

all:
	@echo "Makefile to build a Microprocessor system :"
	@echo "Run make with any of the following targets"
	@echo "  make libs     : Configures the sw libraries for this system"
	@echo "  make program  : Compiles the program sources for all the processor instances"
	@echo "  make netlist  : Generates the netlist for this system ($(SYSTEM))"
	@echo "  make bits     : Runs Implementation tools to generate the bitstream"
	@echo "  make init_bram: Initializes bitstream with BRAM data"
	@echo "  make download : Downloads the bitstream onto the board"
	@echo "  make sim      : Generates simulation models and runs simulator"
	@echo "  make netlistclean: Deletes netlist"
	@echo "  make hwclean  : Deletes implementation dir"
	@echo "  make libsclean: Deletes sw libraries"
	@echo "  make programclean: Deletes compiled ELF files"
	@echo "  make simclean : Deletes simulation dir"
	@echo "  make clean    : Deletes all generated files/directories"
	@echo " "
	@echo "  make <target> : (Default)"
	@echo "      Creates a Microprocessor system using default initializations"
	@echo "      specified for each processor in MSS file"


bits: implementation/$(SYSTEM).bit

ace: implementation/$(SYSTEM).ace

netlist: implementation/$(SYSTEM).ngc

libs: $(LIBRARIES)

program:: $(MYMICROBLAZE_OUTPUT) 

download: implementation/download.bit dummy
	@echo "*********************************************"
	@echo "Downloading Bitstream onto the target board"
	@echo "*********************************************"
	$(XSLOAD) -fpga -b $(XESS_BOARD) implementation/download.bit

init_bram: implementation/download.bit

clean: hwclean libsclean programclean simclean
	rm -f bram_init.sh
	rm -f _impact.cmd

hwclean: netlistclean
	rm -rf implementation synthesis xst hdl
	rm -rf xst.srp $(SYSTEM).srp

netlistclean:
	rm -f implementation/$(SYSTEM).bit implementation/$(SYSTEM).ncd implementation/$(SYSTEM)_bd.bmm 

simclean: 
	rm -rf simulation

libsclean: MYMICROBLAZE_LIBSCLEAN 

programclean: MYMICROBLAZE_PROGRAMCLEAN 

#################################################################
# TARGETS/MACROS FOR PROCESSOR MYMICROBLAZE
#################################################################

#MYMICROBLAZE_SOURCES=c_source_files/bintree
#MYMICROBLAZE_CSRC=patsubst(%, %.c, $(MYMICROBLAZE_SOURCES)
#MYMICROBLAZE_OBJS=patsubst(%, %.o, $(MYMICROBLAZE_SOURCES))

#MYMICROBLAZE_CSRC=c_source_files/bintree.c
MYMICROBLAZE_OBJS=c_source_files/hello.o

MYMICROBLAZE_MODE = executable

# CC1
MYMICROBLAZE_CC_CFLAGS =
MYMICROBLAZE_CC_OPT = -O3 #-mxl-gp-opt
MYMICROBLAZE_CC_DEBUG_FLAG =#  -gstabs 
MYMICROBLAZE_INCLUDES = -I./mymicroblaze/include/ # -I
MYMICROBLAZE_CFLAGS = \
	$(MYMICROBLAZE_CC_CFLAGS)\
	-mxl-barrel-shift \
	$(MYMICROBLAZE_CC_OPT) \
	$(MYMICROBLAZE_CC_DEBUG_FLAG) \
	$(MYMICROBLAZE_INCLUDES)

# LD
MYMICROBLAZE_LD_FLAGS =# -Wl,-M
#MYMICROBLAZE_LINKER_SCRIPT = -Wl,-T -Wl,mylinkscript
MYMICROBLAZE_LINKER_SCRIPT =
MYMICROBLAZE_LIBPATH = -L./mymicroblaze/lib/ # -L
MYMICROBLAZE_CC_START_ADDR_FLAG= -Wl,-defsym -Wl,_TEXT_START_ADDR=0x00000000
MYMICROBLAZE_CC_STACK_SIZE_FLAG=  -Wl,-defsym -Wl,_STACK_SIZE=0x200
MYMICROBLAZE_LFLAGS = \
	 -xl-mode-$(MYMICROBLAZE_MODE) \
	$(MYMICROBLAZE_LD_FLAGS) \
	$(MYMICROBLAZE_LINKER_SCRIPT) \
	$(MYMICROBLAZE_LIBPATH) \
	$(MYMICROBLAZE_CC_START_ADDR_FLAG) \
	$(MYMICROBLAZE_CC_STACK_SIZE_FLAG)


#here is the compilation
$(MYMICROBLAZE_OBJS) : %.o : %.c
	echo $<
	PATH=$(MBBINDIR) $(MYMICROBLAZE_CC) $(MYMICROBLAZE_CFLAGS) -c $< -o $@

#here is the linking
$(MYMICROBLAZE_OUTPUT) :  $(LIBRARIES) $(MYMICROBLAZE_OBJS)
	PATH=$(MBBINDIR) $(MYMICROBLAZE_CC) $(MYMICROBLAZE_LFLAGS) \
		$(MYMICROBLAZE_OBJS) -o $(MYMICROBLAZE_OUTPUT)

	$(MYMICROBLAZE_CC_SIZE) $(MYMICROBLAZE_OUTPUT) 

MYMICROBLAZE_LIBSCLEAN:
	rm -rf mymicroblaze/lib/

MYMICROBLAZE_PROGRAMCLEAN:
	rm -f $(MYMICROBLAZE_OUTPUT) 

#################################################################
# TARGETS/MACROS FOR XILINX IMPLEMENTATION FLOW
#################################################################


implementation/download.bit: implementation/$(SYSTEM).bit  $(MYMICROBLAZE_OUTPUT) 
	@cp -f implementation/$(SYSTEM)_bd.bmm .
	@echo "*********************************************"
	@echo "Initializing BRAM contents of the bitstream"
	@echo "*********************************************"
	$(ISEENVCMDS) ./bram_init.sh 
	@rm -f $(SYSTEM)_bd.bmm

implementation/$(SYSTEM).bit: implementation/$(SYSTEM).ngc etc/fast_runtime.opt etc/bitgen.ut data/$(SYSTEM).ucf
	@echo "Copying Xilinx Implementation tool scripts.."
	@cp -f etc/bitgen.ut implementation/
	@cp -f etc/fast_runtime.opt implementation/
	@cp -f data/$(SYSTEM).ucf implementation/$(SYSTEM).ucf
	@echo "*********************************************"
	@echo "Running Xilinx Implementation tools.."
	@echo "*********************************************"
	$(XFLOW) -wd implementation -p $(DEVICE) -implement fast_runtime.opt $(SYSTEM).ngc
	cd implementation; $(BITGEN) -f bitgen.ut $(SYSTEM)

implementation/$(SYSTEM).ngc: $(MHSFILE)
	@echo "*********************************************"
	@echo "Creating system netlist for hardware specification.."
	@echo "*********************************************"
	XILINX=$(XILINX) XILINX_EDK=$(XILINX_EDK) perl -I $(XILINX_EDK)/bin/nt/perl5lib  $(XILINX_EDK)/bin/nt/platgen.pl $(PLATGEN_OPTIONS) -st xst  $(MHSFILE)
	echo "Running iSE XST..."
	perl synth_modules.pl <synthesis/xst.scr >xst.scr
	$(XST) -ifn xst.scr
	rm -r xst xst.scr
	$(XST) -ifn synthesis/$(SYSTEM).scr

$(LIBRARIES): $(MHSFILE) $(MSSFILE)
	@echo "*********************************************"
	@echo "Creating software libraries..."
	@echo "*********************************************"
	PATH=$$PATH:$(MBBINDIR) XILINX=$(XILINX) XILINX_EDK=$(XILINX_EDK) perl -I $(XILINX_EDK)/bin/nt/perl5lib $(XILINX_EDK)/bin/nt/libgen.pl $(LIBGEN_OPTIONS) $(MSSFILE)

$(SIM_INIT_SCRIPT) : $(SIM_COMP_SCRIPT)  $(MYMICROBLAZE_OUTPUT) 
	@echo "*********************************************"
	@echo "Initializing simulation models..."
	@echo "*********************************************"
	simgen $(SIMGEN_OPTIONS) -i $(MVSFILE)

$(SIM_COMP_SCRIPT) : simulation/$(SYSTEM)_sim.bmm $(MVSFILE) __xps/simgen.opt
	@echo "*********************************************"
	@echo "Creating simulation models..."
	@echo "*********************************************"
	simgen $(SIMGEN_OPTIONS)  $(MVSFILE)

simulation/$(SYSTEM)_sim.bmm: implementation/$(SYSTEM).bit
	platgen -bmm $(PLATGEN_OPTIONS) -st xst  $(SYSTEM).mhs 


dummy:
	@echo ""

