From cdf98f3571ef892d091b6825c5d473bcfbf6e167 Mon Sep 17 00:00:00 2001 From: Kareem Farid Date: Thu, 18 Jul 2024 14:28:46 +0300 Subject: [PATCH] Propagate the clock in some STA reports (#2134) + Add conditional `set_propagated_clocks` for all clocks in `base.sdc` ~ Condition is true for: ~ CTS STA ~ Global routing STA ~ Global routing optimizations STA ~ Multicorner(signoff) STA + Add conditional `set_propagated_clocks` for all clocks after reading an sdc file depending on whether the statement is used in the sdc file for not. Idea is to be backwards compatible with the default behavior of OpenLane of propagating clocks _outside_ the sdc file + Add a report for non-propagated clocks + Add a report for information regarding clocks --- .github/scripts/variables_documentation.py | 1 + scripts/base.sdc | 5 +++++ scripts/openroad/common/io.tcl | 8 ++++++++ scripts/openroad/sta/multi_corner.tcl | 18 ++++++++++++++++++ scripts/report/report.py | 2 ++ scripts/tcl_commands/cts.tcl | 2 +- scripts/tcl_commands/routing.tcl | 6 +++--- scripts/tcl_commands/sta.tcl | 9 +++++++++ 8 files changed, 47 insertions(+), 4 deletions(-) diff --git a/.github/scripts/variables_documentation.py b/.github/scripts/variables_documentation.py index 06dd934d8..befb03315 100644 --- a/.github/scripts/variables_documentation.py +++ b/.github/scripts/variables_documentation.py @@ -112,6 +112,7 @@ LIB_SYNTH_COMPLETE_NO_PG LIB_SYNTH_MERGED LIB_SYNTH_NO_PG +_PROPAGATE_ALL_CLOCKS """ gpio_variables = """ USE_GPIO_ROUTING_LEF diff --git a/scripts/base.sdc b/scripts/base.sdc index a7e679c0d..203bef8f3 100644 --- a/scripts/base.sdc +++ b/scripts/base.sdc @@ -54,3 +54,8 @@ set_clock_transition $::env(SYNTH_CLOCK_TRANSITION) [get_clocks $::env(CLOCK_POR puts "\[INFO\]: Setting timing derate to: [expr {$::env(SYNTH_TIMING_DERATE) * 100}] %" set_timing_derate -early [expr {1-$::env(SYNTH_TIMING_DERATE)}] set_timing_derate -late [expr {1+$::env(SYNTH_TIMING_DERATE)}] + +if { [info exists ::env(_PROPAGATE_ALL_CLOCKS)] && $::env(_PROPAGATE_ALL_CLOCKS) } { + puts "\[INFO\]: Propagating all clocks" + set_propagated_clock [all_clocks] +} diff --git a/scripts/openroad/common/io.tcl b/scripts/openroad/common/io.tcl index 6481a3e62..d917819bc 100644 --- a/scripts/openroad/common/io.tcl +++ b/scripts/openroad/common/io.tcl @@ -52,6 +52,14 @@ proc read_sdc_wrapper {} { puts stderr $errmsg exit 1 } + if { [info exists ::env(_PROPAGATE_ALL_CLOCKS)] && $::env(_PROPAGATE_ALL_CLOCKS) } { + set matches [exec bash -c "{ grep set_propagated_clock $sdc_in | grep -v '#.*set_propagated_clock'; } || true"] + if { $matches == "" } { + puts "\[INFO\]: No (un)set_propagated_clock found in $sdc_in" + puts "\[INFO\]: Propagating all clocks" + set_propagated_clock [all_clocks] + } + } } diff --git a/scripts/openroad/sta/multi_corner.tcl b/scripts/openroad/sta/multi_corner.tcl index 703188a40..d1249297b 100644 --- a/scripts/openroad/sta/multi_corner.tcl +++ b/scripts/openroad/sta/multi_corner.tcl @@ -194,4 +194,22 @@ if { [file tail [info nameofexecutable]] == "openroad" } { puts "area_report_end" } +puts "check_nonpropagated_clocks" + +foreach clock [all_clocks] { + if { ![get_property $clock propagated] } { + puts "[get_property $clock full_name]" + } +} + +puts "check_nonpropagated_clocks_end" + +foreach clock [all_clocks] { + report_clock_properties $clock + report_clock_latency -clock $clock + report_clock_min_period -clocks [get_property $clock name] +} + +puts "report_clock_end" + write -no_global_connect diff --git a/scripts/report/report.py b/scripts/report/report.py index d9ce9b7ad..dbd17c951 100755 --- a/scripts/report/report.py +++ b/scripts/report/report.py @@ -241,6 +241,8 @@ def reports_from_logs(self): ("_sta.skew.rpt", "skew_report"), ("_sta.summary.rpt", "summary_report"), ("_sta.power.rpt", "power_report"), + ("_sta.nonpropagated.rpt", "check_nonpropagated_clocks"), + ("_sta.clock.rpt", "report_clock"), ] for name, log in [ diff --git a/scripts/tcl_commands/cts.tcl b/scripts/tcl_commands/cts.tcl index bc7c498a1..a61126227 100755 --- a/scripts/tcl_commands/cts.tcl +++ b/scripts/tcl_commands/cts.tcl @@ -48,7 +48,7 @@ proc run_cts {args} { scrot_klayout -layout $::env(CURRENT_DEF) -log $::env(cts_logs)/screenshot.log if { [info exists ::env(CTS_REPORT_TIMING)] && $::env(CTS_REPORT_TIMING) } { - run_sta -estimate_placement -no_save $::env(cts_results) -log $::env(cts_logs)/cts_sta.log + run_sta -propagate_all_clocks -estimate_placement -no_save $::env(cts_results) -log $::env(cts_logs)/cts_sta.log } } } diff --git a/scripts/tcl_commands/routing.tcl b/scripts/tcl_commands/routing.tcl index 4e38a5712..04219428a 100755 --- a/scripts/tcl_commands/routing.tcl +++ b/scripts/tcl_commands/routing.tcl @@ -90,7 +90,7 @@ proc global_routing_fastroute {args} { -indexed_log [index_file $::env(routing_logs)/global_write_netlist.log] TIMER::timer_stop - run_sta -no_save -log $::env(routing_logs)/grt_sta.log + run_sta -propagate_all_clocks -no_save -log $::env(routing_logs)/grt_sta.log exec echo "[TIMER::get_runtime]" | python3 $::env(SCRIPTS_DIR)/write_runtime.py "global routing - openroad" } @@ -439,7 +439,7 @@ proc run_resizer_design_routing {args} { TIMER::timer_stop exec echo "[TIMER::get_runtime]" | python3 $::env(SCRIPTS_DIR)/write_runtime.py "resizer design optimizations - openroad" - run_sta -estimate_global -no_save -log $::env(routing_logs)/rsz_design_sta.log + run_sta -propagate_all_clocks -estimate_global -no_save -log $::env(routing_logs)/rsz_design_sta.log } else { puts_info "Skipping Global Routing Resizer Design Optimizations." } @@ -459,7 +459,7 @@ proc run_resizer_timing_routing {args} { TIMER::timer_stop exec echo "[TIMER::get_runtime]" | python3 $::env(SCRIPTS_DIR)/write_runtime.py "resizer timing optimizations - openroad" - run_sta -estimate_global -no_save -log $::env(routing_logs)/rsz_timing_sta.log + run_sta -propagate_all_clocks -estimate_global -no_save -log $::env(routing_logs)/rsz_timing_sta.log } else { puts_info "Skipping Global Routing Resizer Timing Optimizations." } diff --git a/scripts/tcl_commands/sta.tcl b/scripts/tcl_commands/sta.tcl index 029225ee3..c5d60f166 100644 --- a/scripts/tcl_commands/sta.tcl +++ b/scripts/tcl_commands/sta.tcl @@ -27,6 +27,7 @@ proc run_sta {args} { -netlist_in -blackbox_check -no_save + -propagate_all_clocks } parse_key_args "run_sta" args arg_values $options flags_map $flags @@ -43,6 +44,12 @@ proc run_sta {args} { set corner_prefix "Multi-Corner" } + if { [info exists flags_map(-propagate_all_clocks)] } { + set ::env(_PROPAGATE_ALL_CLOCKS) 1 + } else { + set ::env(_PROPAGATE_ALL_CLOCKS) 0 + } + set ::env(PROCESS_CORNER) nom set process_corner_postfix "" if { [info exists arg_values(-process_corner)]} { @@ -121,6 +128,7 @@ proc run_sta {args} { blackbox_modules_check $log } unset ::env(STA_MULTICORNER) + set ::env(_PROPAGATE_ALL_CLOCKS) 0 unset -nocomplain ::env(ESTIMATE_PARASITICS) TIMER::timer_stop exec echo "[TIMER::get_runtime]" | python3 $::env(SCRIPTS_DIR)/write_runtime.py "sta - openroad" @@ -171,6 +179,7 @@ proc run_parasitics_sta {args} { lappend sta_flags -log $log_name lappend sta_flags -process_corner $process_corner lappend sta_flags -multi_corner + lappend sta_flags -propagate_all_clocks lappend sta_flags -save_to $directory lappend sta_flags -tool sta