From c6f4f36f07c17add3bd81c8257c435cba2c85054 Mon Sep 17 00:00:00 2001 From: Colin Schmidt Date: Fri, 26 Jul 2019 16:34:49 -0700 Subject: [PATCH] Switch to auto-generated hammer makefile fragment (#181) * Switch to auto-generated hammer makefile fragment * Add hammer_d_deps Co-Authored-By: John Wright --- vlsi/Makefile | 147 +++++++++++++++++++++++--------------------------- vlsi/hammer | 2 +- 2 files changed, 67 insertions(+), 82 deletions(-) diff --git a/vlsi/Makefile b/vlsi/Makefile index fc0b4ac..519d144 100644 --- a/vlsi/Makefile +++ b/vlsi/Makefile @@ -14,109 +14,94 @@ sim_dir=$(abspath .) ######################################################################################### include $(base_dir)/variables.mk +######################################################################################### +# vlsi types and rules +######################################################################################### +sim_name ?= vcs # needed for GenerateSimFiles, but is unused +tech_name ?= +tech_dir ?= $(vlsi_dir)/hammer-$(tech_name)-plugin/$(tech_name) +SMEMS_COMP ?= $(tech_dir)/sram-compiler.json +SMEMS_CACHE ?= $(tech_dir)/sram-cache.json +SMEMS_HAMMER ?= $(build_dir)/$(long_name).mems.hammer.json +MACROCOMPILER_MODE ?= -l $(SMEMS_CACHE) -hir $(SMEMS_HAMMER) +OBJ_DIR ?= $(vlsi_dir)/build +ENV_YML ?= $(vlsi_dir)/bwrc-env.yml +INPUT_CONFS ?= example.yml $(dir $(tech_dir))/bwrc.yml +HAMMER_EXEC ?= ./example-vlsi + +######################################################################################### +# general rules +######################################################################################### +ALL_RTL = $(TOP_FILE) $(TOP_SMEMS_FILE) $(extra_v_includes) +extra_v_includes = $(build_dir)/EICG_wrapper.v + +.PHONY: default verilog +default: all + +all: drc lvs + +verilog: $(ALL_RTL) + ######################################################################################### # import other necessary rules and variables ######################################################################################### include $(base_dir)/common.mk ######################################################################################### -# vlsi types and rules +# srams ######################################################################################### +SRAM_GENERATOR_CONF = $(build_dir)/sram_generator-input.yml +SRAM_CONF=$(build_dir)/sram_generator-output.json -#sim_name is unused, but GenerateSimFiles expects it -sim_name ?= vcs -tech_name ?= -tech_dir ?= $(vlsi_dir)/hammer-$(tech_name)-plugin/$(tech_name) -SMEMS_COMP ?= $(tech_dir)/sram-compiler.json -SMEMS_HAMMER ?= $(build_dir)/$(long_name).mems.hammer.json -MACROCOMPILER_MODE ?= -l $(SMEMS_COMP) --use-compiler -hir $(SMEMS_HAMMER) -OBJ_DIR ?= $(vlsi_dir)/build -ENV_YML ?= $(vlsi_dir)/bwrc-env.yml -INPUT_CONFS ?= example.yml $(dir $(tech_dir))/bwrc.yml -HAMMER_EXEC ?= ./example-vlsi +## SRAM Generator +.PHONY: sram_generator srams +srams: sram_generator +sram_generator: $(SRAM_CONF) -ROCKET_SRC_DIR=$(ROCKETCHIP_DIR)/src/main/resources/vsrc +# This should be built alongside $(SMEMS_FILE) +$(SMEMS_HAMMER): $(SMEMS_FILE) -ROCKET_SRCS = \ - $(ROCKET_SRC_DIR)/ClockDivider2.v \ - $(ROCKET_SRC_DIR)/ClockDivider3.v \ - $(ROCKET_SRC_DIR)/AsyncResetReg.v \ - $(ROCKET_SRC_DIR)/plusarg_reader.v \ - $(ROCKET_SRC_DIR)/EICG_wrapper.v \ +$(SRAM_GENERATOR_CONF): $(SMEMS_HAMMER) + mkdir -p $(dir $@) + echo "vlsi.inputs.sram_parameters: '$(SMEMS_HAMMER)'" >> $@ + echo "vlsi.inputs.sram_parameters_meta: [\"transclude\", \"json2list\"]">> $@ -ALL_RTL = $(ROCKET_SRCS) $(TOP_FILE) $(TOP_SMEMS_FILE) +$(SRAM_CONF): $(SRAM_GENERATOR_CONF) + cd $(vlsi_dir) && $(HAMMER_EXEC) -e $(ENV_YML) $(foreach x,$(INPUT_CONFS) $(SRAM_GENERATOR_CONF), -p $(x)) --obj_dir $(build_dir) sram_generator + cd $(vlsi_dir) && cp output.json $@ -CLOCK_DOMAINS = $(build_dir)/$(long_name).domains +######################################################################################### +# synthesis input configuration +######################################################################################### +SYN_CONF = $(OBJ_DIR)/inputs.yml +GENERATED_CONFS = $(SYN_CONF) $(SRAM_CONF) -.PHONY: default -default: all - -all: drc lvs - - -###################################################### SYN ############################################################ - -SYNTH_CONF = $(OBJ_DIR)/inputs.yml - -$(SYNTH_CONF): +$(SYN_CONF): $(ALL_RTL) $(extra_v_includes) $(sim_top_blackboxes) mkdir -p $(dir $@) echo "synthesis.inputs:" > $@ echo " top_module: $(TOP)" >> $@ echo " input_files:" >> $@ - for x in $(ALL_RTL); do \ + for x in $(ALL_RTL) $(extra_v_includes) `cat $(sim_top_blackboxes)`; do \ echo ' - "'$$x'"' >> $@; \ done -GENERATED_CONFS=$(SYNTH_CONF) $(SRAM_CONF) +######################################################################################### +# AUTO BUILD FLOW +######################################################################################### -.PHONY: syn synthesis -syn: $(OBJ_DIR)/syn-rundir/$(TOP).mapped.v -synthesis: syn +.PHONY: buildfile +buildfile: $(OBJ_DIR)/hammer.d +# Tip: Set HAMMER_D_DEPS to an empty string to avoid unnecessary RTL rebuilds +# TODO: make this dependency smarter so that we don't need this at all +HAMMER_D_DEPS ?= $(GENERATED_CONFS) +$(OBJ_DIR)/hammer.d: $(HAMMER_D_DEPS) + $(HAMMER_EXEC) -e $(ENV_YML) $(foreach x,$(INPUT_CONFS) $(GENERATED_CONFS), -p $(x)) --obj_dir $(OBJ_DIR) build -$(OBJ_DIR)/syn-rundir/$(TOP).mapped.v $(OBJ_DIR)/syn-rundir/syn-output.json: $(ENV_YML) $(INPUT_CONFS) $(GENERATED_CONFS) $(ALL_RTL) - mkdir -p $(dir $@) - $(HAMMER_EXEC) -e $(ENV_YML) $(foreach x,$(INPUT_CONFS) $(GENERATED_CONFS), -p $(x)) --obj_dir $(OBJ_DIR) syn - -$(OBJ_DIR)/par-input.json: $(OBJ_DIR)/syn-rundir/syn-output.json - mkdir -p $(dir $@) - $(HAMMER_EXEC) -e $(ENV_YML) $(foreach x,$(INPUT_CONFS) $<, -p $(x)) -o $@ syn_to_par - -###################################################### PAR ############################################################ - -.PHONY: par place-and-route -par: $(OBJ_DIR)/par-rundir/$(TOP).gds -place-and-route: par - -$(OBJ_DIR)/par-rundir/$(TOP).gds $(OBJ_DIR)/par-rundir/par-output.json: $(OBJ_DIR)/par-input.json $(OBJ_DIR)/syn-rundir/$(TOP).mapped.v - mkdir -p $(dir $@) - $(HAMMER_EXEC) -e $(ENV_YML) -p $< --obj_dir $(OBJ_DIR) par - -$(OBJ_DIR)/drc-input.json: $(OBJ_DIR)/par-input.json $(OBJ_DIR)/par-rundir/par-output.json - mkdir -p $(dir $@) - $(HAMMER_EXEC) -e $(ENV_YML) $(foreach x,$^, -p $(x)) -o $@ --obj_dir $(OBJ_DIR) par_to_drc - -###################################################### DRC ############################################################ -# TODO unimplemented -.PHONY: drc -drc: $(OBJ_DIR)/drc-rundir/drc_results.db - -$(OBJ_DIR)/drc-rundir/drc_results.db: $(OBJ_DIR)/drc-input.json $(OBJ_DIR)/par-rundir/$(TOP).gds - mkdir -p $(dir $@) - $(HAMMER_EXEC) -e $(ENV_YML) -p $< --obj_dir $(OBJ_DIR) drc - -###################################################### LVS ############################################################ -# TODO unimplemented -$(OBJ_DIR)/lvs-input.json: $(OBJ_DIR)/par-input.json $(OBJ_DIR)/par-rundir/par-output.json - mkdir -p $(dir $@) - $(HAMMER_EXEC) -e $(ENV_YML) $(foreach x,$^, -p $(x)) -o $@ --obj_dir $(OBJ_DIR) par_to_lvs - -.PHONY: lvs -lvs: $(OBJ_DIR)/lvs-rundir/lvs_results.rpt - -$(OBJ_DIR)/lvs-rundir/lvs_results.rpt: $(OBJ_DIR)/lvs-input.json $(OBJ_DIR)/par-rundir/$(TOP).gds - mkdir -p $(dir $@) - $(HAMMER_EXEC) -e $(ENV_YML) -p $< --obj_dir $(OBJ_DIR) lvs +-include $(OBJ_DIR)/hammer.d +######################################################################################### +# general cleanup rule +######################################################################################### .PHONY: clean clean: - rm -rf $(OBJ_DIR) hammer-vlsi*.log __pycache__ output.json $(GENERATED_CONFS) generated-src + rm -rf $(OBJ_DIR) hammer-vlsi*.log __pycache__ output.json $(GENERATED_CONFS) $(gen_dir) diff --git a/vlsi/hammer b/vlsi/hammer index 873b2c1..a27886f 160000 --- a/vlsi/hammer +++ b/vlsi/hammer @@ -1 +1 @@ -Subproject commit 873b2c1af0a54cb339a19a7c8cf3a1e7905feb58 +Subproject commit a27886fb42c121f3ba5f684acaf5856b2ec293e1