include ../../../../../config.mk

TARGET		= riscv
TARGET-ARCH	= riscv32-elf

PROGRAM		= main
BENCHMARK	= daisy
INIT		= init

OPTFLAGS	= -g -O0
INCLUDES	= -I$(PREFIX)/include
CFLAGS		= $(TARGET-ARCH-FLAGS) -Wall
ASFLAGS		= 
LDFLAGS		= -Ttext $(LOADADDR) -L$(TOOLSLIB)/$(TARGET)/ -Map $(PROGRAM).map
LOADADDR	= 0x08004000
SF		= $(TOOLSBIN)/sf

SRCS	=\
	$(INIT).S\
	$(PROGRAM).c\
	$(BENCHMARK).c\

OBJS	=\
	$(INIT).o \
	$(PROGRAM).o \
	$(BENCHMARK).o \

FNOBUILTIN_FLAGS = \
	-fno-builtin-sqrtf \
	-fno-builtin-acosf \
	-fno-builtin-asinf \
	-fno-builtin-atanf \
	-fno-builtin-cosf \
	-fno-builtin-coshf \
	-fno-builtin-sinf \
	-fno-builtin-sinhf \
	-fno-builtin-tanf \
	-fno-builtin-tanhf \
	-fno-builtin-expf \
	-fno-builtin-logf \
	-fno-builtin-log2f \
	-fno-builtin-log10f \
	-fno-builtin-ceilf \
	-fno-builtin-fabsf \
	-fno-builtin-floorf \
	-fno-builtin-sqrt \
	-fno-builtin-acos \
	-fno-builtin-asin \
	-fno-builtin-atan \
	-fno-builtin-cos \
	-fno-builtin-cosh \
	-fno-builtin-sin \
	-fno-builtin-sinh \
	-fno-builtin-tan \
	-fno-builtin-tanh \
	-fno-builtin-exp \
	-fno-builtin-log \
	-fno-builtin-log2 \
	-fno-builtin-log10 \
	-fno-builtin-ceil \
	-fno-builtin-fabs \
	-fno-builtin-floor \
	-fno-builtin-pow \
	-fno-builtin-powf \
	
LWRAP_LIST = \
	--wrap=sqrtf \
	--wrap=acosf \
	--wrap=asinf \
	--wrap=atanf \
	--wrap=cosf \
	--wrap=coshf \
	--wrap=sinf \
	--wrap=sinhf \
	--wrap=tanf \
	--wrap=tanhf \
	--wrap=expf \
	--wrap=logf \
	--wrap=log2f \
	--wrap=log10f \
	--wrap=ceilf \
	--wrap=fabsf \
	--wrap=floorf \
	--wrap=sqrt \
	--wrap=acos \
	--wrap=asin \
	--wrap=atan \
	--wrap=cos \
	--wrap=cosh \
	--wrap=sin \
	--wrap=sinh \
	--wrap=tan \
	--wrap=tanh \
	--wrap=exp \
	--wrap=log \
	--wrap=log2 \
	--wrap=log10 \
	--wrap=ceil \
	--wrap=fabs \
	--wrap=floor \
	--wrap=pow \
	--wrap=powf \
	
build:	$(PROGRAM) $(PROGRAM).sr Makefile

$(INIT).o: $(INIT).S Makefile
	$(UNCERTAIN_AS) $(ASFLAGS) init.S -o $@

$(PROGRAM): $(OBJS)
	$(UNCERTAIN_LD) $(LDFLAGS) $(OBJS) -o $@ $(LWRAP_LIST) -lm -luncertain -lprintf -lc -lgloss -lgcc

$(PROGRAM).sr: $(PROGRAM)
	$(UNCERTAIN_OBJCOPY) -O srec $(PROGRAM) $@

$(PROGRAM).s: $(SRCS) Makefile
	$(CC) $(CFLAGS) $(FNOBUILTIN_FLAGS) $(OPTFLAGS) $(INCLUDES) -S -fverbose-asm -o $(PROGRAM).s -c $(PROGRAM).c

$(BENCHMARK).s: $(SRCS) Makefile
	$(CC) $(CFLAGS) $(FNOBUILTIN_FLAGS) $(OPTFLAGS) $(INCLUDES) -S -fverbose-asm -o $(BENCHMARK).s -c $(BENCHMARK).c

%.o : %.s $(HEADERS) Makefile
	$(UNCERTAIN_AS) $(ASFLAGS) -g -o $@ -c $<
run-all: run run-test run-uniform run-evaluation run-montecarlo

run: build
	$(SF) run.m

run-test: build
	$(SF) run-test.m

run-montecarlo: build
	$(SF) run-montecarlo.m

run-uniform: build
	$(SF) run-uniform.m

run-evaluation: build
	$(SF) run-evaluation.m

disassemble:
	$(UNCERTAIN_OBJDUMP) -dSl $(PROGRAM) > $(PROGRAM).uncert.S

host:
	gcc -Wall -g -DLINUX $(PROGRAM).c -o $(PROGRAM).$(OSTYPE)

clean:
	$(RM) *.o *.$(OSTYPE) *.s *.sr *.map init.i simlog.node* sunflower.out $(PROGRAM)

#
#	Disable direct compilation of .c and .S files
#
%.o : %.c
%.o : %.S
