83 lines
2.2 KiB
Makefile
83 lines
2.2 KiB
Makefile
YOSYS=yosys
|
|
NEXTPNR=nextpnr-ecp5
|
|
TRELLIS?=/usr/share/trellis
|
|
|
|
CHIPNAME?=chip
|
|
DEVICE?=um5g-85k
|
|
PACKAGE?=CABGA381
|
|
DEVICE_IDCODE?=0x41113043
|
|
|
|
DEFINES+=FPGA FPGA_ECP5
|
|
|
|
SYNTH_OPT?=
|
|
PNR_OPT?=
|
|
|
|
SYNTH_CMD=read_verilog $(addprefix -I,$(INCDIRS)) $(addprefix -D,$(DEFINES)) $(SRCS);
|
|
ifneq (,$(TOP))
|
|
SYNTH_CMD+=hierarchy -top $(TOP);
|
|
endif
|
|
SYNTH_CMD+=synth_ecp5 $(SYNTH_OPT) -json $(CHIPNAME).json
|
|
|
|
# Kill implicit rules
|
|
.SUFFIXES:
|
|
.IMPLICIT:
|
|
|
|
.PHONY: all romfiles synth clean program dump
|
|
|
|
all: bit
|
|
|
|
romfiles::
|
|
synth: romfiles $(CHIPNAME).json
|
|
dump: romfiles
|
|
pnr: synth $(CHIPNAME).config
|
|
bit: pnr $(CHIPNAME).bit $(CHIPNAME).svf
|
|
|
|
SRCS=$(shell PROJ_ROOT=$(PROJ_ROOT) HDL=$(HDL) $(SCRIPTS)/listfiles --relative -f flat $(DOTF))
|
|
INCDIRS=$(shell PROJ_ROOT=$(PROJ_ROOT) HDL=$(HDL) $(SCRIPTS)/listfiles --relative -f flati $(DOTF))
|
|
|
|
dump:
|
|
$(YOSYS) -p "$(SYNTH_CMD); write_verilog $(CHIPNAME)_synth.v"
|
|
|
|
$(CHIPNAME).json: $(SRCS)
|
|
@echo ">>> Synth"
|
|
@echo
|
|
$(YOSYS) -p "$(SYNTH_CMD)" > synth.log
|
|
tail -n 35 synth.log
|
|
|
|
|
|
$(CHIPNAME).config: $(CHIPNAME).json $(CHIPNAME).lpf
|
|
@echo ">>> Place and Route"
|
|
@echo
|
|
$(NEXTPNR) -r --placer sa --$(DEVICE) --package $(PACKAGE) --lpf $(CHIPNAME).lpf --json $(CHIPNAME).json --textcfg $@ $(PNR_OPT) --quiet --log pnr.log
|
|
@grep "Info: Max frequency for clock " pnr.log | tail -n 1
|
|
|
|
$(CHIPNAME).bit: $(CHIPNAME).config
|
|
@echo ">>> Generate Bitstream"
|
|
@echo
|
|
ecppack --compress --svf $(CHIPNAME).svf --idcode $(DEVICE_IDCODE) $< $@
|
|
|
|
$(CHIPNAME).svf: $(CHIPNAME).bit
|
|
|
|
clean::
|
|
rm -f $(CHIPNAME).json $(CHIPNAME).asc $(CHIPNAME).bit $(CHIPNAME)_synth.v
|
|
rm -f synth.log pnr.log
|
|
|
|
# Code for trying n different pnr seeds and reporting results
|
|
|
|
PNR_N_TRIES := 100
|
|
PNR_TRY_LIST := $(shell seq $(PNR_N_TRIES))
|
|
|
|
pnr_sweep: $(addprefix pnr_try,$(PNR_TRY_LIST))
|
|
|
|
define make-sweep-target
|
|
pnr_try$1: synth
|
|
@echo ">>> Starting sweep $1"
|
|
$(NEXTPNR) --seed $1 --placer sa --$(DEVICE) --package $(PACKAGE) --lpf $(CHIPNAME).lpf --json $(CHIPNAME).json --textcfg pnr_try$1.config $(PNR_OPT) --quiet --log pnr$1.log
|
|
@grep "Info: Max frequency for clock " pnr$1.log | tail -n 1
|
|
endef
|
|
|
|
$(foreach try,$(PNR_TRY_LIST),$(eval $(call make-sweep-target,$(try))))
|
|
|
|
clean::
|
|
rm -f pnr_try*.asc pnr*.log
|