summaryrefslogtreecommitdiff
path: root/Makefile
diff options
context:
space:
mode:
authorAlejandro Soto <alejandro@34project.org>2024-02-12 16:18:03 -0600
committerAlejandro Soto <alejandro@34project.org>2024-02-20 11:11:18 -0600
commitbf5cece51a20eb4773d196ec650fb3af574afa17 (patch)
tree8abd33c815b38a3dee673ea345f106d4ddcae9ab /Makefile
parent691a441bfeb90642840d2869cb04ec146e274a1e (diff)
mk: initial commit
This is a complete overhaul of the build system. This new implementations upports many new features and is very extensible.
Diffstat (limited to '')
-rw-r--r--Makefile216
1 files changed, 3 insertions, 213 deletions
diff --git a/Makefile b/Makefile
index 165d788..8057426 100644
--- a/Makefile
+++ b/Makefile
@@ -1,215 +1,5 @@
-TOP := conspiracion
-FST_DIR := trace
-OBJ_DIR := obj
-COV_DIR := cov
-RTL_DIR := rtl
-TB_DIR := tb
-SIM_DIR := sim
-DEMO_DIR := demo
-DIST_DIR := dist
-TB_SIM_DIR := $(TB_DIR)/sim
-SIM_OBJ_DIR := $(OBJ_DIR)/$(TOP)/sim
-DEMO_OBJ_DIR := $(OBJ_DIR)/$(TOP)/demo
-DIST_OBJ_DIR := $(OBJ_DIR)/$(TOP)/dist
-RBF_OUT_DIR := output_files
-VERILATOR ?= verilator
-COCOTB_CONFIG ?= cocotb-config
-GENHTML ?= genhtml
-CROSS_CC := $(CROSS_COMPILE)gcc
-CROSS_OBJCOPY := $(CROSS_COMPILE)objcopy
-CROSS_CFLAGS := -O3 -Wall -Wextra -Werror
-CROSS_LDFLAGS :=
+.PHONY: all
-ifeq ($(shell which $(VERILATOR)),)
- $(error verilator not found)
-endif
+all: test
-ifeq ($(shell which $(COCOTB_CONFIG)),)
- $(error cocotb not found)
-endif
-
-ifdef FASTER_IS_BETTER
- DISABLE_COV := 1
- DISABLE_RAND := 1
- DISABLE_TRACE := 1
-
- CXXFLAGS += -O3 -flto
- LDFLAGS += -O3 -flto
-endif
-
-ROOT := $(shell pwd)
-
-CXXFLAGS += -iquote $(ROOT)/$(TB_DIR)
-
-export CXXFLAGS LDFLAGS
-
-X_MODE := $(if $(DISABLE_RAND),fast,unique)
-
-CC_CPU := -mcpu=arm810
-
-VFLAGS ?= \
- --x-assign $(X_MODE) --x-initial $(X_MODE) \
- $(if $(ENABLE_THREADS),--threads $(shell nproc)) \
- $(if $(DISABLE_TRACE),,--trace --trace-fst --trace-structs) \
- $(if $(DISABLE_COV),,--coverage)
-
-VFLAGS += -O3 --cc --exe -y $(RTL_DIR) --prefix Vtop
-
-LIBPYTHON := $(shell $(COCOTB_CONFIG) --libpython)
-
-COCOTB_LDFLAGS := $(LDFLAGS) \
- -Wl,-rpath,$(shell $(COCOTB_CONFIG) --lib-dir) \
- -L$(shell $(COCOTB_CONFIG) -config --lib-dir) \
- -Wl,-rpath,$(dir $(LIBPYTHON)) \
- -lcocotbvpi_verilator -lgpi -lcocotb -lgpilog -lcocotbutils
-
-RTL_FILES := $(shell find $(RTL_DIR)/ ! -path '$(RTL_DIR)/top/*' -type f -name '*.sv')
-RTL_FILES += $(shell find $(TB_DIR)/ ! -path '$(TB_DIR)/top/*' -type f -name '*.sv')
-TB_FILES := $(shell find $(TB_DIR)/ ! -path '$(TB_DIR)/top/*' -type f -name '*.cpp')
-
-SYS_SIMS := $(patsubst $(TB_SIM_DIR)/%.py,%,$(wildcard $(TB_SIM_DIR)/*.py))
-COCO_SIMS := $(filter-out __init__,$(patsubst $(TB_DIR)/top/%.py,%,$(wildcard $(TB_DIR)/top/*.py)))
-SIMS := $(SYS_SIMS) $(COCO_SIMS)
-
-GIT_REV := $(shell if [ -d .git ]; then echo -$$(git rev-parse --short HEAD); fi)
-
-all: sim
-
-clean:
- rm -rf $(DIST_DIR) $(OBJ_DIR) $(FST_DIR) $(COV_DIR)
-
-dist: $(DEMO_OBJ_DIR)/demo.bin $(if $(DISABLE_COV),sim,cov)
- @mkdir -p $(DIST_DIR)
- @rm -rf $(DIST_OBJ_DIR) && mkdir -pv $(DIST_OBJ_DIR)/{bin,bitstream,doc,results/flow,src}
- @git ls-files | xargs cp --parents -rvt $(DIST_OBJ_DIR)/src
- @mv -vt $(DIST_OBJ_DIR) $(DIST_OBJ_DIR)/src/README.md
- @cp -vt $(DIST_OBJ_DIR)/bin $(DEMO_OBJ_DIR)/demo
- @cp -v $(DEMO_OBJ_DIR)/demo.bin $(DIST_OBJ_DIR)/bin/boot.bin
- @if [ -d doc_out ]; then cp -vrt $(DIST_OBJ_DIR)/doc doc_out/*; fi
- @$(if $(DISABLE_COV),,cp -rv $(COV_DIR) $(DIST_OBJ_DIR)/results/coverage)
- @for SIM in $(SYS_SIMS); do \
- mkdir -pv $(DIST_OBJ_DIR)/results/system/$$SIM; \
- if [ -f $(SIM_OBJ_DIR)/$$SIM.fst ]; then \
- cp -v $(SIM_OBJ_DIR)/$$SIM.fst $(DIST_OBJ_DIR)/results/system/$$SIM/trace.fst; \
- fi; done
- @for SIM in $(COCO_SIMS); do \
- mkdir -pv $(DIST_OBJ_DIR)/results/block/$$SIM; \
- cp -vt $(DIST_OBJ_DIR)/results/block/$$SIM $(OBJ_DIR)/$$SIM/{results.xml,sim.log}; \
- $(if $(DISABLE_TRACE),, \
- cp -v $(OBJ_DIR)/$$SIM/dump.fst $(DIST_OBJ_DIR)/results/block/$$SIM/trace.fst); \
- done
- @cp -vt $(DIST_OBJ_DIR)/results/flow $(RBF_OUT_DIR)/*.rpt
- @[ -f $(RBF_OUT_DIR)/$(TOP).rbf ] \
- && cp -vt $(DIST_OBJ_DIR)/bitstream $(RBF_OUT_DIR)/$(TOP).rbf \
- || echo "Warning: missing bitstream at $(RBF_OUT_DIR)/$(TOP).rbf" >&2
- cd $(DIST_OBJ_DIR) && zip -qr \
- $(ROOT)/$(DIST_DIR)/$(TOP)$(GIT_REV)-$(shell date +'%Y%m%d-%H%M%S').zip *
-
-sim: $(addprefix sim/,$(SIMS))
-
-sim/%: $(SIM_DIR)/sim.py $(TB_SIM_DIR)/%.py exe/$(TOP) $(SIM_OBJ_DIR)/%.bin $(FST_DIR)/%
- @$< $(TB_SIM_DIR)/$*.py $(OBJ_DIR)/$(TOP)/Vtop \
- $(SIM_OBJ_DIR)/$*.bin \
- $(if $(DISABLE_COV),,--coverage $(SIM_OBJ_DIR)/$*.cov) \
- $(if $(DISABLE_TRACE),,--trace $(SIM_OBJ_DIR)/$*.fst)
- @$(if $(DISABLE_TRACE),,cp $(SIM_OBJ_DIR)/$*.fst $(FST_DIR)/$*/trace$(GIT_REV).fst)
-
-sim/%: $(TB_DIR)/top/%.py exe/% $(FST_DIR)/%
- @cd $(OBJ_DIR)/$* && \
- LIBPYTHON_LOC=$(LIBPYTHON) PYTHONPATH="$$PYTHONPATH:$(ROOT)" MODULE=tb.top.$* \
- $(if $(SIM_SEED),RANDOM_SEED=$(SIM_SEED)) \
- ./Vtop | tee sim.log
- @$(if $(DISABLE_TRACE),,cp $(OBJ_DIR)/$*/dump.fst $(FST_DIR)/$*/trace$(GIT_REV).fst)
-
-$(FST_DIR)/%:
- @mkdir -p $@
-
-vmlaunch: $(SIM_DIR)/sim.py $(SIM_DIR)/gdbstub.py exe/$(TOP)
- @ENABLE_VIDEO=1 $< $(SIM_DIR)/gdbstub.py $(OBJ_DIR)/$(TOP)/Vtop build/u-boot.bin
-
-demo: $(SIM_DIR)/sim.py $(SIM_DIR)/gdbstub.py exe/$(TOP) $(DEMO_OBJ_DIR)/demo.bin
- @START_HALTED=0 $< $(SIM_DIR)/gdbstub.py $(OBJ_DIR)/$(TOP)/Vtop $(DEMO_OBJ_DIR)/demo.bin
-
-demo.bin: $(DEMO_OBJ_DIR)/demo.bin
- @echo $<
-
-ifndef DISABLE_COV
-cov: $(OBJ_DIR)/$(TOP)/cov.info
- @rm -rf $(COV_DIR)
- $(GENHTML) $< --output-dir=$(COV_DIR)
-
-cov/%: $(SIM_OBJ_DIR)/%.cov
-
-$(SIM_OBJ_DIR)/%.cov: sim/%
-
-$(OBJ_DIR)/$(TOP)/cov.info: $(patsubst %,sim/%,$(SIMS))
- $(VERILATOR)_coverage -write-info $@ \
- $(SIM_OBJ_DIR)/*.cov $(patsubst %,$(OBJ_DIR)/%/coverage.dat,$(COCO_SIMS))
-endif
-
-$(DEMO_OBJ_DIR)/gfx_rom.bin: gfx_asm/assembler.py gfx_asm/default.s
- $^ >$@
-
-%.embed.o: %.bin
- $(CROSS_COMPILE)ld -r -b binary -o $@ $<
-
-%.bin: %
- $(CROSS_OBJCOPY) -O binary --only-section=._img $< $@
-
-$(SIM_OBJ_DIR)/%: $(SIM_OBJ_DIR)/%.o $(SIM_OBJ_DIR)/start.o
- $(CROSS_CC) $(CROSS_LDFLAGS) -o $@ -g -T $(SIM_DIR)/link.ld -nostartfiles -nostdlib $^
-
-$(OBJ_DIR)/%.bin: $(SIM_OBJ_DIR)/%
- $(CROSS_OBJCOPY) -O binary --only-section=._img $< $@
-
-$(DEMO_OBJ_DIR)/demo: $(DEMO_DIR)/link.ld $(patsubst $(DEMO_DIR)/%,$(DEMO_OBJ_DIR)/%.o,\
- $(basename $(wildcard $(DEMO_DIR)/*.c) $(wildcard $(DEMO_DIR)/*.S))) \
- $(DEMO_OBJ_DIR)/gfx_rom.embed.o
- $(CROSS_CC) $(CROSS_LDFLAGS) -o $@ -g -nostartfiles -nostdlib -T $^ -lgcc
-
-$(DEMO_OBJ_DIR)/%.o: $(DEMO_DIR)/%.c $(wildcard $(DEMO_DIR)/*.h)
- @mkdir -p $(DEMO_OBJ_DIR)
- $(CROSS_CC) $(CROSS_CFLAGS) -o $@ -g -c $< $(CC_CPU)
-
-$(DEMO_OBJ_DIR)/%.o: $(DEMO_DIR)/%.S
- @mkdir -p $(DEMO_OBJ_DIR)
- $(CROSS_CC) $(CROSS_CFLAGS) -o $@ -g -c $<
-
-$(SIM_OBJ_DIR)/%.o: $(TB_SIM_DIR)/%.c
- @mkdir -p $(SIM_OBJ_DIR)
- $(CROSS_CC) $(CROSS_CFLAGS) -o $@ -g -c $< $(CC_CPU)
-
-$(SIM_OBJ_DIR)/%.o: $(TB_SIM_DIR)/%.S
- @mkdir -p $(SIM_OBJ_DIR)
- $(CROSS_CC) $(CROSS_CFLAGS) -o $@ -g -c $<
-
-$(SIM_OBJ_DIR)/%.o: $(SIM_DIR)/%.S
- @mkdir -p $(SIM_OBJ_DIR)
- $(CROSS_CC) $(CROSS_CFLAGS) -o $@ -g -c $<
-
-exe: exe/$(TOP)
-
-exe/%: $(OBJ_DIR)/%/Vtop.mk
- @CXXFLAGS="$(CXXFLAGS) -iquote $(ROOT)/$(TB_DIR)/top/$*" \
- $(MAKE) -C $(OBJ_DIR)/$* -f Vtop.mk
-
-.PRECIOUS: $(OBJ_DIR)/%.mk $(SIM_OBJ_DIR)/% $(SIM_OBJ_DIR)/%.o $(SIM_OBJ_DIR)/%.cov %.bin $(FST_DIR)/%
-.PHONY: all clean dist demo sim
-
-.SECONDEXPANSION:
-
-$(OBJ_DIR)/%.mk: \
- $(RTL_DIR)/top/$$(word 1,$$(subst /, ,$$*)).sv \
- $$(shell find $(RTL_DIR)/top/$$(dir $$*) -type f 2>/dev/null) \
- $(RTL_FILES) $(TB_FILES) \
- $$(shell find $(TB_DIR)/top/$$(word 1,$$(subst /, ,$$*)).cpp -type f 2>/dev/null) \
- $$(shell find $(TB_DIR)/top/$$(dir $$*) -type f 2>/dev/null)
-
- mkdir -p $(dir $@)
- $(VERILATOR) $(VFLAGS) \
- --Mdir $(dir $@) --top $(word 1,$(subst /, ,$*)) -FI $(ROOT)/$(TB_DIR)/verilator.hpp \
- $(filter %.sv %.cpp,$(patsubst tb/%,../tb/%,$^)) \
- $(if $(filter $(TOP),$(word 1,$(subst /, ,$*))),, \
- --vpi --public-flat-rw --unroll-count 128 \
- -LDFLAGS "$(COCOTB_LDFLAGS) $(LIBPYTHON)" \
- $(shell $(COCOTB_CONFIG) --share)/lib/verilator/verilator.cpp)
+include mk/top.mk