TARGET = FireARM
VLOGS = Console.v \
        ../ARM_Constants.v \
        ../BigBlockRAM.v \
        ../BlockRAM.v \
        ../BusArbiter.v \
        ../DCache.v \
        ../Decode.v \
        ../Execute.v \
        ../Fetch.v \
        ../ICache.v \
        ../Issue.v \
        ../Memory.v \
        ../RegFile.v \
        ../system.v \
        ../Terminal.v \
        ../Writeback.v
VLOGS_ALL = $(VLOGS) ram.hex ibmpc1.mem scancodes.unshifted.hex scancodes.shifted.hex

all: fpga_target

BITGEN_OPTS = \
	-w \
	-g DebugBitstream:No \
	-g Binary:no \
	-g CRC:Enable \
	-g ProgPin:PullUp \
	-g DonePin:PullUp \
	-g TckPin:PullUp \
	-g TdiPin:PullUp \
	-g TdoPin:PullUp \
	-g TmsPin:PullUp \
	-g UnusedPin:PullDown \
	-g UserID:0xFFFFFFFF \
	-g StartUpClk:CClk \
	-g DONE_cycle:4 \
	-g GTS_cycle:5 \
	-g GWE_cycle:6 \
	-g Security:None \
	-g DonePipe:No \
	-g Match_cycle:2 \
	-g DriveDone:No

fpga_target: $(TARGET).bit

$(TARGET).ngc: $(TARGET).xst $(VLOGS_ALL)
	@mkdir -p xst/projnav.tmp
	@echo work > $(TARGET).lso
	@rm -f $(TARGET).prj
	@for i in $(VLOGS); do echo verilog work '"'$$i'"' >> $(TARGET).prj; done
	xst -ifn $(TARGET).xst -ofn $(TARGET).syr

# for post-synth simulation
$(TARGET)-bare.ngc: $(TARGET)-bare.xst $(VLOGS_ALL)
	@mkdir -p xst/projnav.tmp
	@echo work > $(TARGET).lso
	@rm -f $(TARGET).prj
	@for i in $(VLOGS); do echo verilog work '"'$$i'"' >> $(TARGET).prj; done
	xst -ifn $(TARGET)-bare.xst -ofn $(TARGET)-bare.syr


# for synth mismatch diagnostics
$(TARGET)-memory.ngc: $(TARGET)-memory.xst $(VLOGS_ALL)
	@mkdir -p xst/projnav.tmp
	@echo work > $(TARGET).lso
	@rm -f $(TARGET).prj
	@for i in $(VLOGS); do echo verilog work '"'$$i'"' >> $(TARGET).prj; done
	xst -ifn $(TARGET)-memory.xst -ofn $(TARGET)-memory.syr

sim/%.v: %.ngc
	netgen -ofmt verilog -w -dir sim $<

$(TARGET).ngd: $(TARGET).ngc $(TARGET).ucf
	ngdbuild -dd _ngo -uc $(TARGET).ucf -nt timestamp -p xc5vlx110t-ff1136-1 "$(TARGET).ngc" $(TARGET).ngd

$(TARGET)_map.ncd: $(TARGET).ngd
	map -w -p xc5vlx110t-ff1136-1 -cm area -pr off -k 4 -c 100 -o $(TARGET)_map.ncd $(TARGET).ngd $(TARGET).pcf

$(TARGET).ncd: $(TARGET)_map.ncd
	par -w -ol std -t 1 $(TARGET)_map.ncd $(TARGET).ncd $(TARGET).pcf

$(TARGET).twr: $(TARGET)_map.ncd
	trce -e 3 -s 5 -xml $(TARGET) $(TARGET).ncd -o $(TARGET).twr $(TARGET).pcf -ucf $(TARGET).ucf

$(TARGET).bit: $(TARGET).ncd
	bitgen $(BITGEN_OPTS) $(TARGET).ncd

$(TARGET).svf: $(TARGET).bit impact.cmd
	sed -e s/XXX/$(subst .bit,,$<)/ < impact.cmd > tmp.cmd
	impact -batch tmp.cmd

clean:
	rm -f $(TARGET).bgn $(TARGET).ngc $(TARGET).svf $(TARGET).ngd $(TARGET).bit $(TARGET).twr $(TARGET).ncd $(TARGET)_map.ncd $(TARGET)_map.*
	rm -f $(TARGET).bld $(TARGET).drc $(TARGET)_ngdbuild.xrpt $(TARGET)_pad.* $(TARGET).pad $(TARGET).par $(TARGET)_par.xrpt $(TARGET).ngr
	rm -f $(TARGET).pcf $(TARGET)_summary.xml $(TARGET).unroutes $(TARGET)_usage.xml $(TARGET)_xst.xrpt $(TARGET).syr $(TARGET).ptwx $(TARGET).xpi
	rm -rf xst
	rm -rf xlnx_auto_*
	rm -rf _ngo
	rm -f tmp.cmd
	rm -f _impactbatch.log
	rm -f $(TARGET).prj
	rm -f $(TARGET).lso