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
|