263 lines
8.4 KiB
Makefile
263 lines
8.4 KiB
Makefile
#
|
|
# Makefile - fpgatools
|
|
# Author: Wolfgang Spraul
|
|
#
|
|
# This is free and unencumbered software released into the public domain.
|
|
# For details see the UNLICENSE file at the root of the source tree.
|
|
#
|
|
|
|
CC = clang-3.6
|
|
|
|
CFLAGS += -I$(CURDIR)/libs
|
|
|
|
LDFLAGS += -Wl,-rpath,$(CURDIR)/libs
|
|
|
|
OBJS = autotest.o bit2fp.o printf_swbits.o draw_svg_tiles.o fp2bit.o \
|
|
hstrrep.o merge_seq.o fpinfo.o pair2net.o sort_seq.o hello_world.o \
|
|
blinking_led.o jtag_counter.o j1_blinking.o
|
|
|
|
DYNAMIC_LIBS = libs/libfpga-model.so libs/libfpga-bit.so \
|
|
libs/libfpga-floorplan.so libs/libfpga-control.so \
|
|
libs/libfpga-cores.so
|
|
|
|
.PHONY: all test clean install uninstall FAKE
|
|
.SECONDARY:
|
|
.SECONDEXPANSION:
|
|
|
|
all: fpinfo fp2bit bit2fp printf_swbits draw_svg_tiles autotest hstrrep \
|
|
sort_seq merge_seq pair2net hello_world blinking_led jtag_counter \
|
|
j1_blinking.o
|
|
|
|
include Makefile.common
|
|
|
|
%.o: %.c
|
|
$(CC) $(CPPFLAGS) $(CFLAGS) -o $@ -c $<
|
|
$(MKDEP)
|
|
|
|
libs/%.so: FAKE
|
|
@make -C libs $(notdir $@)
|
|
|
|
#
|
|
# Testing section - there are three types of tests:
|
|
#
|
|
# 1. design
|
|
#
|
|
# design tests run a design binary to produce floorplan stdout, which is
|
|
# converted to binary configuration and back to floorplan. The resulting
|
|
# floorplan after conversion through binary must match the original
|
|
# floorplan. Additionally, the original floorplan is compared to a gold
|
|
# standard if one exists.
|
|
#
|
|
# ./binary -> .fp -> .bit -> .fp -> compare first .fp to second and gold .fp
|
|
#
|
|
# 2. autotest
|
|
#
|
|
# autotest runs an automated test of some fpga logic and produces a log output
|
|
# which is compared against a gold standard.
|
|
#
|
|
# ./autotest -> stdout -> compare with gold standard
|
|
#
|
|
# 3. compare
|
|
#
|
|
# tool output is parsed to extract different types of model data and compare
|
|
# against a gold standard.
|
|
#
|
|
# tool output -> awk/processing -> compare to gold standard
|
|
#
|
|
# - extensions
|
|
#
|
|
# .ftest = fpgatools run test (design, autotest, compare)
|
|
#
|
|
# .f2gd = fpgatools to-gold diff
|
|
# .ffbd = diff between first fp and after roundtrip through binary config
|
|
# .fb2f = fpgatools binary config back to floorplan
|
|
# .ff2b = fpgatools floorplan to binary config
|
|
# .fco = fpgatools compare output for missing/extra
|
|
# .fcr = fpgatools compare missing/extra result
|
|
# .fcm = fpgatools compare match
|
|
# .fcd = fpgatools compare diff
|
|
# .fce = fpgatools compare extra
|
|
# .fao = fpgatools autotest output
|
|
# .far = fpgatools autotest result (diff to gold output)
|
|
#
|
|
|
|
test_dirs := $(shell mkdir -p test.gold test.out)
|
|
|
|
DESIGN_TESTS := hello_world blinking_led jtag_counter j1_blinking
|
|
AUTO_TESTS := logic_cfg routing_sw io_sw iob_cfg lut_encoding
|
|
COMPARE_TESTS := xc6slx9_tiles xc6slx9_devs xc6slx9_ports xc6slx9_conns xc6slx9_sw xc6slx9_swbits
|
|
|
|
DESIGN_GOLD := $(foreach target, $(DESIGN_TESTS), test.gold/design_$(target).fp)
|
|
AUTOTEST_GOLD := $(foreach target, $(AUTO_TESTS), test.gold/autotest_$(target).fao)
|
|
COMPARE_GOLD := $(foreach target, $(COMPARE_TESTS), test.gold/compare_$(target).fco)
|
|
|
|
test_gold: design_gold autotest_gold compare_gold
|
|
design_gold: $(DESIGN_GOLD)
|
|
autotest_gold: $(AUTOTEST_GOLD)
|
|
compare_gold: $(COMPARE_GOLD)
|
|
|
|
test: test_design test_auto test_compare
|
|
test_design: $(foreach target, $(DESIGN_TESTS), test.out/design_$(target).ftest)
|
|
test_auto: $(foreach target, $(AUTO_TESTS), test.out/autotest_$(target).ftest)
|
|
test_compare: $(foreach target, $(COMPARE_TESTS), test.out/compare_$(target).ftest)
|
|
|
|
# design testing targets
|
|
|
|
design_%.ftest: design_%.ffbd
|
|
@if test -s $<; then echo "Design test: $(*F) - failed, diff follows"; cat $<; else echo "Design test: $(*F) - succeeded"; fi;
|
|
@if test -s test.gold/$(basename $(@F)).fp; then diff -U 0 test.gold/$(basename $(@F)).fp $(basename $@).fp > $(basename $@).f2gd || (echo Diff to gold: && cat $(basename $@).f2gd); fi;
|
|
|
|
%.ffbd: %.fp %.fb2f
|
|
@diff -u $(basename $@).fp $(basename $@).fb2f >$@ || true
|
|
|
|
%.fb2f: %.ff2b bit2fp
|
|
@./bit2fp $< >$@ 2>&1
|
|
|
|
%.ff2b: %.fp fp2bit
|
|
@./fp2bit $< $@
|
|
|
|
design_%.fp: $$*
|
|
@./$(*F) >$@ 2>&1
|
|
|
|
# autotest targets
|
|
|
|
autotest_%.ftest: autotest_%.far
|
|
@if test -s $<; then echo "Test failed: $(*F) (autotest), diff follows"; cat $<; else echo "Test succeeded: $(*F) (autotest)"; fi;
|
|
|
|
%.far: %.fao
|
|
@if test ! -e test.gold/$(*F).fao; then echo Gold test.gold/$(*F).fao does not exist, aborting.; false; fi;
|
|
@diff -U 0 -I "^O #NODIFF" test.gold/$(*F).fao $< >$@ || true
|
|
|
|
autotest_%.fao: autotest fp2bit bit2fp
|
|
./autotest --test=$(*F) >$@ 2>&1
|
|
|
|
# compare testing targets
|
|
|
|
compare_%.ftest: compare_%.fcr
|
|
@echo Test: $(*F) \(compare\)
|
|
@cat $<|awk '{print " "$$0}'
|
|
|
|
%.fcr: %.fcm %.fcd %.fce
|
|
@echo Matching lines - $*.fcm >$@
|
|
@cat $*.fcm | wc -l >>$@
|
|
@echo Missing lines - $*.fcd >>$@
|
|
@cat $*.fcd | grep ^-[^-] | wc -l >>$@
|
|
@if test -s $*.fce; then echo Extra lines - $*.fce: >>$@; cat $*.fce >>$@; fi;
|
|
|
|
%.fcm: %.fco
|
|
@if test ! -e test.gold/$(*F).fco; then echo Gold test.gold/$(*F).fco does not exist, aborting.; false; fi;
|
|
@comm -1 -2 $< test.gold/$(*F).fco >$@
|
|
|
|
%.fcd: %.fco
|
|
@if test ! -e test.gold/$(*F).fco; then echo Gold test.gold/$(*F).fco does not exist, aborting.; false; fi;
|
|
@diff -u test.gold/$(*F).fco $< >$@ || true
|
|
|
|
%.fce: %.fcd
|
|
@cat $< | grep ^+[^+] >$@ || true
|
|
|
|
compare_%_tiles.fco: compare_%.fp
|
|
@cat $<|awk '{if ($$1=="tile" && $$4=="name") printf "%s %s %s\n",$$2,$$3,$$5}'|sort >$@
|
|
|
|
compare_%_devs.fco: compare_%.fp
|
|
@cat $<|awk '{if ($$1=="dev") {if ($$6=="type") printf "%s %s %s %s\n",$$2,$$3,$$4,$$7; else printf "%s %s %s\n",$$2,$$3,$$4; }}'|sort >$@
|
|
|
|
compare_%_ports.fco: compare_%.fp
|
|
@cat $<|awk '{if ($$1=="port") printf "%s %s %s\n",$$2,$$3,$$4}'|sort >$@
|
|
|
|
compare_%_conns.fco: compare_%.fp sort_seq merge_seq
|
|
@cat $<|awk '{if ($$1=="conn") printf "%s %s %s %s %s %s\n",$$2,$$3,$$5,$$6,$$4,$$7}'|sort|./sort_seq -|./merge_seq -|awk '{printf "%s %s %s %s %s %s\n",$$1,$$2,$$5,$$3,$$4,$$6}'|sort >$@
|
|
|
|
compare_%_sw.fco: compare_%.fp
|
|
@cat $<|awk '{if ($$1=="sw") printf "%s %s %s %s %s\n",$$2,$$3,$$4,$$5,$$6}'|sort >$@
|
|
|
|
compare_%_swbits.fco: printf_swbits
|
|
@./printf_swbits | sort > $@
|
|
|
|
compare_%.fp: fpinfo
|
|
@./fpinfo >$@
|
|
|
|
# todo: .cnets not integrated yet
|
|
%.cnets: %.fp pair2net
|
|
cat $<|awk '{if ($$1=="conn") printf "%s-%s-%s %s-%s-%s\n",$$2,$$3,$$4,$$5,$$6,$$7}' |./pair2net -|sort >$@
|
|
@echo Number of conn nets:
|
|
@cat $@|wc -l
|
|
@echo Number of connection points:
|
|
@cat $@|wc -w
|
|
@echo Largest net:
|
|
@cat $@|awk '{if (NF>max) max=NF} END {print max}'
|
|
|
|
#
|
|
# end of testing section
|
|
#
|
|
|
|
autotest: autotest.o $(DYNAMIC_LIBS)
|
|
|
|
hello_world: hello_world.o $(DYNAMIC_LIBS)
|
|
|
|
blinking_led: blinking_led.o $(DYNAMIC_LIBS)
|
|
|
|
jtag_counter: jtag_counter.o $(DYNAMIC_LIBS)
|
|
|
|
j1_blinking: j1_blinking.o $(DYNAMIC_LIBS)
|
|
|
|
fp2bit: fp2bit.o $(DYNAMIC_LIBS)
|
|
|
|
bit2fp: bit2fp.o $(DYNAMIC_LIBS)
|
|
|
|
printf_swbits: printf_swbits.o $(DYNAMIC_LIBS)
|
|
|
|
fpinfo: fpinfo.o $(DYNAMIC_LIBS)
|
|
|
|
draw_svg_tiles: CFLAGS += `pkg-config libxml-2.0 --cflags`
|
|
draw_svg_tiles: LDLIBS += `pkg-config libxml-2.0 --libs`
|
|
draw_svg_tiles: draw_svg_tiles.o $(DYNAMIC_LIBS)
|
|
|
|
pair2net: pair2net.o $(DYNAMIC_LIBS)
|
|
|
|
sort_seq: sort_seq.o $(DYNAMIC_LIBS)
|
|
|
|
merge_seq: merge_seq.o $(DYNAMIC_LIBS)
|
|
|
|
hstrrep: hstrrep.o $(DYNAMIC_LIBS)
|
|
|
|
xc6slx9.fp: fpinfo
|
|
./fpinfo > $@
|
|
|
|
xc6slx9.svg: draw_svg_tiles
|
|
./draw_svg_tiles | xmllint --pretty 1 - > $@
|
|
|
|
clean:
|
|
@make -C libs clean
|
|
rm -f $(OBJS) *.d
|
|
rm -f draw_svg_tiles fpinfo hstrrep sort_seq merge_seq autotest
|
|
rm -f fp2bit bit2fp printf_swbits pair2net hello_world blinking_led
|
|
rm -f jtag_counter j1_blinking
|
|
rm -f xc6slx9.fp xc6slx9.svg
|
|
rm -f $(DESIGN_GOLD) $(AUTOTEST_GOLD) $(COMPARE_GOLD)
|
|
rm -f test.gold/compare_xc6slx9.fp
|
|
rm -f $(foreach f, $(DESIGN_TESTS), test.out/design_$(f).ffbd)
|
|
rm -f $(foreach f, $(DESIGN_TESTS), test.out/design_$(f).ff2b)
|
|
rm -f $(foreach f, $(DESIGN_TESTS), test.out/design_$(f).fb2f)
|
|
rm -f $(foreach f, $(DESIGN_TESTS), test.out/design_$(f).f2gd)
|
|
rm -f $(foreach f, $(DESIGN_TESTS), test.out/design_$(f).fp)
|
|
rm -f test.out/autotest_*
|
|
rm -f $(foreach f, $(COMPARE_TESTS), test.out/compare_$(f).fco)
|
|
rm -f $(foreach f, $(COMPARE_TESTS), test.out/compare_$(f).fcr)
|
|
rm -f $(foreach f, $(COMPARE_TESTS), test.out/compare_$(f).fcm)
|
|
rm -f $(foreach f, $(COMPARE_TESTS), test.out/compare_$(f).fcd)
|
|
rm -f $(foreach f, $(COMPARE_TESTS), test.out/compare_$(f).fce)
|
|
rm -f test.out/compare_xc6slx9.fp
|
|
rmdir --ignore-fail-on-non-empty test.out test.gold
|
|
|
|
install: fp2bit bit2fp
|
|
@make -C libs install
|
|
mkdir -p $(DESTDIR)/$(PREFIX)/bin/
|
|
install -m 755 fp2bit $(DESTDIR)/$(PREFIX)/bin/
|
|
install -m 755 bit2fp $(DESTDIR)/$(PREFIX)/bin/
|
|
chrpath -d $(DESTDIR)/$(PREFIX)/bin/fp2bit
|
|
chrpath -d $(DESTDIR)/$(PREFIX)/bin/bit2fp
|
|
|
|
uninstall:
|
|
@make -C libs uninstall
|
|
rm -f $(DESTDIR)/$(PREFIX)/bin/{fp2bit,bit2fp}
|