diff --git a/.Changelog-dev.md b/.Changelog-dev.md new file mode 100644 index 00000000..244dee2e --- /dev/null +++ b/.Changelog-dev.md @@ -0,0 +1,7 @@ +# Dev + +## Steps + +* `OpenROAD.CTS` + * Added flags `CTS_OBSTRUCTION_AWARE` and `CTS_BALANCE_LEVELS` + * Added `CTS_SINK_BUFFER_MAX_CAP_DERATE_PCT` diff --git a/openlane/scripts/openroad/cts.tcl b/openlane/scripts/openroad/cts.tcl index 60faa344..38226c23 100755 --- a/openlane/scripts/openroad/cts.tcl +++ b/openlane/scripts/openroad/cts.tcl @@ -50,11 +50,20 @@ lappend arg_list -sink_clustering_enable if { $::env(CTS_DISTANCE_BETWEEN_BUFFERS) != 0 } { lappend arg_list -distance_between_buffers $::env(CTS_DISTANCE_BETWEEN_BUFFERS) } - if { $::env(CTS_DISABLE_POST_PROCESSING) } { lappend arg_list -post_cts_disable } +if { [info exists ::env(CTS_OBSTRUCTION_AWARE)] && $::env(CTS_OBSTRUCTION_AWARE) } { + lappend arg_list -obstruction_aware +} +if { [info exists ::env(CTS_SINK_BUFFER_MAX_CAP_DERATE_PCT)] } { + lappend arg_list -sink_buffer_max_cap_derate [expr $::env(CTS_SINK_BUFFER_MAX_CAP_DERATE_PCT) / 100.0] +} +if { [info exists ::env(CTS_BALANCE_LEVELS)] && $::env(CTS_BALANCE_LEVELS) } { + lappend arg_list -balance_levels +} +puts "clock_tree_synthesis {*}$arg_list" clock_tree_synthesis {*}$arg_list set_propagated_clock [all_clocks] diff --git a/openlane/steps/openroad.py b/openlane/steps/openroad.py index 11cd6efe..b2fc7fea 100644 --- a/openlane/steps/openroad.py +++ b/openlane/steps/openroad.py @@ -2012,6 +2012,25 @@ class CTS(ResizerStep): OpenROADStep.config_vars + dpl_variables + [ + # sink_buffer_max_cap_derate + Variable( + "CTS_BALANCE_LEVELS", + Optional[bool], + "Attempts to keep a similar number of levels in the clock tree across non-register cells (e.g., clock-gate or inverter).", + ), + Variable( + "CTS_SINK_BUFFER_MAX_CAP_DERATE_PCT", + Optional[Decimal], + "Controls automatic buffer selection. To favor strong(weak) drive strength buffers use a small(large) value." + + "The value of 100 means no derating of max cap limit", + units="%", + ), + Variable( + "CTS_OBSTRUCTION_AWARE", + Optional[bool], + "Enables obstruction-aware buffering such that clock buffers are not placed on top of blockages or hard macros. " + + "This option may reduce legalizer displacement, leading to better latency, skew or timing QoR.", + ), Variable( "CTS_SINK_CLUSTERING_SIZE", int,