mirror of https://github.com/openXC7/prjxray.git
90 lines
3.3 KiB
Makefile
90 lines
3.3 KiB
Makefile
# project.mk: build specimens (run vivado), compute rref
|
|
# corner.mk: run corner specific calculations
|
|
|
|
N := 1
|
|
SPECIMENS := $(addprefix specimen_,$(shell seq -f '%03.0f' $(N)))
|
|
SPECIMENS_OK := $(addsuffix /OK,$(SPECIMENS))
|
|
CSVS := $(addsuffix /timing3.csv,$(SPECIMENS))
|
|
TIMFUZ_DIR=$(XRAY_DIR)/fuzzers/007-timing
|
|
RREF_CORNER=slow_max
|
|
# Allow an empty system of equations?
|
|
# for testing only on small projects
|
|
ALLOW_ZERO_EQN?=N
|
|
# Constrained projects may fail to build
|
|
# Set to Y to make a best effort to suck in the ones that did build
|
|
BADPRJ_OK?=N
|
|
# Set ZERO elements to zero delay (as is expected they should be)
|
|
RMZERO?=N
|
|
BUILD_DIR?=build
|
|
|
|
RREF_ARGS=
|
|
ifeq ($(RMZERO),Y)
|
|
RREF_ARGS+=--rm-zero
|
|
endif
|
|
|
|
TIMGRID_VCS=$(BUILD_DIR)/fast_max/timgrid-vc.json $(BUILD_DIR)/fast_min/timgrid-vc.json $(BUILD_DIR)/slow_max/timgrid-vc.json $(BUILD_DIR)/slow_min/timgrid-vc.json
|
|
|
|
all: $(BUILD_DIR)/timgrid-v.json
|
|
|
|
# make $(BUILD_DIR)/checksub first
|
|
$(BUILD_DIR)/fast_max/timgrid-vc.json: $(BUILD_DIR)/checksub
|
|
$(MAKE) -f $(TIMFUZ_DIR)/projects/corner.mk CORNER=fast_max
|
|
$(BUILD_DIR)/fast_min/timgrid-vc.json: $(BUILD_DIR)/checksub
|
|
$(MAKE) -f $(TIMFUZ_DIR)/projects/corner.mk CORNER=fast_min
|
|
$(BUILD_DIR)/slow_max/timgrid-vc.json: $(BUILD_DIR)/checksub
|
|
$(MAKE) -f $(TIMFUZ_DIR)/projects/corner.mk CORNER=slow_max
|
|
$(BUILD_DIR)/slow_min/timgrid-vc.json: $(BUILD_DIR)/checksub
|
|
$(MAKE) -f $(TIMFUZ_DIR)/projects/corner.mk CORNER=slow_min
|
|
|
|
$(SPECIMENS_OK):
|
|
bash generate.sh $(subst /OK,,$@) || (if [ "$(BADPRJ_OK)" != 'Y' ] ; then exit 1; fi; exit 0)
|
|
touch $@
|
|
|
|
run:
|
|
$(MAKE) clean
|
|
$(MAKE) all
|
|
touch run.ok
|
|
|
|
clean:
|
|
rm -rf specimen_[0-9][0-9][0-9]/ seg_clblx.segbits __pycache__ run.ok
|
|
rm -rf vivado*.log vivado_*.str vivado*.jou design *.bits *.dcp *.bit
|
|
rm -rf $(BUILD_DIR)
|
|
|
|
.PHONY: all run clean
|
|
|
|
# Normally require all projects to complete
|
|
# If BADPRJ_OK is allowed, only take projects that were successful
|
|
# FIXME: couldn't get call to work
|
|
exist_csvs = \
|
|
for f in $(CSVS); do \
|
|
if [ "$(BADPRJ_OK)" != 'Y' -o -f $$f ] ; then \
|
|
echo $$f; \
|
|
fi; \
|
|
done
|
|
|
|
# rref should be the same regardless of corner
|
|
$(BUILD_DIR)/sub.json: $(SPECIMENS_OK)
|
|
mkdir -p $(BUILD_DIR)
|
|
# Discover which variables can be separated
|
|
# This is typically the longest running operation
|
|
\
|
|
csvs=$$(for f in $(CSVS); do if [ "$(BADPRJ_OK)" != 'Y' -o -f $$f ] ; then echo $$f; fi; done) ; \
|
|
python3 $(TIMFUZ_DIR)/rref.py --corner $(RREF_CORNER) --simplify $(RREF_ARGS) --out $(BUILD_DIR)/sub.json.tmp $$csvs
|
|
mv $(BUILD_DIR)/sub.json.tmp $(BUILD_DIR)/sub.json
|
|
|
|
$(BUILD_DIR)/grouped.csv: $(SPECIMENS_OK) $(BUILD_DIR)/sub.json
|
|
# Separate variables
|
|
\
|
|
csvs=$$(for f in $(CSVS); do if [ "$(BADPRJ_OK)" != 'Y' -o -f $$f ] ; then echo $$f; fi; done) ; \
|
|
python3 $(TIMFUZ_DIR)/csv_flat2group.py --sub-json $(BUILD_DIR)/sub.json --strict --out $(BUILD_DIR)/grouped.csv.tmp $$csvs
|
|
mv $(BUILD_DIR)/grouped.csv.tmp $(BUILD_DIR)/grouped.csv
|
|
|
|
$(BUILD_DIR)/checksub: $(BUILD_DIR)/grouped.csv $(BUILD_DIR)/sub.json
|
|
# Verify sub.json makes a cleanly solvable solution with no non-pivot leftover
|
|
python3 $(TIMFUZ_DIR)/checksub.py --sub-json $(BUILD_DIR)/sub.json $(BUILD_DIR)/grouped.csv
|
|
touch $(BUILD_DIR)/checksub
|
|
|
|
$(BUILD_DIR)/timgrid-v.json: $(TIMGRID_VCS)
|
|
python3 $(TIMFUZ_DIR)/timgrid_vc2v.py --out $(BUILD_DIR)/timgrid-v.json $(TIMGRID_VCS)
|
|
|