Anda di halaman 1dari 5

##########################################################################################

# 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

Anda mungkin juga menyukai