You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			468 lines
		
	
	
		
			19 KiB
		
	
	
	
		
			Plaintext
		
	
			
		
		
	
	
			468 lines
		
	
	
		
			19 KiB
		
	
	
	
		
			Plaintext
		
	
| # 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,<lef-files>.*</lef-files>,$(foreach file, $(OBJECTS_DIR)/klayout_tech.lef $(SC_LEF) $(ADDITIONAL_LEFS),<lef-files>$(abspath $(file))</lef-files>),g' $< > $@
 | |
| 
 | |
| #$(OBJECTS_DIR)/klayout_wrap.lyt: $(KLAYOUT_TECH_FILE) $(OBJECTS_DIR)/klayout_tech.lef
 | |
| #	sed 's,<lef-files>.*</lef-files>,$(foreach file, $(OBJECTS_DIR)/klayout_tech.lef $(WRAP_LEFS),<lef-files>$(abspath $(file))</lef-files>),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 "<value>" $@ > $(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
 |