@@ -376,8 +376,12 @@ $(OBJECTS_DIR)/lib/merged.lib:
376376# Pre-process KLayout tech
377377# ==============================================================================
378378$(OBJECTS_DIR ) /klayout_tech.lef : $(TECH_LEF )
379+ $(UNSET_AND_MAKE ) do-klayout_tech
380+
381+ .PHONY : do-klayout_tech
382+ do-klayout_tech :
379383 @mkdir -p $(OBJECTS_DIR )
380- cp $< $@
384+ cp $( TECH_LEF ) $( OBJECTS_DIR ) /klayout_tech.lef
381385
382386KLAYOUT_ENV_VAR_IN_PATH_VERSION = 0.28.11
383387KLAYOUT_VERSION = $(shell $(KLAYOUT_CMD ) -v 2>/dev/null | grep 'KLayout' | cut -d ' ' -f2)
@@ -392,21 +396,29 @@ KLAYOUT_ENV_VAR_IN_PATH = $(shell \
392396 fi)
393397
394398$(OBJECTS_DIR ) /klayout.lyt : $(KLAYOUT_TECH_FILE ) $(OBJECTS_DIR ) /klayout_tech.lef
399+ $(UNSET_AND_MAKE ) do-klayout
400+
401+ .PHONY : do-klayout
402+ do-klayout :
395403ifeq ($(KLAYOUT_ENV_VAR_IN_PATH ) ,valid)
396404 SC_LEF_RELATIVE_PATH="$$\(env('FLOW_HOME')\)/$(shell realpath --relative-to=$(FLOW_HOME) $(SC_LEF))"; \
397405 OTHER_LEFS_RELATIVE_PATHS=$$(echo "$(foreach file, $(OBJECTS_DIR)/klayout_tech.lef $(ADDITIONAL_LEFS),<lef-files>$$(realpath --relative-to=$(RESULTS_DIR) $(file))</lef-files>)"); \
398- sed 's,<lef-files>.*</lef-files>,<lef-files>'"$$SC_LEF_RELATIVE_PATH"'</lef-files>'"$$OTHER_LEFS_RELATIVE_PATHS"',g' $< > $@
406+ sed 's,<lef-files>.*</lef-files>,<lef-files>'"$$SC_LEF_RELATIVE_PATH"'</lef-files>'"$$OTHER_LEFS_RELATIVE_PATHS"',g' $(KLAYOUT_TECH_FILE) > $(OBJECTS_DIR)/klayout.lyt
399407else
400- sed 's,<lef-files>.*</lef-files>,$(foreach file, $(OBJECTS_DIR)/klayout_tech.lef $(SC_LEF) $(ADDITIONAL_LEFS),<lef-files>$(shell realpath --relative-to=$(RESULTS_DIR) $(file))</lef-files>),g' $< > $@
408+ sed 's,<lef-files>.*</lef-files>,$(foreach file, $(OBJECTS_DIR)/klayout_tech.lef $(SC_LEF) $(ADDITIONAL_LEFS),<lef-files>$(shell realpath --relative-to=$(RESULTS_DIR) $(file))</lef-files>),g' $(KLAYOUT_TECH_FILE) > $(OBJECTS_DIR)/klayout.lyt
401409endif
402410
403411$(OBJECTS_DIR ) /klayout_wrap.lyt : $(KLAYOUT_TECH_FILE ) $(OBJECTS_DIR ) /klayout_tech.lef
404- sed ' s,<lef-files>.*</lef-files>,$(foreach file, $(OBJECTS_DIR)/klayout_tech.lef $(WRAP_LEFS),<lef-files>$(shell realpath --relative-to=$(OBJECTS_DIR)/def $(file))</lef-files>),g' $< > $@
412+ $(UNSET_AND_MAKE ) do-klayout_wrap
413+
414+ .PHONY : do-klayout_wrap
415+ do-klayout_wrap :
416+ sed ' s,<lef-files>.*</lef-files>,$(foreach file, $(OBJECTS_DIR)/klayout_tech.lef $(WRAP_LEFS),<lef-files>$(shell realpath --relative-to=$(OBJECTS_DIR)/def $(file))</lef-files>),g' $(KLAYOUT_TECH_FILE ) > $(OBJECTS_DIR ) /klayout_wrap.lyt
417+
405418# Create Macro wrappers (if necessary)
406419# ==============================================================================
407420WRAP_CFG = $(PLATFORM_DIR ) /wrapper.cfg
408421
409-
410422export TCLLIBPATH := util/cell-veneer $(TCLLIBPATH )
411423$(WRAPPED_LEFS ) :
412424 mkdir -p $(OBJECTS_DIR ) /lef $(OBJECTS_DIR ) /def
@@ -785,10 +797,9 @@ $(eval $(call do-step,6_report,$(RESULTS_DIR)/6_1_fill.odb $(RESULTS_DIR)/6_1_fi
785797
786798$(RESULTS_DIR ) /6_final.def : $(LOG_DIR ) /6_report.log
787799
788- # NOTE! No GDS file for now
789800.PHONY : do-finish
790801do-finish :
791- $(UNSET_AND_MAKE ) do-6_1_fill do-6_1_fill.sdc do-6_final.sdc do-6_report elapsed
802+ $(UNSET_AND_MAKE ) do-6_1_fill do-6_1_fill.sdc do-6_final.sdc do-6_report do-gds elapsed
792803
793804.PHONY : skip_place
794805skip_place : $(RESULTS_DIR ) /2_floorplan.odb $(RESULTS_DIR ) /2_floorplan.sdc
@@ -845,34 +856,51 @@ clean_abstract:
845856# Merge wrapped macros using Klayout
846857# -------------------------------------------------------------------------------
847858$(WRAPPED_GDSOAS ) : $(OBJECTS_DIR ) /klayout_wrap.lyt $(WRAPPED_LEFS )
859+ $(UNSET_AND_MAKE ) do-wrapped-gdsoas
860+
861+ .PHONY : do-wrapped-gdsoas
862+ do-wrapped-gdsoas :
863+ ifeq ($(WRAPPED_GDSOAS ) ,)
864+ @echo "Skipping wrapped GDSOA generation"
865+ else
848866 $(call KLAYOUT_FOUND)
849- ($( TIME_CMD) $( KLAYOUT_CMD) -zz -rd design_name=$( basename $( notdir $@ ) ) \
850- -rd in_def=$(OBJECTS_DIR ) /def/$(notdir $(@ :$(STREAM_SYSTEM_EXT ) =def ) ) \
867+ ($(TIME_CMD) $(KLAYOUT_CMD) -zz -rd design_name=$(basename $(notdir $(WRAPPED_GDSOAS) )) \
868+ -rd in_def=$(OBJECTS_DIR)/def/$(notdir $(WRAPPED_GDSOAS :$(STREAM_SYSTEM_EXT)=def)) \
851869 -rd in_files="$(ADDITIONAL_GDSOAS)" \
852870 -rd config_file=$(FILL_CONFIG) \
853871 -rd seal_file="" \
854- -rd out_file=$@ \
872+ -rd out_file=$(WRAPPED_GDSOAS) \
855873 -rd tech_file=$(OBJECTS_DIR)/klayout_wrap.lyt \
856874 -rd layer_map=$(GDS_LAYER_MAP) \
857- -r $(UTILS_DIR ) /def2stream.py) 2>&1 | tee $(LOG_DIR ) /6_merge_$(basename $(notdir $@ ) ) .log
875+ -r $(UTILS_DIR)/def2stream.py) 2>&1 | tee $(LOG_DIR)/6_merge_$(basename $(notdir $(WRAPPED_GDSOAS))).log
876+ endif
858877
859878# Merge GDS using Klayout
860879# -------------------------------------------------------------------------------
861880GDS_MERGED_FILE = $(RESULTS_DIR ) /6_1_merged.$(STREAM_SYSTEM_EXT )
862881$(GDS_MERGED_FILE ) : $(RESULTS_DIR ) /6_final.def $(OBJECTS_DIR ) /klayout.lyt $(GDSOAS_FILES ) $(WRAPPED_GDSOAS ) $(SEAL_GDSOAS )
882+ $(UNSET_AND_MAKE ) do-gds-merged
883+
884+ .PHONY : do-gds-merged
885+ do-gds-merged :
863886 $(call KLAYOUT_FOUND)
864887 ($( TIME_CMD) $( STDBUF_CMD) $( KLAYOUT_CMD) -zz -rd design_name=$( DESIGN_NAME) \
865- -rd in_def=$< \
888+ -rd in_def=$( RESULTS_DIR ) /6_final.def \
866889 -rd in_files=" $( GDSOAS_FILES) $( WRAPPED_GDSOAS) " \
867890 -rd config_file=$(FILL_CONFIG ) \
868891 -rd seal_file=" $( SEAL_GDSOAS) " \
869- -rd out_file=$@ \
892+ -rd out_file=$( GDS_MERGED_FILE ) \
870893 -rd tech_file=$(OBJECTS_DIR ) /klayout.lyt \
871894 -rd layer_map=$(GDS_LAYER_MAP ) \
872895 -r $(UTILS_DIR ) /def2stream.py) 2>&1 | tee $(LOG_DIR ) /6_1_merge.log
873896
874897$(RESULTS_DIR ) /6_final.v : $(LOG_DIR ) /6_report.log
875898
899+ .PHONY : do-gds
900+ do-gds :
901+ $(UNSET_AND_MAKE ) do-klayout_tech do-klayout do-klayout_wrap do-wrapped-gdsoas do-gds-merged
902+ cp $(GDS_MERGED_FILE ) $(GDS_FINAL_FILE )
903+
876904$(GDS_FINAL_FILE ) : $(GDS_MERGED_FILE )
877905 cp $< $@
878906
0 commit comments