RISCV = /opt/riscv
TARGET = riscv64-unknown-elf
CC = ${RISCV}/bin/${TARGET}-gcc -march=rv32im -mabi=ilp32
CXX = ${RISCV}/bin/${TARGET}-g++ -march=rv32im -mabi=ilp32
AS = ${RISCV}/bin/${TARGET}-as
LD = ${RISCV}/bin/${TARGET}-ld
STRIP = ${RISCV}/bin/${TARGET}-strip
GDB = ${RISCV}/bin/${TARGET}-gdb
PK = ${RISCV}/${TARGET}/bin/pk
DUMP= ${RISCV}/${TARGET}/bin/objdump
READELF= ${RISCV}/bin/${TARGET}-readelf
QEMU=qemu-riscv32

BINCONV=java BinaryConverter

MAK= make --no-print-directory

GFLAGS= -g -Wall -pedantic -std=c99
OFLAGS= -O -Wall -pedantic -std=c99
CFLAGS= ${OFLAGS}
LDFLAGS=

all:
	@cat README.txt | less

%.s: %.c
	${CC} -S ${OFLAGS} $<

%.o: %.s
	${CC} -c $<

%.dump: %.lrv
	/opt/rv32im/riscv32-unknown-elf/bin/objdump -S $(*F).lrv | less

%.ddd-l: %.lrv
	ddd --debugger ${GDB} --command target.gdb $(*F).lrv &
	@echo "=============================================================="
	@echo "No es muy util tratar de depurar este binario en ddd."
	@echo "Si es util para desensamblar el codigo que se esta ejecutando"
	@echo "en Logisim.  Vea la direccion en el tunel PC (abajo a la"
	@echo "izquierda). Si la direccion es 0x10150 por ejemplo, desensable"
	@echo "con este comando de ddd: x/20i 0x10150"
	@echo "Eso mostrara las siguientes 20 instrucciones que"
	@echo "se van a ejecutar."
	@echo "=============================================================="
	${QEMU} -g 1234 $(*F).lrv

ucode.rom: dummy
	@$(MAK) -B ucode
	@echo "Generando micro-codigo"
	./ucode

ucode: ucode.c
	gcc $(GFLAGS) $^ -o ucode

%.qemu-O:
	@$(MAK) -B "CFLAGS=$(OFLAGS)" $(*F).qemu

%.qemu-g:
	@$(MAK) -B "CFLAGS=$(GFLAGS)" "LDFLAGS=-g $(LDFLAGS)" $(*F).qemu

%.qemu: %.o term-qemu.o
	${CC} ${LDFLAGS} $^ ${LDLIBS} -o $@

%.run-O:
	@$(MAK) -B "CFLAGS=$(OFLAGS)" $(*F).qemu
	${QEMU} $(*F).qemu

%.run-g:
	@$(MAK) -B "CFLAGS=$(GFLAGS)" $(*F).qemu
	${QEMU} $(*F).qemu

%.ddd-g: %.qemu-g
	ddd --debugger ${GDB} --command target.gdb $(*F).qemu &
	@echo "====================================================="
	@echo "Coloque los breakpoints que necesite"
	@echo "Para comenzar la ejecucion, ingrese en ddd: cont"
	@echo "Si necesita ejecutar nuevamente, ingrese en ddd: kill"
	@echo "Y ejecute en el terminal: make $(*F).rerun-g"
	@echo "Luego ejecute en ddd: target remote localhost:1234"
	@echo "Y finalmente en ddd: cont"
	@echo "====================================================="
	${QEMU} -g 1234 $(*F).qemu

%.rerun-g: %.qemu-g
	@echo "====================================================="
	@echo "Ejecute en ddd: target remote localhost:1234"
	@echo "Y luego: cont"
	@echo "====================================================="
	${QEMU} -g 1234 $(*F).qemu

%.lrv: %.o term.o
	${CC} $(CFLAGS) $(LDFLAGS) $^ $(LDLIBS) -o $@

dummy:
	@echo "Compilando"

%.ram: dummy
	@$(MAK) -B "CFLAGS=$(OFLAGS)" $(*F).lrv
	@echo "Generando imagen para la RAM de Logisim"
	${DUMP} -s $(*F).lrv | ${BINCONV} `${READELF} -a $(*F).lrv | grep " _start"` > $@

clean:
	rm -f *.lrv *.o *.s *.ram *.rom *.lrv *.qemu
