summaryrefslogtreecommitdiff
path: root/Makefile
blob: de8af585a3cf9baf6e42a3f21f1ea918b8f807af (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
MAKEFLAGS += --no-builtin-rules
MAKEFLAGS += --no-builtin-variables
.SUFFIXES:

## Variables
PROGRAM ?= led
CST ?= tangnano9k.cst
FLASH_OPTS ?=
YOSYS_OPTS ?= -Q -q -l $(PROGRAM).yosys.log
DEPS := $(wildcard *.dep)
# this is "bad", as it runs the deps target every time
# probably because of the include below
# SOURCES := $(wildcard *.v)
# DEPS := $(SOURCES:.v=.dep)

# yosys deps-file doesn't work, it writes ": infile depfiles"
#-E $(PROGRAM).deps

## default target
all: $(PROGRAM).fs

## dependencies

tangnano9k.cst:
	wget https://github.com/YosysHQ/apicula/raw/refs/heads/master/examples/tangnano9k.cst || \
	curl -LO https://github.com/YosysHQ/apicula/raw/refs/heads/master/examples/tangnano9k.cst

## helper targets
.PHONY: clean flash show
show: $(PROGRAM).v
	yosys -p "read_verilog $<; show $(PROGRAM)"

flash: $(PROGRAM).fs
	openFPGALoader -b tangnano9k  $(FLASH_OPTS) $(PROGRAM).fs

clean:
	rm -rf *.json *.fs *.svg *.log *.dep

## Patterns

# synthesize
%.json: %.v
	gawk 'match($$0, /`include "(.*)"/, ary) {print "$*.json:", ary[1]}'  $< > $*.dep
	yosys -p "read_verilog $<; synth_gowin -top $* -json $@" $(YOSYS_OPTS) 

# because yosys -E is buggy, or behaves differently than expected,
# use gawk to force-create deps.
%.dep: %.v
	gawk 'match($$0, /`include "(.*)"/, ary) {print "$*.json:", ary[1]}'  $< > $@

# place and route?
%.pnr.json: %.json $(CST)
	nextpnr-himbaechel --json $< --write $@ \
	--device GW1NR-LV9QN88PC6/I5 --vopt family=GW1N-9C \
	--vopt cst=$(CST) \
	--placed-svg $*.plc.svg \
	--routed-svg $*.rt.svg \
	-q -l $(PROGRAM).pnr.log \
	|| \
	nextpnr-gowin --json $< --write $@ \
	--device GW1NR-LV9QN88PC6/I5 --family GW1N-9C \
	--cst $(CST) \
	--placed-svg $*.plc.svg \
	--routed-svg $*.rt.svg \
	-q -l $(PROGRAM).pnr.log

# pack bitstream
%.fs: %.pnr.json
	gowin_pack -d GW1N-9C -o $@ $<

## inter-file dependencies
-include $(DEPS)
-include $($(wildcard *.fs:.fs=.dep)