blob: 0992050d75746efb12dd3b0b22adad46599f8b72 [file] [log] [blame]
###############################################################################
# CADENCE COPYRIGHT NOTICE
# © 2008-2013 Cadence Design Systems, Inc. All rights reserved.
#------------------------------------------------------------------------------
#
# This Foundation Flow is provided as an example of how to perform specialized
# tasks.
#
# This work may not be copied, re-published, uploaded, or distributed in any way,
# in any medium, whether in whole or in part, without prior written permission
# from Cadence. Notwithstanding any restrictions herein, subject to compliance
# with the terms and conditions of the Cadence software license agreement under
# which this material was provided, this material may be copied and internally
# distributed solely for internal purposes for use with Cadence tools.
#
# This work is Cadence intellectual property and may under no circumstances be
# given to third parties, neither in original nor in modified versions, without
# explicit written permission from Cadence. The information contained herein is
# the proprietary and confidential information of Cadence or its licensors, and
# is supplied subject to, and may be used only by Cadence's current customers
# in accordance with, a previously executed license agreement between Cadence
# and its customer.
#
#------------------------------------------------------------------------------
# THIS MATERIAL IS PROVIDED BY CADENCE "AS IS" AND ANY EXPRESS OR IMPLIED
# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
# IN NO EVENT SHALL CADENCE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL
# OR CONSEQUENTIAL DAMAGES HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS MATERIAL, EVEN IF
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
###############################################################################
proc conv2mmmc {} {
global rda_Input
if {![info exists slow_libs]} {
set slow_libs [list]
}
if {![info exists fast_libs]} {
set fast_libs [list]
}
if {$rda_Input(ui_timelib,max) != ""} {
foreach lib $rda_Input(ui_timelib,max) {
foreach glob_lib [glob $lib] {
if {[file isdirectory $glob_lib]} {
foreach nested_glob_lib [glob $glob_lib/\*] {
lappend slow_libs $nested_glob_lib
}
} else {
lappend slow_libs $glob_lib
}
}
}
foreach lib $rda_Input(ui_timelib) {
foreach glob_lib [glob $lib] {
if {[file isdirectory $glob_lib]} {
foreach nested_glob_lib [glob $glob_lib/\*] {
lappend slow_libs $nested_glob_lib
}
} else {
lappend slow_libs $glob_lib
}
}
}
# set slow_libs [concat $rda_Input(ui_timelib,max) $rda_Input(ui_timelib)]
} else {
foreach lib $rda_Input(ui_timelib) {
foreach glob_lib [glob $lib] {
if {[file isdirectory $glob_lib]} {
foreach nested_glob_lib [glob $glob_lib/\*] {
lappend slow_libs $nested_glob_lib
}
} else {
lappend slow_libs $glob_lib
}
}
}
# set slow_libs $rda_Input(ui_timelib)
}
if {$rda_Input(ui_timelib,min) != ""} {
foreach lib $rda_Input(ui_timelib,min) {
foreach glob_lib [glob $lib] {
if {[file isdirectory $glob_lib]} {
foreach nested_glob_lib [glob $glob_lib/\*] {
lappend fast_libs $nested_glob_lib
}
} else {
lappend fast_libs $glob_lib
}
}
}
foreach lib $rda_Input(ui_timelib) {
foreach glob_lib [glob $lib] {
if {[file isdirectory $glob_lib]} {
foreach nested_glob_lib [glob $glob_lib/\*] {
lappend fast_libs $nested_glob_lib
}
} else {
lappend fast_libs $glob_lib
}
}
}
# set fast_libs [concat $rda_Input(ui_timelib,min) $rda_Input(ui_timelib)]
} else {
set fast_libs $slow_libs
}
#puts "--------------------------------------------------------------------------------------"
#puts "PQRS: $slow_libs"
#puts "PQRS: $fast_libs"
#puts "--------------------------------------------------------------------------------------"
set sdc_files [list]
foreach file $rda_Input(ui_timingcon_file) {
lappend sdc_files $file
}
set ilm_sdc_files [list]
if {[info exists rda_Input(ui_timingcon_file,full)]} {
foreach file $rda_Input(ui_timingcon_file,full) {
lappend ilm_sdc_files $file
}
}
if {$rda_Input(ui_cdb_file,max) != ""} {
set slow_cdbs [concat $rda_Input(ui_cdb_file,max) $rda_Input(ui_cdb_file)]
} else {
if {$rda_Input(ui_cdb_file) != ""} {
set slow_cdbs $rda_Input(ui_cdb_file)
}
}
if {$rda_Input(ui_cdb_file,min) != ""} {
set fast_cdbs [concat $rda_Input(ui_cdb_file,min) $rda_Input(ui_cdb_file)]
} else {
if {$rda_Input(ui_cdb_file) != ""} {
set fast_cdbs $rda_Input(ui_cdb_file)
} else {
if {[info exists slow_cdbs] && ($slow_cdbs != "")} {
set fast_cdbs $slow_cdbs
}
}
}
set bc_cap_table ""
set wc_cap_table ""
if {[llength $rda_Input(ui_captbl_file)] > 1} {
for {set i 0} {$i<[llength $rda_Input(ui_captbl_file)]} {incr i} {
if {[lindex $rda_Input(ui_captbl_file) $i] == "-best"} {
set bc_cap_table [file normalize [lindex $rda_Input(ui_captbl_file) [expr $i+1]]]
}
if {[lindex $rda_Input(ui_captbl_file) $i] == "-worst"} {
set wc_cap_table [file normalize [lindex $rda_Input(ui_captbl_file) [expr $i+1]]]
}
}
} else {
set wc_cap_table [file normalize $rda_Input(ui_captbl_file)]
set bc_cap_table [file normalize $rda_Input(ui_captbl_file)]
}
set bc_qx_tech_file ""
set wc_qx_tech_file ""
if {[llength $rda_Input(ui_qxtech_file)] > 1} {
for {set i 0} {$i<[llength $rda_Input(ui_qxtech_file)]} {incr i} {
if {[lindex $rda_Input(ui_qxtech_file) $i] == "-best"} {
set bc_qx_tech_file [file normalize [lindex $rda_Input(ui_qxtech_file) [expr $i+1]]]
}
if {[lindex $rda_Input(ui_qxtech_file) $i] == "-worst"} {
set wc_qx_tech_file [file normalize [lindex $rda_Input(ui_qxtech_file) [expr $i+1]]]
}
}
} else {
set wc_qx_tech_file [file normalize $rda_Input(ui_qxtech_file)]
set bc_qx_tech_file [file normalize $rda_Input(ui_qxtech_file)]
}
# if {$wc_cap_table == ""} {
# Puts "--------------------------------------------------------------------------------------"
# Puts "\[PQRS\]\[ERROR\] No cap tables defined for this testcase ... aborting"
# Puts "--------------------------------------------------------------------------------------"
# exit 1
# }
if {([info exists dgn_max_temp] == 0) || ([info exists dgn_max_temp] && $dgn_max_temp == "")} {
set max_temp ""
} else {
set max_temp $dgn_max_temp
}
if {([info exists dgn_min_temp] == 0) || ([info exists dgn_min_temp] && $dgn_min_temp == "")} {
set min_temp ""
} else {
set min_temp [expr abs($dgn_min_temp)]
}
set pre_route_res_factor $rda_Input(ui_preRoute_res)
set pre_route_clk_res_factor 1.0
set post_route_res_factor $rda_Input(ui_postRoute_res)
set post_route_clk_res_factor "1.0 1.0 1.0"
set pre_route_cap_factor $rda_Input(ui_preRoute_cap)
set pre_route_clk_cap_factor 1.0
set post_route_cap_factor $rda_Input(ui_postRoute_cap)
set post_route_clk_cap_factor "1.0 1.0 1.0"
set post_route_xcap_factor $rda_Input(ui_postRoute_xcap)
set shrink_factor $rda_Input(ui_shr_scale)
# set relative_c_thresh $rda_Input(ui_rel_c_thresh)
# set total_c_thresh $rda_Input(ui_tot_c_thresh)
# set coupling_c_thresh $rda_Input(ui_cpl_c_thresh)
create_rc_corner -name rc_max \
-preRoute_res $pre_route_res_factor \
-preRoute_clkres $pre_route_clk_res_factor \
-preRoute_cap $pre_route_cap_factor \
-preRoute_clkcap $pre_route_clk_cap_factor \
-postRoute_res $post_route_res_factor \
-postRoute_clkres $post_route_clk_res_factor \
-postRoute_cap $post_route_cap_factor \
-postRoute_clkcap $post_route_clk_cap_factor \
-postRoute_xcap $post_route_xcap_factor
if {$wc_cap_table != ""} {
update_rc_corner -name rc_max -cap_table $wc_cap_table
}
if {$max_temp != ""} {
update_rc_corner -name rc_max -T $max_temp
}
if {$wc_qx_tech_file != "" } {
update_rc_corner -name rc_max -qx_tech_file $wc_qx_tech_file
}
create_rc_corner -name rc_min \
-preRoute_res $pre_route_res_factor \
-preRoute_clkres $pre_route_clk_res_factor \
-preRoute_cap $pre_route_cap_factor \
-preRoute_clkcap $pre_route_clk_cap_factor \
-postRoute_res $post_route_res_factor \
-postRoute_clkres $post_route_clk_res_factor \
-postRoute_cap $post_route_cap_factor \
-postRoute_clkcap $post_route_clk_cap_factor \
-postRoute_xcap $post_route_xcap_factor
if {$bc_cap_table != ""} {
update_rc_corner -name rc_min -cap_table $bc_cap_table
}
if {$min_temp != ""} {
update_rc_corner -name rc_min -T $min_temp
}
if {$bc_qx_tech_file != "" } {
update_rc_corner -name rc_min -qx_tech_file $bc_qx_tech_file
}
if {[info exists slow_cdbs] && ($slow_cdbs != "")} {
create_library_set -name libs_max -timing $slow_libs -si $slow_cdbs
create_library_set -name libs_min -timing $fast_libs -si $fast_cdbs
} else {
create_library_set -name libs_max -timing $slow_libs
create_library_set -name libs_min -timing $fast_libs
}
create_delay_corner -name corner_max -library_set libs_max -rc_corner rc_max
create_delay_corner -name corner_min -library_set libs_min -rc_corner rc_min
Puts "\[INFO\] create_constraint_mode setup_func_mode with "
Puts "\[INFO\] SDC files: $sdc_files"
if {$ilm_sdc_files != ""} {
Puts "\[INFO\] ILM SDC files: $ilm_sdc_files"
create_constraint_mode -name setup_func_mode -sdc_files $sdc_files -ilm_sdc_files ilm_sdc_files
} else {
create_constraint_mode -name setup_func_mode -sdc_files $sdc_files
}
create_analysis_view -name setup_func -constraint_mode setup_func_mode -delay_corner corner_max
# Puts "\[INFO\] create_constraint_mode hold_func_mode with "
# Puts "\[INFO\] SDC files: $sdc_files"
# if {$ilm_sdc_files != ""} {
# Puts "\[INFO\] ILM SDC files: $ilm_sdc_files"
# create_constraint_mode -name hold_func_mode -sdc_files $sdc_files -ilm_sdc_files ilm_sdc_files
# } else {
# create_constraint_mode -name hold_func_mode -sdc_files $sdc_files
# }
create_analysis_view -name hold_func -constraint_mode setup_func_mode -delay_corner corner_min
set_analysis_view -setup {setup_func} -hold {hold_func}
set_default_view -setup {setup_func} -hold {hold_func}
set_interactive_constraint_modes [all_constraint_modes -active]
}
proc create_lp_config_file {} {
global vars
set op [open lp_config.auto.tcl w]
if {[file exists setup.auto.tcl]} {
source setup.auto.tcl
}
if {[file exists innovus_config.auto.tcl]} {
source innovus_config.auto.tcl
}
puts $op "##########################################################################################"
puts $op "# Low power configuration file overlay. This file contains foundation flow variables"
puts $op "# that are specific to the LP flow and should be used in addition to the setup.tcl"
puts $op "##########################################################################################"
puts $op "# Tie cell information"
puts $op "# ----------------------------------------------------------------------------------------"
puts $op "# The variable vars(tie_cells) is defined in the setup.tcl and is used to define a "
puts $op "# \"global\" tie cell list. This list will be used by default for each power domain."
puts $op "# It can be overridden for a given power domain by setting vars(<power_domain>,tie_cells)."
puts $op "# ----------------------------------------------------------------------------------------"
puts $op "#"
puts $op "##########################################################################################"
puts $op "# Placement Options"
puts $op "# ----------------------------------------------------------------------------------------"
puts $op "#set vars(resize_shifter_and_iso_insts) <true | false>"
puts $op "#"
if {[info exists vars(power_domains)]} {
foreach domain $vars(power_domains) {
if {[info exists vars(tie_cells)]} {
puts $op "# set vars($domain,tie_cells)\t\"$vars(tie_cells)\""
} else {
puts $op "# set vars($domain,tie_cells) <tie cells for <power_domain>>"
}
}
}
puts $op "#"
puts $op "##########################################################################################"
puts $op "# Filler cell information"
puts $op "# ----------------------------------------------------------------------------------------"
puts $op "# The variable vars(filler_cells) is defined in the setup.tcl and is used to define a "
puts $op "# \"global\" filler cell list. This list will be used by default for each power domain."
puts $op "# It can be overridden for a given power domain by setting vars(<power_domain>,filler_cells)."
puts $op "# ----------------------------------------------------------------------------------------"
if {[info exists vars(power_domains)]} {
foreach domain $vars(power_domains) {
if {[info exists vars(filler_cells)]} {
puts $op "# set vars($domain,filler_cells)\t\"$vars(filler_cells)\""
} else {
puts $op "# set vars($domain,filler_cells) <filler cells for <power_domain>>"
}
}
}
puts $op "#"
puts $op "##########################################################################################"
puts $op "# Welltap cell information"
puts $op "# ----------------------------------------------------------------------------------------"
puts $op "# The variable vars(welltaps) is defined in the setup.tcl and is used to define a "
puts $op "# \"global\" welltap cell list. This list will be used by default for each power domain."
puts $op "# It can be overridden for a given power domain by setting vars(<power_domain>,welltaps)."
puts $op "# ----------------------------------------------------------------------------------------"
puts $op "# verify_rule : maximum distance (in microns) between welltap cells and standard cells "
puts $op "# in microns"
puts $op "# max_gap : specifies the maximum distance from the right edge of one well-tap cell "
puts $op "# to the left edge of the following well-tap cell in the same row"
puts $op "# cell_interval : specifies the maximum distance from the center of one well-tap cell "
puts $op "# to the center of the following well-tap cell in the same row"
puts $op "#"
puts $op "# NOTE: max_gap and cell_interval parameters are mutually exclusive, user has to define "
puts $op "# only one of these parameters to add welltap cells"
puts $op "#"
puts $op "# ----------------------------------------------------------------------------------------"
if {[info exists vars(power_domains)]} {
foreach domain $vars(power_domains) {
if {[info exists vars(welltaps)]} {
puts $op "# set vars($domain,vars(welltaps)) <welltap cell list for <power_domain>>"
} else {
puts $op "# set vars($domain,welltaps) <welltap cell list for <power_domain>>"
}
puts $op "# set vars($domain,welltaps,checkerboard) <true or false>"
puts $op "# set vars($domain,welltaps,max_gap) <max gap in microns>"
puts $op "# set vars($domain,welltaps,cell_interval) <cell interval in microns>"
puts $op "# set vars($domain,welltaps,row_offset) <row offset in microns>"
puts $op "# set vars($domain,welltaps,verify_rule) <verify rule distance>"
}
}
puts $op "#"
puts $op "##########################################################################################"
puts $op "# Endcap cell information"
puts $op "# ----------------------------------------------------------------------------------------"
puts $op "# The variables vars(pre_endcap) and vars(post_endcap) are set in the setup.tcl file and"
puts $op "# are used to define \"global\" endcap cells. These used by default for each power domain."
puts $op "# They can be overridden for a given power domain setting vars(<power_domain>,pre_endcap)"
puts $op "# and/or vars(<power_domain>,post_endcap)."
puts $op "# ----------------------------------------------------------------------------------------"
if {[info exists vars(power_domains)]} {
foreach domain $vars(power_domains) {
puts $op "# set vars($domain,pre_endcap) <pre endcap cell for <power_domain>>"
puts $op "# set vars($domain,post_endcap) <post endcap cell for <power_domain>>"
}
}
puts $op "#"
puts $op "##########################################################################################"
puts $op "# Always on net buffering"
puts $op "# ----------------------------------------------------------------------------------------"
puts $op "# By default SOCE does always-on-net synthesis for SRPG control signal and PSO enable "
puts $op "# signals as part of optDesign -preCTS, but this can be manually done for specific nets if"
puts $op "# necessary. To do this, define the following variables and uncomment the pre_prects.tcl"
puts $op "# plug-in template"
puts $op "# ----------------------------------------------------------------------------------------"
puts $op "# set vars(always_on_buffers) <list of always on buffers>"
puts $op "# set vars(always_on_nets) <list of always on nets>"
puts $op "# set vars(always_on_nets,max_fanout) <max fanout limit for always on nets> (optional)"
puts $op "# set vars(always_on_nets,max_tran) <max transition on always on nets> (optional)"
puts $op "# set vars(always_on_nets,max_skew) <max skew for always on nets> (optional)"
puts $op "# set vars(always_on_nets,max_delay) <max delay for always on nets> (optional)"
if {[info exists vars(power_domains)]} {
foreach domain $vars(power_domains) {
puts $op "# set vars($domain,always_on_buffers) <buffers for <power domain>>"
}
}
puts $op "#"
puts $op "##########################################################################################"
puts $op "# Secondary power/ground routing"
puts $op "# ----------------------------------------------------------------------------------------"
puts $op "# Automatic secondary power routing can be enabled the foundation flows by setting "
puts $op "# vars(route_secondary_pg_nets) to true and providing cell pin pair information to"
puts $op "# identify the connections requiring routing (PTBUFFD1:TVDD LVLLHCD4:VDDL, e.g.) "
puts $op "# ----------------------------------------------------------------------------------------"
puts $op "# set vars(route_secondary_pg_nets) \[true | false\]"
puts $op "# set vars(secondary_pg,cell_pin_pairs) <secondary power cell pin pair list>"
puts $op "# ----------------------------------------------------------------------------------------"
puts $op "#In addition, the following can optionally defined either globally or per p/g net"
puts $op "# ----------------------------------------------------------------------------------------"
puts $op "# set vars(secondary_pg,max_fanout) <max fanout for secondary power routing>"
puts $op "# set vars(secondary_pg,pattern) <secondary power routing pattern trunk | steiner>"
puts $op "# set vars(secondary_pg,non_default_rule) <non-default rule for secondary p/g/ routing>"
puts $op "# ----------------------------------------------------------------------------------------"
puts $op "# To optionally override for a given p/g net(s), use the vars(route_secondary_pg_nets) to "
puts $op "# define the list of nets to be overridden and then override vars(<p/g net>,<option>)"
puts $op "# ----------------------------------------------------------------------------------------"
puts $op "# set vars(secondary_pg,nets) <list of power/ground nets>"
puts $op "# set vars(<p/g_net>,max_fanout) <max fanout>"
puts $op "# set vars(<p/g_net>,pattern) <trunk | steiner>"
puts $op "# set vars(<p/g_net>,non_default_rule) <non default rule>"
puts $op "#"
puts $op "##########################################################################################"
puts $op "# runCLP options"
puts $op "# ----------------------------------------------------------------------------------------"
puts $op "# set vars(clp_options) <options for runCLP>"
puts $op "# ----------------------------------------------------------------------------------------"
puts $op "# set vars(clp_options) \"\""
puts $op "#"
puts $op "##########################################################################################"
puts $op "# Modify power domains, row creation for power domains"
puts $op "# ----------------------------------------------------------------------------------------"
puts $op "# The foundation flows contain a sample post_init_tcl (PLUG/post_init.tcl) plug-in to do "
puts $op "# power domain modification automatically based on the folloing variables:"
puts $op "# ----------------------------------------------------------------------------------------"
if {[info exists vars(power_domains)]} {
foreach domain $vars(power_domains) {
puts $op "# set vars($domain,bbox) <llx lly urx ury>; bondary coordinates in microns"
puts $op "# set vars($domain,rs_exts) <top bot left right>; distance in microns "
puts $op "# set vars($domain,min_gaps) <top bot left right>; distance in microns"
}
}
puts $op "#"
puts $op "##########################################################################################"
puts $op "# Power Shut-off Planning "
puts $op "# ----------------------------------------------------------------------------------------"
puts $op "# The foundation flows contain a sample post_init_tcl (PLUG/post_init.tcl) plug-in to do "
puts $op "# power switch insertion automatically based on the following information:"
puts $op "# ----------------------------------------------------------------------------------------"
puts $op "# set vars(<power_domain>,switchable) <true | false>"
puts $op "# set vars(<power_domain>,switch_type) <column | ring>"
puts $op "# set vars(<power_domain>,switch_cell) <PSO cell name>"
puts $op "# set vars(<power_domain>,input_enable_pin) <PSO cell input enable pin>"
puts $op "# set vars(<power_domain>,output_enable_pin) <PSO cell output enable pin>"
puts $op "# set vars(<power_domain>,input_enable_net) <PSO cell input enable net>"
puts $op "# set vars(<power_domain>,output_enable_net) <PSO cell output enable net>"
puts $op "# set vars(<power_domain>,switch_instance) <switchModuleInstance>"
puts $op "# set vars(<power_domain>,top_offset) <top offset in microns>"
puts $op "# set vars(<power_domain>,bottom_offset) <bottom offset in microns>"
puts $op "# set vars(<power_domain>,right_offset) <right offset in microns>"
puts $op "# set vars(<power_domain>,left_offset) <left offset in microns>"
puts $op "# ----------------------------------------------------------------------------------------"
puts $op "# Below variables are for column based pso implemetation"
puts $op "# ----------------------------------------------------------------------------------------"
puts $op "# set vars(<power_domain>,checker_board) <true | false>"
puts $op "# set vars(<power_domain>,horizonal_pitch) <in microns>"
puts $op "# set vars(<power_domain>,column_height) <Switch cell column height in microns>"
puts $op "# set vars(<power_domain>,skip_rows) <Number of rows to skip>"
puts $op "# set vars(<power_domain>,back_to_back_chain) <true|false>"
puts $op "# ... Connects the enableNetOut at the top of a column to the enableNetIn at the top of "
puts $op "# ... the next column, and connects the enableNetOut at the bottom of the column to the "
puts $op "# ... enableNetIn at the bottom of the next column"
puts $op "# ----------------------------------------------------------------------------------------"
puts $op "# Below variables are for ring based pso implemetation"
puts $op "# ----------------------------------------------------------------------------------------"
puts $op "# set vars(<power_domain>,top_ring) <1|0>"
puts $op "# set vars(<power_domain>,bottom_ring) <1|0>"
puts $op "# set vars(<power_domain>,right_ring) <1|0>"
puts $op "# set vars(<power_domain>,left_ring) <1|0>"
puts $op "# ... defines which side of the power domain to insert switches:"
puts $op "# ----------------------------------------------------------------------------------------"
puts $op "# set vars(<power_domain>,top_switch_cell) <pso cell name>"
puts $op "# set vars(<power_domain>,bottom_switch_cell) <pso cell name>"
puts $op "# set vars(<power_domain>,left_switch_cell) <pso cell name>"
puts $op "# set vars(<power_domain>,right_switch_cell) <pso cell name>"
puts $op "# ... define pso cell name for each side of the power domain"
puts $op "# ----------------------------------------------------------------------------------------"
puts $op "# set vars(<power_domain>,top_filler_cell) <filler cell name>"
puts $op "# set vars(<power_domain>,bottom_filler_cell) <filler cell name>"
puts $op "# set vars(<power_domain>,left_filler_cell) <filler cell name>"
puts $op "# set vars(<power_domain>,right_filler_cell) <filler cell name>"
puts $op "# set vars(<power_domain>,corner_cell_list) <corner cell name>"
puts $op "# ... define filler cell name for each side of the power domain"
puts $op "# ----------------------------------------------------------------------------------------"
puts $op "# set vars(<power_domain>,distribute) <true or false>"
puts $op "# set vars(<power_domain>,top_switches) <integer>"
puts $op "# set vars(<power_domain>,bottom_switches) <integer>"
puts $op "# set vars(<power_domain>,left_switches) <integer>"
puts $op "# set vars(<power_domain>,right_switches) <integer>"
puts $op "# ... define the number of switches for each side of the power domain"
puts $op "#"
close $op
Puts "<FF> ------------------------------------------------------------------------------------"
Puts "<FF> Created low power config file \"lp_config.auto.tcl\""
Puts "<FF> This file is used to define variables specific to the LP foundation flow."
Puts "<FF> All the informaiton in this file is optional but is intended to help "
Puts "<FF> automate some of the most common LP commands. Please edit and copy"
Puts "<FF> to lp_config.tcl to enable (make sure it is sourced from setup.tcl)."
}
proc create_invs_tag_file {} {
global vars
global tags
set steps [list "feedthrough" "assign_pin" "model_gen" "partition" \
"init" "place" "prects" "cts" "postcts" "postcts_hold" "route" \
"postroute" "postroute_hold" "signoff" "assemble"]
set tags(init) [list \
set_distribute_host \
set_multi_cpu_usage \
set_distribute_host \
set_multi_cpu_usage \
set_rc_factor \
derate_timing \
create_rc_corner \
create_library_set \
create_delay_corner \
create_constraint_mode \
create_analysis_view \
update_delay_corner \
update_library_set \
derate_timing \
set_default_view \
set_power_analysis_mode \
init_design \
load_floorplan \
generate_tracks \
load_cpf \
commit_cpf \
read_activity_file \
specify_ilm \
load_ilm_non_sdc_file \
initialize_timing \
load_scan \
specify_spare_gates \
set_dont_use \
set_max_route_layer \
set_design_mode \
insert_welltaps_endcaps \
time_design \
check_design \
check_timing \
report_power_domains \
ff_replace_flexmodel_with_full_netlist \
]
set tags(place) [list \
set_distribute_host \
set_multi_cpu_usage \
restore_design \
initialize_step \
set_design_mode \
set_delay_cal_mode \
set_place_mode \
set_opt_mode \
set_tie_hilo_mode \
cleanup_specify_clock_tree \
specify_clock_tree \
specify_jtag \
place_jtag \
place_design \
place_opt_design \
add_tie_cells \
time_design \
save_design \
report_power \
verify_power_domain \
run_clp \
]
set tags(prects) [list \
set_distribute_host \
set_multi_cpu_usage \
initialize_step \
set_design_mode \
set_ilm_type \
cleanup_specify_clock_tree \
create_clock_tree_spec \
specify_clock_tree \
set_useful_skew_mode \
set_opt_mode \
set_design_mode \
set_delay_cal_mode \
set_dont_use \
opt_design \
ck_clone_gate \
save_design \
report_power \
verify_power_domain \
run_clp \
]
set tags(cts) [list \
set_distribute_host \
set_multi_cpu_usage \
initialize_step \
set_design_mode \
set_cts_mode \
set_ccopt_mode \
set_nanoroute_mode \
enable_clock_gate_cells \
cleanup_specify_clock_tree \
create_clock_tree_spec \
specify_clock_tree \
clock_design \
ccopt_design \
disable_clock_gate_cells \
run_clock_eco \
update_timing \
time_design \
save_design \
report_power \
verify_power_domain \
run_clp \
]
set tags(postcts) [list \
set_distribute_host \
set_multi_cpu_usage \
initialize_step \
set_design_mode \
set_delay_cal_mode \
set_analysis_mode \
set_opt_mode \
opt_design \
save_design \
report_power \
verify_power_domain \
run_clp \
]
set tags(postcts_hold) [list \
set_distribute_host \
set_multi_cpu_usage \
initialize_step \
set_dont_use \
set_opt_mode \
opt_design \
save_design \
report_power \
verify_power_domain \
run_clp \
]
set tags(route) [list \
set_distribute_host \
set_multi_cpu_usage \
initialize_step \
set_nanoroute_mode \
add_filler_cells \
route_secondary_pg_nets \
check_place \
route_design \
run_clock_eco \
spread_wires \
initialize_timing \
time_design \
save_design \
report_power \
verify_power_domain \
run_clp \
]
set tags(postroute) [list \
set_distribute_host \
set_multi_cpu_usage \
initialize_step \
set_design_mode \
set_extract_rc_mode \
set_analysis_mode \
set_delay_cal_mode \
add_metalfill \
opt_design \
trim_metalfill \
save_design \
report_power \
verify_power_domain \
run_clp \
]
set tags(postroute_hold) [list \
set_distribute_host \
set_multi_cpu_usage \
initialize_step \
set_dont_use_mode \
set_opt_mode \
opt_design \
trim_metalfill \
save_design \
report_power \
verify_power_domain \
run_clp \
]
set tags(signoff) [list \
set_distribute_host \
set_multi_cpu_usage \
initialize_timing \
initialize_step \
set_analysis_mode \
set_extract_rc_mode \
extract_rc \
dump_spef \
signoff_time_design \
time_design_setup \
time_design_hold \
stream_out \
save_oa_design \
create_ilm \
summary_report \
verify_connectivity \
verify_geometry \
verify_metal_density \
verify_process_antenna \
save_design \
report_power \
verify_power_domain \
run_clp \
]
set tags(feedthrough) [list \
initialize_timing \
load_cpf \
commit_cpf \
run_clp_init \
save_init_dbs \
set_budgeting_mode \
update_constraint_mode \
set_ptn_user_cns_file \
set_place_mode \
set_proto_model \
place_design \
time_design \
save_place_dbs \
insert_ptn_feedthrough \
trial_route \
trial_route_time_design \
]
set tags(assign_pin) [list \
assign_ptn_pins \
check_pin_assignment \
report_unaligned_nets \
trial_route \
]
set tags(model_gen) [list \
create_ps_per_micron_model \
identify_proto_model \
report_proto_model \
setIlmMode \
create_proto_model \
create_flexfiller_route_blockage \
report_proto_model \
saveDesign \
]
set tags(partition) [list \
time_design_proto \
set_pspm_vars \
set_budgeting_mode \
set_ptn_pin_status \
derive_timing_budget \
save_budget_dbs \
run_clp \
partition \
save_partition \
]
set tags(assemble) [list \
assemble_design \
specify_ilm \
load_ilm_non_sdc_file \
load_cpf \
commit_cpf \
initialize_timing \
update_timing \
pre_signoff_eco_verify_connectivity \
pre_signoff_eco_verify_geometry \
set_module_view \
delete_filler_cells \
opt_design \
extract_rc \
signoff_opt_design \
signoff_time_design \
add_filler_cells \
eco_route \
post_signoff_eco_verify_connectivity \
post_signoff_eco_verify_geometry \
]
set op [open invs.auto.tcl w]
puts $op "##########################################################################################"
puts $op "# CDNS FOUNDATION FLOW"
puts $op "#-----------------------------------------------------------------------------------------"
puts $op "# This is the foundation flow tags file. Each flow step is a sequence of commands and"
puts $op "# each command has a tag associated with it and each tag has four attributes:"
puts $op "#-----------------------------------------------------------------------------------------"
puts $op "# pre_tcl -> file to be sourced prior to the command"
puts $op "# post_tcl -> file to be sourced after the command"
puts $op "# replace_tcl -> file to be sourced instead of the command"
puts $op "# skip -> skip the command entirely (true | false)"
puts $op "#-----------------------------------------------------------------------------------------"
puts $op "# These attributes provide more granularity that the plug-ins and are intended to"
puts $op "# allow for flow customization at a very detailed level. To enable, simply uncomment"
puts $op "# the tag, assign the appropriate value, and make sure this file gets sourced"
puts $op "# from the setup.tcl or innovus_config.tcl. Keep in mind, these tags will only"
puts $op "# be evaluated if the command they are associated is executed as part of the flow"
puts $op "#-----------------------------------------------------------------------------------------"
puts $op "# verbose -> Print tag related comments for imported tags"
puts $op "# verbosity_level -> Print tag related comments for ALL possible tags \[LOW | HIGH\]"
puts $op "#-----------------------------------------------------------------------------------------"
foreach step $steps {
foreach command $tags($step) {
foreach tag "pre_tcl post_tcl replace_tcl skip" {
set string "#set vars($step,$command,$tag)"
set length [string length $string]
set diff [expr 60-$length]
set spaces [string repeat " " $diff]
if {$tag == "skip"} {
puts $op [format "%s%s%s" $string $spaces "<true or false>"]
} else {
puts $op [format "%s%s%s" $string $spaces "<file>"]
}
}
}
puts $op "# ----------------------------------------------------------------------------------------"
}
}
proc pad {a {add 0}} {
if {[expr [string length $a] + $add] < 6} {
return "\t\t\t\t"
} elseif {[expr [string length $a] + $add] < 12} {
return "\t\t\t"
} elseif {[expr [string length $a] + $add] < 18} {
return "\t\t"
} elseif {[expr [string length $a] + $add] < 24} {
return "\t"
}
}
proc format_string {a b {large 0}} {
set add 0
if {[regexp "#" $a]} {
regsub "#" $a "" a
set add 1
}
# puts "$a, [string length $a]"
if {$large} {
if {[expr [string length $a] + $add] < 4} {
set tabs "\t\t\t\t\t\t\t\t\t\t"
} elseif {[expr [string length $a] + $add] < 8} {
set tabs "\t\t\t\t\t\t\t\t\t"
} elseif {[expr [string length $a] + $add] < 12} {
set tabs "\t\t\t\t\t\t\t\t"
} elseif {[expr [string length $a] + $add] < 16} {
set tabs "\t\t\t\t\t\t\t"
} elseif {[expr [string length $a] + $add] < 20} {
set tabs "\t\t\t\t\t\t"
} elseif {[expr [string length $a] + $add] < 24} {
set tabs "\t\t\t\t\t"
} elseif {[expr [string length $a] + $add] < 28} {
set tabs "\t\t\t\t"
} elseif {[expr [string length $a] + $add] < 32} {
set tabs "\t\t\t"
} else {
set tabs "\t\t"
}
} else {
if {[expr [string length $a] + $add] < 4} {
set tabs "\t\t\t\t\t\t"
} elseif {[expr [string length $a] + $add] < 8} {
set tabs "\t\t\t\t\t"
} elseif {[expr [string length $a] + $add] < 12} {
set tabs "\t\t\t\t"
} elseif {[expr [string length $a] + $add] < 16} {
set tabs "\t\t\t"
} elseif {[expr [string length $a] + $add] < 20} {
set tabs "\t\t"
} else {
set tabs "\t"
}
}
# Handle the empty string correctly
if {$b == {}} { set b {{}} }
if {$add} {
return [format "#set $a%s%s" $tabs $b]
} else {
return [format "set $a%s%s" $tabs $b]
}
}
proc get_line_match {pattern file {last 1}} {
set ip [open $file r]
while {[gets $ip line]>=0} {
if {[regexp "$pattern" $line]>0} {
if {$last} {
set match $line
} else {
lappend match $line
}
}
}
if {[info exists match]} {
return $match
}
}
set op1 [open setup.auto.tcl w]
set op2 [open innovus_config.auto.tcl w]
puts $op1 "##########################################################################################"
puts $op1 "# CDNS FOUNDATION FLOW"
puts $op1 "#-----------------------------------------------------------------------------------------"
puts $op1 "# This is the foundation flow setup file. It contains all the necessary design"
puts $op1 "# data to drive all the CDNS foundation flows. Each flow can also have an"
puts $op1 "# additional configuration file to define flow specific information:"
puts $op1 "#-----------------------------------------------------------------------------------------"
puts $op1 "# INNOVUS -> innovus_config.tcl (for flat and hier implementation flows)"
puts $op1 "# + lp_config.tcl (additional information for flat and hier lp flows)"
#puts $op1 "# -> proto_config.tcl (for the prototyping flow)"
#puts $op1 "# ETS -> ets_config.tcl"
#puts $op1 "# EPS -> eps_config.tcl"
puts $op1 "#-----------------------------------------------------------------------------------------"
puts $op1 "# A single setup.tcl is all that is required. These additional files are to enable "
puts $op1 "# the sharing of a setup.tcl (design data) amongst design groups while also allowing"
puts $op1 "# different flow options to be set in the *_config.cl files for different blocks or runs"
puts $op1 "##########################################################################################"
puts $op1 ""
puts $op2 "##########################################################################################"
puts $op2 "# INNOVUS FOUNDATION FLOW"
puts $op2 "#-----------------------------------------------------------------------------------------"
puts $op2 "# This is the INNOVUS foundation flow configuration file. It contains all the necessary flow"
puts $op2 "# options to drive the CDNS flat and/or hier implementation flows. "
puts $op2 "# For low power flows, an optional/additional configuration file (lp_config.tcl) can be "
puts $op2 "# used to enable low power foundation flow features and define domain specific information."
puts $op2 "#-----------------------------------------------------------------------------------------"
if {![info exists vars(version)]} {
set vars(version) 17.1.0
}
if {[lindex [split $vars(version) "."] 0] <= 10 && [llength [all_analysis_views]] == 2} {
puts "Converting default timing environment to MMMC"
conv2mmmc
}
global rda_Input
puts $op1 "##########################################################################################"
puts $op1 "# The variable vars(version) tells the code generator which version of INNOVUS you will be"
puts $op1 "# targeting."
puts $op1 "#-----------------------------------------------------------------------------------------"
puts $op1 "set vars(version) $vars(version)"
#puts $op1 "##########################################################################################"
#puts $op1 "# For non-codgen flow, the following must be set - it should point to the foundation "
#puts $op1 "# flow installation directory"
puts $op1 "#-----------------------------------------------------------------------------------------"
#puts $op1 "#set vars(script_root) SCRIPTS"
#puts $op1 ""
#puts $op2 "# The vars(flow) variable can be used to define the type of flow to run. If not set,"
#puts $op2 "# mmmc will be used. Supported values are:"
#puts $op2 "# - default (minmax timing)"
#puts $op2 "# - pr_mmmc (minmax timing pre-route, mmmc timing post-route)"
#puts $op2 "# - mmmc (mmmc timing)"
#puts $op2 "##########################################################################################"
#if {[info exists ::CPF::cpfCommitted]} {
# puts $op2 "set vars(flow) mmmc"
#} else {
# puts $op2 "set vars(flow) default"
#}
puts $op2 "set vars(plug_dir) PLUG/INNOVUS"
puts $op2 "set vars(dbs_dir) DBS"
puts $op2 "set vars(log_dir) LOG"
puts $op2 "set vars(rpt_dir) RPT"
puts $op2 "# You can set a report directory per step using vars(<step>,rpt_dir) ..."
puts $op2 ""
if {[info exists rda_Input(ui_netlist)]} {
set vars(netlist) [list]
foreach file $rda_Input(ui_netlist) {
lappend vars(netlist) [file normalize $file]
}
} else {
catch {set vars(netlist) [file normalize [lindex [get_line_match "Reading netlist file" [getLogFileName]] 3]]}
}
catch {set vars(fp_file) [file normalize [lindex [get_line_match "Reading floorplan" [getLogFileName]] 4]]}
#catch {set vars(cts_spec) [regsub -all "'" [lindex [get_line_match "Reading clock tree spec file" [getLogFileName]] 5] ""]}
#catch {set vars(cts_spec) [regsub -all "\"" $vars(cts_spec)] ""}
set vars(cts_spec) ""
set specOpt [ckGetCkSpecOption]
for { set i 0 } { $i < [llength $specOpt] } { incr i } {
if { [string match -nocase [lindex $specOpt $i] "-file" ] || [string match -nocase [lindex $specOpt $i] "-specFile" ] } {
incr i
set clkFile [lindex $specOpt $i]
if { [file exists $clkFile ] } {
if { [lsearch -exact $vars(cts_spec) $clkFile] == -1 } {
lappend vars(cts_spec) [file normalize $clkFile]
}
}
}
}
foreach option [getDesignMode -quiet] {
if {[lindex $option 0] == "process"} {
set vars(process) [lindex $option 1]nm
}
}
catch {set vars(max_route_layer) [getMaxRouteLayer]}
puts $op1 "########################################################################################"
puts $op1 "# Define design data ..."
puts $op1 "########################################################################################"
puts $op1 [format_string vars(design) [dbCellName [dbgTopCell]]]
if {[lindex [split $vars(version) "."] 0] > 10} {
if {[info exists init_verilog] && ($init_verilog != "")} {
set vars(netlist) $init_verilog
}
if {[info exists init_oa_ref_lib] && ($init_oa_ref_lib != "")} {
set vars(oa_ref_lib) $init_oa_ref_lib
}
# catch {set restore_design [get_line_match "restoreDesign" [getLogFileName]}
# set vars(netlist_type) oa
# set vars(oa_design_lib) [lindex $restore_design 1]
# set vars(oa_design_cell) [lindex $restore_design 2]
# set vars(oa_design_view) [lindex $restore_design 3]
if {[info exists init_abstract_view] && ($init_abstract_view != "")} {
set vars(oa_abstract_name) $init_abstract_view
}
if {[info exists init_oa_design_lib] && ($init_oa_design_lib != "")} {
set vars(oa_design_lib) $init_oa_design_lib
}
if {[info exists init_oa_design_cell] && ($init_oa_design_cell != "")} {
set vars(oa_design_cell) $init_oa_design_cell
}
if {[info exists init_oa_design_view] && ($init_oa_design_view != "")} {
set vars(oa_design_view) $init_oa_design_view
}
if {[info exists init_abstract_view] && ($init_abstract_view != "")} {
set vars(oa_abstract_name) $init_abstract_view
}
if {[info exists init_layout_view] && ($init_layout_view != "")} {
set vars(oa_layout_name) $init_layout_view
}
puts $op1 "#########################################################################################"
puts $op1 "# Variables for OA design import and export"
puts $op1 "# ---------------------------------------------------------------------------------------"
if {[info exists vars(oa_design_lib)]} {
puts $op1 "set vars(netlist_type) oa"
puts $op1 "set vars(oa_design_lib) $vars(oa_design_lib)"
} else {
puts $op1 "#set vars(oa_design_lib) <OA design library>"
}
if {[info exists vars(oa_design_cell)]} {
puts $op1 "set vars(oa_design_cell) $vars(oa_design_cell)"
} else {
puts $op1 "#set vars(oa_design_cell) <OA design cell>"
}
if {[info exists vars(oa_design_view)]} {
puts $op1 "set vars(oa_design_view) $vars(oa_design_view)"
} else {
puts $op1 "#set vars(oa_design_view) <OA design view>"
}
puts $op1 "#set vars(dbs_format) oa"
if {[info exists vars(oa_ref_lib)]} {
puts $op1 "set vars(oa_ref_lib) $vars(oa_ref_lib)"
} else {
puts $op1 "#set vars(oa_ref_lib) <OA reference library>"
}
if {[info exists vars(oa_abstract_name)]} {
puts $op1 "set vars(oa_abstract_name) $vars(oa_abstract_name)"
} else {
puts $op1 "#set vars(oa_abstract_name) <OA abstract name>"
}
if {[info exists vars(oa_layout_name)]} {
puts $op1 "set vars(oa_layout_name) $vars(oa_layout_name)"
} else {
puts $op1 "#set vars(oa_layout_name) <OA layout name>"
}
if {[info exists vars(netlist)]} {
# puts $op1 [format "set vars(netlist)%s%s" [pad vars(netlist)] $vars(netlist)]
puts $op1 [format_string vars(netlist) \"$vars(netlist)\"]
puts $op1 [format_string vars(netlist_type) verilog]
}
puts $op1 "#########################################################################################"
} else {
if {[info exists vars(netlist)]} {
# puts $op1 [format "set vars(netlist)%s%s" [pad vars(netlist)] $vars(netlist)]
puts $op1 [format_string vars(netlist) \"$vars(netlist)\"]
puts $op1 [format_string vars(netlist_type) verilog]
}
puts $op1 "#########################################################################################"
puts $op1 "# Variables for OA design import and export"
puts $op1 "# ---------------------------------------------------------------------------------------"
puts $op1 "#set vars(oa_design_lib) <OA design library>"
puts $op1 "#set vars(oa_design_cell) <OA design cell>"
puts $op1 "#set vars(oa_design_view) <OA design view>"
puts $op1 "#set vars(oa_ref_lib) <OA reference library>"
puts $op1 "#set vars(oa_abstract_name) <OA abstract name>"
puts $op1 "#set vars(oa_layout_name) <OA layout name>"
}
if {[info exists vars(fp_file)]} {
puts $op1 [format_string vars(fp_file) $vars(fp_file)]
} else {
puts $op1 [format_string #vars(fp_file) <floorplan_file>]
}
puts $op1 [format_string #vars(oa_fp) <OA_floorplan>]
puts $op1 [format_string #vars(def_files) <def_files>]
#puts $op1 "#set vars(scan_def) <scan_def>"
puts $op1 "# NOTE: vars(cts_spec) is only required for cts flows."
puts $op1 "# For ccopt flows, it is not required"
if {[file exists $vars(cts_spec)]} {
puts $op1 [format_string vars(cts_spec) \"$vars(cts_spec)\"]
} else {
puts $op1 [format_string #vars(cts_spec) <cts_spec>]
}
if {[info exists vars(process)]} {
puts $op1 [format_string vars(process) $vars(process)]
} else {
puts $op1 [format_string #vars(process) <process>]
}
if {[info exists vars(max_route_layer)]} {
puts $op1 [format_string vars(max_route_layer) $vars(max_route_layer)]
} else {
puts $op1 [format_string #vars(max_route_layer) <max_route_layer>]
}
puts $op1 "# NOTE: When generate_tracks is set, the tracks in the DEF are ignored; even the pitch"
puts $op1 "# To generate new tracks but preserve the pitch, use vars(honor_pitch) true"
puts $op1 [format_string #vars(generate_tracks) "<true | false>"]
puts $op1 [format_string #vars(honor_pitch) "<true | false>"]
if {[info exists rda_Input(ui_pwrnet)] && ($rda_Input(ui_pwrnet) != "")} {
puts $op1 "set vars(power_nets) \"$rda_Input(ui_pwrnet)\""
} else {
puts $op1 "#set vars(power_nets) <list of power nets>"
}
if {[info exists rda_Input(ui_gndnet)] && ($rda_Input(ui_gndnet) != "")} {
puts $op1 "set vars(ground_nets) \"$rda_Input(ui_gndnet)\""
} else {
puts $op1 "#set vars(ground_nets) <list of ground nets>"
}
puts $op1 "##########################################################################################"
puts $op1 "# For hierarchical designs, define vars(partition_list) which should be a list "
puts $op1 "# of all defined partitions (DO NOT INCLUDE THE TOP PARTITION)."
puts $op1 "#-----------------------------------------------------------------------------------------"
puts $op1 "# To assist the budgeting process, also define the following for each partition"
puts $op1 "# - set vars(<partition>,cts_spec) <file>"
puts $op1 "# - set vars(<partition>,latency_sdc) <file>"
puts $op1 "#"
puts $op1 "# These files should contain the expected clock latency for the clock tree(s)"
puts $op1 "# For example, if partition A has an expected clock latency of 500ps out of a total clock"
puts $op1 "# latency of 1ns, the top level constraints would have 'set_clock_latency 1.0 <clock pin>'"
puts $op1 "# and A would have a latency sdc file containing 'set_clock_latency 0.5 <ptn clock pin>'"
puts $op1 "# Likewise, the top level CTS spec would contain 'MaxDelay 1ns' and the vars(A,cts_spec)"
puts $op1 "# would contain 'MacroModel A/<ptn clock pin> 500ps 500ps 500ps 500ps 0fF"
puts $op1 "#-----------------------------------------------------------------------------------------"
puts $op1 "# During assembly, the foundation flow defaults to assembly the 'signoff' databases"
puts $op1 "# from each partition sub-directory. To specify a different database to use for any"
puts $op1 "# partition (including the top), specify the following:"
puts $op1 "# - vars(<ptn>,assemble_dbs) <path to INNOVUS database directory>"
puts $op1 "#-----------------------------------------------------------------------------------------"
puts $op1 "# If vars(use_flexmodels) is set to true, Flexmodels will be used. Some additional"
puts $op1 "# options for flexmodel usage are:"
puts $op1 "# set vars(use_proto_net_delay_model) false"
puts $op1 "# set vars(flexmodel_as_ptn) true"
puts $op1 "# set vars(flexmodel_art_based) true"
puts $op1 "# set vars(create_flexfiller_blockage) true"
puts $op1 "# set vars(enable_nrgr) true"
puts $op1 "#-----------------------------------------------------------------------------------------"
puts $op1 "# If vars(insert_feedthrough) is set to true, feedthrough insertion will be called"
puts $op1 "# before partitioning. Some additional options for partitioning are:"
puts $op1 "# set vars(abutted_design) true"
puts $op1 "# set vars(placement_based_ptn) true"
puts $op1 "# set vars(budget_mode) { trial_ipo giga_opt proto_net_delay_model }"
puts $op1 "#-----------------------------------------------------------------------------------------"
puts $op1 "# Flexilm creation can be enabled for the partitions, using vars(enable_flexilm) true"
puts $op1 "#-----------------------------------------------------------------------------------------"
puts $op1 "# Finally, each partition can have its own innovus_config.tcl (INCLUDING THE TOP PARTITION)."
puts $op1 "# To enable this, define vars(<partition>,<innovus_config_tcl>"
puts $op1 "##########################################################################################"
set vars(partition_list) ""
dbForEachCellPtn [dbGet top] ptn {
lappend vars(partition_list) [dbPtnName $ptn]
}
if {$vars(partition_list) != ""} {
puts $op1 "set vars(partition_list) \[list $vars(partition_list)\]"
foreach part $vars(partition_list) {
puts $op1 "#set vars($part,cts_spec) <partition cts spec file>"
puts $op1 "#set vars($part,latency_sdc) <partition latency sdc file>"
puts $op1 "#set vars($part,assemble_dbs) <database directory>"
puts $op1 "#set vars($part,ilm_dir) <path to ILM diretory>"
puts $op1 "#set vars($part,lef_file) <path to LEF file>"
puts $op1 "#set vars($part,innovus_config_tcl) <partition specific innovus_config.tcl>"
}
} else {
puts $op1 "#set vars(partition_list) <list of partitions>"
puts $op1 "#set vars(<partition>,cts_spec) <partition cts spec file>"
puts $op1 "#set vars(<partition>,latency_sdc) <partition latency sdc file>"
puts $op1 "#set vars(<partition>,assemble_dbs) <database directory>"
puts $op1 "#set vars(<partition>,ilm_dir) <path to ILM diretory>"
puts $op1 "#set vars(<partition>,lef_file) <path to LEF file>"
puts $op1 "#set vars(<partition>,innovus_config_tcl) <partition specific innovus_config.tcl>"
}
if {(![catch {dbGet top.isProtoModelCommitted} val]) && $val} {
puts $op1 "set vars(use_flexmodels) true"
} else {
puts $op1 "#set vars(use_flexmodels) <boolean>"
}
puts $op1 ""
puts $op1 "########################################################################################"
puts $op1 "# Optionally define user ILMs to be specified during the flow. These will be specified "
puts $op1 "# during the flat init step and the hierarchical partitioning step. The ILMs should"
puts $op1 "# not be hierarhical partitions (they are handled automatically. See below for "
puts $op1 "# handling partition ILMs during post assembly closure."
puts $op1 "# - vars(ilm_list) <list of ilm modules>"
puts $op1 "# - vars(<ilm>,ilm_dir) <path to ILM diretory>"
puts $op1 "# - vars(<ilm>,lef_file) <path to LEF file>"
puts $op1 "########################################################################################"
puts $op1 "# set vars(ilm_list) \[list\]"
if {[info exists rda_Input(ui_ilmdir)] && ($rda_Input(ui_ilmdir) != "")} {
set ilm_list [list]
for {set i 0} {$i < [llength $rda_Input(ui_ilmdir)]} {incr i} {
set ilm [lindex $rda_Input(ui_ilmdir) $i]
incr i
set dir [lindex $rda_Input(ui_ilmdir) $i]
lappend ilm_list $ilm
set vars($ilm,ilm_dir) $dir
}
if {$ilm_list != ""} {
puts $op1 "set vars(ilm_list) \[list $ilm_list\]"
foreach ilm $ilm_list {
puts $op1 "set vars($ilm,ilm_dir) $vars($ilm,ilm_dir)"
}
}
}
puts $op1 "########################################################################################"
puts $op1 "# Define lef files ..."
puts $op1 "########################################################################################"
puts $op1 "set vars(lef_files) \"\\"
foreach file $rda_Input(ui_leffile) {
puts $op1 " [file normalize $file] \\"
}
puts $op1 "\""
puts $op1 "########################################################################################"
puts $op1 "# Define library sets ..."
puts $op1 "#---------------------------------------------------------------------------------------"
puts $op1 "# set vars(library_sets) <list of library sets>"
puts $op1 "# set vars(<set>,timing) <list of lib files>"
puts $op1 "# set vars(<set>,si) <list of cdb/udn files>"
puts $op1 "########################################################################################"
set library_sets [list]
foreach library_set [all_library_sets] {
if {[llength [all_library_sets]] > 2} {
# if {[regexp "^default" $library_set] == 0} {
if {[info exists ::CPF::cpfCommitted]} {
if {([regexp "^domain_" $library_set] == 0)} {
lappend library_sets $library_set
}
} else {
lappend library_sets $library_set
}
# }
} else {
lappend library_sets $library_set
}
}
if {$library_sets != ""} {
puts $op1 "set vars(library_sets) \"$library_sets\""
}
foreach library_set $library_sets {
foreach option "timing si aocv" {
if {[get_library_set $library_set -$option] != ""} {
set file_list [get_library_set $library_set -$option]
puts $op1 "set vars($library_set,$option) \"\\"
foreach file $file_list {
puts $op1 " [file normalize $file] \\"
}
puts $op1 "\""
}
}
}
puts $op1 "########################################################################################"
puts $op1 "# Define rc corners ..."
puts $op1 "#---------------------------------------------------------------------------------------"
puts $op1 "# set vars(rc_corners) <list of rc corners>"
puts $op1 "# set vars(<rc_corner>,T) <temperature>"
puts $op1 "# set vars(<rc_corner>,cap_table) <cap table for corner>"
puts $op1 "########################################################################################"
set rc_corners [list]
foreach rc_corner [all_rc_corners] {
# if {[llength [all_rc_corners]] > 1} {
# if {[regexp "^default" $rc_corner ] == 0} {
# lappend rc_corners $rc_corner
# }
# } else {
lappend rc_corners $rc_corner
# }
}
if {$rc_corners != ""} {
puts $op1 "set vars(rc_corners) \"$rc_corners\""
}
foreach rc_corner $rc_corners {
foreach option "T cap_table" {
if {[get_rc_corner $rc_corner -$option] != ""} {
if {$option == "cap_table"} {
puts $op1 "set vars($rc_corner,$option) [file normalize [get_rc_corner $rc_corner -$option]]"
} else {
puts $op1 "set vars($rc_corner,$option) [get_rc_corner $rc_corner -$option]"
}
} else {
if {($option == "T") && ([get_rc_corner $rc_corner -$option] == "")} {
puts $op1 "#set vars($rc_corner,$option) 25 ; # EDIT FOR CORRECT T VALUE"
}
if {($option == "cap_table") && ([get_rc_corner $rc_corner -$option] == "")} {
puts $op1 "#set vars($rc_corner,$option) ; # EDIT FOR CORRECT CAP TABLE DEFINITION"
}
}
}
puts $op1 "#set vars($rc_corner,atf_file)"
}
puts $op1 "########################################################################################"
puts $op1 "# Optionally define QRC technology information"
puts $op1 "#---------------------------------------------------------------------------------------"
puts $op1 "# set vars(<rc_corner>,qx_tech_file) <qx_tech_file for corner>"
puts $op1 "# set vars(<rc_corner>,qx_lib_file) <qx_lib_file for corner>"
puts $op1 "# set vars(<rc_corner>,qx_conf_file) <qx_conf_file for corner>"
puts $op1 "########################################################################################"
foreach rc_corner $rc_corners {
foreach option "qx_tech_file qx_lib_file qx_conf_file" {
if {[get_rc_corner $rc_corner -$option] != ""} {
puts $op1 "set vars($rc_corner,$option) [file normalize [get_rc_corner $rc_corner -$option]]"
}
}
}
puts $op1 "########################################################################################"
puts $op1 "# Scale factors are also optional but are strongly encouraged for pre_route optimization "
puts $op1 "# in order to obtain the best flow convergence and QoR. Scaling factors are applied per"
puts $op1 "# rc corner by setting the individual values OR via a scale_tcl file which must contain"
puts $op1 "# syntactically correct update_rc_corner commands for a given rc_corner"
puts $op1 "#---------------------------------------------------------------------------------------"
puts $op1 "# set vars(<rc_corner>,scale_tcl) <file>"
puts $op1 "#---------------------------------------------------------------------------------------"
puts $op1 "# set vars(<rc_corner>,pre_route_res_factor) <pre-route resistance scale factor>"
puts $op1 "# set vars(<rc_corner>,pre_route_clk_res_factor) <pre-route clock resistance scale factor>"
puts $op1 "# set vars(<rc_corner>,post_route_res_factor) <post-route resistance scale factor (triplets)>"
puts $op1 "# set vars(<rc_corner>,post_route_clk_res_factor) <post-route clock resistance scale factor>"
puts $op1 "# set vars(<rc_corner>,pre_route_cap_factor) <pre-route capacitance scale factor>"
puts $op1 "# set vars(<rc_corner>,pre_route_clk_cap_factor) <pre-route clock capacitance scale factor>"
puts $op1 "# set vars(<rc_corner>,post_route_cap_factor) <post-route capacitance scale factor (triplets)>"
puts $op1 "# set vars(<rc_corner>,post_route_clk_cap_factor) <post-route clock capacitance scale factor>"
puts $op1 "# set vars(<rc_corner>,post_route_xcap_factor) <post-route coupling capacitance scale factor (triplets)>"
puts $op1 "########################################################################################"
foreach rc_corner $rc_corners {
if {[get_rc_corner $rc_corner -preRoute_res] != ""} {
puts $op1 "set vars($rc_corner,pre_route_res_factor) \t\t[format %4.2f [expr [get_rc_corner $rc_corner -preRoute_res]*1.0]]"
}
if {[get_rc_corner $rc_corner -preRoute_clkres] != ""} {
puts $op1 "set vars($rc_corner,pre_route_clk_res_factor) \t[format %4.2f [expr [get_rc_corner $rc_corner -preRoute_clkres]*1.0]]"
}
if {[get_rc_corner $rc_corner -postRoute_res] != ""} {
set triplets [get_rc_corner $rc_corner -postRoute_res]
set scalar [lindex $triplets 0]
if {[llength $scalar] == 1} {
set pstring [format "%4.2f %4.2f %4.2f" [expr [lindex $scalar 0]*1.0] 1.0 1.0]
}
if {[llength $scalar] == 2} {
set pstring [format "%4.2f %4.2f %4.2f" [expr [lindex $scalar 0]*1.0] [expr [lindex $scalar 1]*1.0] 1.0]
}
if {[llength $scalar] == 3} {
set pstring [format "%4.2f %4.2f %4.2f" [expr [lindex $scalar 0]*1.0] [expr [lindex $scalar 1]*1.0] [expr [lindex $scalar 2]*1.0]]
}
puts $op1 "set vars($rc_corner,post_route_res_factor) \t\t\"$pstring\""
}
if {[get_rc_corner $rc_corner -postRoute_clkres] != ""} {
set triplets [get_rc_corner $rc_corner -postRoute_clkres]
set scalar [lindex $triplets 0]
if {[llength $scalar] == 1} {
set pstring [format "%4.2f %4.2f %4.2f" [expr [lindex $scalar 0]*1.0] 1.0 1.0]
}
if {[llength $scalar] == 2} {
set pstring [format "%4.2f %4.2f %4.2f" [expr [lindex $scalar 0]*1.0] [expr [lindex $scalar 1]*1.0] 1.0]
}
if {[llength $scalar] == 3} {
set pstring [format "%4.2f %4.2f %4.2f" [expr [lindex $scalar 0]*1.0] [expr [lindex $scalar 1]*1.0] [expr [lindex $scalar 2]*1.0]]
}
puts $op1 "set vars($rc_corner,post_route_clk_res_factor) \t\t\"$pstring\""
}
if {[get_rc_corner $rc_corner -preRoute_cap] != ""} {
puts $op1 "set vars($rc_corner,pre_route_cap_factor) \t\t[format %4.2f [expr [get_rc_corner $rc_corner -preRoute_cap]*1.0]]"
}
if {[get_rc_corner $rc_corner -preRoute_clkcap] != ""} {
puts $op1 "set vars($rc_corner,pre_route_clk_cap_factor) \t[format %4.2f [expr [get_rc_corner $rc_corner -preRoute_clkcap]*1.0]]"
}
if {[get_rc_corner $rc_corner -postRoute_cap] != ""} {
set triplets [get_rc_corner $rc_corner -postRoute_cap]
set scalar [lindex $triplets 0]
if {[llength $scalar] == 1} {
set pstring [format "%4.2f %4.2f %4.2f" [expr [lindex $scalar 0]*1.0] 1.0 1.0]
}
if {[llength $scalar] == 2} {
set pstring [format "%4.2f %4.2f %4.2f" [expr [lindex $scalar 0]*1.0] [expr [lindex $scalar 1]*1.0] 1.0]
}
if {[llength $scalar] == 3} {
set pstring [format "%4.2f %4.2f %4.2f" [expr [lindex $scalar 0]*1.0] [expr [lindex $scalar 1]*1.0] [expr [lindex $scalar 2]*1.0]]
}
puts $op1 "set vars($rc_corner,post_route_cap_factor) \t\t\"$pstring\""
}
if {[get_rc_corner $rc_corner -postRoute_clkcap] != ""} {
set triplets [get_rc_corner $rc_corner -postRoute_clkcap]
set scalar [lindex $triplets 0]
if {[llength $scalar] == 1} {
set pstring [format "%4.2f %4.2f %4.2f" [expr [lindex $scalar 0]*1.0] 1.0 1.0]
}
if {[llength $scalar] == 2} {
set pstring [format "%4.2f %4.2f %4.2f" [expr [lindex $scalar 0]*1.0] [expr [lindex $scalar 1]*1.0] 1.0]
}
if {[llength $scalar] == 3} {
set pstring [format "%4.2f %4.2f %4.2f" [expr [lindex $scalar 0]*1.0] [expr [lindex $scalar 1]*1.0] [expr [lindex $scalar 2]*1.0]]
}
puts $op1 "set vars($rc_corner,post_route_clk_cap_factor) \t\t\"$pstring\""
}
if {[get_rc_corner $rc_corner -postRoute_xcap] != ""} {
set triplets [get_rc_corner $rc_corner -postRoute_xcap]
set scalar [lindex $triplets 0]
if {[llength $scalar] == 1} {
set pstring [format "%4.2f %4.2f %4.2f" [expr [lindex $scalar 0]*1.0] 1.0 1.0]
}
if {[llength $scalar] == 2} {
set pstring [format "%4.2f %4.2f %4.2f" [expr [lindex $scalar 0]*1.0] [expr [lindex $scalar 1]*1.0] 1.0]
}
if {[llength $scalar] == 3} {
set pstring [format "%4.2f %4.2f %4.2f" [expr [lindex $scalar 0]*1.0] [expr [lindex $scalar 1]*1.0] [expr [lindex $scalar 2]*1.0]]
}
puts $op1 "set vars($rc_corner,post_route_xcap_factor) \t\t\"$pstring\""
}
puts $op1 ""
}
puts $op1 "########################################################################################"
puts $op1 "# Define operating conditions (optional)"
puts $op1 "#---------------------------------------------------------------------------------------"
puts $op1 "# set vars(opconds) <list of operating conditions>"
puts $op1 "# set vars(<opcond>,library_file) <library file >"
puts $op1 "# set vars(<opcond>,P) <process scale factor>"
puts $op1 "# set vars(<opcond>,V) <voltage>"
puts $op1 "# set vars(<opcond>,T) <temperature>"
puts $op1 "########################################################################################"
if {![info exists ::CPF::cpfCommitted]} {
set opconds [list]
foreach opcond [all_op_conds] {
# if {[regexp "^default" $opcond ] == 0} {
lappend opconds $opcond
# }
}
if {$opconds != ""} {
puts $op1 "#set vars(opconds) \"$opconds\""
}
foreach opcond $opconds {
foreach option "library_file P V T" {
if {[get_op_cond $opcond -$option] != ""} {
puts $op1 "#set vars($opcond,$option) [get_op_cond $opcond -$option]"
}
}
}
}
puts $op1 "########################################################################################"
puts $op1 "# Define delay corners ..."
puts $op1 "#---------------------------------------------------------------------------------------"
puts $op1 "# set vars(delay_corners) <list of delay corners>"
puts $op1 "# set vars(<delay_corner>,library_set) <library_set> (previously defined)"
puts $op1 "# set vars(<delay_corner>,opcond) <opcond> (previously defined) (optional)"
puts $op1 "# set vars(<delay_corner>,rc_corner) library_set> (previously defined)"
puts $op1 "########################################################################################"
set delay_corners [list]
foreach delay_corner [all_delay_corners] {
# if {[llength [all_delay_corners]] > 2} {
# if {[regexp "^default" $delay_corner ] == 0} {
# lappend delay_corners $delay_corner
# }
# } else {
lappend delay_corners $delay_corner
# }
}
if {$delay_corners != ""} {
puts $op1 "set vars(delay_corners) \"$delay_corners\""
}
foreach dc $delay_corners {
set attribute_list "rc_corner library_set opcond_library opcond irdrop_file late_library_set early_library_set
late_opcond_library early_opcond_library late_opcond early_opcond late_irdrop_file early_irdrop_file"
foreach attr $attribute_list {
# Extraction the corner level properties
if {[get_delay_corner $dc -$attr] != ""} {
puts $op1 "set vars($dc,$attr) \t[get_delay_corner $dc -$attr]"
}
# Extraction the power domain level properties
set domains [get_delay_corner $dc -power_domain_list]
if {$domains != ""} {
if {![info exists done($dc,power_domains)]} {
puts $op1 "set vars($dc,power_domains) \"$domains\""
foreach pd [get_delay_corner $dc -power_domain_list] {
puts $op1 "# Attributes for power domain $pd"
foreach attr $attribute_list {
if {[get_delay_corner -power_domain $pd $dc -$attr] != ""} {
set done($dc,$pd,$attr) TRUE
puts $op1 "set vars($dc,$pd,$attr) \t[get_delay_corner $dc -power_domain $pd -$attr]"
}
}
}
set done($dc,power_domains) TRUE
}
}
}
}
puts $op1 "########################################################################################"
puts $op1 "# Optionally define derating factors for OCV here (clock and data). "
puts $op1 "# Derating factors are applied per delay corner using either individual"
puts $op1 "# values OR via a derate_tcl file which must contain syntactically correct"
puts $op1 "# set_timing_derate commands for a given delay_corner"
puts $op1 "#---------------------------------------------------------------------------------------"
puts $op1 "#set vars(<delay_corner>,derate_tcl) <file>"
puts $op1 "#---------------------------------------------------------------------------------------"
puts $op1 "#set vars(<delay_corner>,data_cell_late) <float>"
puts $op1 "#set vars(<delay_corner>,data_cell_early) <float>"
puts $op1 "#set vars(<delay_corner>,data_net_late) <float>"
puts $op1 "#set vars(<delay_corner>,data_net_early) <float>"
puts $op1 "#set vars(<delay_corner>,clock_cell_late) <float>"
puts $op1 "#set vars(<delay_corner>,clock_cell_early) <float>"
puts $op1 "#set vars(<delay_corner>,clock_net_late) <float>"
puts $op1 "#set vars(<delay_corner>,clock_net_early) <float>"
puts $op1 "#set vars(<delay_corner>,cell_check_late) <float>"
puts $op1 "#set vars(<delay_corner>,cell_check_early) <float>"
puts $op1 "#---------------------------------------------------------------------------------------"
set map(early_cell_check_derate_factor) early_cell_check
set map(early_clk_cell_derate_factor) clock_cell_early
set map(early_data_cell_derate_factor) data_cell_early
set map(late_cell_check_derate_factor) late_cell_check
set map(late_clk_cell_derate_factor) clock_cell_late
set map(late_data_cell_derate_factor) data_cell_late
#timeDesign -prePlace
#foreach view [all_setup_analysis_views] {
# foreach type "early_cell_check_derate_factor early_clk_cell_derate_factor early_data_cell_derate_factor \
# late_cell_check_derate_factor late_clk_cell_derate_factor late_data_cell_derate_factor" {
#
# puts $op1 "set vars([get_analysis_view $view -delay_corner],$map($type)) [get_property [lindex [all_registers] 0] $type -view $view]"
# }
#}
#timeDesign -prePlace -hold
#foreach view [all_hold_analysis_views] {
# foreach type "early_cell_check_derate_factor early_clk_cell_derate_factor early_data_cell_derate_factor \
# late_cell_check_derate_factor late_clk_cell_derate_factor late_data_cell_derate_factor" {
#
# puts $op1 "set vars([get_analysis_view $view -delay_corner],$map($type)) [get_property [lindex [all_registers] 0] $type -view $view]"
# }
#}
puts $op1 "########################################################################################"
puts $op1 "# Define constraint modes ... "
puts $op1 "#---------------------------------------------------------------------------------------"
puts $op1 "# set vars(constraint_modes) <list of constraint modes>"
puts $op1 "# set vars(<mode>,pre_cts_sdc) <pre cts constraint file> (required)"
puts $op1 "# set vars(<mode>,post_cts_sdc) <post cts constraint file> (optional)"
puts $op1 "# set vars(<mode>,incr_cts_sdc) <incremental post cts constraint file> (optional)"
puts $op1 "# set vars(<mode>,pre_cts_ilm_sdc) <pre cts ilm constraint file> (optional)"
puts $op1 "#---------------------------------------------------------------------------------------"
set constraint_modes [list]
foreach constraint_mode [all_constraint_modes] {
# if {[llength [all_constraint_modes]] > 2} {
# if {[regexp "^default_mode" $constraint_mode ] == 0} {
# lappend constraint_modes $constraint_mode
# }
# } else {
lappend constraint_modes $constraint_mode
# }
}
if {$constraint_modes != ""} {
puts $op1 "set vars(constraint_modes) \"$constraint_modes\""
}
foreach constraint_mode $constraint_modes {
if {[get_constraint_mode $constraint_mode -sdc_files] != ""} {
# puts $op1 "set vars($constraint_mode,pre_cts_sdc) \"[file normalize [get_constraint_mode $constraint_mode -sdc_files]]\""
set pre_cts_sdc_list [list]
foreach file [get_constraint_mode $constraint_mode -sdc_files] {
lappend pre_cts_sdc_list [file normalize $file]
}
puts $op1 "set vars($constraint_mode,pre_cts_sdc) \"[join $pre_cts_sdc_list]\""
if {[info exists dgn_post_cts_sdc] && ($dgn_post_cts_sdc != "") } {
puts $op1 "set vars($constraint_mode,post_cts_sdc) \"$dgn_post_cts_sdc\""
}
}
if {[get_constraint_mode $constraint_mode -ilm_sdc_files] != ""} {
# puts $op1 "set vars($constraint_mode,pre_cts_ilm_sdc) \"[file normalize [get_constraint_mode $constraint_mode -ilm_sdc_files]]\""
set ilm_cts_sdc_list [list]
foreach file [get_constraint_mode $constraint_mode -ilm_sdc_files] {
lappend ilm_cts_sdc_list [file normalize $file]
}
puts $op1 "set vars($constraint_mode,pre_cts_ilm_sdc) \"[join $ilm_cts_sdc_list]\""
}
}
puts $op1 "########################################################################################"
puts $op1 "# Define setup and hold analysis views ... each analysis view requires"
puts $op1 "# a delay corner and a constraint mode"
puts $op1 "########################################################################################"
#set analysis_views ""
set analysis_views [concat [all_setup_analysis_views] [all_hold_analysis_views]]
#foreach view [all_analysis_views] {
# if {[llength [all_analysis_views]] > 2} {
# if {[regexp "^default" $view ] == 0} {
# lappend analysis_views $view
# }
# } else {
# lappend analysis_views $view
# }
#}
foreach view $analysis_views {
foreach option "delay_corner constraint_mode" {
if {[get_analysis_view $view -$option] != ""} {
puts $op1 "set vars($view,$option) [get_analysis_view $view -$option]"
}
}
}
puts $op1 "########################################################################################"
puts $op1 "# EDIT/VERIFY THESE LISTS!!"
puts $op1 "########################################################################################"
puts $op1 "set vars(setup_analysis_views) \"[all_setup_analysis_views]\""
puts $op1 "set vars(hold_analysis_views) \"[all_hold_analysis_views]\""
#puts $op1 "set vars(setup_analysis_views) \"$analysis_views\""
#puts $op1 "set vars(hold_analysis_views) \"$analysis_views\""
puts $op1 "########################################################################################"
puts $op1 "# Define active setup and hold analysis view lists and default views"
puts $op1 "########################################################################################"
puts $op1 "set vars(default_setup_view) \[lindex \$vars(setup_analysis_views) 0\]"
puts $op1 "set vars(default_hold_view) \[lindex \$vars(hold_analysis_views) 0\]"
#puts $op1 "set vars(active_setup_views) \$vars(setup_analysis_views)"
#puts $op1 "set vars(active_hold_views) \$vars(hold_analysis_views)"
puts $op1 "set vars(active_setup_views) \$vars(setup_analysis_views)"
puts $op1 "set vars(active_hold_views) \$vars(hold_analysis_views)"
puts $op1 ""
puts $op1 "#set vars(gds_files) <list of gds files>"
puts $op1 "#set vars(gds_layer_map) <gds layer map file>"
puts $op1 "#set vars(qrc_layer_map) <qrc layer map file>"
puts $op1 "#set vars(qrc_library) <qrc library directory>"
puts $op1 "#set vars(qrc_config_file) <qrc config file>"
puts $op1 ""
puts $op2 "########################################################################################"
puts $op2 "# Enable onChipVariation (for MMMC flows). Options are:"
puts $op2 "# pre_place, pre_prects, pre_cts, pre_postcts, pre_postroute, pre_signoff, false"
puts $op2 "########################################################################################"
puts $op2 "set vars(enable_ocv) pre_cts"
puts $op2 ""
puts $op2 "########################################################################################"
puts $op2 "# Optionally enable aocv"
puts $op2 "########################################################################################"
puts $op2 "set vars(enable_aocv) false"
puts $op2 "########################################################################################"
puts $op2 "# Optionally enable cppr; options are: setup, hold, both, none"
puts $op2 "########################################################################################"
puts $op2 "set vars(enable_cppr) both"
puts $op2 ""
#puts $op2 "########################################################################################"
#puts $op2 "# Optionally enable signalStorm delay calculation during the flow."
#puts $op2 "# This is a requirement when using ECSM/CCS models. The following are"
#puts $op2 "# value options: pre_place pre_prects pre_postcts pre_postroute pre_signoff false"
#puts $op2 "########################################################################################"
#puts $op2 "set vars(enable_ss) false"
#puts $op2 ""
puts $op2 "########################################################################################"
puts $op2 "# Optionally enable signoff ECO for the hierarhical flow"
puts $op2 "# IF 'ilm', THEN THE FOLLOWING SHOULD BE SET IN THE setup.tcl"
puts $op2 "# - vars(<ptn>,ilm_dir) <path to ILM diretory>"
puts $op2 "# - va#rs(<ptn>,lef_file) <path to LEF file>"
puts $op2 "########################################################################################"
puts $op2 "set vars(enable_signoff_eco) false"
puts $op2 ""
puts $op2 "########################################################################################"
puts $op2 "# Flow Options"
puts $op2 "# Optionally enable design mode options:"
puts $op2 "#---------------------------------------------------------------------------------------"
puts $op2 "#set vars(flow_effot) <express | standard | extreme>"
puts $op2 "#set vars(power_effort) <none | low | high>"
puts $op2 ""
puts $op2 "########################################################################################"
puts $op2 "# Placement Options"
puts $op2 "# NOTE: When place_opt_design is enabled, the prects step will be skipped"
puts $op2 "#---------------------------------------------------------------------------------------"
puts $op2 "#set vars(in_place_opt) true"
puts $op2 "#set vars(no_pre_place_opt) true"
puts $op2 "#set vars(place_opt_design) <true | false>"
puts $op2 "#set vars(place_io_pins) <true | false>"
puts $op2 "#set vars(clock_gate_aware) <true | false>"
puts $op2 "#set vars(congestion_effort) <auto | low | high>"
puts $op2 "#---------------------------------------------------------------------------------------"
foreach option [getPlaceMode -quiet] {
if {[lindex $option 0] == "clkGateAware"} {
puts $op2 "set vars(clock_gate_aware) [lindex $option 1]"
}
if {[lindex $option 0] == "congEffort"} {
puts $op2 "set vars(congestion_effort) [lindex $option 1]"
}
if {[lindex $option 0] == "placeIoPins"} {
puts $op2 "set vars(place_io_pins) [lindex $option 1]"
}
}
puts $op2 ""
puts $op2 "########################################################################################"
puts $op2 "# Tie/Filler/Tap Cell Options"
puts $op2 "# --------------------------------------------------------------------------------------"
puts $op2 "# Tie cell information"
puts $op2 "# --------------------------------------------------------------------------------------"
foreach option [getTieHiLoMode -quiet] {
switch -exact -- [lindex $option 0] {
"cell" {
if {[lindex $option 1] != ""} {
puts $op2 "set vars(tie_cells) \"[lindex $option 1]\""
} else {
puts $op2 "#set vars(tie_cells) <tie_cells>"
}
}
"maxDistance" {
if {[lindex $option 1] != 0} {
puts $op2 "set vars(tie_cells,max_distance) [list [lindex $option 1]]"
} else {
puts $op2 "#set vars(tie_cells,max_distance) <float>"
}
}
"maxFanout" {
if {[lindex $option 1] != 0} {
puts $op2 "set vars(tie_cells,max_fanout) [list [lindex $option 1]]"
} else {
puts $op2 "#set vars(tie_cells,max_fanout) <int>"
}
}
}
}
puts $op2 "# --------------------------------------------------------------------------------------"
puts $op2 "# Filler cell information"
puts $op2 "# --------------------------------------------------------------------------------------"
foreach option [getFillerMode -quiet] {
if {[lindex $option 0] == "core"} {
if {[lindex $option 1] != ""} {
puts $op2 "set vars(filler_cells) \"[lindex $option 1]\""
} else {
puts $op2 "#set vars(filler_cells) <filler_cells>"
}
}
}
puts $op2 "# ---------------------------------------------------------------------------------------"
puts $op2 "# Welltap cell information"
puts $op2 "# ---------------------------------------------------------------------------------------"
puts $op2 "# verify_rule : maximum distance (in microns) between welltap cells and standard cells "
puts $op2 "# in microns"
puts $op2 "# max_gap : specifies the maximum distance from the right edge of one well-tap cell "
puts $op2 "# to the left edge of the following well-tap cell in the same row"
puts $op2 "# cell_interval : specifies the maximum distance from the center of one well-tap cell "
puts $op2 "# to the center of the following well-tap cell in the same row"
puts $op2 "#"
puts $op2 "# NOTE: max_gap and cell_interval parameters are mutually exclusive, user has to define "
puts $op2 "# only one of these parameters to add welltap cells"
puts $op2 "#"
puts $op2 "# ---------------------------------------------------------------------------------------"
puts $op2 "#set vars(welltaps) <welltap cells>"
puts $op2 "#set vars(welltaps,checkerboard) <true or false>"
puts $op2 "#set vars(welltaps,max_gap) <max gap>"
puts $op2 "#set vars(welltaps,cell_interval) <cell interval>"
puts $op2 "#set vars(welltaps,verify_rule) <distance interval>"
puts $op2 "# ---------------------------------------------------------------------------------------"
puts $op2 "# Endcap cell information"
puts $op2 "# ---------------------------------------------------------------------------------------"
puts $op2 "#set vars(pre_endcap) <pre endcap cell>"
puts $op2 "#set vars(post_endcap) <post endcap cell>"
puts $op2 ""
if {[info exists ::CPF::cpfCommitted] || [info exists ::MSV::ieee1801Loaded]} {
puts $op1 "##########################################################################################"
puts $op1 "# LP Flow Options"
puts $op1 "#---------------------------------------------------------------------------------------"
set lpfile {}
if {[info exists ::CPF::cpfCommitted] && $::CPF::cpfCommitted &&
[info exists ::CPF::cpf_file] && $::CPF::cpf_file != ""} {
set lpformat cpf
set lpfile gen_setup.[pid].$lpformat; # $::CPF::cpf_file is not used directly
if {[lindex [split $vars(version) "."] 0] < 15} {
saveCPF $lpfile
} else {
write_power_intent -cpf $lpfile
}
} elseif {[info exists ::MSV::ieee1801Loaded] && $::MSV::ieee1801Loaded &&
[info exists ::MSV_UPF::upf_file]} {
set lpfile [file normalize $::MSV_UPF::upf_file]
set lpformat ieee1801
}
if {$lpfile == {}} {
puts "WARNING: Cannot determine CPF or IEEE 1801 file ..."
} else {
set vars(${lpformat}_file) $lpfile
puts $op1 "set vars(${lpformat}_file) \"$vars(${lpformat}_file)\""
puts $op1 "# --------------------------------------------------------------------"
puts $op1 "# Define the following to selectively commit sections of the [string toupper $lpformat] file"
puts $op1 "#set vars(${lpformat}_power_domain) <true | false>"
puts $op1 "#set vars(${lpformat}_power_switch) <true | false>"
puts $op1 "#set vars(${lpformat}_isolation) <true | false>"
puts $op1 "#set vars(${lpformat}_level_shifter) <true | false>"
puts $op1 "#set vars(${lpformat}_state_retention) <true | false>"
puts $op1 "# --------------------------------------------------------------------"
puts $op1 "#set vars(${lpformat}_keep_rows) <true | false>"
puts $op1 "# ---------------------------------------------------------------------------------------"
puts $op1 "# The vars(power_domains) is optional. If not defined, the power"
puts $op1 "# power domain list will be picked up automatically"
puts $op1 "# ---------------------------------------------------------------------------------------"
set power_domains [list]
dbForEachPowerDomain [dbgHead] pd {
lappend power_domains [dbPowerDomainName $pd]
}
if {$power_domains != ""} {
puts $op1 "set vars(power_domains) \"$power_domains\""
} else {
puts $op1 "#set vars(power_domains) <list of power domains>"
}
puts $op1 "# ---------------------------------------------------------------------------------------"
puts $op1 "# Additional optional low power variables can be defined in the lp_config.tcl file."
puts $op1 "# ---------------------------------------------------------------------------------------"
}
}
puts $op2 ""
puts $op2 "#########################################################################################"
puts $op2 "# Clock Tree Options"
puts $op2 "# ---------------------------------------------------------------------------------------"
puts $op2 "#set vars(route_clock_nets) <true | false>"
puts $op2 "#set vars(cts_cells) <list of clock buffers>"
puts $op2 "#set vars(clock_gate_cells) <list of clock gating cells>"
puts $op2 "#set vars(clock_gate_clone) <true | false>"
puts $op2 "#set vars(clock_eco) <pre_route | post_route | both | none>"
puts $op2 "# ---------------------------------------------------------------------------------------"
puts $op2 "#set vars(clk_tree_top_layer) <tree_top_preferred_layer>"
puts $op2 "#set vars(clk_tree_bottom_layer) <tree_bottom_preferred_layer> "
puts $op2 "#set vars(clk_tree_ndr) <tree_non_default_rule>"
puts $op2 "#set vars(clk_tree_shield_net) <tree_shield_net> "
puts $op2 "#set vars(clk_leaf_top_layer) <leaf_top_preferred_layer>"
puts $op2 "#set vars(clk_leaf_bottom_layer) <leaf_bottom_preferred_layer>"
puts $op2 "#set vars(cts_leaf_ndr) <leaf_non_default_layer>"
puts $op2 "# ---------------------------------------------------------------------------------------"
puts $op2 "# Additional variables to enable/support ccopt"
puts $op2 "# ---------------------------------------------------------------------------------------"
puts $op2 "#set vars(cts_engine) <clockDesign | ccoptDesign>"
puts $op2 "#set vars(cts_buffer_cells) <list of buffers>"
puts $op2 "#set vars(cts_inverter_cells) <list of inverters>"
puts $op2 "#set vars(cts_use_inverters) <true | false>"
puts $op2 "#set vars(cts_io_opt) <on secondary off>"
#puts $op2 "#set vars(ccopt_integration) <native | scripted>"
#puts $op2 "#set vars(ccopt_executable) <path to ccopt executable>"
puts $op2 ""
puts $op2 "#########################################################################################"
puts $op2 "# Optimization Options"
puts $op2 "# --------------------------------------------------------------------"
puts $op2 "# For difficult timing designs, 'set vars(high_timing_effort) true'"
puts $op2 "# This enables a variety of options throughout the flow for optimal"
puts $op2 "# QoR at the expense of runtime"
puts $op2 "# --------------------------------------------------------------------"
puts $op2 "#set vars(high_timing_effort) <true | false>"
puts $op2 "# --------------------------------------------------------------------"
#puts $op2 "#set vars(critical_range) <float>"
puts $op2 "#set vars(preserve_assertions) <true | false>"
puts $op2 "#set vars(clock_gate_aware_opt) <true | false>"
#puts $op2 "#set vars(power_effort) <none | low | high>"
#puts $op2 "#set vars(power_ratio) <float>"
puts $op2 "#set vars(fix_hold_allow_tns_degradation) <true | false>"
puts $op2 "#set vars(useful_skew) <true | false>"
#puts $op2 "#set vars(skew_buffers) <true | false>"
puts $op2 "#set vars(fix_hold) <false | postcts | postroute >"
puts $op2 "#set vars(fix_hold_ignore_ios) <true | false>"
puts $op2 "#set vars(delay_cells) <list of delay cells>"
puts $op2 "#set vars(dont_use_list) <list of cells>"
puts $op2 "#set vars(dont_use_file) <file of dont use commands>"
puts $op2 "#set vars(use_list) <list of cells>"
puts $op2 "#---------------------------------------------------------------------------------------"
foreach option [getOptMode -quiet] {
if {[lindex $option 0] == "criticalRange"} {
puts $op2 "#set vars(critical_range) [lindex $option 1]"
}
if {[lindex $option 0] == "preserveAssertions"} {
puts $op2 "set vars(preserve_assertions) [lindex $option 1]"
}
# if {[lindex $option 0] == "leakagePowerEffort"} {
# puts $op2 "set vars(leakage_power_effort) [lindex $option 1]"
# }
# if {[lindex $option 0] == "dynamicPowerEffort"} {
# puts $op2 "set vars(dynamic_power_effort) [lindex $option 1]"
# }
if {[lindex $option 0] == "fixHoldAllowSetupTnsDegrade"} {
puts $op2 "set vars(fix_hold_allow_tns_degradation) [lindex $option 1]"
}
if {[lindex $option 0] == "clkGateAware"} {
puts $op2 "set vars(clock_gate_aware_opt) [lindex $option 1]"
}
if {[lindex $option 0] == "usefulSkew"} {
puts $op2 "set vars(useful_skew) [lindex $option 1]"
}
}
#foreach option [getUsefulSkewMode -quiet] {
# if {[lindex $option 0] == "useCells"} {
# if {[lindex $option 1] != ""} {
# puts $op2 "set vars(skew_buffers) \"\\"
# foreach cell [lindex $option 1] {
# puts $op2 " $cell \\"
# }
# puts $op2 "\""
# }
# }
#}
catch {set foo [get_line_match "set don't use by User" [getLogFileName]]}
if {[info exists foo] && ($foo != "") } {
puts $op2 "set vars(dont_use_list) \"\\"
foreach line [get_line_match "set don't use by User" [getLogFileName] 0] {
# lappend vars(dont_use_list) [lindex [split [lindex $line 0] "/"] 1]
puts $op2 " [lindex [split [lindex $line 0] "/"] 1] \\"
}
puts $op2 "\""
}
puts $op2 "#########################################################################################"
puts $op2 "# Power Analysis Options"
puts $op2 "# ---------------------------------------------------------------------------------------"
puts $op2 "#set vars(activity_file) <activity file>"
puts $op2 "#set vars(activity_file_format) <TCF | SAF | VCD>"
puts $op2 "#set vars(report_power) <true or false>"
puts $op2 "#set vars(power_analysis_view) <power analysis view>"
puts $op2 ""
puts $op2 "#########################################################################################"
puts $op2 "# Nanoroute Options"
puts $op2 "# ---------------------------------------------------------------------------------------"
puts $op2 "#set vars(multi_cut_effort) <low | medium | high>"
puts $op2 "#set vars(antenna_diode) <cell name>"
puts $op2 "#set vars(litho_driven_routing) <true | false>"
puts $op2 "#set vars(verify_litho) <true | false>"
puts $op2 "#set vars(lpa_tech_file) <file name>"
puts $op2 "#set vars(fix_litho) <true | false>"
puts $op2 "#set vars(lpa_conf_file) <file name>"
puts $op2 "#set vars(postroute_spread_wires) <true | false>"
puts $op2 "# ---------------------------------------------------------------------------------------"
foreach option [getNanoRouteMode -quiet] {
if {[lindex $option 0] == "drouteUseMultiCutViaEffort"} {
puts $op2 "set vars(multi_cut_effort) [lindex $option 1]"
}
if {[lindex $option 0] == "routeWithLithoDriven"} {
puts $op2 "set vars(litho_driven_routing) [lindex $option 1]"
}
}
puts $op2 "#########################################################################################"
puts $op2 "# Extraction Options"
puts $op2 "# ---------------------------------------------------------------------------------------"
puts $op2 "#set vars(coupling_c_thresh) <float>"
puts $op2 "#set vars(relative_c_thresh) <float>"
puts $op2 "#set vars(total_c_thresh) <float>"
puts $op2 "# ---------------------------------------------------------------------------------------"
foreach option [getExtractRCMode -quiet] {
if {[lindex $option 0] == "coupling_c_th"} {
puts $op2 "#set vars(coupling_c_thresh) [lindex $option 1]"
}
if {[lindex $option 0] == "relative_c_th"} {
puts $op2 "#set vars(relative_c_thresh) [lindex $option 1]"
}
if {[lindex $option 0] == "total_c_th"} {
puts $op2 "#set vars(total_c_thresh) [lindex $option 1]"
}
}
puts $op2 "# Signoff extraction requires qrc_tech file; if you dont have one, please switch to effort low."
puts $op2 "# But keep in mind, effort low is NOT allowed for process nodes 32nm and below"
puts $op2 "# ---------------------------------------------------------------------------------------"
puts $op2 "#set vars(postroute_extraction_effort) <low | medium | high>"
puts $op2 "#set vars(signoff_extraction_effort) <low | medium | high | signoff>"
puts $op2 ""
puts $op2 "#########################################################################################"
puts $op2 "# Signal Integrity Options"
puts $op2 "# ---------------------------------------------------------------------------------------"
puts $op2 "#set vars(delta_delay_threshold) <float> (in nanoseconds)"
puts $op2 "#set vars(celtic_settings) <string>"
puts $op2 "#set vars(si_analysis_type) <default | pessimistic>"
puts $op2 "#set vars(acceptable_wns) <float>"
puts $op2 "# ---------------------------------------------------------------------------------------"
foreach option [getSIMode -quiet] {
if {[lindex $option 0] == "deltaDelayThreshold"} {
puts $op2 "set vars(delta_delay_threshold) [lindex $option 1]"
}
if {[lindex $option 0] == "insCeltICPreTCL"} {
puts $op2 "set vars(celtic_settings) [lindex $option 1]"
}
if {[lindex $option 0] == "analysisType"} {
puts $op2 "set vars(si_analysis_type) [lindex $option 1]"
}
}
puts $op2 "#########################################################################################"
puts $op2 "# Optionally define the following when applicable"
puts $op2 "# ---------------------------------------------------------------------------------------"
puts $op2 "#set vars(assign_buffer) {1 -buffer <buffer name>}"
puts $op2 "#set vars(buffer_tie_assign) <true | false>"
puts $op2 "#set vars(jtag_rows) <number of rows for jtag placement>"
puts $op2 "#set vars(jtag_cells) <list of jtag cells>"
puts $op2 "#set vars(spare_cells) <list of spare cells instances>"
puts $op2 "#########################################################################################"
puts $op2 "# Below are the available plug-ins for the flat foundation flow. Each "
puts $op2 "# should point to a file. If the file doesn't exist, the flow will print"
puts $op2 "# a warning an continue. The place_tcl and cts_tcl are unique in that "
puts $op2 "# they REPLACE the placeDesign and clockDesign calls, respectively."
puts $op2 "# ---------------------------------------------------------------------------------------"
puts $op2 "set vars(always_source_tcl) \$vars(plug_dir)/always_source.tcl"
puts $op2 "set vars(final_always_source_tcl) \$vars(plug_dir)/final_always_source.tcl"
puts $op2 "set vars(pre_init_tcl) \$vars(plug_dir)/pre_init.tcl"
puts $op2 "set vars(post_init_tcl) \$vars(plug_dir)/post_init.tcl"
puts $op2 "set vars(pre_place_tcl) \$vars(plug_dir)/pre_place.tcl"
puts $op2 "#set vars(place_tcl) \$vars(plug_dir)/place.tcl"
puts $op2 "set vars(post_place_tcl) \$vars(plug_dir)/post_place.tcl"
puts $op2 "set vars(pre_prects_tcl) \$vars(plug_dir)/pre_prects.tcl"
puts $op2 "set vars(post_prects_tcl) \$vars(plug_dir)/post_prects.tcl"
puts $op2 "set vars(pre_cts_tcl) \$vars(plug_dir)/pre_cts.tcl"
puts $op2 "#set vars(cts_tcl) \$vars(plug_dir)/cts.tcl"
puts $op2 "set vars(post_cts_tcl) \$vars(plug_dir)/post_cts.tcl"
puts $op2 "set vars(pre_postcts_tcl) \$vars(plug_dir)/pre_postcts.tcl"
puts $op2 "set vars(post_postcts_tcl) \$vars(plug_dir)/post_postcts.tcl"
puts $op2 "set vars(pre_route_tcl) \$vars(plug_dir)/pre_route.tcl"
puts $op2 "set vars(post_route_tcl) \$vars(plug_dir)/post_route.tcl"
puts $op2 "set vars(pre_postcts_hold_tcl) \$vars(plug_dir)/pre_postcts_hold.tcl"
puts $op2 "set vars(post_postcts_hold_tcl) \$vars(plug_dir)/post_postcts_hold.tcl"
puts $op2 "set vars(pre_postroute_tcl) \$vars(plug_dir)/pre_postroute.tcl"
puts $op2 "set vars(post_postroute_tcl) \$vars(plug_dir)/post_postroute.tcl"
puts $op2 "set vars(pre_postroute_hold_tcl) \$vars(plug_dir)/pre_postroute_hold.tcl"
puts $op2 "set vars(post_postroute_hold_tcl) \$vars(plug_dir)/post_postroute_hold.tcl"
puts $op2 "set vars(pre_signoff_tcl) \$vars(plug_dir)/pre_signoff.tcl"
puts $op2 "set vars(post_signoff_tcl) \$vars(plug_dir)/post_signoff.tcl"
puts $op2 "# --------------------------------------------------------------------"
puts $op2 "# Below are the plug-ins available for the hierarchical flow ... note"
puts $op2 "# the additional plug-ins for the partition and assemble steps. "
puts $op2 "# Keep in mind "
puts $op2 "# - The partitioning step will also load the pre/post init"
puts $op2 "# and pre/post place plug-ins (see above)."
puts $op2 "# - The assemble step will also load the pre/post signoff"
puts $op2 "# plug-ins as well. "
puts $op2 "# --------------------------------------------------------------------"
puts $op2 "#set vars(always_source_tcl) \$vars(plug_dir)/post_signoff.tcl"
puts $op2 "#set vars(final_always_source_tcl) \$vars(plug_dir)/final_always_source.tcl"
puts $op2 "#set vars(pre_model_gen_tcl) \$vars(plug_dir)/pre_model_gen.tcl"
puts $op2 "#set vars(post_model_gen_tcl) \$vars(plug_dir)/post_model_gen.tcl"
puts $op2 "#set vars(pre_pin_assign_tcl) \$vars(plug_dir)/pre_pin_assign.tcl"
puts $op2 "#set vars(post_pin_assign_tcl) \$vars(plug_dir)/post_pin_assign.tcl"
puts $op2 "#set vars(pre_partition_tcl) \$vars(plug_dir)/pre_partition.tcl"
puts $op2 "#set vars(post_partition_tcl) \$vars(plug_dir)/post_partition.tcl"
puts $op2 "#set vars(pre_assemble_tcl) \$vars(plug_dir)/pre_assemble.tcl"
puts $op2 "#set vars(post_assemble_tcl) \$vars(plug_dir)/post_assemble.tcl"
puts $op2 "#set vars(pre_signoff_tcl) \$vars(plug_dir)/pre_signoff.tcl"
puts $op2 "#set vars(post_signoff_tcl) \$vars(plug_dir)/post_signoff.tcl"
puts $op2 "# --------------------------------------------------------------------"
puts $op2 "# All other plug-ins are only used during the flat implementation"
puts $op2 "# of the partitions. To enable plug-ins for partition implementation"
puts $op2 "# define in the vars(<part>,innovus_config_tcl) file for that partition"
puts $op2 "# --------------------------------------------------------------------"
puts $op2 "# To insert metal fill during the flow define the following two variables:"
puts $op2 "# - vars(metalfill) \[pre_postroute, pre_signoff\]"
puts $op2 "# - vars(metalfill_tcl) <path to metalfill plug-in file>"
puts $op2 "# --------------------------------------------------------------------"
puts $op2 "#set vars(metalfill) pre_postroute"
puts $op2 "#set vars(metalfill_tcl) \$vars(plug_dir)/metalfill.tcl"
puts $op2 "##########################################################################################"
puts $op2 "# Distribution setup ... vars(distribute) can be one of the following:"
puts $op2 "# lsf, rsh, local, or custom"
puts $op2 "# Depending on the value of vars(distribute), addition variables"
puts $op2 "# may be required. Some examples are shown below"
puts $op2 "# Also, a timeout can be set (unit is seconds)"
puts $op2 "# --------------------------------------------------------------------"
puts $op2 "#set vars(distribute) custom"
puts $op2 "#set vars(distribute_timeout) 3600"
puts $op2 "#set vars(custom,script) {/grid/sfi/farm/bin/gridsub -W 72:00 -P SOC7.1 -R \"SFIARCH==OPT64 && OSREL==EE40\" -q lnx64}"
puts $op2 "#set vars(lsf,queue) lnx64"
puts $op2 "#set vars(lsf,resource) \"SFIARCH==OPT64 && OSREL==EE40\""
puts $op2 "#set vars(lsf,args) \"-W 72:00 -P SOC8.1\""
puts $op2 "#set vars(local_cpus) 2"
puts $op2 "#set vars(remote_hosts) 2"
puts $op2 "#set vars(cpu_per_remote_host) 2"
puts $op2 "#set vars(rsh,hosts) <list of hosts>"
puts $op2 "##########################################################################################"
puts $op2 "# Capture qor and run time metrics ..."
puts $op2 "# --------------------------------------------------------------------"
puts $op2 "#set vars(capture_metrics) false"
puts $op2 "set vars(report_run_time) true"
puts $op2 "# --------------------------------------------------------------------"
puts $op2 "#set vars(html_summary) <filename>"
puts $op2 "#set vars(time_info_rpt) <filename>"
puts $op2 "#set vars(time_info_dbs) <filename>"
puts $op2 "##########################################################################################"
puts $op2 "# Makefile options ..."
puts $op2 "# --------------------------------------------------------------------"
puts $op2 "#set vars(make_tool) <innovus executable>"
puts $op2 "#set vars(make_tool_args) \"-64 -nowin\""
puts $op2 "#set vars(make_syn_tool) <rc executable>"
puts $op2 "#set vars(make_syn_tool_args) \"-64\""
puts $op2 "#set vars(make_browser) mozilla"
puts $op2 "##########################################################################################"
puts $op2 "# Abort if there are errors in the setup.tcl"
puts $op2 "# --------------------------------------------------------------------"
puts $op2 "set vars(abort) true"
puts $op2 "##########################################################################################"
puts $op2 "# Send mail during flow execution; vars(mail,steps) defaults to ALL steps."
puts $op2 "#set vars(mail,to) \"<list of email addresses>\""
puts $op2 "#set vars(mail,steps) \"<list of steps>\""
puts $op2 "##########################################################################################"
puts $op1 "puts \"<FF> Finished loading setup.tcl file\""
puts $op2 "puts \"<FF> Finished loading the INNOVUS configuration file\""
close $op1
close $op2
Puts "<FF> ------------------------------------------------------------------------------------"
Puts "<FF> Finished generating setup file \"setup.auto.tcl\" ... "
Puts "<FF> please edit and rename to setup.tcl to enable"
Puts "<FF> ------------------------------------------------------------------------------------"
Puts "<FF> Finished generating INNOVUS config file \"innovus_config.auto.tcl\" ... "
Puts "<FF> please edit and rename to innovus_config.tcl to enable"
Puts "<FF> ------------------------------------------------------------------------------------"
#puts " Please check for correctness and add additional information as necessary"
if {[info exists lpfile]} {
create_lp_config_file
Puts "<FF> Finished generating low power config file \"lp_config.auto.tcl\" ... "
Puts "<FF> please edit and rename to lp_config.tcl to enable"
Puts "<FF> ------------------------------------------------------------------------------------"
}
create_invs_tag_file
Puts "<FF> ------------------------------------------------------------------------------------"
Puts "<FF> Finished generating INNOVUS tag file \"invs.auto.tcl\" ... "
Puts "<FF> This file is for detailed flow customization and in purely optional."
Puts "<FF> ------------------------------------------------------------------------------------"
if {[info exists done]} {
foreach var [array names done] {
unset done($var)
}
}