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