# wtf partial make for synth/timing only export SCRIPTS_DIR = ./scripts SYNTH_SCRIPT ?= $(SCRIPTS_DIR)/synth.tcl FLOORPLAN_SCRIPT ?= $(SCRIPTS_DIR)/floorplan.tcl IO_PLACE_RANDOM_SCRIPT ?= $(SCRIPTS_DIR)/io_placement_random.tcl TDMS_SCRIPT ?= $(SCRIPTS_DIR)/tdms_place.tcl MACRO_PLACE_SCRIPT ?= $(SCRIPTS_DIR)/macro_place.tcl IO_PLACE_SCRIPT ?= $(SCRIPTS_DIR)/io_placement.tcl GLOBAL_PLACE_SCRIPT ?= $(SCRIPTS_DIR)/global_place.tcl RESIZE_SCRIPT ?= $(SCRIPTS_DIR)/resize.tcl RUN_ALL_SCRIPT ?= $(SCRIPTS_DIR)/run_all.tcl FINAL_REPORT_SCRIPT ?= $(SCRIPTS_DIR)/final_report.tcl # # Global override Floorplan # export CORE_UTILIZATION := 30 # export CORE_ASPECT_RATIO := 1 # export CORE_MARGIN := 4 default: finish # ============================================================================== # ____ _____ _____ _ _ ____ # / ___|| ____|_ _| | | | _ \ # \___ \| _| | | | | | | |_) | # ___) | |___ | | | |_| | __/ # |____/|_____| |_| \___/|_| # # ============================================================================== # Include design and platform configuration include $(DESIGN_CONFIG) PUBLIC=nangate45 sky130hd sky130hs asap7 ifneq ($(wildcard $(PLATFORM_BASE)/$(PLATFORM)),) export PLATFORM_DIR = $(PLATFORM_BASE)/$(PLATFORM) else ifneq ($(findstring $(PLATFORM),$(PUBLIC)),) export PLATFORM_DIR = ./platforms/$(PLATFORM) else ifneq ($(wildcard ../../$(PLATFORM)),) export PLATFORM_DIR = ../../$(PLATFORM) else $(error [ERROR][FLOW] Platform '$(PLATFORM)' not found) endif $(info [INFO][FLOW] Using platform directory $(PLATFORM_DIR)) include $(PLATFORM_DIR)/config.mk export FLOW_VARIANT ?= base # Setup working directories export DESIGN_NICKNAME ?= $(DESIGN_NAME) export LOG_DIR = ./logs/$(PLATFORM)/$(DESIGN_NICKNAME)/$(FLOW_VARIANT) export OBJECTS_DIR = ./objects/$(PLATFORM)/$(DESIGN_NICKNAME)/$(FLOW_VARIANT) export REPORTS_DIR = ./reports/$(PLATFORM)/$(DESIGN_NICKNAME)/$(FLOW_VARIANT) export RESULTS_DIR = ./results/$(PLATFORM)/$(DESIGN_NICKNAME)/$(FLOW_VARIANT) export UTILS_DIR = ./util export TEST_DIR = ./test # Tool Options SHELL = /bin/bash -o pipefail TIME_CMD = /usr/bin/time -f "%Eelapsed %PCPU %MmemKB" TIME_TEST = $(shell $(TIME_CMD) echo foo 2>/dev/null) ifeq (, $(strip $(TIME_TEST))) TIME_CMD = /usr/bin/time endif ifeq (, $(strip $(NPROC))) # Linux (utility program) NPROC := $(shell nproc 2>/dev/null) ifeq (, $(strip $(NPROC))) # Linux (generic) NPROC := $(shell grep -c ^processor /proc/cpuinfo 2>/dev/null) endif ifeq (, $(strip $(NPROC))) # BSD (at least FreeBSD and Mac OSX) NPROC := $(shell sysctl -n hw.ncpu 2>/dev/null) endif ifeq (, $(strip $(NPROC))) # Fallback NPROC := 1 endif endif export NUM_CORES := $(NPROC) OPENROAD_CMD = openroad -no_init -exit OPENROAD_NO_EXIT_CMD = $(patsubst -exit,,$(OPENROAD_CMD)) WRAPPED_LEFS = $(foreach lef,$(notdir $(WRAP_LEFS)),$(OBJECTS_DIR)/lef/$(lef:.lef=_mod.lef)) WRAPPED_LIBS = $(foreach lib,$(notdir $(WRAP_LIBS)),$(OBJECTS_DIR)/$(lib:.lib=_mod.lib)) export ADDITIONAL_LEFS += $(WRAPPED_LEFS) $(WRAP_LEFS) export LIB_FILES += $(WRAP_LIBS) $(WRAPPED_LIBS) export DONT_USE_LIBS = $(addprefix $(OBJECTS_DIR)/lib/, $(notdir $(LIB_FILES))) export DONT_USE_SC_LIB ?= $(OBJECTS_DIR)/lib/$(notdir $(firstword $(LIB_FILES))) # Stream system used for final result (GDS is default): GDS, GSDII, GDS2, OASIS, or OAS STREAM_SYSTEM ?= GDS ifneq ($(findstring GDS,$(shell echo $(STREAM_SYSTEM) | tr '[:lower:]' '[:upper:]')),) export STREAM_SYSTEM_EXT := gds GDSOAS_FILES = $(GDS_FILES) ADDITIONAL_GDSOAS = $(ADDITIONAL_GDS) SEAL_GDSOAS = $(SEAL_GDS) else export STREAM_SYSTEM_EXT := oas GDSOAS_FILES = $(OAS_FILES) ADDITIONAL_GDSOAS = $(ADDITIONAL_OAS) SEAL_GDSOAS = $(SEAL_OAS) endif export WRAPPED_GDSOAS = $(foreach lef,$(notdir $(WRAP_LEFS)),$(OBJECTS_DIR)/$(lef:.lef=_mod.$(STREAM_SYSTEM_EXT))) # Utility to print tool version information #------------------------------------------------------------------------------- .PHONY: versions.txt versions.txt: @yosys -V > $@ @echo openroad `$(firstword $(OPENROAD_CMD)) -version` >> $@ @klayout -zz -v >> $@ # Pre-process libraries # ============================================================================== # Create temporary Liberty files which have the proper dont_use properties set # For use with Yosys and ABC .SECONDEXPANSION: $(DONT_USE_LIBS): $$(filter %$$(@F),$(LIB_FILES)) @mkdir -p $(OBJECTS_DIR)/lib $(UTILS_DIR)/markDontUse.py -p "$(DONT_USE_CELLS)" -i $^ -o $@ $(OBJECTS_DIR)/lib/merged.lib: $(UTILS_DIR)/mergeLib.pl $(PLATFORM)_merged $(DONT_USE_LIBS) > $@ # Pre-process KLayout tech # ============================================================================== #$(OBJECTS_DIR)/klayout_tech.lef: $(TECH_LEF) # @mkdir -p $(OBJECTS_DIR) # sed '/OR_DEFAULT/d' $< > $@ # $(OBJECTS_DIR)/klayout.lyt: $(KLAYOUT_TECH_FILE) $(OBJECTS_DIR)/klayout_tech.lef # sed 's,.*,$(foreach file, $(OBJECTS_DIR)/klayout_tech.lef $(SC_LEF) $(ADDITIONAL_LEFS),$(abspath $(file))),g' $< > $@ #$(OBJECTS_DIR)/klayout_wrap.lyt: $(KLAYOUT_TECH_FILE) $(OBJECTS_DIR)/klayout_tech.lef # sed 's,.*,$(foreach file, $(OBJECTS_DIR)/klayout_tech.lef $(WRAP_LEFS),$(abspath $(file))),g' $< > $@ # Create Macro wrappers (if necessary) # ============================================================================== #WRAP_CFG = $(PLATFORM_DIR)/wrapper.cfg export TCLLIBPATH := util/cell-veneer $(TCLLIBPATH) $(WRAPPED_LEFS): mkdir -p $(OBJECTS_DIR)/lef $(OBJECTS_DIR)/def util/cell-veneer/wrap.tcl -cfg $(WRAP_CFG) -macro $(filter %$(notdir $(@:_mod.lef=.lef)),$(WRAP_LEFS)) mv $(notdir $@) $@ mv $(notdir $(@:lef=def)) $(dir $@)../def/$(notdir $(@:lef=def)) $(WRAPPED_LIBS): mkdir -p $(OBJECTS_DIR)/lib sed 's/library(\(.*\))/library(\1_mod)/g' $(filter %$(notdir $(@:_mod.lib=.lib)),$(WRAP_LIBS)) | sed 's/cell(\(.*\))/cell(\1_mod)/g' > $@ # ============================================================================== # ______ ___ _ _____ _ _ _____ ____ ___ ____ # / ___\ \ / / \ | |_ _| | | | ____/ ___|_ _/ ___| # \___ \\ V /| \| | | | | |_| | _| \___ \| |\___ \ # ___) || | | |\ | | | | _ | |___ ___) | | ___) | # |____/ |_| |_| \_| |_| |_| |_|_____|____/___|____/ # synth: versions.txt \ $(RESULTS_DIR)/1_synth.v \ $(RESULTS_DIR)/1_synth.sdc # ============================================================================== # Run Synthesis using yosys #------------------------------------------------------------------------------- $(RESULTS_DIR)/1_1_yosys.v: $(DONT_USE_LIBS) $(WRAPPED_LIBS) $(DONT_USE_SC_LIB) $(VERILOG_FILES) mkdir -p $(RESULTS_DIR) $(LOG_DIR) $(REPORTS_DIR) ($(TIME_CMD) yosys -c $(SYNTH_SCRIPT)) 2>&1 | tee $(LOG_DIR)/1_1_yosys.log $(RESULTS_DIR)/1_synth.v: $(RESULTS_DIR)/1_1_yosys.v mkdir -p $(RESULTS_DIR) $(LOG_DIR) $(REPORTS_DIR) cp $< $@ $(RESULTS_DIR)/1_synth.sdc: $(SDC_FILE) mkdir -p $(RESULTS_DIR) $(LOG_DIR) $(REPORTS_DIR) cp $< $@ clean_synth: rm -f $(RESULTS_DIR)/1_*.v $(RESULTS_DIR)/1_synth.sdc rm -f $(REPORTS_DIR)/synth_* rm -f $(LOG_DIR)/1_* rm -rf _tmp_yosys-abc-* # ============================================================================== # _____ _ ___ ___ ____ ____ _ _ _ _ # | ___| | / _ \ / _ \| _ \| _ \| | / \ | \ | | # | |_ | | | | | | | | | |_) | |_) | | / _ \ | \| | # | _| | |__| |_| | |_| | _ <| __/| |___ / ___ \| |\ | # |_| |_____\___/ \___/|_| \_\_| |_____/_/ \_\_| \_| # floorplan: $(RESULTS_DIR)/2_floorplan.def \ $(RESULTS_DIR)/2_floorplan.sdc # ============================================================================== # STEP 1: Translate verilog to def #------------------------------------------------------------------------------- $(RESULTS_DIR)/2_1_floorplan.def: $(RESULTS_DIR)/1_synth.v $(RESULTS_DIR)/1_synth.sdc $(TECH_LEF) $(SC_LEF) $(ADDITIONAL_LEFS) $(FOOTPRINT) $(SIG_MAP_FILE) ($(TIME_CMD) $(OPENROAD_CMD) $(FLOORPLAN_SCRIPT) -metrics $(LOG_DIR)/2_1_floorplan.json) 2>&1 | tee $(LOG_DIR)/2_1_floorplan.log # STEP 2: IO Placement #------------------------------------------------------------------------------- $(RESULTS_DIR)/2_2_floorplan_io.def: $(RESULTS_DIR)/2_1_floorplan.def $(IO_CONSTRAINTS) ($(TIME_CMD) $(OPENROAD_CMD) $(IO_PLACE_RANDOM_SCRIPT) -metrics $(LOG_DIR)/2_2_floorplan_io.json) 2>&1 | tee $(LOG_DIR)/2_2_floorplan_io.log # STEP 3: Timing Driven Mixed Sized Placement #------------------------------------------------------------------------------- $(RESULTS_DIR)/2_3_floorplan_tdms.def: $(RESULTS_DIR)/2_2_floorplan_io.def $(RESULTS_DIR)/1_synth.v $(RESULTS_DIR)/1_synth.sdc $(LIB_FILES) ($(TIME_CMD) $(OPENROAD_CMD) $(TDMS_SCRIPT) -metrics $(LOG_DIR)/2_3_tdms.json) 2>&1 | tee $(LOG_DIR)/2_3_tdms_place.log # STEP 4: Macro Placement #------------------------------------------------------------------------------- $(RESULTS_DIR)/2_4_floorplan_macro.def: $(RESULTS_DIR)/2_3_floorplan_tdms.def $(RESULTS_DIR)/1_synth.v $(RESULTS_DIR)/1_synth.sdc $(MACRO_PLACEMENT) ($(TIME_CMD) $(OPENROAD_CMD) $(MACRO_PLACE_SCRIPT) -metrics $(LOG_DIR)/2_4_mplace.json) 2>&1 | tee $(LOG_DIR)/2_4_mplace.log # STEP 5: Tapcell and Welltie insertion #------------------------------------------------------------------------------- #$(RESULTS_DIR)/2_5_floorplan_tapcell.def: $(RESULTS_DIR)/2_4_floorplan_macro.def $(TAPCELL_TCL) # ($(TIME_CMD) $(OPENROAD_CMD) $(SCRIPTS_DIR)/tapcell.tcl -metrics $(LOG_DIR)/2_5_tapcell.json) 2>&1 | tee $(LOG_DIR)/2_5_tapcell.log # STEP 6: PDN generation #------------------------------------------------------------------------------- #$(RESULTS_DIR)/2_6_floorplan_pdn.def: $(RESULTS_DIR)/2_5_floorplan_tapcell.def $(PDN_CFG) # ($(TIME_CMD) $(OPENROAD_CMD) $(SCRIPTS_DIR)/pdn.tcl -metrics $(LOG_DIR)/2_6_pdn.json) 2>&1 | tee $(LOG_DIR)/2_6_pdn.log #$(RESULTS_DIR)/2_floorplan.def: $(RESULTS_DIR)/2_6_floorplan_pdn.def # cp $< $@ #$(RESULTS_DIR)/2_floorplan.sdc: $(RESULTS_DIR)/2_1_floorplan.def #$(RESULTS_DIR)/2_floorplan.def: $(RESULTS_DIR)/2_3_floorplan_tdms.def # cp $< $@ $(RESULTS_DIR)/2_floorplan.def: $(RESULTS_DIR)/2_4_floorplan_macro.def cp $< $@ $(RESULTS_DIR)/2_floorplan.sdc: $(RESULTS_DIR)/2_1_floorplan.def clean_floorplan: rm -f $(RESULTS_DIR)/2_*floorplan*.def $(RESULTS_DIR)/2_floorplan.sdc $(RESULTS_DIR)/2_floorplan.v rm -f $(REPORTS_DIR)/2_* rm -f $(LOG_DIR)/2_* # ============================================================================== # ____ _ _ ____ _____ # | _ \| | / \ / ___| ____| # | |_) | | / _ \| | | _| # | __/| |___ / ___ \ |___| |___ # |_| |_____/_/ \_\____|_____| # place: $(RESULTS_DIR)/3_place.def \ $(RESULTS_DIR)/3_place.sdc # ============================================================================== #wtf this only runs if there are macros # STEP 1: Global placement + IO placement (not random) #------------------------------------------------------------------------------- $(RESULTS_DIR)/3_1_place_gp.def: $(RESULTS_DIR)/2_floorplan.def $(RESULTS_DIR)/2_floorplan.sdc $(LIB_FILES) ($(TIME_CMD) $(OPENROAD_CMD) $(GLOBAL_PLACE_SCRIPT) -metrics $(LOG_DIR)/3_1_place_gp.json) 2>&1 | tee $(LOG_DIR)/3_1_place_gp.log # STEP 2: IO placement (non-random) #------------------------------------------------------------------------------- $(RESULTS_DIR)/3_2_place_iop.def: $(RESULTS_DIR)/3_1_place_gp.def $(IO_CONSTRAINTS) ($(TIME_CMD) $(OPENROAD_CMD) $(IO_PLACE_SCRIPT) -metrics $(LOG_DIR)/3_2_place_iop.json) 2>&1 | tee $(LOG_DIR)/3_2_place_iop.log # STEP 3: Resizing & Buffering #------------------------------------------------------------------------------- #wtf use above steps #$(RESULTS_DIR)/3_3_place_resized.def: $(RESULTS_DIR)/3_2_place_iop.def $(RESULTS_DIR)/2_floorplan.sdc # ($(TIME_CMD) $(OPENROAD_CMD) $(RESIZE_SCRIPT) -metrics $(LOG_DIR)/3_3_resizer.json) 2>&1 | tee $(LOG_DIR)/3_3_resizer.log #wtf just use fp $(RESULTS_DIR)/3_3_place_resized.def: $(RESULTS_DIR)/2_floorplan.def $(RESULTS_DIR)/2_floorplan.sdc ($(TIME_CMD) $(OPENROAD_CMD) $(RESIZE_SCRIPT) -metrics $(LOG_DIR)/3_3_resizer.json) 2>&1 | tee $(LOG_DIR)/3_3_resizer.log clean_resize: rm -f $(RESULTS_DIR)/3_3_place_resized.def # STEP 4: Detail placement #------------------------------------------------------------------------------- #$(RESULTS_DIR)/3_4_place_dp.def: $(RESULTS_DIR)/3_3_place_resized.def # ($(TIME_CMD) $(OPENROAD_CMD) $(SCRIPTS_DIR)/detail_place.tcl -metrics $(LOG_DIR)/3_4_opendp.json) 2>&1 | tee $(LOG_DIR)/3_4_opendp.log $(RESULTS_DIR)/3_place.def: $(RESULTS_DIR)/3_3_place_resized.def cp $< $@ $(RESULTS_DIR)/3_place.sdc: $(RESULTS_DIR)/2_floorplan.sdc cp $< $@ # Clean Targets #------------------------------------------------------------------------------- clean_place: rm -f $(RESULTS_DIR)/3_*place*.def rm -f $(RESULTS_DIR)/3_place.sdc rm -f $(REPORTS_DIR)/3_* rm -f $(LOG_DIR)/3_* # ============================================================================== # _____ ___ _ _ ___ ____ _ _ ___ _ _ ____ # | ___|_ _| \ | |_ _/ ___|| | | |_ _| \ | |/ ___| # | |_ | || \| || |\___ \| |_| || || \| | | _ # | _| | || |\ || | ___) | _ || || |\ | |_| | # |_| |___|_| \_|___|____/|_| |_|___|_| \_|\____| # 6_FINAL_FILE = $(RESULTS_DIR)/6_final.$(STREAM_SYSTEM_EXT) #finish: $(LOG_DIR)/6_report.log \ # $(RESULTS_DIR)/6_final.v \ # $(6_FINAL_FILE) finish: $(LOG_DIR)/6_report.log \ $(RESULTS_DIR)/2_floorplan.v # ============================================================================== #ifneq ($(USE_FILL),) #$(RESULTS_DIR)/6_1_fill.def: $(RESULTS_DIR)/5_route.def # ($(TIME_CMD) $(OPENROAD_CMD) $(SCRIPTS_DIR)/density_fill.tcl -metrics $(LOG_DIR)/6_density_fill.json) 2>&1 | tee $(LOG_DIR)/6_density_fill.log #else #$(RESULTS_DIR)/6_1_fill.def: $(RESULTS_DIR)/5_route.def # cp $< $@ #endif # #$(RESULTS_DIR)/6_1_fill.sdc: $(RESULTS_DIR)/5_route.sdc # cp $< $@ # #$(LOG_DIR)/6_report.log: $(RESULTS_DIR)/6_1_fill.def $(RESULTS_DIR)/6_1_fill.sdc # ($(TIME_CMD) $(OPENROAD_CMD) $(SCRIPTS_DIR)/final_report.tcl -metrics $(LOG_DIR)/6_report.json) 2>&1 | tee $(LOG_DIR)/6_report.log $(LOG_DIR)/6_report.log: $(RESULTS_DIR)/3_place.def $(RESULTS_DIR)/3_place.sdc ($(TIME_CMD) $(OPENROAD_CMD) $(FINAL_REPORT_SCRIPT) -metrics $(LOG_DIR)/6_report.json) 2>&1 | tee $(LOG_DIR)/6_report.log # #$(RESULTS_DIR)/6_final.def: $(LOG_DIR)/6_report.log # # Merge wrapped macros using Klayout #------------------------------------------------------------------------------- #$(WRAPPED_GDSOAS): $(OBJECTS_DIR)/klayout_wrap.lyt $(WRAPPED_LEFS) # ($(TIME_CMD) klayout -zz -rd design_name=$(basename $(notdir $@)) \ # -rd in_def=$(OBJECTS_DIR)/def/$(notdir $(@:$(STREAM_SYSTEM_EXT)=def)) \ # -rd in_files="$(ADDITIONAL_GDSOAS)" \ # -rd config_file=$(FILL_CONFIG) \ # -rd seal_file="" \ # -rd out_file=$@ \ # -rd tech_file=$(OBJECTS_DIR)/klayout_wrap.lyt \ # -rm $(UTILS_DIR)/def2stream.py) 2>&1 | tee $(LOG_DIR)/6_merge_$(basename $(notdir $@)).log # # Merge GDS using Klayout #------------------------------------------------------------------------------- #6_1_MERGED_FILE = $(RESULTS_DIR)/6_1_merged.$(STREAM_SYSTEM_EXT) #$(6_1_MERGED_FILE): $(RESULTS_DIR)/6_final.def $(OBJECTS_DIR)/klayout.lyt $(GDSOAS_FILES) $(WRAPPED_GDSOAS) # ($(TIME_CMD) stdbuf -o L klayout -zz -rd design_name=$(DESIGN_NAME) \ # -rd in_def=$< \ # -rd in_files="$(GDSOAS_FILES) $(WRAPPED_GDSOAS)" \ # -rd config_file=$(FILL_CONFIG) \ # -rd seal_file="$(SEAL_GDSOAS)" \ # -rd out_file=$@ \ # -rd tech_file=$(OBJECTS_DIR)/klayout.lyt \ # -rm $(UTILS_DIR)/def2stream.py) 2>&1 | tee $(LOG_DIR)/6_1_merge.log # #$(RESULTS_DIR)/6_final.v: $(LOG_DIR)/6_report.log # #$(6_FINAL_FILE): $(6_1_MERGED_FILE) # cp $^ $@ # #drc: $(REPORTS_DIR)/6_drc.lyrdb # #$(REPORTS_DIR)/6_drc.lyrdb: $(6_FINAL_FILE) $(KLAYOUT_DRC_FILE) #ifneq ($(KLAYOUT_DRC_FILE),) # ($(TIME_CMD) klayout -zz -rd in_gds="$<" \ # -rd report_file=$(abspath $@) \ # -r $(KLAYOUT_DRC_FILE)) 2>&1 | tee $(LOG_DIR)/6_drc.log # # Hacky way of getting DRV count (don't error on no matches) # grep -c "" $@ > $(REPORTS_DIR)/6_drc_count.rpt || [[ $$? == 1 ]] #else # echo "DRC not supported on this platform" > $@ #endif # #$(RESULTS_DIR)/6_final.cdl: $(RESULTS_DIR)/6_final.v # ($(TIME_CMD) $(OPENROAD_CMD) $(SCRIPTS_DIR)/cdl.tcl) 2>&1 | tee $(LOG_DIR)/6_cdl.log # #$(OBJECTS_DIR)/6_final_concat.cdl: $(RESULTS_DIR)/6_final.cdl $(CDL_FILE) # cat $^ > $@ # #lvs: $(RESULTS_DIR)/6_lvs.lvsdb # #$(RESULTS_DIR)/6_lvs.lvsdb: $(6_FINAL_FILE) $(KLAYOUT_LVS_FILE) $(OBJECTS_DIR)/6_final_concat.cdl #ifneq ($(KLAYOUT_LVS_FILE),) # ($(TIME_CMD) klayout -b -rd in_gds="$<" \ # -rd cdl_file=$(abspath $(OBJECTS_DIR)/6_final_concat.cdl) \ # -rd report_file=$(abspath $@) \ # -r $(KLAYOUT_LVS_FILE)) 2>&1 | tee $(LOG_DIR)/6_lvs.log #else # echo "LVS not supported on this platform" > $@ #endif clean_finish: rm -rf $(RESULTS_DIR)/6_*.gds $(RESULTS_DIR)/6_*.oas $(RESULTS_DIR)/6_*.def $(RESULTS_DIR)/6_*.v $(RESULTS_DIR)/6_*.sdc rm -rf $(REPORTS_DIR)/6_*.rpt rm -f $(LOG_DIR)/6_* # ============================================================================== # __ __ ___ ____ ____ # | \/ |_ _/ ___| / ___| # | |\/| || |\___ \| | # | | | || | ___) | |___ # |_| |_|___|____/ \____| # # ============================================================================== all: $(SDC_FILE) $(WRAPPED_LIBS) $(DONT_USE_LIBS) $(OBJECTS_DIR)/klayout.lyt $(WRAPPED_GDSOAS) mkdir -p $(RESULTS_DIR) $(LOG_DIR) $(REPORTS_DIR) ($(TIME_CMD) $(OPENROAD_CMD) $(RUN_ALL_SCRIPT) -metrics $(LOG_DIR)/run_all.json) 2>&1 | tee $(LOG_DIR)/run_all.log clean: @echo @echo "Make clean disabled." @echo "Use make clean_all or clean individual steps:" @echo " clean_synth clean_floorplan clean_place clean_cts clean_route clean_finish" @echo clean_all: clean_synth clean_floorplan clean_place clean_cts clean_route clean_finish rm -rf $(OBJECTS_DIR) nuke: clean_test clean_issues rm -rf ./results ./logs ./reports ./objects rm -rf layer_*.mps macrocell.list *best.plt *_pdn.def dummy.guide rm -rf *.rpt *.rpt.old *.def.v pin_dumper.log rm -rf versions.txt # DEF/GDS/OAS viewer shortcuts #------------------------------------------------------------------------------- RESULTS_DEF = $(notdir $(sort $(wildcard $(RESULTS_DIR)/*.def))) RESULTS_GDS = $(notdir $(sort $(wildcard $(RESULTS_DIR)/*.gds))) RESULTS_OAS = $(notdir $(sort $(wildcard $(RESULTS_DIR)/*.oas))) $(foreach file,$(RESULTS_DEF) $(RESULTS_GDS) $(RESULTS_OAS),klayout_$(file)): klayout_%: $(OBJECTS_DIR)/klayout.lyt klayout -nn $(OBJECTS_DIR)/klayout.lyt $(RESULTS_DIR)/$* gui_final: gui_6_final.def $(foreach file,$(RESULTS_DEF),gui_$(file)): gui_%: DEF_FILE=$(RESULTS_DIR)/$* $(OPENROAD_NO_EXIT_CMD) -gui $(SCRIPTS_DIR)/gui.tcl # Utilities #------------------------------------------------------------------------------- include $(UTILS_DIR)/utils.mk export PRIVATE_DIR = ../../private_tool_scripts -include $(PRIVATE_DIR)/util/utils.mk