Makefile 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. NAME := pyprofibusphy
  2. TARGET := tinyfpga_bx
  3. TARGET_NAME := $(TARGET)_$(NAME)
  4. DEBUG := 0
  5. YOSYS := yosys
  6. NEXTPNR := nextpnr
  7. ICEPACK := icepack
  8. ICETIME := icetime
  9. ICEPLL := icepll
  10. TINYPROG := tinyprog
  11. PYTHON := python3
  12. CAT := cat
  13. GREP := grep
  14. PRINTF := printf
  15. RM := rm
  16. FALSE := false
  17. TR := tr
  18. TEST := test
  19. TOUCH := touch
  20. GIT := git
  21. TARGET_LOWER := $(shell $(PRINTF) '%s' '$(TARGET)' | $(TR) A-Z a-z)
  22. TARGET_UPPER := $(shell $(PRINTF) '%s' '$(TARGET)' | $(TR) a-z A-Z)
  23. TOP_FILE := main.v
  24. TOP_MODULE := top_module
  25. PCF_FILE := $(TARGET_LOWER).pcf
  26. PLL_MOD_V_FILE := pll_mod.v
  27. GENERATED_V := crc8_func.v
  28. ifeq ($(TARGET_LOWER),tinyfpga_bx)
  29. YOSYS_SYNTH_CMD = 'synth_ice40 -top $(TOP_MODULE) -json $(patsubst %.blif,%.json,$@) -blif $@'
  30. PNR_PACKAGE := cm81
  31. NEXTPNR_ARCH := ice40
  32. DEVICE := lp8k
  33. else
  34. $(error TARGET $(TARGET) is invalid)
  35. endif
  36. YOSYS_LOG := $(TARGET_NAME)_yosys.log
  37. NEXTPNR_LOG := $(TARGET_NAME)_nextpnr.log
  38. ICEPACK_LOG := $(TARGET_NAME)_icepack.log
  39. ICETIME_LOG := $(TARGET_NAME)_icetime.log
  40. LOG = >$(1) 2>&1 || ( $(CAT) $(1); $(FALSE) )
  41. .DEFAULT_GOAL := all
  42. all: $(TARGET_NAME).bin $(TARGET_NAME).rpt
  43. ifeq ($(TARGET_LOWER),tinyfpga_bx)
  44. CLK_HZ := 16000000
  45. PLL_HZ := 24000000
  46. PLL_MOD_V := $(PLL_MOD_V_FILE)
  47. CLK_MHZ := $(shell expr $(CLK_HZ) / 1000000)
  48. PLL_MHZ := $(shell expr $(PLL_HZ) / 1000000)
  49. $(PLL_MOD_V):
  50. $(ICEPLL) -q -f $@ -m -n pll_module -i $(CLK_MHZ) -o $(PLL_MHZ)
  51. else
  52. CLK_HZ := 16000000
  53. PLL_HZ := 16000000
  54. PLL_MOD_V :=
  55. endif
  56. crcgen.stamp:
  57. $(TEST) -f ./crcgen/crcgen/__main__.py || $(GIT) submodule update --init
  58. $(TOUCH) $@
  59. crc8_func.v: crcgen.stamp
  60. PYTHONPATH=./crcgen $(PYTHON) ./crcgen/crcgen --algorithm CRC-8-CCITT --verilog-function --name crc8 > $@
  61. %.blif: $(TOP_FILE) $(wildcard *.v) $(GENERATED_V) $(PLL_MOD_V)
  62. $(YOSYS) -p 'read_verilog -DTARGET_$(TARGET_UPPER)=1 -DCLK_HZ=$(CLK_HZ) -DPLL_HZ=$(PLL_HZ) $(if $(filter-out 0,$(DEBUG)),-DDEBUG=1) $<' \
  63. -p $(YOSYS_SYNTH_CMD) \
  64. $(call LOG,$(YOSYS_LOG))
  65. %.asc: $(PCF_FILE) %.blif
  66. $(NEXTPNR)-$(NEXTPNR_ARCH) --$(DEVICE) --package $(PNR_PACKAGE) --json $(TARGET_NAME).json --pcf $< --asc $@ \
  67. $(call LOG,$(NEXTPNR_LOG))
  68. %.bin: %.asc
  69. $(ICEPACK) $< $@ $(call LOG,$(ICEPACK_LOG))
  70. %.rpt: %.asc %.bin
  71. $(ICETIME) -d $(DEVICE) -p $(PCF_FILE) -m -t -r $@ $< \
  72. $(call LOG,$(ICETIME_LOG))
  73. -@$(PRINTF) '\n'
  74. -@$(GREP) -i -e 'Total' $@
  75. -@$(GREP) -i -Ee 'Max frequency|Max delay' $(NEXTPNR_LOG)
  76. -@$(PRINTF) '\n'
  77. -@$(GREP) --color=auto -H -n -i -e 'Warning' $(YOSYS_LOG) $(NEXTPNR_LOG) $(ICEPACK_LOG)
  78. -@$(PRINTF) '\n'
  79. -@$(GREP) -A6 -i -e 'Device utilisation' $(NEXTPNR_LOG)
  80. install: $(TARGET_NAME).bin
  81. $(TINYPROG) -p $<
  82. boot:
  83. $(TINYPROG) -b
  84. clean:
  85. $(RM) -f *.blif *.json *.asc *.bin *.rpt crcgen.stamp $(YOSYS_LOG) $(NEXTPNR_LOG) $(ICEPACK_LOG) $(ICETIME_LOG) $(GENERATED_V) $(PLL_MOD_V_FILE)
  86. .PHONY: all install boot clean
  87. .PRECIOUS: %.json %.blif %.asc