##########################################################################################
# Tool: IC Compiler II
# Script: clock_opt_opto.tcl
# Version: O-2018.06-SP2 (October 8, 2018)
# Copyright (C) 2014-2018 Synopsys, Inc. All rights reserved.
##########################################################################################
set CURRENT_STEP clock_opt_opto
pd_start_icc2 -stage clock_opt_opto -open_from_stage clock_opt_cts -change_abstracts
if {[file exists ../config/user_config.tcl]} {exec cp -prfL --no-preserve=ownership ../config/user_config.tcl
$REPORTS_DIR/user_config.tcl}
if {[file exists ../config/flow_config.tcl]} {exec cp -prfL --no-preserve=ownership ../config/flow_config.tcl
$REPORTS_DIR/flow_config.tcl}
set REPORT_PREFIX $CLOCK_OPT_CTS_BLOCK_NAME
if {$CLOCK_OPT_OPTO_USER_INSTANCE_NAME_PREFIX != ""} {
set_app_options -name opt.common.user_instance_name_prefix -value
$CLOCK_OPT_OPTO_USER_INSTANCE_NAME_PREFIX
if {[get_app_option_value -name clock_opt.flow.enable_ccd]} {
# If CCD is enabled, set both opt and cts user prefix as CCD can work on both clock and data paths
set_app_options -name cts.common.user_instance_name_prefix -value $
{CLOCK_OPT_OPTO_USER_INSTANCE_NAME_PREFIX}_cts
####################################
## Pre-opto customizations
####################################
if {$pd_config(run,icc2,clock_aware_scan_in_clock_opto) ne ""} {
set_app_option -name opt.dft.clock_aware_scan -value $pd_config(run,icc2,clock_aware_scan_in_clock_opto)
synthesize_clock_trees -propagate_only ;# only works on active scenarios
compute_clock_latency -verbose
if {[file exists [which $TCL_USER_CLOCK_OPT_OPTO_PRE_SCRIPT]]} {
puts "RM-info: Sourcing [which $TCL_USER_CLOCK_OPT_OPTO_PRE_SCRIPT]"
source $TCL_USER_CLOCK_OPT_OPTO_PRE_SCRIPT
} elseif {$TCL_USER_CLOCK_OPT_OPTO_PRE_SCRIPT != ""} {
puts "RM-error: TCL_USER_CLOCK_OPT_OPTO_PRE_SCRIPT($TCL_USER_CLOCK_OPT_OPTO_PRE_SCRIPT) is
invalid. Please correct it."
if {$pd_config(run,icc2,disable_hold_fix) || ([info exists pd_config(run,icc2,disable_hold_fix,clock_opt_opto)] &&
$pd_config(run,icc2,disable_hold_fix,clock_opt_opto))} {
puts "PD-info: disabling all hold scenarios"
set current_active_hold_scenarios [get_object_name [get_scenarios -filter hold&&active]]
if {$current_active_hold_scenarios ne "" } {
set_scenario_status -active false $current_active_hold_scenarios
report_scenarios
if {$pd_config(run,icc2,clock_wide_wire_effort_level) ne ""} {
set pd_config(run,icc2,clock_wide_wire_effort_level,orig) [get_app_option_value -name
route.detail.use_wide_wire_effort_level]
set_app_options -name route.detail.use_wide_wire_effort_level -value
$pd_config(run,icc2,clock_wide_wire_effort_level)
}
####################################
## report_app_options & report_lib_cell_purpose
####################################
#pd_set_dont_use_on_variant_groups
if {[file exists ${REPORTS_DIR}/${REPORT_PREFIX}.report_app_options.start]} {
pd_rm -f ${REPORTS_DIR}/$${REPORT_PREFIX}.report_app_options.start
if {[file exists ${REPORTS_DIR}/${REPORT_PREFIX}.report_lib_cell_purpose]} {
pd_rm -f ${REPORTS_DIR}/$${REPORT_PREFIX}.report_lib_cell_purpose
redirect -tee -file ${REPORTS_DIR}/${REPORT_PREFIX}.report_app_options.start {report_app_options -non_default *}
redirect -file ${REPORTS_DIR}/${REPORT_PREFIX}.report_lib_cell_purpose {report_lib_cell -objects [get_lib_cells]
-column {full_name:20 valid_purposes}}
pd_trace_cmd_end "${CURRENT_STEP}_setup"
####################################
## Post-CTS optimization
####################################
## The following only applies to designs with physical hierarchy
## Ignore the sub-blocks (bound to abstracts) internal timing paths
if {$pd_config(hier,abstraction,design_list) ne ""} {
set_timing_paths_disabled_blocks -all_sub_blocks
if {[file exists [which $TCL_USER_CLOCK_OPT_OPTO_SCRIPT]]} {
puts "RM-info: Sourcing [which $TCL_USER_CLOCK_OPT_OPTO_SCRIPT]"
source $TCL_USER_CLOCK_OPT_OPTO_SCRIPT
} elseif {$TCL_USER_CLOCK_OPT_OPTO_SCRIPT != ""} {
puts "RM-error: TCL_USER_CLOCK_OPT_OPTO_SCRIPT($TCL_USER_CLOCK_OPT_OPTO_SCRIPT) is invalid. Please
correct it."
} else {
puts "RM-info: Running clock_opt -from final_opto -to final_opto command"
clock_opt -from final_opto -to final_opto
####################################
## Post-route clock tree optimization for non-CCD flow
####################################
if {$CLOCK_OPT_OPTO_CTO && ![get_app_option_value -name clock_opt.flow.enable_ccd]} {
if {$CLOCK_OPT_OPTO_CTO_USER_INSTANCE_NAME_PREFIX != ""} {
set_app_options -name cts.common.user_instance_name_prefix -value $
{CLOCK_OPT_OPTO_CTO_USER_INSTANCE_NAME_PREFIX}
save_block -as ${CLOCK_OPT_OPTO_BLOCK_NAME}_pre_cto
synthesize_clock_trees -postroute -routed_clock_stage detail
if {$pd_config(run,icc2,clock_wide_wire_effort_level) ne ""} {
set_app_options -name route.detail.use_wide_wire_effort_level -value
$pd_config(run,icc2,clock_wide_wire_effort_level,orig)
if {$pd_config(run,icc2,disable_hold_fix) || ([info exists pd_config(run,icc2,disable_hold_fix,clock_opt_opto)] &&
$pd_config(run,icc2,disable_hold_fix,clock_opt_opto))} {
puts "PD-info: re-activating hold scenarios"
if {$current_active_hold_scenarios ne "" } {
set_scenario_status -active true $current_active_hold_scenarios
report_scenarios
####################################
## Post-opto customizations
####################################
if {[file exists [which $TCL_USER_CLOCK_OPT_OPTO_POST_SCRIPT]]} {
puts "RM-info: Sourcing [which $TCL_USER_CLOCK_OPT_OPTO_POST_SCRIPT]"
source $TCL_USER_CLOCK_OPT_OPTO_POST_SCRIPT
} elseif {$TCL_USER_CLOCK_OPT_OPTO_POST_SCRIPT != ""} {
puts "RM-error: TCL_USER_CLOCK_OPT_OPTO_POST_SCRIPT($TCL_USER_CLOCK_OPT_OPTO_POST_SCRIPT) is
invalid. Please correct it."
####################################
pd_end_icc2 -stage $CURRENT_STEP -congestion_snapshot TRUE
####################################
exit