@@ -447,46 +447,62 @@ endif
447447
448448UNSET_AND_MAKE = @bash -c 'for var in $(ISSUE_VARIABLES_NAMES ) ; do unset $$var; done; echo $(MAKE ) DESIGN_CONFIG=$(DESIGN_CONFIG ) $$@ ; $(MAKE ) DESIGN_CONFIG=$(DESIGN_CONFIG ) $$@ ' --
449449
450+ # Separate dependency checking and doing a step. This can
451+ # be useful to retest a stage without having to delete the
452+ # target, or when building a wafer thin layer on top of
453+ # ORFS using CMake, Ninja, Bazel, etc. where makefile
454+ # dependecy checking only gets in the way.
455+ #
456+ # Note that there is no "do-synth" step as it is a special
457+ # first step that for usecases such as Bazel where it should
458+ # always be built when invoked. Latter stages in the build process
459+ # are conditionally built by the Bazel implementation.
460+ #
461+ # A "do-synth" step would be welcomed, but it isn't strictly necessary
462+ # for the Bazel use-case.
463+ define do-step
464+ $(if $(5 ) ,$(5 ) ,$(RESULTS_DIR ) ) /$(1 )$(if $(4 ) ,$(4 ) ,.odb) : $(2 )
465+ $$(UNSET_AND_MAKE ) do-$(1 )
466+
467+ .PHONY: do-$(1 )
468+ do-$(1 ) :
469+ ($(TIME_CMD ) $(OPENROAD_CMD ) $(SCRIPTS_DIR ) /$(3 ) .tcl -metrics $(LOG_DIR ) /$(1 ) .json) 2>&1 | tee $(LOG_DIR ) /$(1 ) .log
470+ endef
471+
450472# STEP 1: Translate verilog to odb
451473# -------------------------------------------------------------------------------
452- $(RESULTS_DIR ) /2_1_floorplan.odb : $(RESULTS_DIR ) /1_synth.v $(RESULTS_DIR ) /1_synth.sdc $(TECH_LEF ) $(SC_LEF ) $(ADDITIONAL_LEFS ) $(FOOTPRINT ) $(SIG_MAP_FILE ) $(FOOTPRINT_TCL )
453- ($( TIME_CMD) $( OPENROAD_CMD) $( SCRIPTS_DIR) /floorplan.tcl -metrics $( LOG_DIR) /2_1_floorplan.json) 2>&1 | tee $(LOG_DIR ) /2_1_floorplan.log
454-
474+ $(eval $(call do-step,2_1_floorplan,$(RESULTS_DIR)/1_synth.v $(RESULTS_DIR)/1_synth.sdc $(TECH_LEF) $(SC_LEF) $(ADDITIONAL_LEFS) $(FOOTPRINT) $(SIG_MAP_FILE) $(FOOTPRINT_TCL),floorplan))
455475
456476# STEP 2: IO Placement (random)
457477# -------------------------------------------------------------------------------
458- $(RESULTS_DIR ) /2_2_floorplan_io.odb : $(RESULTS_DIR ) /2_1_floorplan.odb $(IO_CONSTRAINTS )
459478ifndef IS_CHIP
460- ($(TIME_CMD) $(OPENROAD_CMD) $(SCRIPTS_DIR)/io_placement_random.tcl -metrics $(LOG_DIR)/2_2_floorplan_io.json) 2>&1 | tee $(LOG_DIR)/2_2_floorplan_io.log
479+ $(eval $(call do-step,2_2_floorplan_io,$(RESULTS_DIR)/2_1_floorplan.odb $(IO_CONSTRAINTS),io_placement_random))
461480else
481+ $(RESULTS_DIR ) /2_2_floorplan_io.odb : $(RESULTS_DIR ) /2_1_floorplan.odb $(IO_CONSTRAINTS )
462482 cp $< $@
463483endif
464484
465485# STEP 3: Timing Driven Mixed Sized Placement
466486# -------------------------------------------------------------------------------
467- $(RESULTS_DIR ) /2_3_floorplan_tdms.odb : $(RESULTS_DIR ) /2_2_floorplan_io.odb $(RESULTS_DIR ) /1_synth.v $(RESULTS_DIR ) /1_synth.sdc $(LIB_FILES )
468487ifeq ($(MACRO_PLACEMENT ) ,)
469- ($(TIME_CMD) $(OPENROAD_CMD) $(SCRIPTS_DIR)/tdms_place.tcl -metrics $(LOG_DIR)/2_3_tdms.json) 2>&1 | tee $(LOG_DIR)/2_3_tdms_place.log
488+ $(eval $(call do-step,2_3_floorplan_tdms,$(RESULTS_DIR)/2_2_floorplan_io.odb $(RESULTS_DIR)/1_synth.v $(RESULTS_DIR)/1_synth.sdc $(LIB_FILES),tdms_place))
470489else
490+ $(RESULTS_DIR ) /2_3_floorplan_tdms.odb : $(RESULTS_DIR ) /2_2_floorplan_io.odb $(RESULTS_DIR ) /1_synth.v $(RESULTS_DIR ) /1_synth.sdc $(LIB_FILES )
471491 $(info [INFO][FLOW] Using manual macro placement file $(MACRO_PLACEMENT ) )
472492 cp $< $@
473493endif
474494
475495# STEP 4: Macro Placement
476496# -------------------------------------------------------------------------------
477- $(RESULTS_DIR ) /2_4_floorplan_macro.odb : $(RESULTS_DIR ) /2_3_floorplan_tdms.odb $(RESULTS_DIR ) /1_synth.v $(RESULTS_DIR ) /1_synth.sdc $(MACRO_PLACEMENT ) $(MACRO_PLACEMENT_TCL )
478- ($( TIME_CMD) $( OPENROAD_CMD) $( SCRIPTS_DIR) /macro_place.tcl -metrics $( LOG_DIR) /2_4_floorplan_macro.json) 2>&1 | tee $(LOG_DIR ) /2_4_floorplan_macro.log
497+ $(eval $(call do-step,2_4_floorplan_macro,$(RESULTS_DIR)/2_3_floorplan_tdms.odb $(RESULTS_DIR)/1_synth.v $(RESULTS_DIR)/1_synth.sdc $(MACRO_PLACEMENT) $(MACRO_PLACEMENT_TCL),macro_place))
479498
480499# STEP 5: Tapcell and Welltie insertion
481500# -------------------------------------------------------------------------------
482- $(RESULTS_DIR ) /2_5_floorplan_tapcell.odb : $(RESULTS_DIR ) /2_4_floorplan_macro.odb $(TAPCELL_TCL )
483- ($( TIME_CMD) $( OPENROAD_CMD) $( SCRIPTS_DIR) /tapcell.tcl -metrics $( LOG_DIR) /2_5_floorplan_tapcell.json) 2>&1 | tee $(LOG_DIR ) /2_5_floorplan_tapcell.log
484-
501+ $(eval $(call do-step,2_5_floorplan_tapcell,$(RESULTS_DIR)/2_4_floorplan_macro.odb $(TAPCELL_TCL),tapcell))
485502
486503# STEP 6: PDN generation
487504# -------------------------------------------------------------------------------
488- $(RESULTS_DIR ) /2_6_floorplan_pdn.odb : $(RESULTS_DIR ) /2_5_floorplan_tapcell.odb $(PDN_TCL )
489- ($( TIME_CMD) $( OPENROAD_CMD) $( SCRIPTS_DIR) /pdn.tcl -metrics $( LOG_DIR) /2_6_floorplan_pdn.json) 2>&1 | tee $(LOG_DIR ) /2_6_floorplan_pdn.log
505+ $(eval $(call do-step,2_6_floorplan_pdn,$(RESULTS_DIR)/2_5_floorplan_tapcell.odb $(PDN_TCL),pdn))
490506
491507$(RESULTS_DIR ) /2_floorplan.odb : $(RESULTS_DIR ) /2_6_floorplan_pdn.odb
492508 cp $< $@
@@ -513,36 +529,32 @@ place: $(RESULTS_DIR)/3_place.odb \
513529# ==============================================================================
514530# STEP 1: Global placement without placed IOs, timing-driven, and routability-driven.
515531# -------------------------------------------------------------------------------
516- $(RESULTS_DIR ) /3_1_place_gp_skip_io.odb : $(RESULTS_DIR ) /2_floorplan.odb $(RESULTS_DIR ) /2_floorplan.sdc $(LIB_FILES )
517- ($( TIME_CMD) $( OPENROAD_CMD) $( SCRIPTS_DIR) /global_place_skip_io.tcl -metrics $( LOG_DIR) /3_1_place_gp_skip_io.json) 2>&1 | tee $(LOG_DIR ) /3_1_place_gp_skip_io.log
532+ $(eval $(call do-step,3_1_place_gp_skip_io,$(RESULTS_DIR)/2_floorplan.odb $(RESULTS_DIR)/2_floorplan.sdc $(LIB_FILES),global_place_skip_io))
518533
519534# STEP 2: IO placement (non-random)
520535# -------------------------------------------------------------------------------
521- $(RESULTS_DIR ) /3_2_place_iop.odb : $(RESULTS_DIR ) /3_1_place_gp_skip_io.odb $(IO_CONSTRAINTS )
522536ifndef IS_CHIP
523- ($(TIME_CMD) $(OPENROAD_CMD) $(SCRIPTS_DIR)/io_placement.tcl -metrics $(LOG_DIR)/3_2_place_iop.json) 2>&1 | tee $(LOG_DIR)/3_2_place_iop.log
537+ $(eval $(call do-step,3_2_place_iop,$(RESULTS_DIR)/3_1_place_gp_skip_io.odb $(IO_CONSTRAINTS),io_placement))
524538else
539+ $(RESULTS_DIR ) /3_2_place_iop.odb : $(RESULTS_DIR ) /3_1_place_gp_skip_io.odb $(IO_CONSTRAINTS )
525540 cp $< $@
526541endif
527542
528543# STEP 3: Global placement with placed IOs, timing-driven, and routability-driven.
529544# -------------------------------------------------------------------------------
530- $(RESULTS_DIR ) /3_3_place_gp.odb : $(RESULTS_DIR ) /3_2_place_iop.odb $(RESULTS_DIR ) /2_floorplan.sdc $(LIB_FILES )
531- ($( TIME_CMD) $( OPENROAD_CMD) $( SCRIPTS_DIR) /global_place.tcl -metrics $( LOG_DIR) /3_3_place_gp.json) 2>&1 | tee $(LOG_DIR ) /3_3_place_gp.log
545+ $(eval $(call do-step,3_3_place_gp,$(RESULTS_DIR)/3_2_place_iop.odb $(RESULTS_DIR)/2_floorplan.sdc $(LIB_FILES),global_place))
532546
533547# STEP 4: Resizing & Buffering
534548# -------------------------------------------------------------------------------
535- $(RESULTS_DIR ) /3_4_place_resized.odb : $(RESULTS_DIR ) /3_3_place_gp.odb $(RESULTS_DIR ) /2_floorplan.sdc
536- ($( TIME_CMD) $( OPENROAD_CMD) $( SCRIPTS_DIR) /resize.tcl -metrics $( LOG_DIR) /3_4_place_resized.json) 2>&1 | tee $(LOG_DIR ) /3_4_place_resized.log
549+ $(eval $(call do-step,3_4_place_resized,$(RESULTS_DIR)/3_3_place_gp.odb $(RESULTS_DIR)/2_floorplan.sdc,resize))
537550
538551.PHONY : clean_resize
539552clean_resize :
540553 rm -f $(RESULTS_DIR ) /3_4_place_resized.odb
541554
542555# STEP 5: Detail placement
543556# -------------------------------------------------------------------------------
544- $(RESULTS_DIR ) /3_5_place_dp.odb : $(RESULTS_DIR ) /3_4_place_resized.odb
545- ($( TIME_CMD) $( OPENROAD_CMD) $( SCRIPTS_DIR) /detail_place.tcl -metrics $( LOG_DIR) /3_5_place_dp.json) 2>&1 | tee $(LOG_DIR ) /3_5_place_dp.log
557+ $(eval $(call do-step,3_5_place_dp,$(RESULTS_DIR)/3_4_place_resized.odb,detail_place))
546558
547559$(RESULTS_DIR ) /3_place.odb : $(RESULTS_DIR ) /3_5_place_dp.odb
548560 cp $< $@
@@ -575,13 +587,11 @@ cts: $(RESULTS_DIR)/4_cts.odb \
575587
576588# Run TritonCTS
577589# ------------------------------------------------------------------------------
578- $(RESULTS_DIR ) /4_1_cts.odb : $(RESULTS_DIR ) /3_place.odb $(RESULTS_DIR ) /3_place.sdc
579- ($( TIME_CMD) $( OPENROAD_CMD) $( SCRIPTS_DIR) /cts.tcl -metrics $( LOG_DIR) /4_1_cts.json) 2>&1 | tee $(LOG_DIR ) /4_1_cts.log
590+ $(eval $(call do-step,4_1_cts,$(RESULTS_DIR)/3_place.odb $(RESULTS_DIR)/3_place.sdc,cts))
580591
581592# Filler cell insertion
582593# ------------------------------------------------------------------------------
583- $(RESULTS_DIR ) /4_2_cts_fillcell.odb : $(RESULTS_DIR ) /4_1_cts.odb
584- ($( TIME_CMD) $( OPENROAD_CMD) $( SCRIPTS_DIR) /fillcell.tcl -metrics $( LOG_DIR) /4_2_cts_fillcell.json) 2>&1 | tee $(LOG_DIR ) /4_2_cts_fillcell.log
594+ $(eval $(call do-step,4_2_cts_fillcell,$(RESULTS_DIR)/4_1_cts.odb,fillcell))
585595
586596$(RESULTS_DIR ) /4_cts.sdc : $(RESULTS_DIR ) /4_cts.odb
587597
@@ -610,18 +620,15 @@ route: $(RESULTS_DIR)/5_route.odb \
610620
611621# STEP 1: Run global route
612622# -------------------------------------------------------------------------------
613- $(RESULTS_DIR ) /5_1_grt.odb : $(RESULTS_DIR ) /4_cts.odb $(FASTROUTE_TCL ) $(PRE_GLOBAL_ROUTE )
614- ($( TIME_CMD) $( OPENROAD_CMD) $( SCRIPTS_DIR) /global_route.tcl -metrics $( LOG_DIR) /5_1_grt.json) 2>&1 | tee $(LOG_DIR ) /5_1_grt.log
615-
623+ $(eval $(call do-step,5_1_grt,$(RESULTS_DIR)/4_cts.odb $(FASTROUTE_TCL) $(PRE_GLOBAL_ROUTE),global_route))
616624
617625# STEP 2: Run detailed route
618626# -------------------------------------------------------------------------------
619627ifeq ($(USE_WXL ) ,)
620- $(RESULTS_DIR ) /5_2_route.odb : $(RESULTS_DIR ) /5_1_grt.odb
628+ $(eval $(call do-step,5_2_route,$( RESULTS_DIR)/5_1_grt.odb,detail_route))
621629else
622- $(RESULTS_DIR ) /5_2_route.odb : $(RESULTS_DIR ) /4_cts.odb
630+ $(eval $(call do-step,5_2_route,$( RESULTS_DIR)/4_cts.odb,detail_route))
623631endif
624- ($(TIME_CMD) $(OPENROAD_CMD) $(SCRIPTS_DIR)/detail_route.tcl -metrics $(LOG_DIR)/5_2_route.json) 2>&1 | tee $(LOG_DIR)/5_2_route.log
625632
626633$(RESULTS_DIR ) /5_route.odb : $(RESULTS_DIR ) /5_2_route.odb
627634 cp $< $@
@@ -681,8 +688,7 @@ elapsed:
681688# ==============================================================================
682689
683690ifneq ($(USE_FILL ) ,)
684- $(RESULTS_DIR ) /6_1_fill.odb : $(RESULTS_DIR ) /5_route.odb $(FILL_CONFIG )
685- ($( TIME_CMD) $( OPENROAD_CMD) $( SCRIPTS_DIR) /density_fill.tcl -metrics $( LOG_DIR) /6_1_fill.json) 2>&1 | tee $(LOG_DIR ) /6_1_fill.log
691+ $(eval $(call do-step,6_1_fill,$(RESULTS_DIR)/5_route.odb $(FILL_CONFIG),density_fill))
686692else
687693$(RESULTS_DIR ) /6_1_fill.odb : $(RESULTS_DIR ) /5_route.odb
688694 cp $< $@
@@ -694,8 +700,7 @@ $(RESULTS_DIR)/6_1_fill.sdc: $(RESULTS_DIR)/5_route.sdc
694700$(RESULTS_DIR ) /6_final.sdc : $(RESULTS_DIR ) /5_route.sdc
695701 cp $< $@
696702
697- $(LOG_DIR ) /6_report.log : $(RESULTS_DIR ) /6_1_fill.odb $(RESULTS_DIR ) /6_1_fill.sdc
698- ($( TIME_CMD) $( OPENROAD_CMD) $( SCRIPTS_DIR) /final_report.tcl -metrics $( LOG_DIR) /6_report.json) 2>&1 | tee $(LOG_DIR ) /6_report.log
703+ $(eval $(call do-step,6_report,$(RESULTS_DIR)/6_1_fill.odb $(RESULTS_DIR)/6_1_fill.sdc,final_report,.log,$(LOG_DIR)))
699704
700705$(RESULTS_DIR ) /6_final.def : $(LOG_DIR ) /6_report.log
701706
0 commit comments