Skip to content

Commit 2734e98

Browse files
authored
Merge pull request #1175 from Pinata-Consulting/makefile-issue-variables-names
Demonstrate separation of concerns: execution of a flow stage and dependency checking
2 parents d4324e4 + 7dd7406 commit 2734e98

File tree

1 file changed

+43
-38
lines changed

1 file changed

+43
-38
lines changed

flow/Makefile

Lines changed: 43 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -447,46 +447,62 @@ endif
447447

448448
UNSET_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)
459478
ifndef 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))
461480
else
481+
$(RESULTS_DIR)/2_2_floorplan_io.odb: $(RESULTS_DIR)/2_1_floorplan.odb $(IO_CONSTRAINTS)
462482
cp $< $@
463483
endif
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)
468487
ifeq ($(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))
470489
else
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 $< $@
473493
endif
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)
522536
ifndef 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))
524538
else
539+
$(RESULTS_DIR)/3_2_place_iop.odb: $(RESULTS_DIR)/3_1_place_gp_skip_io.odb $(IO_CONSTRAINTS)
525540
cp $< $@
526541
endif
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
539552
clean_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
#-------------------------------------------------------------------------------
619627
ifeq ($(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))
621629
else
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))
623631
endif
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

683690
ifneq ($(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))
686692
else
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

Comments
 (0)