Makefile 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. MAKEFLAGS += -R -r
  2. PROJECT = max80
  3. REVISIONS = v1 v2
  4. QU = quartus
  5. # Common options for all Quartus tools
  6. QPRI = --lower_priority
  7. QCPF = $(QU)_cpf $(QPRI)
  8. QSH = $(QU)_sh $(QPRI)
  9. QSTA = $(QU)_sta $(QPRI)
  10. QPGM = $(QU)_pgm $(QPRI)
  11. # Common options for Quartus in-flow tools
  12. QOPT = --write_settings_files=off $(QPRI)
  13. QMAP = $(QU)_map $(QOPT)
  14. QFIT = $(QU)_fit $(QOPT)
  15. QCDB = $(QU)_cdb $(QOPT)
  16. QASM = $(QU)_asm $(QOPT)
  17. QPOW = $(QU)_pow $(QOPT)
  18. outdir = output
  19. PERL = perl
  20. SUBDIRS = usb
  21. PREREQFILES = $(outdir)/sram.mif
  22. alltarg := sof jic pow.rpt sta.rpt
  23. allout = $(foreach o,$(alltarg),$(outdir)/$(1).$(o))
  24. .SUFFIXES: .targets
  25. .SECONDARY:
  26. .DELETE_ON_ERROR:
  27. all:
  28. $(MAKE) prereq
  29. $(MAKE) $(foreach rev,$(REVISIONS),$(rev).targets)
  30. .PHONY: $(REVISIONS)
  31. $(REVISIONS):
  32. $(MAKE) prereq
  33. $(MAKE) $@.targets
  34. .PHONY: %.targets
  35. %.targets:
  36. $(MAKE) $(call allout,$*)
  37. $(outdir)/%.map.rpt: %.qsf %_map_deps
  38. $(QMAP) $(PROJECT) -c $*
  39. $(outdir)/%.fit.rpt: $(outdir)/%.map.rpt
  40. $(QFIT) $(PROJECT) -c $*
  41. all_map_deps: $(foreach rev,$(REVISIONS),$(rev),$(rev)_map_deps)
  42. $(outdir)/sram.bin: ../rv32/boot.bin $(all_map_deps)
  43. LC_ALL=C date | tr '\n' '\0' | cat $< - > $@
  44. sram_depth := 8192
  45. sram_width := 32
  46. sram_stride := 1
  47. $(outdir)/%.mif: $(outdir)/%.bin ../tools/bin2mif.pl
  48. $(PERL) ../tools/bin2mif.pl $< $@ $($*_depth) $($*_width) $($*_stride)
  49. $(outdir)/%.mif_update.rpt: $(outdir)/%.fit.rpt $(outdir)/sram.mif
  50. $(QCDB) --update_mif $(PROJECT) -c $*
  51. $(outdir)/%.sof: $(outdir)/%.mif_update.rpt
  52. $(QASM) $(PROJECT) -c $*
  53. $(outdir)/%.sta.rpt: $(outdir)/%.fit.rpt | $(outdir)/%.sof
  54. $(QSTA) $(PROJECT) -c $*
  55. $(outdir)/%.pow.rpt: $(outdir)/%.sta.rpt
  56. $(QPOW) $(PROJECT) -c $*
  57. # XXX: do all .sof -> conversions using quartus_cpf
  58. $(outdir)/%.jic: $(PROJECT)-%.cof $(outdir)/%.sof ../rv32/dram.hex
  59. $(QCPF) --convert $<
  60. # Prerequisite directories and files
  61. prereq:
  62. mkdir -p $(outdir)
  63. $(MAKE) $(PREREQFILES)
  64. for d in $(SUBDIRS); do $(MAKE) -C $$d; done
  65. # Clean out SignalTap
  66. signalclean:
  67. for f in *.qsf; do \
  68. $(PERL) -ne 'print unless (/(SIGNALTAP_FILE\b|\bENABLE_SIGNALTAP\b|\bSLD_FILE\b|SLD_NODE_)/);' < $$f > $$f.tmp &&
  69. mv -f $$f.qsf.tmp $$f.qsf ;
  70. done
  71. # Programming targets. Environment JTAG_CABLE can override the default,
  72. # which is otherwise the first cable found.
  73. rpar := )
  74. JTAG_CABLE ?= $(shell jtagconfig --enum | sed -ne 's/^1$(rpar) //p')
  75. # Transient programming
  76. program-%: $(outdir)/%.sof
  77. $(QPGM) -c '$(JTAG_CABLE)' -m JTAG -o 'p;$(outdir)/$*.sof'
  78. # Permanent programming in flash
  79. flash-%: $(outdir)/%.jic
  80. $(QPGM) -c '$(JTAG_CABLE)' -m JTAG -i -o 'pvbi;$(outdir)/$*.jic'
  81. %.deps: %.qsf scripts/qsfdeps.pl
  82. $(PERL) scripts/qsfdeps.pl $* $@ $<
  83. clean:
  84. for d in $(SUBDIRS); do $(MAKE) -C $$d clean; done
  85. rm -rf db incremental_db simulation/modelsim \
  86. greybox_tmp */greybox_tmp iodevs.vh output_files
  87. for d in $(REVISIONS); do \
  88. $$d/*.rpt $$d/*.rpt $$d/*.summary $$d/*.smsg \
  89. $$d/*.htm $$d/*.htm_files $$d/*.map $$d/*.eqn $$d/*.sld \
  90. $$d/*.done ; \
  91. done
  92. spotless:
  93. for d in $(SUBDIRS); do $(MAKE) -C $$d spotless; done
  94. rm -rf $(outdir)
  95. iodevs.vh: ../iodevs.conf ../tools/iodevs.pl
  96. $(PERL) ../tools/iodevs.pl v $< $@
  97. # Verilog header dependencies
  98. max80.sv: iodevs.vh
  99. -include $(foreach rev,$(REVISIONS),$(rev).deps)