#########################################################################################
# vlsi makefile
#########################################################################################

#########################################################################################
# general path variables
#########################################################################################
base_dir=$(abspath ..)
vlsi_dir=$(abspath .)
sim_dir=$(abspath .)

#########################################################################################
# include shared variables
#########################################################################################
include $(base_dir)/variables.mk

#########################################################################################
# import other necessary rules and variables
#########################################################################################
include $(base_dir)/common.mk

#########################################################################################
# vlsi types and rules
#########################################################################################

#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

ROCKET_SRC_DIR=$(ROCKETCHIP_DIR)/src/main/resources/vsrc

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 \

ALL_RTL = $(ROCKET_SRCS) $(TOP_FILE) $(TOP_SMEMS_FILE)

CLOCK_DOMAINS = $(build_dir)/$(long_name).domains

.PHONY: default
default: all

all: drc lvs


###################################################### SYN ############################################################

SYNTH_CONF = $(OBJ_DIR)/inputs.yml

$(SYNTH_CONF):
	mkdir -p $(dir $@)
	echo "synthesis.inputs:" > $@
	echo "  top_module: $(TOP)" >> $@
	echo "  input_files:" >> $@
	for x in $(ALL_RTL); do \
		echo '    - "'$$x'"' >> $@; \
	done

GENERATED_CONFS=$(SYNTH_CONF) $(SRAM_CONF)

.PHONY: syn synthesis
syn: $(OBJ_DIR)/syn-rundir/$(TOP).mapped.v
synthesis: syn

$(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

.PHONY: clean
clean:
	rm -rf $(OBJ_DIR) hammer-vlsi*.log __pycache__ output.json $(GENERATED_CONFS) generated-src
